From 434cb7e5b5a969575583e45c3fd85fd04fdf2f0c Mon Sep 17 00:00:00 2001 From: Joachim Date: Sun, 1 Jan 2023 14:22:54 +0100 Subject: [PATCH 001/962] Create suggestion list --- bookwyrm/forms/lists.py | 6 +++++ bookwyrm/migrations/0173_suggestionlist.py | 26 ++++++++++++++++++++++ bookwyrm/models/__init__.py | 2 +- bookwyrm/models/fields.py | 2 +- bookwyrm/models/list.py | 8 +++++++ 5 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 bookwyrm/migrations/0173_suggestionlist.py diff --git a/bookwyrm/forms/lists.py b/bookwyrm/forms/lists.py index 647db3bfe9..945c2889df 100644 --- a/bookwyrm/forms/lists.py +++ b/bookwyrm/forms/lists.py @@ -14,6 +14,12 @@ class Meta: fields = ["user", "name", "description", "curation", "privacy", "group"] +class SuggestionListForm(CustomForm): + class Meta: + model = models.SuggestionList + fields = ["user", "book"] + + class ListItemForm(CustomForm): class Meta: model = models.ListItem diff --git a/bookwyrm/migrations/0173_suggestionlist.py b/bookwyrm/migrations/0173_suggestionlist.py new file mode 100644 index 0000000000..b056b3cb03 --- /dev/null +++ b/bookwyrm/migrations/0173_suggestionlist.py @@ -0,0 +1,26 @@ +# Generated by Django 3.2.16 on 2023-01-01 12:26 + +import bookwyrm.models.fields +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('bookwyrm', '0172_alter_user_preferred_language'), + ] + + operations = [ + migrations.CreateModel( + name='SuggestionList', + fields=[ + ('list_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='bookwyrm.list')), + ('book', bookwyrm.models.fields.OneToOneField(on_delete=django.db.models.deletion.PROTECT, to='bookwyrm.edition')), + ], + options={ + 'abstract': False, + }, + bases=('bookwyrm.list',), + ), + ] diff --git a/bookwyrm/models/__init__.py b/bookwyrm/models/__init__.py index ae70001623..ae2be0aff0 100644 --- a/bookwyrm/models/__init__.py +++ b/bookwyrm/models/__init__.py @@ -8,7 +8,7 @@ from .connector import Connector from .shelf import Shelf, ShelfBook -from .list import List, ListItem +from .list import List, SuggestionList, ListItem from .status import Status, GeneratedNote, Comment, Quotation from .status import Review, ReviewRating diff --git a/bookwyrm/models/fields.py b/bookwyrm/models/fields.py index d11f5fb1d1..dbced6d984 100644 --- a/bookwyrm/models/fields.py +++ b/bookwyrm/models/fields.py @@ -280,7 +280,7 @@ def field_to_activity(self, value): class OneToOneField(ActivitypubRelatedFieldMixin, models.OneToOneField): - """activitypub-aware foreign key field""" + """activitypub-aware one to one field""" def field_to_activity(self, value): if not value: diff --git a/bookwyrm/models/list.py b/bookwyrm/models/list.py index 63dd5b23f6..080bfd49c8 100644 --- a/bookwyrm/models/list.py +++ b/bookwyrm/models/list.py @@ -131,6 +131,14 @@ def save(self, *args, **kwargs): super().save(*args, **kwargs) +class SuggestionList(List): + """List related to a specific book""" + + book = fields.OneToOneField( + "Edition", on_delete=models.PROTECT, activitypub_field="book" + ) + + class ListItem(CollectionItemMixin, BookWyrmModel): """ok""" From acd379944d4ab3a842b57c2dade0bf49720b763c Mon Sep 17 00:00:00 2001 From: Joachim Date: Sun, 1 Jan 2023 14:23:37 +0100 Subject: [PATCH 002/962] Add list creation button --- bookwyrm/templates/book/book.html | 4 ++++ .../templates/book/suggestion_list/list.html | 11 ++++++++++ bookwyrm/urls.py | 5 +++++ bookwyrm/views/__init__.py | 1 + bookwyrm/views/books/books.py | 20 +++++++++++++++++++ 5 files changed, 41 insertions(+) create mode 100644 bookwyrm/templates/book/suggestion_list/list.html diff --git a/bookwyrm/templates/book/book.html b/bookwyrm/templates/book/book.html index 6a8d4d794c..2a69829e56 100644 --- a/bookwyrm/templates/book/book.html +++ b/bookwyrm/templates/book/book.html @@ -344,6 +344,10 @@

{% trans "Your reading activity" %}

+
+ {% include "book/suggestion_list/list.html" %} +
+ {% if book.subjects %}

{% trans "Subjects" %}

diff --git a/bookwyrm/templates/book/suggestion_list/list.html b/bookwyrm/templates/book/suggestion_list/list.html new file mode 100644 index 0000000000..8f9ad179ac --- /dev/null +++ b/bookwyrm/templates/book/suggestion_list/list.html @@ -0,0 +1,11 @@ +{% load i18n %} +{% if book.suggestionlist %} +

{% trans "Suggestions" %}

+{% else %} +
+ {% csrf_token %} + + + +
+{% endif %} diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py index ac3a805803..7ee4bca8e0 100644 --- a/bookwyrm/urls.py +++ b/bookwyrm/urls.py @@ -664,6 +664,11 @@ views.update_book_from_remote, name="book-update-remote", ), + re_path( + rf"{BOOK_PATH}/create-suggestion-list/?$", + views.create_suggestion_list, + name="book-create-suggestion-list", + ), re_path( r"^author/(?P\d+)/update/(?P[\w\.]+)/?$", views.update_author_from_remote, diff --git a/bookwyrm/views/__init__.py b/bookwyrm/views/__init__.py index db88f1ae28..0e815853ec 100644 --- a/bookwyrm/views/__init__.py +++ b/bookwyrm/views/__init__.py @@ -49,6 +49,7 @@ upload_cover, add_description, resolve_book, + create_suggestion_list, ) from .books.books import update_book_from_remote from .books.edit_book import ( diff --git a/bookwyrm/views/books/books.py b/bookwyrm/views/books/books.py index 565220b6ea..9339840694 100644 --- a/bookwyrm/views/books/books.py +++ b/bookwyrm/views/books/books.py @@ -208,3 +208,23 @@ def update_book_from_remote(request, book_id, connector_identifier): return Book().get(request, book_id, update_error=True) return redirect("book", book.id) + + +@login_required +@require_POST +def create_suggestion_list(request, book_id): + """create a suggestion_list""" + form = forms.SuggestionListForm(request.POST) + book = get_object_or_404(models.Edition, id=book_id) + + if not form.is_valid(): + return redirect("book", book.id) + suggestion_list = form.save(request, commit=False) + + # default values for the suggestion list + suggestion_list.privacy = "public" + suggestion_list.curation = "open" + suggestion_list.save() + + return redirect("book", book.id) + From fe05e319037b68eb433855c8514e69fa2714cbb6 Mon Sep 17 00:00:00 2001 From: Joachim Date: Sun, 1 Jan 2023 14:27:54 +0100 Subject: [PATCH 003/962] Fix field doc --- bookwyrm/models/fields.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bookwyrm/models/fields.py b/bookwyrm/models/fields.py index dbced6d984..572e4a3395 100644 --- a/bookwyrm/models/fields.py +++ b/bookwyrm/models/fields.py @@ -528,11 +528,11 @@ class BooleanField(ActivitypubFieldMixin, models.BooleanField): class IntegerField(ActivitypubFieldMixin, models.IntegerField): - """activitypub-aware boolean field""" + """activitypub-aware integer field""" class DecimalField(ActivitypubFieldMixin, models.DecimalField): - """activitypub-aware boolean field""" + """activitypub-aware decimal field""" def field_to_activity(self, value): if not value: From 25af64f03d88a0bf9880ea05f384d1717908b586 Mon Sep 17 00:00:00 2001 From: Joachim Date: Sun, 1 Jan 2023 15:32:25 +0100 Subject: [PATCH 004/962] Display books in list --- bookwyrm/templates/book/book.html | 9 ++- .../templates/book/suggestion_list/list.html | 72 +++++++++++++++++-- 2 files changed, 69 insertions(+), 12 deletions(-) diff --git a/bookwyrm/templates/book/book.html b/bookwyrm/templates/book/book.html index 2a69829e56..e920a496ca 100644 --- a/bookwyrm/templates/book/book.html +++ b/bookwyrm/templates/book/book.html @@ -344,10 +344,6 @@

{% trans "Your reading activity" %}

-
- {% include "book/suggestion_list/list.html" %} -
- {% if book.subjects %}

{% trans "Subjects" %}

@@ -408,8 +404,11 @@

{% trans "Lists" %}

- + +
+ {% include "book/suggestion_list/list.html" %} +
{% endwith %} {% endblock %} diff --git a/bookwyrm/templates/book/suggestion_list/list.html b/bookwyrm/templates/book/suggestion_list/list.html index 8f9ad179ac..d75e7c27a8 100644 --- a/bookwyrm/templates/book/suggestion_list/list.html +++ b/bookwyrm/templates/book/suggestion_list/list.html @@ -1,11 +1,69 @@ {% load i18n %} + +

+ {% trans "Suggestions" %} +

+ {% if book.suggestionlist %} -

{% trans "Suggestions" %}

+{% with book.suggestionlist.listitem_set.all as items %} + + {% if items.count == 0 %} +
+

+ {% trans "There are currently no suggestions." %} +
+

+

+ +

+
+ {% else %} +
    + {% for item in items %} +
  1. +
    +
    + {% with book=item.book %} + + +

    + {% include 'snippets/book_titleby.html' %} +

    + {% endwith %} +
    + +
    +
  2. + {% endfor %} +
+ {% endif %} +{% endwith %} {% else %} -
- {% csrf_token %} - - - -
+
+
+ {% csrf_token %} + + + +
+
{% endif %} From 4712673f945533e98708aba9cf8b414ff8cdccc6 Mon Sep 17 00:00:00 2001 From: Joachim Date: Sun, 1 Jan 2023 16:48:19 +0100 Subject: [PATCH 005/962] Add book suggestion --- .../templates/book/suggestion_list/list.html | 25 ++++----- .../book/suggestion_list/search.html | 54 +++++++++++++++++++ bookwyrm/templates/lists/add_item_modal.html | 6 ++- bookwyrm/urls.py | 5 ++ bookwyrm/views/__init__.py | 1 + bookwyrm/views/books/books.py | 36 ++++++++++++- bookwyrm/views/list/list.py | 10 ++-- 7 files changed, 118 insertions(+), 19 deletions(-) create mode 100644 bookwyrm/templates/book/suggestion_list/search.html diff --git a/bookwyrm/templates/book/suggestion_list/list.html b/bookwyrm/templates/book/suggestion_list/list.html index d75e7c27a8..cf97b53cde 100644 --- a/bookwyrm/templates/book/suggestion_list/list.html +++ b/bookwyrm/templates/book/suggestion_list/list.html @@ -1,23 +1,17 @@ {% load i18n %} -

+

{% trans "Suggestions" %}

{% if book.suggestionlist %} {% with book.suggestionlist.listitem_set.all as items %} - {% if items.count == 0 %} -
-

- {% trans "There are currently no suggestions." %} -
-

-

- -

+ {% if items|length == 0 %} +
+
+ {% include "book/suggestion_list/search.html" %} +
{% else %}
    @@ -28,7 +22,7 @@

    {% with book=item.book %} @@ -54,12 +48,15 @@

    {% endfor %} +
  1. + {% include "book/suggestion_list/search.html" %} +
{% endif %} {% endwith %} {% else %}
-
+ {% csrf_token %} diff --git a/bookwyrm/templates/book/suggestion_list/search.html b/bookwyrm/templates/book/suggestion_list/search.html new file mode 100644 index 0000000000..989583a0c6 --- /dev/null +++ b/bookwyrm/templates/book/suggestion_list/search.html @@ -0,0 +1,54 @@ +{% load i18n %} +{% load utilities %} + +{% if request.user.is_authenticated %} +{% with book.suggestionlist as list %} +

+ {% trans "Add suggestions" %} +

+ +
+
+ +
+
+ +
+
+ {% if query %} +

{% trans "Clear search" %}

+ {% endif %} +
+ {% if not suggested_books %} + {% if query %} +

{% blocktrans %}No books found matching the query "{{ query }}"{% endblocktrans %}

{% else %} +

{% trans "No books found" %}

+ {% endif %} + {% endif %} + + {% if suggested_books|length > 0 %} + {% for book in suggested_books %} +
+
+

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

+ + {% join "add_item" list.id book.id as modal_id %} + + {% include "lists/add_item_modal.html" with id=modal_id is_suggestion=True %} +
+
+ {% endfor %} + {% endif %} +{% endwith %} +{% endif %} + diff --git a/bookwyrm/templates/lists/add_item_modal.html b/bookwyrm/templates/lists/add_item_modal.html index 2c586b308c..184911cfca 100644 --- a/bookwyrm/templates/lists/add_item_modal.html +++ b/bookwyrm/templates/lists/add_item_modal.html @@ -19,7 +19,11 @@
{% endblock %} diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py index 7ee4bca8e0..6c5d4f993c 100644 --- a/bookwyrm/urls.py +++ b/bookwyrm/urls.py @@ -669,6 +669,11 @@ views.create_suggestion_list, name="book-create-suggestion-list", ), + re_path( + rf"{BOOK_PATH}/book-add-suggestion/?$", + views.book_add_suggestion, + name="book-add-suggestion", + ), re_path( r"^author/(?P\d+)/update/(?P[\w\.]+)/?$", views.update_author_from_remote, diff --git a/bookwyrm/views/__init__.py b/bookwyrm/views/__init__.py index 0e815853ec..b35e833247 100644 --- a/bookwyrm/views/__init__.py +++ b/bookwyrm/views/__init__.py @@ -50,6 +50,7 @@ add_description, resolve_book, create_suggestion_list, + book_add_suggestion, ) from .books.books import update_book_from_remote from .books.edit_book import ( diff --git a/bookwyrm/views/books/books.py b/bookwyrm/views/books/books.py index 9339840694..4d7ffecf92 100644 --- a/bookwyrm/views/books/books.py +++ b/bookwyrm/views/books/books.py @@ -3,7 +3,8 @@ from django.contrib.auth.decorators import login_required, permission_required from django.core.paginator import Paginator -from django.db.models import Avg, Q +from django.db import transaction +from django.db.models import Avg, Q, Max from django.http import Http404 from django.shortcuts import get_object_or_404, redirect from django.template.response import TemplateResponse @@ -16,6 +17,7 @@ from bookwyrm.connectors.abstract_connector import get_image from bookwyrm.settings import PAGE_LENGTH from bookwyrm.views.helpers import is_api_request, maybe_redirect_local_path +from bookwyrm.views.list.list import get_list_suggestions, increment_order_in_reverse # pylint: disable=no-self-use @@ -74,6 +76,8 @@ def get(self, request, book_id, **kwargs): queryset = queryset.select_related("user").order_by("-published_date") paginated = Paginator(queryset, PAGE_LENGTH) + query = request.GET.get("suggestion_query", "") + lists = models.List.privacy_filter(request.user,).filter( listitem__approved=True, listitem__book__in=book.parent_work.editions.all(), @@ -90,6 +94,7 @@ def get(self, request, book_id, **kwargs): "rating": reviews.aggregate(Avg("rating"))["rating__avg"], "lists": lists, "update_error": kwargs.get("update_error", False), + "query": query, } if request.user.is_authenticated: @@ -122,6 +127,10 @@ def get(self, request, book_id, **kwargs): "comment_count": book.comment_set.filter(**filters).count(), "quotation_count": book.quotation_set.filter(**filters).count(), } + if hasattr(book, "suggestionlist"): + data["suggested_books"] = get_list_suggestions( + book.suggestionlist, request.user, query=query, ignore_id=book.id, + ) return TemplateResponse(request, "book/book.html", data) @@ -228,3 +237,28 @@ def create_suggestion_list(request, book_id): return redirect("book", book.id) + +@login_required +@require_POST +@transaction.atomic +def book_add_suggestion(request, book_id): + """put a book on the suggestion list""" + book_list = get_object_or_404(models.List, id=request.POST.get("book_list")) + + form = forms.ListItemForm(request.POST) + if not form.is_valid(): + return Book().get(request, book_id, add_failed=True) + + item = form.save(request, commit=False) + + # add the book at the latest order of approved books, before pending books + order_max = ( + book_list.listitem_set.filter(approved=True).aggregate(Max("order"))[ + "order__max" + ] + ) or 0 + increment_order_in_reverse(book_list.id, order_max + 1) + item.order = order_max + 1 + item.save() + + return Book().get(request, book_id, add_succeeded=True) diff --git a/bookwyrm/views/list/list.py b/bookwyrm/views/list/list.py index 1adf7a6797..a8f31b5c05 100644 --- a/bookwyrm/views/list/list.py +++ b/bookwyrm/views/list/list.py @@ -94,22 +94,26 @@ def post(self, request, list_id): return redirect(book_list.local_path) -def get_list_suggestions(book_list, user, query=None): +def get_list_suggestions(book_list, user, query=None, ignore_id=None): """What books might a user want to add to a list""" if query: # search for books return book_search.search( query, - filters=[~Q(parent_work__editions__in=book_list.books.all())], + filters=[ + ~Q(parent_work__editions__in=book_list.books.all()), + ~Q(parent_work__editions__in=[ignore_id]), + ], ) # just suggest whatever books are nearby - suggestions = user.shelfbook_set.filter(~Q(book__in=book_list.books.all())) + suggestions = user.shelfbook_set.filter(~Q(book__in=book_list.books.all())).exclude(book__id=ignore_id) suggestions = [s.book for s in suggestions[:5]] if len(suggestions) < 5: suggestions += [ s.default_edition for s in models.Work.objects.filter( ~Q(editions__in=book_list.books.all()), + ~Q(editions__in=[ignore_id]), ).order_by("-updated_date")[: 5 - len(suggestions)] ] return suggestions From aee1af52fb4e5499a686d2ba076bf7bac23b0076 Mon Sep 17 00:00:00 2001 From: Joachim Date: Sun, 1 Jan 2023 16:53:19 +0100 Subject: [PATCH 006/962] =?UTF-8?q?black=20=E2=9C=A8=20=F0=9F=8D=B0=20?= =?UTF-8?q?=E2=9C=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bookwyrm/migrations/0173_suggestionlist.py | 28 +++++++++++++++++----- bookwyrm/views/books/books.py | 7 ++++-- bookwyrm/views/list/list.py | 4 +++- 3 files changed, 30 insertions(+), 9 deletions(-) diff --git a/bookwyrm/migrations/0173_suggestionlist.py b/bookwyrm/migrations/0173_suggestionlist.py index b056b3cb03..96e9341e27 100644 --- a/bookwyrm/migrations/0173_suggestionlist.py +++ b/bookwyrm/migrations/0173_suggestionlist.py @@ -8,19 +8,35 @@ class Migration(migrations.Migration): dependencies = [ - ('bookwyrm', '0172_alter_user_preferred_language'), + ("bookwyrm", "0172_alter_user_preferred_language"), ] operations = [ migrations.CreateModel( - name='SuggestionList', + name="SuggestionList", fields=[ - ('list_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='bookwyrm.list')), - ('book', bookwyrm.models.fields.OneToOneField(on_delete=django.db.models.deletion.PROTECT, to='bookwyrm.edition')), + ( + "list_ptr", + models.OneToOneField( + auto_created=True, + on_delete=django.db.models.deletion.CASCADE, + parent_link=True, + primary_key=True, + serialize=False, + to="bookwyrm.list", + ), + ), + ( + "book", + bookwyrm.models.fields.OneToOneField( + on_delete=django.db.models.deletion.PROTECT, + to="bookwyrm.edition", + ), + ), ], options={ - 'abstract': False, + "abstract": False, }, - bases=('bookwyrm.list',), + bases=("bookwyrm.list",), ), ] diff --git a/bookwyrm/views/books/books.py b/bookwyrm/views/books/books.py index 4d7ffecf92..b577beeef1 100644 --- a/bookwyrm/views/books/books.py +++ b/bookwyrm/views/books/books.py @@ -129,7 +129,10 @@ def get(self, request, book_id, **kwargs): } if hasattr(book, "suggestionlist"): data["suggested_books"] = get_list_suggestions( - book.suggestionlist, request.user, query=query, ignore_id=book.id, + book.suggestionlist, + request.user, + query=query, + ignore_id=book.id, ) return TemplateResponse(request, "book/book.html", data) @@ -225,7 +228,7 @@ def create_suggestion_list(request, book_id): """create a suggestion_list""" form = forms.SuggestionListForm(request.POST) book = get_object_or_404(models.Edition, id=book_id) - + if not form.is_valid(): return redirect("book", book.id) suggestion_list = form.save(request, commit=False) diff --git a/bookwyrm/views/list/list.py b/bookwyrm/views/list/list.py index a8f31b5c05..61f870928b 100644 --- a/bookwyrm/views/list/list.py +++ b/bookwyrm/views/list/list.py @@ -106,7 +106,9 @@ def get_list_suggestions(book_list, user, query=None, ignore_id=None): ], ) # just suggest whatever books are nearby - suggestions = user.shelfbook_set.filter(~Q(book__in=book_list.books.all())).exclude(book__id=ignore_id) + suggestions = user.shelfbook_set.filter(~Q(book__in=book_list.books.all())).exclude( + book__id=ignore_id + ) suggestions = [s.book for s in suggestions[:5]] if len(suggestions) < 5: suggestions += [ From 3cb548f059878c8ae2a9ebbf491bc738b5956270 Mon Sep 17 00:00:00 2001 From: Joachim Date: Sun, 1 Jan 2023 17:52:43 +0100 Subject: [PATCH 007/962] Switch from subclass to new column --- bookwyrm/forms/lists.py | 4 +- bookwyrm/migrations/0173_list_suggests_for.py | 26 ++++++++++++ bookwyrm/migrations/0173_suggestionlist.py | 42 ------------------- bookwyrm/models/__init__.py | 2 +- bookwyrm/models/list.py | 16 +++---- bookwyrm/views/books/books.py | 4 +- bookwyrm/views/list/lists.py | 11 ++++- 7 files changed, 48 insertions(+), 57 deletions(-) create mode 100644 bookwyrm/migrations/0173_list_suggests_for.py delete mode 100644 bookwyrm/migrations/0173_suggestionlist.py diff --git a/bookwyrm/forms/lists.py b/bookwyrm/forms/lists.py index 945c2889df..29c17bc0e5 100644 --- a/bookwyrm/forms/lists.py +++ b/bookwyrm/forms/lists.py @@ -16,8 +16,8 @@ class Meta: class SuggestionListForm(CustomForm): class Meta: - model = models.SuggestionList - fields = ["user", "book"] + model = models.List + fields = ["user", "suggests_for"] class ListItemForm(CustomForm): diff --git a/bookwyrm/migrations/0173_list_suggests_for.py b/bookwyrm/migrations/0173_list_suggests_for.py new file mode 100644 index 0000000000..48c9456967 --- /dev/null +++ b/bookwyrm/migrations/0173_list_suggests_for.py @@ -0,0 +1,26 @@ +# Generated by Django 3.2.16 on 2023-01-01 16:19 + +import bookwyrm.models.fields +from django.db import migrations +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0172_alter_user_preferred_language"), + ] + + operations = [ + migrations.AddField( + model_name="list", + name="suggests_for", + field=bookwyrm.models.fields.OneToOneField( + default=None, + null=True, + on_delete=django.db.models.deletion.PROTECT, + related_name="suggestion_list", + to="bookwyrm.edition", + ), + ), + ] diff --git a/bookwyrm/migrations/0173_suggestionlist.py b/bookwyrm/migrations/0173_suggestionlist.py deleted file mode 100644 index 96e9341e27..0000000000 --- a/bookwyrm/migrations/0173_suggestionlist.py +++ /dev/null @@ -1,42 +0,0 @@ -# Generated by Django 3.2.16 on 2023-01-01 12:26 - -import bookwyrm.models.fields -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ("bookwyrm", "0172_alter_user_preferred_language"), - ] - - operations = [ - migrations.CreateModel( - name="SuggestionList", - fields=[ - ( - "list_ptr", - models.OneToOneField( - auto_created=True, - on_delete=django.db.models.deletion.CASCADE, - parent_link=True, - primary_key=True, - serialize=False, - to="bookwyrm.list", - ), - ), - ( - "book", - bookwyrm.models.fields.OneToOneField( - on_delete=django.db.models.deletion.PROTECT, - to="bookwyrm.edition", - ), - ), - ], - options={ - "abstract": False, - }, - bases=("bookwyrm.list",), - ), - ] diff --git a/bookwyrm/models/__init__.py b/bookwyrm/models/__init__.py index ae2be0aff0..ae70001623 100644 --- a/bookwyrm/models/__init__.py +++ b/bookwyrm/models/__init__.py @@ -8,7 +8,7 @@ from .connector import Connector from .shelf import Shelf, ShelfBook -from .list import List, SuggestionList, ListItem +from .list import List, ListItem from .status import Status, GeneratedNote, Comment, Quotation from .status import Review, ReviewRating diff --git a/bookwyrm/models/list.py b/bookwyrm/models/list.py index 080bfd49c8..2c5e1e9779 100644 --- a/bookwyrm/models/list.py +++ b/bookwyrm/models/list.py @@ -47,6 +47,14 @@ class List(OrderedCollectionMixin, BookWyrmModel): ) embed_key = models.UUIDField(unique=True, null=True, editable=False) activity_serializer = activitypub.BookList + suggests_for = fields.OneToOneField( + "Edition", + on_delete=models.PROTECT, + activitypub_field="book", + related_name="suggestion_list", + default=None, + null=True, + ) def get_remote_id(self): """don't want the user to be in there in this case""" @@ -131,14 +139,6 @@ def save(self, *args, **kwargs): super().save(*args, **kwargs) -class SuggestionList(List): - """List related to a specific book""" - - book = fields.OneToOneField( - "Edition", on_delete=models.PROTECT, activitypub_field="book" - ) - - class ListItem(CollectionItemMixin, BookWyrmModel): """ok""" diff --git a/bookwyrm/views/books/books.py b/bookwyrm/views/books/books.py index b577beeef1..b55af8ea6b 100644 --- a/bookwyrm/views/books/books.py +++ b/bookwyrm/views/books/books.py @@ -127,9 +127,9 @@ def get(self, request, book_id, **kwargs): "comment_count": book.comment_set.filter(**filters).count(), "quotation_count": book.quotation_set.filter(**filters).count(), } - if hasattr(book, "suggestionlist"): + if hasattr(book, "suggestion_list"): data["suggested_books"] = get_list_suggestions( - book.suggestionlist, + book.suggestion_list, request.user, query=query, ignore_id=book.id, diff --git a/bookwyrm/views/list/lists.py b/bookwyrm/views/list/lists.py index 2514fad58b..90cca49737 100644 --- a/bookwyrm/views/list/lists.py +++ b/bookwyrm/views/list/lists.py @@ -21,6 +21,7 @@ def get(self, request): lists = ListsStream().get_list_stream(request.user) else: lists = models.List.objects.filter(privacy="public") + lists = lists.filter(suggests_for__isnull=True) paginated = Paginator(lists, 12) data = { "lists": paginated.get_page(request.GET.get("page")), @@ -53,7 +54,9 @@ class SavedLists(View): def get(self, request): """display book lists""" # hide lists with no approved books - lists = request.user.saved_lists.order_by("-updated_date") + lists = request.user.saved_lists.order_by("-updated_date").filter( + suggests_for__isnull=True + ) paginated = Paginator(lists, 12) data = { @@ -71,7 +74,11 @@ class UserLists(View): def get(self, request, username): """display a book list""" user = get_user_from_username(request.user, username) - lists = models.List.privacy_filter(request.user).filter(user=user) + lists = ( + models.List.privacy_filter(request.user) + .filter(user=user) + .filter(suggests_for__isnull=True) + ) paginated = Paginator(lists, 12) data = { From 630bbc1075a4740c5a7a7b5eab459ea1db3f1265 Mon Sep 17 00:00:00 2001 From: Joachim Date: Sun, 1 Jan 2023 17:53:08 +0100 Subject: [PATCH 008/962] Update template with new column names --- bookwyrm/templates/book/suggestion_list/list.html | 6 +++--- bookwyrm/templates/book/suggestion_list/search.html | 2 +- bookwyrm/templates/lists/add_item_modal.html | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/bookwyrm/templates/book/suggestion_list/list.html b/bookwyrm/templates/book/suggestion_list/list.html index cf97b53cde..a5249b3f89 100644 --- a/bookwyrm/templates/book/suggestion_list/list.html +++ b/bookwyrm/templates/book/suggestion_list/list.html @@ -4,8 +4,8 @@

{% trans "Suggestions" %}

-{% if book.suggestionlist %} -{% with book.suggestionlist.listitem_set.all as items %} +{% if book.suggestion_list %} +{% with book.suggestion_list.listitem_set.all as items %} {% if items|length == 0 %}
@@ -59,7 +59,7 @@

{% csrf_token %} - +

diff --git a/bookwyrm/templates/book/suggestion_list/search.html b/bookwyrm/templates/book/suggestion_list/search.html index 989583a0c6..8edd5fd7db 100644 --- a/bookwyrm/templates/book/suggestion_list/search.html +++ b/bookwyrm/templates/book/suggestion_list/search.html @@ -2,7 +2,7 @@ {% load utilities %} {% if request.user.is_authenticated %} -{% with book.suggestionlist as list %} +{% with book.suggestion_list as list %}

{% trans "Add suggestions" %}

diff --git a/bookwyrm/templates/lists/add_item_modal.html b/bookwyrm/templates/lists/add_item_modal.html index 184911cfca..254d17b99d 100644 --- a/bookwyrm/templates/lists/add_item_modal.html +++ b/bookwyrm/templates/lists/add_item_modal.html @@ -20,7 +20,7 @@ name="add-book-{{ book.id }}" method="POST" {% if is_suggestion %} - action="{% url 'book-add-suggestion' book_id=list.book.id %}{% if query %}?suggestion_query={{ query }}#suggestions-section{% endif %}" + action="{% url 'book-add-suggestion' book_id=list.suggests_for.id %}{% if query %}?suggestion_query={{ query }}#suggestions-section{% endif %}" {% else %} action="{% url 'list-add-book' %}{% if query %}?q={{ query }}{% endif %}" {% endif %} From 6de97aebde6e64afb70979ba51d391b10fbff43b Mon Sep 17 00:00:00 2001 From: Joachim Date: Sun, 1 Jan 2023 18:01:15 +0100 Subject: [PATCH 009/962] Add get_name for dynamically generated name and description --- bookwyrm/models/list.py | 18 ++++++++++++++++++ bookwyrm/templates/lists/embed-list.html | 2 +- bookwyrm/templates/lists/layout.html | 6 +++--- bookwyrm/templates/lists/list.html | 4 ++-- bookwyrm/templates/lists/list_items.html | 8 ++++---- 5 files changed, 28 insertions(+), 10 deletions(-) diff --git a/bookwyrm/models/list.py b/bookwyrm/models/list.py index 2c5e1e9779..2b18b733c9 100644 --- a/bookwyrm/models/list.py +++ b/bookwyrm/models/list.py @@ -5,6 +5,7 @@ from django.db import models from django.db.models import Q from django.utils import timezone +from django.utils.translation import gettext_lazy as _ from bookwyrm import activitypub from bookwyrm.settings import DOMAIN @@ -65,6 +66,23 @@ def collection_queryset(self): """list of books for this shelf, overrides OrderedCollectionMixin""" return self.books.filter(listitem__approved=True).order_by("listitem") + @property + def get_name(self): + if self.suggests_for: + return _("Suggestions for %(title)s") % {"title": self.suggests_for.title} + + return self.name + + @property + def get_description(self): + if self.suggests_for: + return _("This is the list of suggestions for %(title)s") % { + "title": self.suggests_for.title, + "url": self.suggests_for.local_path, + } + + return self.description + class Meta: """default sorting""" diff --git a/bookwyrm/templates/lists/embed-list.html b/bookwyrm/templates/lists/embed-list.html index d9a50a4646..411763eab2 100644 --- a/bookwyrm/templates/lists/embed-list.html +++ b/bookwyrm/templates/lists/embed-list.html @@ -21,7 +21,7 @@

- {% include 'snippets/trimmed_text.html' with full=list.description %} + {% include 'snippets/trimmed_text.html' with full=list.get_description %}
diff --git a/bookwyrm/templates/lists/layout.html b/bookwyrm/templates/lists/layout.html index e61d72b562..f1f52c7cab 100644 --- a/bookwyrm/templates/lists/layout.html +++ b/bookwyrm/templates/lists/layout.html @@ -1,12 +1,12 @@ {% extends 'layout.html' %} {% load i18n %} -{% block title %}{{ list.name }}{% endblock %} +{% block title %}{{ list.get_name }}{% endblock %} {% block content %}
-

{{ list.name }} {% include 'snippets/privacy-icons.html' with item=list %}

+

{{ list.get_name }} {% include 'snippets/privacy-icons.html' with item=list %}

{% include 'lists/created_text.html' with list=list %}

@@ -28,7 +28,7 @@

{{ list.name }} {% include 'snippets/pr {% block breadcrumbs %}{% endblock %}
- {% include 'snippets/trimmed_text.html' with full=list.description %} + {% include 'snippets/trimmed_text.html' with full=list.get_description %}
diff --git a/bookwyrm/templates/lists/list.html b/bookwyrm/templates/lists/list.html index 6824f50076..04fcd253c8 100644 --- a/bookwyrm/templates/lists/list.html +++ b/bookwyrm/templates/lists/list.html @@ -12,7 +12,7 @@
  • {% trans "Lists" %}
  • - {{ list.name|truncatechars:30 }} + {{ list.get_name|truncatechars:30 }}
  • @@ -275,7 +275,7 @@

    data-copytext data-copytext-label="{% trans 'Copy embed code' %}" data-copytext-success="{% trans 'Copied!' %}" - ><iframe style="border-width:0;" id="bookwyrm_list_embed" width="400" height="600" title="{% blocktrans trimmed with list_name=list.name site_name=site.name owner=list.user.display_name %} + ><iframe style="border-width:0;" id="bookwyrm_list_embed" width="400" height="600" title="{% blocktrans trimmed with list_name=list.get_name site_name=site.name owner=list.user.display_name %} {{ list_name }}, a list by {{owner}} on {{ site_name }} {% endblocktrans %}" src="{{ embed_url }}"></iframe>

    diff --git a/bookwyrm/templates/lists/list_items.html b/bookwyrm/templates/lists/list_items.html index 1191a62647..1e73847a38 100644 --- a/bookwyrm/templates/lists/list_items.html +++ b/bookwyrm/templates/lists/list_items.html @@ -8,7 +8,7 @@

    - {{ list.name }} {% include 'snippets/privacy-icons.html' with item=list %} + {{ list.get_name }} {% include 'snippets/privacy-icons.html' with item=list %}

    {% if request.user.is_authenticated and request.user|saved:list %}
    @@ -33,9 +33,9 @@

    {% endwith %}
    -
    - {% if list.description %} - {{ list.description|to_markdown|safe|truncatechars_html:30 }} +
    + {% if list.get_description %} + {{ list.get_description|to_markdown|safe|truncatechars_html:30 }} {% else %}   {% endif %} From f81c1611fed4a60277741f99f5fb2df4475f9645 Mon Sep 17 00:00:00 2001 From: Joachim Date: Sun, 1 Jan 2023 18:09:48 +0100 Subject: [PATCH 010/962] Limit what's displayed on list page --- bookwyrm/templates/lists/layout.html | 4 +++- bookwyrm/templates/lists/list.html | 2 ++ bookwyrm/views/list/list.py | 2 +- bookwyrm/views/list/lists.py | 4 +--- 4 files changed, 7 insertions(+), 5 deletions(-) diff --git a/bookwyrm/templates/lists/layout.html b/bookwyrm/templates/lists/layout.html index f1f52c7cab..fb4dacacb4 100644 --- a/bookwyrm/templates/lists/layout.html +++ b/bookwyrm/templates/lists/layout.html @@ -7,13 +7,15 @@

    {{ list.get_name }} {% include 'snippets/privacy-icons.html' with item=list %}

    + {% if list.suggests_for == None %}

    {% include 'lists/created_text.html' with list=list %}

    + {% endif %}
    - {% if request.user == list.user %} + {% if request.user == list.user and list.suggests_for == None %}
    {% trans "Edit List" as button_text %} {% include 'snippets/toggle/open_button.html' with text=button_text icon_with_text="pencil" controls_text="edit_list" focus="edit_list_header" %} diff --git a/bookwyrm/templates/lists/list.html b/bookwyrm/templates/lists/list.html index 04fcd253c8..6a5208a555 100644 --- a/bookwyrm/templates/lists/list.html +++ b/bookwyrm/templates/lists/list.html @@ -177,6 +177,7 @@

    + {% if list.suggests_for == None %}

    {% trans "Sort List" %}

    @@ -199,6 +200,7 @@

    + {% endif %} {% if request.user.is_authenticated and not list.curation == 'closed' or request.user == list.user %}

    {% if list.curation == 'open' or request.user == list.user or list.group|is_member:request.user %} diff --git a/bookwyrm/views/list/list.py b/bookwyrm/views/list/list.py index 61f870928b..079d7a035e 100644 --- a/bookwyrm/views/list/list.py +++ b/bookwyrm/views/list/list.py @@ -73,7 +73,7 @@ def get(self, request, list_id, **kwargs): if request.user.is_authenticated: data["suggested_books"] = get_list_suggestions( - book_list, request.user, query=query + book_list, request.user, query=query, ignore_id=book_list.suggests_for.id ) return TemplateResponse(request, "lists/list.html", data) diff --git a/bookwyrm/views/list/lists.py b/bookwyrm/views/list/lists.py index 90cca49737..ff4c931779 100644 --- a/bookwyrm/views/list/lists.py +++ b/bookwyrm/views/list/lists.py @@ -54,9 +54,7 @@ class SavedLists(View): def get(self, request): """display book lists""" # hide lists with no approved books - lists = request.user.saved_lists.order_by("-updated_date").filter( - suggests_for__isnull=True - ) + lists = request.user.saved_lists.order_by("-updated_date") paginated = Paginator(lists, 12) data = { From 067ce297bc9c9ad11a4dce556263fd1c12c24002 Mon Sep 17 00:00:00 2001 From: Joachim Date: Sun, 1 Jan 2023 18:14:04 +0100 Subject: [PATCH 011/962] black --- bookwyrm/models/list.py | 4 +++- bookwyrm/views/list/list.py | 5 ++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/bookwyrm/models/list.py b/bookwyrm/models/list.py index 2b18b733c9..2862a0695c 100644 --- a/bookwyrm/models/list.py +++ b/bookwyrm/models/list.py @@ -76,7 +76,9 @@ def get_name(self): @property def get_description(self): if self.suggests_for: - return _("This is the list of suggestions for %(title)s") % { + return _( + "This is the list of suggestions for %(title)s" + ) % { "title": self.suggests_for.title, "url": self.suggests_for.local_path, } diff --git a/bookwyrm/views/list/list.py b/bookwyrm/views/list/list.py index 079d7a035e..ef9c7a53d3 100644 --- a/bookwyrm/views/list/list.py +++ b/bookwyrm/views/list/list.py @@ -73,7 +73,10 @@ def get(self, request, list_id, **kwargs): if request.user.is_authenticated: data["suggested_books"] = get_list_suggestions( - book_list, request.user, query=query, ignore_id=book_list.suggests_for.id + book_list, + request.user, + query=query, + ignore_id=book_list.suggests_for.id, ) return TemplateResponse(request, "lists/list.html", data) From 2faaea6ef76e19968a0ddf611f2b2cb472ac6027 Mon Sep 17 00:00:00 2001 From: Joachim Date: Sun, 1 Jan 2023 18:14:26 +0100 Subject: [PATCH 012/962] docstrings --- bookwyrm/models/list.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bookwyrm/models/list.py b/bookwyrm/models/list.py index 2862a0695c..68ce6e8621 100644 --- a/bookwyrm/models/list.py +++ b/bookwyrm/models/list.py @@ -68,6 +68,7 @@ def collection_queryset(self): @property def get_name(self): + """The name comes from the book title if it's a suggestion list""" if self.suggests_for: return _("Suggestions for %(title)s") % {"title": self.suggests_for.title} @@ -75,6 +76,7 @@ def get_name(self): @property def get_description(self): + """The description comes from the book title if it's a suggestion list""" if self.suggests_for: return _( "This is the list of suggestions for %(title)s" From 62c9c71343f187112d18188e7f82058d49576458 Mon Sep 17 00:00:00 2001 From: Joachim Date: Sun, 1 Jan 2023 18:31:24 +0100 Subject: [PATCH 013/962] Replace ignore_id with ignore_book --- bookwyrm/views/books/books.py | 2 +- bookwyrm/views/list/list.py | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/bookwyrm/views/books/books.py b/bookwyrm/views/books/books.py index b55af8ea6b..ff2d2ce551 100644 --- a/bookwyrm/views/books/books.py +++ b/bookwyrm/views/books/books.py @@ -132,7 +132,7 @@ def get(self, request, book_id, **kwargs): book.suggestion_list, request.user, query=query, - ignore_id=book.id, + ignore_book=book, ) return TemplateResponse(request, "book/book.html", data) diff --git a/bookwyrm/views/list/list.py b/bookwyrm/views/list/list.py index ef9c7a53d3..11b4cd77f7 100644 --- a/bookwyrm/views/list/list.py +++ b/bookwyrm/views/list/list.py @@ -76,7 +76,7 @@ def get(self, request, list_id, **kwargs): book_list, request.user, query=query, - ignore_id=book_list.suggests_for.id, + ignore_book=book_list.suggests_for, ) return TemplateResponse(request, "lists/list.html", data) @@ -97,7 +97,7 @@ def post(self, request, list_id): return redirect(book_list.local_path) -def get_list_suggestions(book_list, user, query=None, ignore_id=None): +def get_list_suggestions(book_list, user, query=None, ignore_book=None): """What books might a user want to add to a list""" if query: # search for books @@ -105,12 +105,12 @@ def get_list_suggestions(book_list, user, query=None, ignore_id=None): query, filters=[ ~Q(parent_work__editions__in=book_list.books.all()), - ~Q(parent_work__editions__in=[ignore_id]), + ~Q(parent_work__editions__in=[ignore_book]), ], ) # just suggest whatever books are nearby suggestions = user.shelfbook_set.filter(~Q(book__in=book_list.books.all())).exclude( - book__id=ignore_id + book=ignore_book ) suggestions = [s.book for s in suggestions[:5]] if len(suggestions) < 5: @@ -118,7 +118,7 @@ def get_list_suggestions(book_list, user, query=None, ignore_id=None): s.default_edition for s in models.Work.objects.filter( ~Q(editions__in=book_list.books.all()), - ~Q(editions__in=[ignore_id]), + ~Q(editions__in=[ignore_book]), ).order_by("-updated_date")[: 5 - len(suggestions)] ] return suggestions From 80ce4eca459d5bdb57e6767b9f7ec9b5e0973f71 Mon Sep 17 00:00:00 2001 From: Joachim Date: Sun, 1 Jan 2023 18:46:34 +0100 Subject: [PATCH 014/962] Display the right lists in the Book sidebar --- bookwyrm/templates/book/book.html | 2 +- bookwyrm/views/books/books.py | 22 ++++++++++++++-------- 2 files changed, 15 insertions(+), 9 deletions(-) diff --git a/bookwyrm/templates/book/book.html b/bookwyrm/templates/book/book.html index e920a496ca..62df9b2ea6 100644 --- a/bookwyrm/templates/book/book.html +++ b/bookwyrm/templates/book/book.html @@ -367,7 +367,7 @@

    {% trans "Places" %}

    {% endif %} - {% if lists.exists or request.user.list_set.exists %} + {% if lists.exists or list_options.exists %}

    {% trans "Lists" %}

      diff --git a/bookwyrm/views/books/books.py b/bookwyrm/views/books/books.py index ff2d2ce551..8c4ee0e1c0 100644 --- a/bookwyrm/views/books/books.py +++ b/bookwyrm/views/books/books.py @@ -76,11 +76,15 @@ def get(self, request, book_id, **kwargs): queryset = queryset.select_related("user").order_by("-published_date") paginated = Paginator(queryset, PAGE_LENGTH) - query = request.GET.get("suggestion_query", "") - - lists = models.List.privacy_filter(request.user,).filter( - listitem__approved=True, - listitem__book__in=book.parent_work.editions.all(), + lists = ( + models.List.privacy_filter( + request.user, + ) + .filter( + listitem__approved=True, + listitem__book__in=book.parent_work.editions.all(), + ) + .filter(suggests_for__isnull=True) ) data = { "book": book, @@ -94,11 +98,13 @@ def get(self, request, book_id, **kwargs): "rating": reviews.aggregate(Avg("rating"))["rating__avg"], "lists": lists, "update_error": kwargs.get("update_error", False), - "query": query, + "query": request.GET.get("suggestion_query", ""), } if request.user.is_authenticated: - data["list_options"] = request.user.list_set.exclude(id__in=data["lists"]) + data["list_options"] = request.user.list_set.filter( + suggests_for__isnull=True + ).exclude(id__in=data["lists"]) data["file_link_form"] = forms.FileLinkForm() readthroughs = models.ReadThrough.objects.filter( user=request.user, @@ -131,7 +137,7 @@ def get(self, request, book_id, **kwargs): data["suggested_books"] = get_list_suggestions( book.suggestion_list, request.user, - query=query, + query=request.GET.get("suggestion_query", ""), ignore_book=book, ) From 88da8257d56ccf776d26de30a4cc5c642040f7c6 Mon Sep 17 00:00:00 2001 From: Joachim Date: Sun, 1 Jan 2023 19:44:02 +0100 Subject: [PATCH 015/962] Update ordered_collection.py --- bookwyrm/activitypub/ordered_collection.py | 1 + 1 file changed, 1 insertion(+) diff --git a/bookwyrm/activitypub/ordered_collection.py b/bookwyrm/activitypub/ordered_collection.py index 32e37c9966..7d8437d09b 100644 --- a/bookwyrm/activitypub/ordered_collection.py +++ b/bookwyrm/activitypub/ordered_collection.py @@ -40,6 +40,7 @@ class BookList(OrderedCollectionPrivate): summary: str = None curation: str = "closed" + book: str type: str = "BookList" From bee38cdf1f2594d46c763d42a66fab2463ea378c Mon Sep 17 00:00:00 2001 From: Joachim Date: Sun, 1 Jan 2023 19:44:33 +0100 Subject: [PATCH 016/962] Add defauult --- bookwyrm/activitypub/ordered_collection.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/activitypub/ordered_collection.py b/bookwyrm/activitypub/ordered_collection.py index 7d8437d09b..a3da6d24cb 100644 --- a/bookwyrm/activitypub/ordered_collection.py +++ b/bookwyrm/activitypub/ordered_collection.py @@ -40,7 +40,7 @@ class BookList(OrderedCollectionPrivate): summary: str = None curation: str = "closed" - book: str + book: str = None type: str = "BookList" From 486278bbf44aaf4c63ffbd37852290ca9e71f0c9 Mon Sep 17 00:00:00 2001 From: Joachim Date: Tue, 1 Aug 2023 15:12:50 +0200 Subject: [PATCH 017/962] =?UTF-8?q?Black=20=F0=9F=95=B4=EF=B8=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bookwyrm/views/list/list.py | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/bookwyrm/views/list/list.py b/bookwyrm/views/list/list.py index ceb5fc2185..227725b2eb 100644 --- a/bookwyrm/views/list/list.py +++ b/bookwyrm/views/list/list.py @@ -102,8 +102,8 @@ def post(self, request, list_id): def get_list_suggestions( - book_list, user, query=None, num_suggestions=5, ignore_book=None - ): + book_list, user, query=None, num_suggestions=5, ignore_book=None +): """What books might a user want to add to a list""" if query: # search for books @@ -115,9 +115,11 @@ def get_list_suggestions( ], ) # just suggest whatever books are nearby - suggestions = user.shelfbook_set.filter( - ~Q(book__in=book_list.books.all()) - ).exclude(book=ignore_book).distinct()[:num_suggestions] + suggestions = ( + user.shelfbook_set.filter(~Q(book__in=book_list.books.all())) + .exclude(book=ignore_book) + .distinct()[:num_suggestions] + ) suggestions = [s.book for s in suggestions[:num_suggestions]] if len(suggestions) < num_suggestions: others = [ From 0f93833b4fcb91d8b094591ae7ea7eeff654fa82 Mon Sep 17 00:00:00 2001 From: Joachim Date: Tue, 1 Aug 2023 15:12:57 +0200 Subject: [PATCH 018/962] Update migration --- .../{0173_list_suggests_for.py => 0180_list_suggests_for.py} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename bookwyrm/migrations/{0173_list_suggests_for.py => 0180_list_suggests_for.py} (83%) diff --git a/bookwyrm/migrations/0173_list_suggests_for.py b/bookwyrm/migrations/0180_list_suggests_for.py similarity index 83% rename from bookwyrm/migrations/0173_list_suggests_for.py rename to bookwyrm/migrations/0180_list_suggests_for.py index 48c9456967..dcd2e09858 100644 --- a/bookwyrm/migrations/0173_list_suggests_for.py +++ b/bookwyrm/migrations/0180_list_suggests_for.py @@ -1,4 +1,4 @@ -# Generated by Django 3.2.16 on 2023-01-01 16:19 +# Generated by Django 3.2.20 on 2023-08-01 13:12 import bookwyrm.models.fields from django.db import migrations @@ -8,7 +8,7 @@ class Migration(migrations.Migration): dependencies = [ - ("bookwyrm", "0172_alter_user_preferred_language"), + ("bookwyrm", "0179_populate_sort_title"), ] operations = [ From 5b229fa362dae4cd22495765b7e7c7e21f44fde8 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Tue, 2 Jan 2024 13:57:19 -0800 Subject: [PATCH 019/962] Makes reports an activitypub model --- bookwyrm/activitypub/__init__.py | 1 + bookwyrm/activitypub/verbs.py | 10 ++++ .../migrations/0192_auto_20240102_2156.py | 57 +++++++++++++++++++ bookwyrm/models/report.py | 25 +++++--- 4 files changed, 86 insertions(+), 7 deletions(-) create mode 100644 bookwyrm/migrations/0192_auto_20240102_2156.py diff --git a/bookwyrm/activitypub/__init__.py b/bookwyrm/activitypub/__init__.py index 41decd68af..5789986378 100644 --- a/bookwyrm/activitypub/__init__.py +++ b/bookwyrm/activitypub/__init__.py @@ -24,6 +24,7 @@ from .verbs import Add, Remove from .verbs import Announce, Like from .verbs import Move +from .verbs import Flag # 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/verbs.py b/bookwyrm/activitypub/verbs.py index a365f4cc07..13a303af71 100644 --- a/bookwyrm/activitypub/verbs.py +++ b/bookwyrm/activitypub/verbs.py @@ -268,3 +268,13 @@ def action(self, allow_external_connections=True): else: # we might do something with this to move other objects at some point pass + + +@dataclass(init=False) +class Flag(Verb): + """Report a user to their home server""" + + to: str + object: List[str] = None + links: List[str] = None + type: str = "Flag" diff --git a/bookwyrm/migrations/0192_auto_20240102_2156.py b/bookwyrm/migrations/0192_auto_20240102_2156.py new file mode 100644 index 0000000000..7537bbbaae --- /dev/null +++ b/bookwyrm/migrations/0192_auto_20240102_2156.py @@ -0,0 +1,57 @@ +# Generated by Django 3.2.23 on 2024-01-02 21:56 + +import bookwyrm.models.fields +from django.conf import settings +from django.db import migrations +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0191_merge_20240102_0326"), + ] + + operations = [ + migrations.AlterField( + model_name="report", + name="links", + field=bookwyrm.models.fields.ManyToManyField( + blank=True, to="bookwyrm.Link" + ), + ), + migrations.AlterField( + model_name="report", + name="note", + field=bookwyrm.models.fields.TextField(blank=True, null=True), + ), + migrations.AlterField( + model_name="report", + name="reporter", + field=bookwyrm.models.fields.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="reporter", + to=settings.AUTH_USER_MODEL, + ), + ), + migrations.AlterField( + model_name="report", + name="status", + field=bookwyrm.models.fields.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to="bookwyrm.status", + ), + ), + migrations.AlterField( + model_name="report", + name="user", + field=bookwyrm.models.fields.ForeignKey( + blank=True, + null=True, + on_delete=django.db.models.deletion.PROTECT, + to=settings.AUTH_USER_MODEL, + ), + ), + ] diff --git a/bookwyrm/models/report.py b/bookwyrm/models/report.py index 74a9bbe411..153ba6dc29 100644 --- a/bookwyrm/models/report.py +++ b/bookwyrm/models/report.py @@ -3,8 +3,11 @@ from django.db import models from django.utils.translation import gettext_lazy as _ +from bookwyrm import activitypub from bookwyrm.settings import DOMAIN +from .activitypub_mixin import ActivityMixin from .base_model import BookWyrmModel +from . import fields # Report action enums @@ -22,21 +25,29 @@ DELETE_ITEM = "delete_item" -class Report(BookWyrmModel): +class Report(ActivityMixin, BookWyrmModel): """reported status or user""" - reporter = models.ForeignKey( - "User", related_name="reporter", on_delete=models.PROTECT + activity_serializer = activitypub.Flag + + reporter = fields.ForeignKey( + "User", + related_name="reporter", + on_delete=models.PROTECT, + activitypub_field="actor", + ) + note = fields.TextField(null=True, blank=True, activitypub_field="content") + user = fields.ForeignKey( + "User", on_delete=models.PROTECT, null=True, blank=True, activitypub_field="to" ) - note = models.TextField(null=True, blank=True) - user = models.ForeignKey("User", on_delete=models.PROTECT, null=True, blank=True) - status = models.ForeignKey( + status = fields.ForeignKey( "Status", null=True, blank=True, on_delete=models.PROTECT, + activitypub_field="object", ) - links = models.ManyToManyField("Link", blank=True) + links = fields.ManyToManyField("Link", blank=True) resolved = models.BooleanField(default=False) def raise_not_editable(self, viewer): From 5c0ade5346726e39453c202b1c6cf7ea78969252 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Tue, 2 Jan 2024 14:38:35 -0800 Subject: [PATCH 020/962] Changes field names in report model so the reporter is "user" This is such an annoying change but it is objectively better. Just gotta be real sure they didn't get mixed up anywhere along the way. --- bookwyrm/emailing.py | 8 ++-- bookwyrm/forms/forms.py | 2 +- .../0193_rename_user_report_reported_user.py | 18 ++++++++ .../0194_rename_reporter_report_user.py | 18 ++++++++ bookwyrm/models/antispam.py | 8 ++-- bookwyrm/models/report.py | 23 ++++++---- bookwyrm/templates/report.html | 2 +- .../templates/settings/reports/report.html | 20 ++++---- .../settings/reports/report_header.html | 8 ++-- .../settings/reports/report_preview.html | 2 +- bookwyrm/templates/snippets/report_modal.html | 8 ++-- bookwyrm/tests/models/test_report_model.py | 46 +++++++++++++++++++ bookwyrm/tests/views/admin/test_reports.py | 18 +++++--- bookwyrm/tests/views/admin/test_user_admin.py | 2 +- bookwyrm/tests/views/test_notifications.py | 4 +- bookwyrm/tests/views/test_report.py | 10 ++-- 16 files changed, 145 insertions(+), 52 deletions(-) create mode 100644 bookwyrm/migrations/0193_rename_user_report_reported_user.py create mode 100644 bookwyrm/migrations/0194_rename_reporter_report_user.py create mode 100644 bookwyrm/tests/models/test_report_model.py diff --git a/bookwyrm/emailing.py b/bookwyrm/emailing.py index 5e08ebba13..758da962c0 100644 --- a/bookwyrm/emailing.py +++ b/bookwyrm/emailing.py @@ -50,9 +50,11 @@ def password_reset_email(reset_code): def moderation_report_email(report): """a report was created""" data = email_data() - data["reporter"] = report.reporter.localname or report.reporter.username - if report.user: - data["reportee"] = report.user.localname or report.user.username + data["reporter"] = report.user.localname or report.user.username + if report.reported_user: + data["reportee"] = ( + report.reported_user.localname or report.reported_user.username + ) data["report_link"] = report.remote_id data["link_domain"] = report.links.exists() diff --git a/bookwyrm/forms/forms.py b/bookwyrm/forms/forms.py index 3d555f308d..4764b871a7 100644 --- a/bookwyrm/forms/forms.py +++ b/bookwyrm/forms/forms.py @@ -44,7 +44,7 @@ class Meta: class ReportForm(CustomForm): class Meta: model = models.Report - fields = ["user", "reporter", "status", "links", "note"] + fields = ["reported_user", "user", "status", "links", "note"] class ReadThroughForm(CustomForm): diff --git a/bookwyrm/migrations/0193_rename_user_report_reported_user.py b/bookwyrm/migrations/0193_rename_user_report_reported_user.py new file mode 100644 index 0000000000..0633e69fa1 --- /dev/null +++ b/bookwyrm/migrations/0193_rename_user_report_reported_user.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.23 on 2024-01-02 22:16 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0192_auto_20240102_2156"), + ] + + operations = [ + migrations.RenameField( + model_name="report", + old_name="user", + new_name="reported_user", + ), + ] diff --git a/bookwyrm/migrations/0194_rename_reporter_report_user.py b/bookwyrm/migrations/0194_rename_reporter_report_user.py new file mode 100644 index 0000000000..3c2c0f1802 --- /dev/null +++ b/bookwyrm/migrations/0194_rename_reporter_report_user.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.23 on 2024-01-02 22:17 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0193_rename_user_report_reported_user"), + ] + + operations = [ + migrations.RenameField( + model_name="report", + old_name="reporter", + new_name="user", + ), + ] diff --git a/bookwyrm/models/antispam.py b/bookwyrm/models/antispam.py index 1067cbf1d7..da58e8aa68 100644 --- a/bookwyrm/models/antispam.py +++ b/bookwyrm/models/antispam.py @@ -109,9 +109,9 @@ def automod_users(reporter): return report_model.objects.bulk_create( [ report_model( - reporter=reporter, + user=reporter, note=_("Automatically generated report"), - user=u, + reported_user=u, ) for u in users ] @@ -143,9 +143,9 @@ def automod_statuses(reporter): return report_model.objects.bulk_create( [ report_model( - reporter=reporter, + user=reporter, note=_("Automatically generated report"), - user=s.user, + reported_user=s.user, status=s, ) for s in statuses diff --git a/bookwyrm/models/report.py b/bookwyrm/models/report.py index 153ba6dc29..9a9b0393c5 100644 --- a/bookwyrm/models/report.py +++ b/bookwyrm/models/report.py @@ -1,5 +1,4 @@ """ flagged for moderation """ -from django.core.exceptions import PermissionDenied from django.db import models from django.utils.translation import gettext_lazy as _ @@ -30,15 +29,19 @@ class Report(ActivityMixin, BookWyrmModel): activity_serializer = activitypub.Flag - reporter = fields.ForeignKey( + user = fields.ForeignKey( "User", - related_name="reporter", on_delete=models.PROTECT, activitypub_field="actor", ) note = fields.TextField(null=True, blank=True, activitypub_field="content") - user = fields.ForeignKey( - "User", on_delete=models.PROTECT, null=True, blank=True, activitypub_field="to" + reported_user = fields.ForeignKey( + "User", + related_name="reported_user", + on_delete=models.PROTECT, + null=True, + blank=True, + activitypub_field="to", ) status = fields.ForeignKey( "Status", @@ -50,11 +53,11 @@ class Report(ActivityMixin, BookWyrmModel): links = fields.ManyToManyField("Link", blank=True) resolved = models.BooleanField(default=False) - def raise_not_editable(self, viewer): - """instead of user being the owner field, it's reporter""" - if self.reporter == viewer or viewer.has_perm("bookwyrm.moderate_user"): - return - raise PermissionDenied() + def get_recipients(self, software=None): + """Send this to the public inbox of the offending instance""" + if self.user.local: + return None + return [self.user.shared_inbox or self.user.inbox] def get_remote_id(self): return f"https://{DOMAIN}/settings/reports/{self.id}" diff --git a/bookwyrm/templates/report.html b/bookwyrm/templates/report.html index be7ed68f7a..b1ea826925 100644 --- a/bookwyrm/templates/report.html +++ b/bookwyrm/templates/report.html @@ -6,5 +6,5 @@ {% endblock %} {% block content %} -{% include "snippets/report_modal.html" with user=user active=True static=True id="report-modal" %} +{% include "snippets/report_modal.html" with reported_user=reported_user active=True static=True id="report-modal" %} {% endblock %} diff --git a/bookwyrm/templates/settings/reports/report.html b/bookwyrm/templates/settings/reports/report.html index df45341c6d..f26892af51 100644 --- a/bookwyrm/templates/settings/reports/report.html +++ b/bookwyrm/templates/settings/reports/report.html @@ -27,7 +27,7 @@
      {% trans "Update on your report:" as dm_template %} - {% include 'snippets/create_status/status.html' with type="direct" uuid=1 mention=report.reporter prepared_content=dm_template no_script=True %} + {% include 'snippets/create_status/status.html' with type="direct" uuid=1 mention=report.user prepared_content=dm_template no_script=True %}
      @@ -56,10 +56,10 @@

      {% trans "Reported links" %}

      {% endif %} -{% if report.user %} -{% include 'settings/users/user_info.html' with user=report.user %} +{% if report.reported_user %} +{% include 'settings/users/user_info.html' with reported_user=report.reported_user %} -{% include 'settings/users/user_moderation_actions.html' with user=report.user %} +{% include 'settings/users/user_moderation_actions.html' with reported_user=report.reported_user %} {% endif %}
      @@ -70,8 +70,8 @@

      {% trans "Moderation Activity" %}

    • - {% blocktrans trimmed with user=report.reporter|username user_link=report.reporter.local_path %} - {{ user}} opened this report + {% blocktrans trimmed with reported_user=report.user|username user_link=report.user.local_path %} + {{ reported_user}} opened this report {% endblocktrans %}

      {{ report.created_date }} @@ -83,12 +83,12 @@

      {% trans "Moderation Activity" %}

      {% if comment.action_type == "comment" %} - {% blocktrans trimmed with user=comment.user|username user_link=comment.user.local_path %} - {{ user}} commented on this report: + {% blocktrans trimmed with reported_user=comment.reported_user|username user_link=comment.reported_user.local_path %} + {{ reported_user}} commented on this report: {% endblocktrans %} {% else %} - {% blocktrans trimmed with user=comment.user|username user_link=comment.user.local_path %} - {{ user}} took an action on this report: + {% blocktrans trimmed with reported_user=comment.reported_user|username user_link=comment.reported_user.local_path %} + {{ reported_user}} took an action on this report: {% endblocktrans %} {{ comment.get_action_type_display }} diff --git a/bookwyrm/templates/settings/reports/report_header.html b/bookwyrm/templates/settings/reports/report_header.html index b77c6c6ae6..1c9b01c9b2 100644 --- a/bookwyrm/templates/settings/reports/report_header.html +++ b/bookwyrm/templates/settings/reports/report_header.html @@ -3,14 +3,14 @@ {% if report.status %} -{% blocktrans trimmed with report_id=report.id username=report.user|username %} +{% blocktrans trimmed with report_id=report.id username=report.reported_user|username %} Report #{{ report_id }}: Status posted by @{{ username }} {% endblocktrans %} {% elif report.links.exists %} - {% if report.user %} - {% blocktrans trimmed with report_id=report.id username=report.user|username %} + {% if report.reported_user %} + {% blocktrans trimmed with report_id=report.id username=report.reported_user|username %} Report #{{ report_id }}: Link added by @{{ username }} {% endblocktrans %} {% else %} @@ -21,7 +21,7 @@ {% else %} -{% blocktrans trimmed with report_id=report.id username=report.user|username %} +{% blocktrans trimmed with report_id=report.id username=report.reported_user|username %} Report #{{ report_id }}: User @{{ username }} {% endblocktrans %} diff --git a/bookwyrm/templates/settings/reports/report_preview.html b/bookwyrm/templates/settings/reports/report_preview.html index bd0009c519..26afd273cf 100644 --- a/bookwyrm/templates/settings/reports/report_preview.html +++ b/bookwyrm/templates/settings/reports/report_preview.html @@ -21,7 +21,7 @@

      {% block card-footer %}

    -
    - {{ dead_key_count }} -
    - {% csrf_token %} - -
    -
    - {% csrf_token %} - - -
    +
    +

    {% trans "Outdated cache keys" %}

    +
    +

    + {% blocktrans trimmed %} + This will scan for keys in the Django redis cache that use no prefix (the current prefix is {{ prefix }}), and identify Activity Streams for users with deleted accounts. + {% endblocktrans %} +

    + + {% if outdated_identified is not None %} +

    + {% blocktrans trimmed with keys=outdated_identified|intcomma %} + {{ keys }} identified + {% endblocktrans %} +

    + + {% if outdated_identified > 0 %} +
    + {% csrf_token %} + +
    + {% endif %} + {% else %} +
    + {% csrf_token %} + + +
    + {% endif %} +
    + +
    +

    {% trans "Clear Django cache" %}

    +
    +

    + {% blocktrans trimmed %} + This is NOT recommended and should only be used if something has gone very wrong with your cache. All sessions will be cleared and users will be logged out of their accounts. + {% endblocktrans %} +

    + + {% if cache_deleted %} +

    + {% blocktrans trimmed with keys=cache_deleted|intcomma %} + {{ keys }} keys deleted + {% endblocktrans %} +

    + {% else %} +
    + {% csrf_token %} + + +
    + {% endif %} +
    +
    + {% else %} +
    diff --git a/bookwyrm/views/admin/redis.py b/bookwyrm/views/admin/redis.py index c682bfcf19..ff975e550a 100644 --- a/bookwyrm/views/admin/redis.py +++ b/bookwyrm/views/admin/redis.py @@ -21,12 +21,7 @@ class RedisStatus(View): def get(self, request): """See workers and active tasks""" - data = {"errors": []} - try: - data["info"] = r.info - # pylint: disable=broad-except - except Exception as err: - data["errors"].append(err) + data = view_data() return TemplateResponse(request, "settings/redis.html", data) @@ -34,19 +29,39 @@ def get(self, request): def post(self, request): """Erase invalid keys""" dry_run = request.POST.get("dry_run") - patterns = [":*:*"] # this pattern is a django cache with no prefix - for user_id in models.User.objects.filter( - is_deleted=True, local=True - ).values_list("id", flat=True): - patterns.append(f"{user_id}-*") + erase_cache = request.POST.get("erase_cache") + data_key = "cache" if erase_cache else "outdated" + + if erase_cache: + patterns = [f"{settings.CACHE_KEY_PREFIX}:*:*"] + else: + patterns = [":*:*"] # this pattern is a django cache with no prefix + for user_id in models.User.objects.filter( + is_deleted=True, local=True + ).values_list("id", flat=True): + patterns.append(f"{user_id}-*") deleted_count = 0 for pattern in patterns: deleted_count += erase_keys(pattern, dry_run=dry_run) + data = view_data() if dry_run: - return HttpResponse(f"{deleted_count} keys identified for deletion") - return HttpResponse(f"{deleted_count} keys deleted") + data[f"{data_key}_identified"] = deleted_count + else: + data[f"{data_key}_deleted"] = deleted_count + return TemplateResponse(request, "settings/redis.html", data) + + +def view_data(): + """Helper function to load basic info for the view""" + data = {"errors": [], "prefix": settings.CACHE_KEY_PREFIX} + try: + data["info"] = r.info + # pylint: disable=broad-except + except Exception as err: + data["errors"].append(err) + return data def erase_keys(pattern, count=1000, dry_run=False): From ace0bf46d6b41ee76981efb5491a8001f4be09d6 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Fri, 23 Aug 2024 19:35:12 -0700 Subject: [PATCH 035/962] Hide option to clear redis cache Don't make it tempting to do this --- bookwyrm/templates/settings/redis.html | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/bookwyrm/templates/settings/redis.html b/bookwyrm/templates/settings/redis.html index 342f11c6da..7d740b0253 100644 --- a/bookwyrm/templates/settings/redis.html +++ b/bookwyrm/templates/settings/redis.html @@ -68,8 +68,15 @@

    {% trans "Outdated cache keys" %}

    -

    {% trans "Clear Django cache" %}

    -
    +

    {% trans "Advanced" %}

    +
    + + + {% trans "Clear Django Cache" %} + + + +

    {% blocktrans trimmed %} This is NOT recommended and should only be used if something has gone very wrong with your cache. All sessions will be cleared and users will be logged out of their accounts. @@ -86,10 +93,12 @@

    {% trans "Clear Django cache" %}

    {% csrf_token %} - +
    + +
    {% endif %} -
    +
    {% else %} From 1c9bc936f63f851c0653ee98ebe0abc86a7a0728 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Sat, 24 Aug 2024 09:09:09 -0700 Subject: [PATCH 036/962] Adds tests file --- bookwyrm/templates/settings/redis.html | 4 +- bookwyrm/tests/views/admin/test_redis.py | 51 ++++++++++++++++++++++++ bookwyrm/views/admin/redis.py | 2 - 3 files changed, 53 insertions(+), 4 deletions(-) create mode 100644 bookwyrm/tests/views/admin/test_redis.py diff --git a/bookwyrm/templates/settings/redis.html b/bookwyrm/templates/settings/redis.html index 7d740b0253..3915544987 100644 --- a/bookwyrm/templates/settings/redis.html +++ b/bookwyrm/templates/settings/redis.html @@ -56,7 +56,7 @@

    {% trans "Outdated cache keys" %}

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

    {% else %} -
      +
        {% for item in items %}
      1. From cc70e836877724a17aa71a33726556ead957dee2 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Sun, 25 Aug 2024 19:16:22 -0700 Subject: [PATCH 046/962] Re-styles suggstions to show the recommender's notes I also just shuffled the card around to fit more text. --- .../templates/book/suggestion_list/list.html | 37 +++++++++----- bookwyrm/templates/lists/list.html | 44 +---------------- bookwyrm/templates/lists/list_item_notes.html | 48 +++++++++++++++++++ 3 files changed, 73 insertions(+), 56 deletions(-) create mode 100644 bookwyrm/templates/lists/list_item_notes.html diff --git a/bookwyrm/templates/book/suggestion_list/list.html b/bookwyrm/templates/book/suggestion_list/list.html index d2b862d2cb..fd8eeb3682 100644 --- a/bookwyrm/templates/book/suggestion_list/list.html +++ b/bookwyrm/templates/book/suggestion_list/list.html @@ -1,4 +1,5 @@ {% load i18n %} +{% load book_display_tags %}

        {% trans "Suggestions" %} @@ -16,19 +17,29 @@

        {% else %}
          {% for item in items %} -
        1. +
        2. -
          - {% with book=item.book %} -
          - +
          + {% with item_book=item.book %} + +
          +

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

          + {% if item_book|book_description %} +
          + {% with full=item_book|book_description trim_length=20 %} + {% include 'snippets/trimmed_text.html' with hide_more=True %} + {% endwith %} + {% endif %} + {% include "lists/list_item_notes.html" with list=book.suggestion_list hide_edit=True %}
          - -

          - {% include 'snippets/book_titleby.html' %} -

          {% endwith %}
        3. {% endfor %} -
        4. +
        5. {% include "book/suggestion_list/search.html" %}
        @@ -61,6 +72,6 @@

        - +

    {% endif %} diff --git a/bookwyrm/templates/lists/list.html b/bookwyrm/templates/lists/list.html index 804e71037f..3836720534 100644 --- a/bookwyrm/templates/lists/list.html +++ b/bookwyrm/templates/lists/list.html @@ -80,50 +80,8 @@ {% endwith %} + {% include "lists/list_item_notes.html" with item=item %} - {% if item.notes %} -
    - -
    -
    -
    - {% url 'user-feed' item.user|username as user_path %} - {% blocktrans trimmed with username=item.user.display_name %} - {{ username }} says: - {% endblocktrans %} -
    - {{ item.notes|to_markdown|safe }} -
    - {% if item.user == request.user %} -
    -
    - - - {% trans "Edit notes" %} - - - - {% include "lists/edit_item_form.html" with book=item.book %} -
    -
    - {% endif %} -
    -
    - {% elif item.user == request.user %} -
    -
    - - - {% trans "Add notes" %} - - - - {% include "lists/edit_item_form.html" with book=item.book %} -
    -
    - {% endif %} {% endwith %} {% endblock %} diff --git a/bookwyrm/templates/book/edit/edit_book.html b/bookwyrm/templates/book/edit/edit_book.html index 2bddc9c7eb..2c0fd15be0 100644 --- a/bookwyrm/templates/book/edit/edit_book.html +++ b/bookwyrm/templates/book/edit/edit_book.html @@ -115,7 +115,7 @@

    {% trans "Confirm Book Info" %}

    {% blocktrans with name=add_author %}Creating a new author: {{ name }}{% endblocktrans %}

    {% endif %} - {% if not book.parent_work %} + {% if not book.parent_work.exists %}
    {% if book_matches%} @@ -139,33 +139,36 @@

    {% trans "Confirm Book Info" %}

    {% endif %} - {% if form.series %} + {% if form.series.value %}
    -
    {% if series_matches %} +
    {% trans "Is this book part of one of these series?" %} - {% for series in series_matches %} + {% for series in series_matches %} - {% endfor %} + {% endfor %} +
    {% else %} {% trans "Creating a new series" %}:

    {{ form.series.value }}

    -
    {% endif %}
    {% endif %} diff --git a/bookwyrm/templates/book/edit/edit_book_form.html b/bookwyrm/templates/book/edit/edit_book_form.html index 0355cf5ad3..c78c301722 100644 --- a/bookwyrm/templates/book/edit/edit_book_form.html +++ b/bookwyrm/templates/book/edit/edit_book_form.html @@ -132,25 +132,27 @@

    - {% if book.series_ids.exists %} + {% with seriesbooks=book.parent_work.seriesbooks %} + {% if seriesbooks.exists %} {# preserve series if the book is unsaved #} - +
    - {% for series in book.series_ids.all %} + {% for sb in seriesbooks.all %} {% endfor %}
    {% endif %} + {% endwith %}

    {% trans "Add Series" %} @@ -160,6 +162,7 @@

    {% include 'snippets/form_errors.html' with errors_list=form.series.errors id="desc_series" %} +

    diff --git a/bookwyrm/templates/book/edit/edit_book_form.html b/bookwyrm/templates/book/edit/edit_book_form.html index c78c301722..7f1f12d1d2 100644 --- a/bookwyrm/templates/book/edit/edit_book_form.html +++ b/bookwyrm/templates/book/edit/edit_book_form.html @@ -134,11 +134,9 @@

    {% with seriesbooks=book.parent_work.seriesbooks %} {% if seriesbooks.exists %} -
    {% endif %} @@ -69,7 +68,6 @@

    {% trans "Identifiers" %}

    {% for book in books %} - {% with book=book %}
    @@ -78,7 +76,6 @@

    {% trans "Identifiers" %}

    {% include 'landing/small-book.html' with book=book.book %}
    - {% endwith %} {% endfor %}
    diff --git a/bookwyrm/templatetags/utilities.py b/bookwyrm/templatetags/utilities.py index 6c291cf689..9148e29cff 100644 --- a/bookwyrm/templatetags/utilities.py +++ b/bookwyrm/templatetags/utilities.py @@ -105,7 +105,7 @@ def possible_series_hint(seriesbook): title = seriesbook.book.title path = seriesbook.series.local_path author = seriesbook.book.authors.first().name - + # pylint: disable=line-too-long hint = f'Includes "{title}"' if author: hint += f" by {author}" diff --git a/bookwyrm/views/books/edit_book.py b/bookwyrm/views/books/edit_book.py index aabd8dc035..4c8cb4f453 100644 --- a/bookwyrm/views/books/edit_book.py +++ b/bookwyrm/views/books/edit_book.py @@ -173,7 +173,6 @@ def ensure_transient_values_persist(request, data, **kwargs): if kwargs and kwargs.get("form"): data["book"] = data.get("book") or {} data["book"]["subjects"] = kwargs["form"].cleaned_data["subjects"] - data["book"]["series_ids"] = kwargs["form"].cleaned_data.get("series_ids") data["add_author"] = request.POST.getlist("add_author") elif kwargs and kwargs.get("add_author") is True: data["add_author"] = request.POST.getlist("add_author") diff --git a/bookwyrm/views/books/series.py b/bookwyrm/views/books/series.py index cdd071e94c..4871e0190c 100644 --- a/bookwyrm/views/books/series.py +++ b/bookwyrm/views/books/series.py @@ -33,23 +33,16 @@ def get(self, request, series_id, slug=None): books = [] items = ( series.seriesbooks.filter(series=series.id) - .prefetch_related("book", "book__authors") + .prefetch_related("book__work", "book__authors") .order_by("series_number") ) for item in items: - - book = ( - item.book.edition - if hasattr(item.book, "edition") - else item.book.work.default_edition - ) - + book = item.book.work.default_edition book_data = {"book": book, "series_number": item.series_number} books.append(book_data) - authors = authors.union(item.book.authors.all()) - paginated = Paginator(items, PAGE_LENGTH) + paginated = Paginator(books, PAGE_LENGTH) page = paginated.get_page(request.GET.get("page")) data = { From aa5470eb6e71d3fbd2926e881bc3a15bef358134 Mon Sep 17 00:00:00 2001 From: Hugh Rundle Date: Thu, 13 Nov 2025 17:25:57 +1100 Subject: [PATCH 167/962] refactor series models and templates also adds tests --- bookwyrm/activitypub/book.py | 18 +- bookwyrm/connectors/abstract_connector.py | 28 +- bookwyrm/connectors/inventaire.py | 8 +- bookwyrm/forms/books.py | 4 +- ...rgedseries_book_book_series_seriesbook.py} | 23 +- bookwyrm/models/book.py | 20 +- bookwyrm/templates/book/book.html | 4 +- bookwyrm/templates/book/edit/edit_book.html | 2 +- .../templates/book/edit/edit_book_form.html | 2 +- bookwyrm/templates/book/edit/edit_series.html | 12 +- bookwyrm/templates/book/series.html | 12 +- bookwyrm/templatetags/rating_tags.py | 2 +- bookwyrm/tests/activitypub/test_series.py | 285 ++++++++++++++++++ bookwyrm/views/books/edit_book.py | 8 +- bookwyrm/views/books/series.py | 6 +- 15 files changed, 363 insertions(+), 71 deletions(-) rename bookwyrm/migrations/{0219_series_mergedseries_seriesbook.py => 0220_series_mergedseries_book_book_series_seriesbook.py} (92%) create mode 100644 bookwyrm/tests/activitypub/test_series.py diff --git a/bookwyrm/activitypub/book.py b/bookwyrm/activitypub/book.py index d7f85c7b62..3ae9ca2e64 100644 --- a/bookwyrm/activitypub/book.py +++ b/bookwyrm/activitypub/book.py @@ -4,8 +4,6 @@ from .base_activity import ActivityObject from .image import Document -from .ordered_collection import CollectionItem, OrderedCollection - # pylint: disable=invalid-name @dataclass(init=False) @@ -38,8 +36,7 @@ class Book(BookData): languages: list[str] = field(default_factory=list) series: str = "" # legacy, now deprecated seriesNumber: str = "" # legacy, now deprecated - seriesBooks: list[str] = field(default_factory=list) - seriesIds: list[str] = field(default_factory=list) + bookSeries: list[str] = field(default_factory=list) subjects: list[str] = field(default_factory=list) subjectPlaces: list[str] = field(default_factory=list) @@ -99,19 +96,22 @@ class Author(BookData): @dataclass(init=False) -class Series(OrderedCollection, BookData): +class Series(BookData): """serializes a book series""" - title: str = "" - alternativeTitles: list[str] = field(default_factory=list) + actor: str + name: str + alternativeNames: list[str] = field(default_factory=list) + seriesBooks: list[str] = field(default_factory=list) type: str = "Series" @dataclass(init=False) -class SeriesBook(CollectionItem): +class SeriesBook(ActivityObject): """a book in a series""" + actor: str book: str - series: str + series: str = "" seriesNumber: str = "" type: str = "SeriesBook" diff --git a/bookwyrm/connectors/abstract_connector.py b/bookwyrm/connectors/abstract_connector.py index 5366cd6516..14f98bf7b8 100644 --- a/bookwyrm/connectors/abstract_connector.py +++ b/bookwyrm/connectors/abstract_connector.py @@ -125,22 +125,22 @@ def get_or_create_seriesbook_from_data( # pylint: disable=no-self-use series_to_process.append(series_obj) elif edition.series: # otherwise it's just a a string - series_to_process.append({"title": edition.series}) + series_to_process.append({"name": edition.series}) work.series_number = edition.series_number for obj in series_to_process: instance = None possible_series = models.SeriesBook.objects.filter( - Q(series__title__iexact=obj["title"]) - | Q(series__alternative_titles__icontains=obj["title"]) - | Q(series__alternative_titles__in=obj["alternative_titles"]) + Q(series__title__iexact=obj["name"]) + | Q(series__alternative_titles__icontains=obj["name"]) + | Q(series__alternative_titles__in=obj["alternative_names"]) ) if possible_series.exists(): if book_in_series := possible_series.filter( book__authors__in=work.authors.all() ).first(): - # we already have a series with same title + # we already have a series with same name # and author, let's feel lucky instance = book_in_series.series @@ -151,9 +151,9 @@ def get_or_create_seriesbook_from_data( # pylint: disable=no-self-use edition.series_number = work.series_number edition.save() - return + continue - activitydata_to_seriesbook(user, work, obj, instance) + return activitydata_to_seriesbook(user, work, obj, instance) # now clear all the series fields for book in [work, edition]: @@ -521,23 +521,23 @@ def activitydata_to_seriesbook( "goodreads_key", "wikidata", "isfdb", - "title", + "name", ]: if not getattr(series, field) and getattr(temp, field): setattr(series, field, getattr(temp, field)) - for name in temp.alternative_titles: - if name not in series.alternative_titles and name != series.title: - series.alternative_titles.append(name) + for name in temp.alternative_names: + if name not in series.alternative_names and name != series.name: + series.alternative_names.append(name) series.save() else: - series = temp.user = user - series.save() + temp.user = user + series = temp.save() if not models.SeriesBook.objects.filter(book=work, series=series).exists(): # using the work.series_number for every series is safe because - # Inventaire doesn't record series ordinal when more than one series + # Inventaire doesn't supply series ordinal when more than one series models.SeriesBook.objects.create( user=user, book=work, series=series, series_number=work.series_number ) diff --git a/bookwyrm/connectors/inventaire.py b/bookwyrm/connectors/inventaire.py index 088693109e..2503a18296 100644 --- a/bookwyrm/connectors/inventaire.py +++ b/bookwyrm/connectors/inventaire.py @@ -253,7 +253,7 @@ def format_series(self, keys: Iterable[str]) -> list[dict]: except ConnectorException: continue - alternative_titles = set() + alternative_names = set() series = {} original_lang = series_data.get("originalLang") if original_lang: @@ -263,11 +263,11 @@ def format_series(self, keys: Iterable[str]) -> list[dict]: for k, v in series_data["labels"].items(): if k == original_lang: - series["title"] = v + series["name"] = v else: - alternative_titles.add(v) + alternative_names.add(v) - series["alternativeTitles"] = list(alternative_titles) + series["alternativeNames"] = list(alternative_names) series["inventaireId"] = uri series["wikidata"] = uri.split("wd:")[1] if series_data.get("wdt:P6947"): diff --git a/bookwyrm/forms/books.py b/bookwyrm/forms/books.py index 4efb8835ae..8d9b1605f4 100644 --- a/bookwyrm/forms/books.py +++ b/bookwyrm/forms/books.py @@ -150,8 +150,8 @@ class Meta: model = models.Series fields = [ "user", - "title", - "alternative_titles", + "name", + "alternative_names", "inventaire_id", "wikidata", "isfdb", diff --git a/bookwyrm/migrations/0219_series_mergedseries_seriesbook.py b/bookwyrm/migrations/0220_series_mergedseries_book_book_series_seriesbook.py similarity index 92% rename from bookwyrm/migrations/0219_series_mergedseries_seriesbook.py rename to bookwyrm/migrations/0220_series_mergedseries_book_book_series_seriesbook.py index 8055a9bbd0..89d3cfb43f 100644 --- a/bookwyrm/migrations/0219_series_mergedseries_seriesbook.py +++ b/bookwyrm/migrations/0220_series_mergedseries_book_book_series_seriesbook.py @@ -1,4 +1,4 @@ -# Generated by Django 5.2.3 on 2025-11-04 02:17 +# Generated by Django 5.2.3 on 2025-11-09 03:53 import bookwyrm.models.activitypub_mixin import bookwyrm.models.fields @@ -11,7 +11,7 @@ class Migration(migrations.Migration): dependencies = [ - ("bookwyrm", "0218_merge_0217_merge_20250816_0749_0217_usersession"), + ("bookwyrm", "0219_datamigration_fix_isbn10_20251017_1810"), ] operations = [ @@ -108,9 +108,9 @@ class Migration(migrations.Migration): "search_vector", django.contrib.postgres.search.SearchVectorField(null=True), ), - ("title", bookwyrm.models.fields.TextField(max_length=255)), + ("name", bookwyrm.models.fields.TextField(max_length=255)), ( - "alternative_titles", + "alternative_names", bookwyrm.models.fields.ArrayField( base_field=models.CharField(max_length=255), blank=True, @@ -138,11 +138,7 @@ class Migration(migrations.Migration): options={ "abstract": False, }, - bases=( - bookwyrm.models.activitypub_mixin.OrderedCollectionMixin, - bookwyrm.models.activitypub_mixin.ObjectMixin, - models.Model, - ), + bases=(bookwyrm.models.activitypub_mixin.ObjectMixin, models.Model), ), migrations.CreateModel( name="MergedSeries", @@ -161,6 +157,13 @@ class Migration(migrations.Migration): "abstract": False, }, ), + migrations.AddField( + model_name="book", + name="book_series", + field=bookwyrm.models.fields.ManyToManyField( + related_name="books", to="bookwyrm.series" + ), + ), migrations.CreateModel( name="SeriesBook", fields=[ @@ -217,6 +220,6 @@ class Migration(migrations.Migration): options={ "ordering": ("-series_number", "-created_date", "-updated_date"), }, - bases=(bookwyrm.models.activitypub_mixin.CollectionItemMixin, models.Model), + bases=(bookwyrm.models.activitypub_mixin.ObjectMixin, models.Model), ), ] diff --git a/bookwyrm/models/book.py b/bookwyrm/models/book.py index 155fc177b6..e53f38033b 100644 --- a/bookwyrm/models/book.py +++ b/bookwyrm/models/book.py @@ -31,9 +31,7 @@ from .activitypub_mixin import ( OrderedCollectionPageMixin, - OrderedCollectionMixin, ObjectMixin, - CollectionItemMixin, ) from .base_model import BookWyrmModel from . import fields @@ -260,9 +258,13 @@ class Book(BookDataModel): models.CharField(max_length=255), blank=True, default=list ) - # These legacy fields are still used for editing and as a fallback: + # these legacy fields are still used for editing and as a fallback: series = fields.TextField(max_length=255, blank=True, null=True) series_number = fields.CharField(max_length=255, blank=True, null=True) + # this is the newer field + book_series = fields.ManyToManyField( + "Series", related_name="books", activitypub_field="bookSeries" + ) subjects = fields.ArrayField( models.CharField(max_length=255), blank=True, null=True, default=list @@ -804,11 +806,11 @@ def preview_image(instance, *args, **kwargs): ) -class Series(OrderedCollectionMixin, BookDataModel): +class Series(BookDataModel): """a series of books""" - title = fields.TextField(max_length=255) - alternative_titles = fields.ArrayField( + name = fields.TextField(max_length=255) + alternative_names = fields.ArrayField( models.CharField(max_length=255), blank=True, default=list ) # like aliases on an author user = fields.ForeignKey( @@ -816,6 +818,8 @@ class Series(OrderedCollectionMixin, BookDataModel): ) # for broadcast, should always be instance user but we can't set that here activity_serializer = activitypub.Series + serialize_reverse_fields = [("seriesbooks", "seriesBooks", "-created_date")] + deserialize_reverse_fields = [("seriesbooks", "seriesBooks")] def get_remote_id(self): """series need a remote id""" @@ -837,8 +841,8 @@ def isfdb_link(self): return f"https://www.isfdb.org/cgi-bin/pe.cgi?{self.isfdb}" -class SeriesBook(CollectionItemMixin, BookWyrmModel): - """connect a book to a series""" +class SeriesBook(ObjectMixin, BookWyrmModel): + """connect a book to a series with a series number""" series = fields.ForeignKey( "Series", on_delete=models.CASCADE, related_name="seriesbooks" diff --git a/bookwyrm/templates/book/book.html b/bookwyrm/templates/book/book.html index f00b84e3d2..2381afa73a 100644 --- a/bookwyrm/templates/book/book.html +++ b/bookwyrm/templates/book/book.html @@ -65,13 +65,13 @@

    {% spaceless %} {% if sbook.series_number %} - {% blocktrans with title=sbook.series.title path=sbook.series.local_path number=sbook.series_number %} + {% blocktrans with title=sbook.series.name path=sbook.series.local_path number=sbook.series_number %} Book {{ number }} in {{ title }} {% endblocktrans %} {% else %} - {% blocktrans with title=sbook.series.title path=sbook.series.local_path %} + {% blocktrans with title=sbook.series.name path=sbook.series.local_path %} Part of {{ title }} diff --git a/bookwyrm/templates/book/edit/edit_book.html b/bookwyrm/templates/book/edit/edit_book.html index 7198d60550..f2b55d1770 100644 --- a/bookwyrm/templates/book/edit/edit_book.html +++ b/bookwyrm/templates/book/edit/edit_book.html @@ -143,7 +143,7 @@

    {% trans "Confirm Book Info" %}

    {% for series in series_matches %}
    - + - + - +
    {% for book in books %} - {% with book=book %}
    - {% include 'landing/small-book.html' with book=book.book %} + {% include 'landing/small-book.html' with book=book.edition %}
    + {% with book=book %} - + + {% endwith %}
    - {% endwith %} {% endfor %}
    diff --git a/bookwyrm/templatetags/utilities.py b/bookwyrm/templatetags/utilities.py index 9148e29cff..47d6323794 100644 --- a/bookwyrm/templatetags/utilities.py +++ b/bookwyrm/templatetags/utilities.py @@ -104,7 +104,7 @@ def possible_series_hint(seriesbook): """Returns the hint string for a possible matching series""" title = seriesbook.book.title path = seriesbook.series.local_path - author = seriesbook.book.authors.first().name + author = seriesbook.book.authors.first().name if seriesbook.book.authors.first() else None # pylint: disable=line-too-long hint = f'Includes "{title}"' if author: diff --git a/bookwyrm/tests/activitypub/test_series.py b/bookwyrm/tests/activitypub/test_series.py index 165d47b77c..4a3ab42bcb 100644 --- a/bookwyrm/tests/activitypub/test_series.py +++ b/bookwyrm/tests/activitypub/test_series.py @@ -36,9 +36,6 @@ def setUpTestData(cls): remote_id="https://example.com/book/1", ) - cls.book.book_series.add(cls.series) - cls.book.save(broadcast=False) - cls.seriesbook = models.SeriesBook.objects.create( book=cls.book, series=cls.series, @@ -116,12 +113,6 @@ def test_serialize_seriesbook(self): self.assertEqual(activity["book"], self.book.remote_id) self.assertEqual(activity["series"], self.series.remote_id) - def test_serialize_book_has_bookseries(self): - """check presence of seriesbook fields""" - activity = self.book.to_activity() - - self.assertIsInstance(activity["bookSeries"], list) - self.assertEqual(activity["bookSeries"], [self.series.remote_id]) @responses.activate def test_deserialize_book_with_series(self): @@ -148,6 +139,10 @@ def test_deserialize_book_with_series(self): status=200, ) + + # TODO: + # set_related_field.delay is in play here, we need to mock it so the seriesbook is unfurled + book_data = activitypub.Work(**self.book_data) book = book_data.to_model() @@ -157,32 +152,34 @@ def test_deserialize_book_with_series(self): @responses.activate def test_deserialize_book_series_no_duplicate(self): - """check that new style series don't duplicate""" - - responses.add( - responses.GET, - "https://example.com/series/2", - json=self.series_data, - status=200, - ) - - responses.add( - responses.GET, - "https://example.com/seriesbook/2", - json=self.seriesbook_data, - status=200, - ) - - responses.add( - responses.GET, - "https://example.com/user/instance", - json=self.user.to_activity(), - status=200, - ) - - book_data = activitypub.Work(**self.book_data) - book_data.to_model() - self.assertEqual(models.Series.objects.count(), 2) + """check that new-style series don't duplicate""" + + pass + # responses.add( + # responses.GET, + # "https://example.com/series/2", + # json=self.series_data, + # status=200, + # ) + + # responses.add( + # responses.GET, + # "https://example.com/seriesbook/2", + # json=self.seriesbook_data, + # status=200, + # ) + + # responses.add( + # responses.GET, + # "https://example.com/user/instance", + # json=self.user.to_activity(), + # status=200, + # ) + + # self.assertEqual(models.Series.objects.count(), 1) + # book_data = activitypub.Work(**self.book_data) + # book_data.to_model() + # self.assertEqual(models.Series.objects.count(), 1) @responses.activate def test_deserialize_series(self): diff --git a/bookwyrm/tests/connectors/test_abstract_connector.py b/bookwyrm/tests/connectors/test_abstract_connector.py index 97794b151b..00f61213e9 100644 --- a/bookwyrm/tests/connectors/test_abstract_connector.py +++ b/bookwyrm/tests/connectors/test_abstract_connector.py @@ -1,11 +1,12 @@ """ testing book data connectors """ +import json from unittest.mock import patch from django.test import TestCase import responses from bookwyrm import models from bookwyrm.connectors import abstract_connector, ConnectorException -from bookwyrm.connectors.abstract_connector import Mapping, get_data +from bookwyrm.connectors.abstract_connector import Mapping, get_data, activitydata_to_seriesbook from bookwyrm.settings import BASE_URL, INSTANCE_ACTOR_USERNAME @@ -15,7 +16,7 @@ class AbstractConnector(TestCase): @classmethod def setUpTestData(cls): """we need an example connector in the database""" - models.Connector.objects.create( + cls.connector = models.Connector.objects.create( identifier="example.com", connector_file="openlibrary", base_url="https://example.com", @@ -172,3 +173,103 @@ def test_get_data_invalid_url(self): with self.assertRaises(ConnectorException): get_data("http://127.0.0.1/image/jpg") + + + def test_get_or_create_seriesbook_from_data(self): + """do we make a seriesbook?""" + + work = models.Work.objects.create(title="Test Book") + work.series = json.dumps([{"name": "Test Series 1"}]) + edition = self.book + + self.assertEqual(models.Series.objects.count(), 0) + self.assertEqual(models.SeriesBook.objects.count(), 0) + + self.connector.get_or_create_seriesbook_from_data(work=work, edition=edition) + + self.assertEqual(models.Series.objects.count(), 1) + self.assertEqual(models.SeriesBook.objects.count(), 1) + + def test_get_or_create_seriesbook_from_existing_series(self): + """do we get a seriesbook with existing series?""" + + author = models.Author.objects.create(name="Sammy") + series = models.Series.objects.create(name="Test Series 1", user=self.local_user) + models.SeriesBook.objects.create(user=self.local_user, book=self.book, series=series) + + work = models.Work.objects.create(title="Test Book") + work.series = json.dumps([{"name": "Test Series 1"}]) + edition = self.book + edition.authors.add(author) + + self.assertEqual(models.Series.objects.count(), 1) + self.assertEqual(models.SeriesBook.objects.count(), 1) + + self.connector.get_or_create_seriesbook_from_data(work=work, edition=edition) + + self.assertEqual(models.Series.objects.count(), 1) + self.assertEqual(models.SeriesBook.objects.count(), 2) + + def test_get_or_create_seriesbook_with_ambiguous_series(self): + """do we get series info in the book when we can't match author?""" + + author = models.Author.objects.create(name="Sammy") + series = models.Series.objects.create(name="Test Series 1", user=self.local_user) + models.SeriesBook.objects.create(user=self.local_user, book=self.book, series=series) + + work = models.Work.objects.create(title="Test Book 2") + work.series = json.dumps([{"name": "Test Series 1"}]) + edition = models.Edition.objects.create(title="Test Book 2") + edition.authors.add(author) + + self.assertEqual(models.Series.objects.count(), 1) + self.assertEqual(models.SeriesBook.objects.count(), 1) + + self.connector.get_or_create_seriesbook_from_data(work=work, edition=edition) + + self.assertEqual(models.Series.objects.count(), 1) + self.assertEqual(models.SeriesBook.objects.count(), 1) + self.assertEqual(edition.series, "Test Series 1") + + def test_activitydata_to_seriesbook(self): + """ do we get a seriesbook?""" + + work = models.Work.objects.create(title="Test Book 2") + new = models.Series(name="Test Series A") + + self.assertEqual(models.Series.objects.count(), 0) + self.assertEqual(models.SeriesBook.objects.count(), 0) + + activitydata_to_seriesbook(user=self.local_user, work=work, new=new, instance=None) + + self.assertEqual(models.Series.objects.count(), 1) + self.assertEqual(models.SeriesBook.objects.count(), 1) + + def test_activitydata_to_seriesbook_with_existing_series(self): + """ do we get a seriesbook but not a duplicate series?""" + + work = models.Work.objects.create(title="Test Book 2") + series = models.Series.objects.create(name="Test Series A", user=self.local_user) + + self.assertEqual(models.Series.objects.count(), 1) + self.assertEqual(models.SeriesBook.objects.count(), 0) + + activitydata_to_seriesbook(user=self.local_user, work=work, new=series, instance=series) + + self.assertEqual(models.Series.objects.count(), 1) + self.assertEqual(models.SeriesBook.objects.count(), 1) + + def test_activitydata_to_seriesbook_with_existing_seriesbook(self): + """ do we reuse the existing series and seriesbook?""" + + work = models.Work.objects.create(title="Test Book 2") + series = models.Series.objects.create(name="Test Series A", user=self.local_user) + models.SeriesBook.objects.create(user=self.local_user, book=work, series=series) + + self.assertEqual(models.Series.objects.count(), 1) + self.assertEqual(models.SeriesBook.objects.count(), 1) + + activitydata_to_seriesbook(user=self.local_user, work=work, new=series, instance=None) + + self.assertEqual(models.Series.objects.count(), 1) + self.assertEqual(models.SeriesBook.objects.count(), 1) \ No newline at end of file diff --git a/bookwyrm/tests/connectors/test_inventaire_connector.py b/bookwyrm/tests/connectors/test_inventaire_connector.py index 1cd88195f1..adbb1ceaf4 100644 --- a/bookwyrm/tests/connectors/test_inventaire_connector.py +++ b/bookwyrm/tests/connectors/test_inventaire_connector.py @@ -285,3 +285,15 @@ def test_remote_id_from_model(self): self.connector.get_remote_id_from_model(obj), "https://inventaire.io?action=by-uris&uris=123", ) + + + def test_format_series(self): + """make an activitypub object from Inventaire JSON-LD""" + + pass + + + def test_get_or_create_seriesbook_from_data(self): + """create a seriesbook from activityjson""" + + pass \ No newline at end of file diff --git a/bookwyrm/tests/models/test_series.py b/bookwyrm/tests/models/test_series.py new file mode 100644 index 0000000000..90af8dcbcf --- /dev/null +++ b/bookwyrm/tests/models/test_series.py @@ -0,0 +1,41 @@ +""" testing series models """ +import json +from unittest.mock import patch +from django.db import IntegrityError +from django.test import TestCase + +from bookwyrm import models, settings + +class TestSeriesModel(TestCase): + """testing series""" + + @classmethod + def setUpTestData(cls): + """reusable data""" + + cls.instance_user = models.User.objects.create_user( + "instance@local.com", + local=True, + localname=settings.INSTANCE_ACTOR_USERNAME, + remote_id="https://example.com/users/instance_actor", + ) + + cls.work = models.Work.objects.create(title="Test Book") + cls.edition = models.Edition.objects.create(title="Test Book", parent_work=cls.work) + cls.series = models.Series.objects.create(name="Test series", user=cls.instance_user) + + def test_seriesbook(self): + + self.assertEqual(models.SeriesBook.objects.count(), 0) + models.SeriesBook.objects.create(series=self.series, book=self.work, user=self.instance_user) + self.assertEqual(models.SeriesBook.objects.count(), 1) + + def test_seriesbook_fields(self): + + self.assertEqual(models.SeriesBook.objects.count(), 0) + seriesbook = models.SeriesBook.objects.create(series=self.series, book=self.work, user=self.instance_user) + + self.assertEqual(models.SeriesBook.objects.count(), 1) + self.assertEqual(self.work.seriesbooks.first(), seriesbook) + self.assertEqual(self.work.book_series()[0], self.series) + self.assertEqual(self.series.seriesbooks.first(), seriesbook) \ No newline at end of file diff --git a/bookwyrm/tests/views/books/test_series.py b/bookwyrm/tests/views/books/test_series.py new file mode 100644 index 0000000000..2c6dcf46f2 --- /dev/null +++ b/bookwyrm/tests/views/books/test_series.py @@ -0,0 +1,67 @@ +""" test for app action functionality """ +from unittest.mock import patch + +from django.template.response import TemplateResponse +from django.test import TestCase +from django.test.client import RequestFactory +from django.http.response import Http404 +from bookwyrm import models, views +from bookwyrm.tests.validate_html import validate_html + + +class SeriesViews(TestCase): + """series views""" + + @classmethod + def setUpTestData(cls): + """we need basic test data and mocks""" + + cls.local_user = models.User.objects.create_user( + "mouse@local.com", + "mouse@mouse.com", + "mouseword" + ) + + cls.book = models.Work.objects.create(title="test book") + cls.series = models.Series.objects.create(name="test series", user=cls.local_user) + cls.seriesbook = models.SeriesBook.objects.create(book=cls.book, series=cls.series, user=cls.local_user) + + models.SiteSettings.objects.create() + + def setUp(self): + """individual test setup""" + self.factory = RequestFactory() + + def test_series_page(self): + """there are so many views, this just makes sure it LOADS""" + view = views.Series.as_view() + request = self.factory.get("") + request.user = self.local_user + result = view(request, self.series.id) + self.assertIsInstance(result, TemplateResponse) + validate_html(result.render()) + + self.assertEqual(result.status_code, 200) + + + def test_editseries_page(self): + """there are so many views, this just makes sure it LOADS""" + view = views.EditSeries.as_view() + request = self.factory.get("") + request.user = self.local_user + result = view(request, self.series.id) + self.assertIsInstance(result, TemplateResponse) + validate_html(result.render()) + + self.assertEqual(result.status_code, 200) + + + def test_seriesbook_page_404s(self): + """make sure it doesn't load for normal traffic""" + view = views.SeriesBook.as_view() + request = self.factory.get("") + request.user = self.local_user + + with self.assertRaises(Http404): + result = view(request, self.seriesbook.id) + diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py index 4211b609f8..79075a13d8 100644 --- a/bookwyrm/urls.py +++ b/bookwyrm/urls.py @@ -906,8 +906,10 @@ ), # series re_path( - r"^series/(?P\d+)(.json)?/?$", views.Series.as_view(), name="series" + rf"^series/(?P\d+)(.json)?{regex.SLUG}/?$", views.Series.as_view(), name="series" ), + re_path( + rf"^series/(?P\d+)(.json)/?$", views.Series.as_view()), # activitypub re_path( r"^series/(?P\d+)/edit/?$", views.EditSeries.as_view(), diff --git a/bookwyrm/views/books/series.py b/bookwyrm/views/books/series.py index e616907321..0e727de59c 100644 --- a/bookwyrm/views/books/series.py +++ b/bookwyrm/views/books/series.py @@ -61,11 +61,21 @@ class EditSeries(View): def get(self, request, series_id=None): """edit page for series""" - series = models.Series.objects.filter(id=series_id).first() + series = models.Series.objects.get(id=series_id) seriesbooks = models.SeriesBook.objects.filter(series=series) + books = [] + for item in seriesbooks: + edition = item.book.work.default_edition + number = item.series_number or "" + books.append({"edition": edition, "number": number, "id": item.book.work.id}) + print({"edition": edition, "number": number, "id": item.book.work.id}) + + paginated = Paginator(books, PAGE_LENGTH) + page = paginated.get_page(request.GET.get("page")) + data = { "series": series, - "books": seriesbooks, + "books": page, "form": SeriesForm(instance=series), } @@ -96,12 +106,12 @@ def post(self, request, series_id): # update seriesbooks as needed for book in series.seriesbooks.all(): - value = request.POST[f"series_number-{book.id}"] + value = request.POST[f"series_number-{book.book.id}"] book.series_number = value # save the series_number as the value book.save(update_fields=["series_number"]) - return redirect("series", series_id) + return redirect(series.local_path) class SeriesBook(View): From 1739f50d47c7b648a9538bec330dcfd1d8ea9557 Mon Sep 17 00:00:00 2001 From: Hugh Rundle Date: Sun, 16 Nov 2025 08:55:48 +1100 Subject: [PATCH 169/962] formatting --- bookwyrm/connectors/abstract_connector.py | 10 ++-- bookwyrm/models/book.py | 9 ++-- bookwyrm/templatetags/utilities.py | 6 ++- bookwyrm/tests/activitypub/test_series.py | 2 - .../connectors/test_abstract_connector.py | 51 +++++++++++++------ .../connectors/test_inventaire_connector.py | 4 +- bookwyrm/tests/models/test_series.py | 19 +++++-- bookwyrm/tests/views/books/test_series.py | 15 +++--- bookwyrm/urls.py | 7 ++- bookwyrm/views/books/series.py | 4 +- 10 files changed, 83 insertions(+), 44 deletions(-) diff --git a/bookwyrm/connectors/abstract_connector.py b/bookwyrm/connectors/abstract_connector.py index c8bb4f5493..5f843d4abe 100644 --- a/bookwyrm/connectors/abstract_connector.py +++ b/bookwyrm/connectors/abstract_connector.py @@ -154,13 +154,16 @@ def get_or_create_seriesbook_from_data( # pylint: disable=no-self-use # leave it for the user to work out if work.series: edition.series = series.name - edition.series_number = json.loads(work.series)[0].get("seriesNumber", "") + edition.series_number = json.loads(work.series)[0].get( + "seriesNumber", "" + ) edition.save() continue - activitydata_to_seriesbook(user=user, work=work, new=series, instance=instance) - + activitydata_to_seriesbook( + user=user, work=work, new=series, instance=instance + ) @abstractmethod def get_or_create_book(self, remote_id: str) -> Optional[models.Book]: @@ -247,7 +250,6 @@ def get_book_data(self, remote_id: str) -> JsonDict: # pylint: disable=no-self- """this allows connectors to override the default behavior""" return get_data(remote_id, is_activitypub=False) - def create_edition_from_data( self, work: models.Work, diff --git a/bookwyrm/models/book.py b/bookwyrm/models/book.py index 4752d78d61..4be7175e9a 100644 --- a/bookwyrm/models/book.py +++ b/bookwyrm/models/book.py @@ -489,10 +489,13 @@ def to_edition_list(self, **kwargs): serialize_reverse_fields = [ ("editions", "editions", "-edition_rank"), ("file_links", "fileLinks", "-created_date"), - ("seriesbooks", "seriesBooks", "-created_date") + ("seriesbooks", "seriesBooks", "-created_date"), + ] + deserialize_reverse_fields = [ + ("editions", "editions"), + ("file_links", "fileLinks"), + ("seriesbooks", "seriesBooks"), ] - deserialize_reverse_fields = [("editions", "editions"), ("file_links", "fileLinks"), ("seriesbooks", "seriesBooks")] - # https://schema.org/BookFormatType diff --git a/bookwyrm/templatetags/utilities.py b/bookwyrm/templatetags/utilities.py index 47d6323794..0f04aed05a 100644 --- a/bookwyrm/templatetags/utilities.py +++ b/bookwyrm/templatetags/utilities.py @@ -104,7 +104,11 @@ def possible_series_hint(seriesbook): """Returns the hint string for a possible matching series""" title = seriesbook.book.title path = seriesbook.series.local_path - author = seriesbook.book.authors.first().name if seriesbook.book.authors.first() else None + author = ( + seriesbook.book.authors.first().name + if seriesbook.book.authors.first() + else None + ) # pylint: disable=line-too-long hint = f'Includes "{title}"' if author: diff --git a/bookwyrm/tests/activitypub/test_series.py b/bookwyrm/tests/activitypub/test_series.py index 4a3ab42bcb..a22abc0d27 100644 --- a/bookwyrm/tests/activitypub/test_series.py +++ b/bookwyrm/tests/activitypub/test_series.py @@ -113,7 +113,6 @@ def test_serialize_seriesbook(self): self.assertEqual(activity["book"], self.book.remote_id) self.assertEqual(activity["series"], self.series.remote_id) - @responses.activate def test_deserialize_book_with_series(self): """check that new style series are deserialised""" @@ -139,7 +138,6 @@ def test_deserialize_book_with_series(self): status=200, ) - # TODO: # set_related_field.delay is in play here, we need to mock it so the seriesbook is unfurled diff --git a/bookwyrm/tests/connectors/test_abstract_connector.py b/bookwyrm/tests/connectors/test_abstract_connector.py index 00f61213e9..e7e3693f48 100644 --- a/bookwyrm/tests/connectors/test_abstract_connector.py +++ b/bookwyrm/tests/connectors/test_abstract_connector.py @@ -6,7 +6,11 @@ from bookwyrm import models from bookwyrm.connectors import abstract_connector, ConnectorException -from bookwyrm.connectors.abstract_connector import Mapping, get_data, activitydata_to_seriesbook +from bookwyrm.connectors.abstract_connector import ( + Mapping, + get_data, + activitydata_to_seriesbook, +) from bookwyrm.settings import BASE_URL, INSTANCE_ACTOR_USERNAME @@ -174,7 +178,6 @@ def test_get_data_invalid_url(self): with self.assertRaises(ConnectorException): get_data("http://127.0.0.1/image/jpg") - def test_get_or_create_seriesbook_from_data(self): """do we make a seriesbook?""" @@ -194,8 +197,12 @@ def test_get_or_create_seriesbook_from_existing_series(self): """do we get a seriesbook with existing series?""" author = models.Author.objects.create(name="Sammy") - series = models.Series.objects.create(name="Test Series 1", user=self.local_user) - models.SeriesBook.objects.create(user=self.local_user, book=self.book, series=series) + series = models.Series.objects.create( + name="Test Series 1", user=self.local_user + ) + models.SeriesBook.objects.create( + user=self.local_user, book=self.book, series=series + ) work = models.Work.objects.create(title="Test Book") work.series = json.dumps([{"name": "Test Series 1"}]) @@ -214,8 +221,12 @@ def test_get_or_create_seriesbook_with_ambiguous_series(self): """do we get series info in the book when we can't match author?""" author = models.Author.objects.create(name="Sammy") - series = models.Series.objects.create(name="Test Series 1", user=self.local_user) - models.SeriesBook.objects.create(user=self.local_user, book=self.book, series=series) + series = models.Series.objects.create( + name="Test Series 1", user=self.local_user + ) + models.SeriesBook.objects.create( + user=self.local_user, book=self.book, series=series + ) work = models.Work.objects.create(title="Test Book 2") work.series = json.dumps([{"name": "Test Series 1"}]) @@ -232,7 +243,7 @@ def test_get_or_create_seriesbook_with_ambiguous_series(self): self.assertEqual(edition.series, "Test Series 1") def test_activitydata_to_seriesbook(self): - """ do we get a seriesbook?""" + """do we get a seriesbook?""" work = models.Work.objects.create(title="Test Book 2") new = models.Series(name="Test Series A") @@ -240,36 +251,46 @@ def test_activitydata_to_seriesbook(self): self.assertEqual(models.Series.objects.count(), 0) self.assertEqual(models.SeriesBook.objects.count(), 0) - activitydata_to_seriesbook(user=self.local_user, work=work, new=new, instance=None) + activitydata_to_seriesbook( + user=self.local_user, work=work, new=new, instance=None + ) self.assertEqual(models.Series.objects.count(), 1) self.assertEqual(models.SeriesBook.objects.count(), 1) def test_activitydata_to_seriesbook_with_existing_series(self): - """ do we get a seriesbook but not a duplicate series?""" + """do we get a seriesbook but not a duplicate series?""" work = models.Work.objects.create(title="Test Book 2") - series = models.Series.objects.create(name="Test Series A", user=self.local_user) + series = models.Series.objects.create( + name="Test Series A", user=self.local_user + ) self.assertEqual(models.Series.objects.count(), 1) self.assertEqual(models.SeriesBook.objects.count(), 0) - activitydata_to_seriesbook(user=self.local_user, work=work, new=series, instance=series) + activitydata_to_seriesbook( + user=self.local_user, work=work, new=series, instance=series + ) self.assertEqual(models.Series.objects.count(), 1) self.assertEqual(models.SeriesBook.objects.count(), 1) def test_activitydata_to_seriesbook_with_existing_seriesbook(self): - """ do we reuse the existing series and seriesbook?""" + """do we reuse the existing series and seriesbook?""" work = models.Work.objects.create(title="Test Book 2") - series = models.Series.objects.create(name="Test Series A", user=self.local_user) + series = models.Series.objects.create( + name="Test Series A", user=self.local_user + ) models.SeriesBook.objects.create(user=self.local_user, book=work, series=series) self.assertEqual(models.Series.objects.count(), 1) self.assertEqual(models.SeriesBook.objects.count(), 1) - activitydata_to_seriesbook(user=self.local_user, work=work, new=series, instance=None) + activitydata_to_seriesbook( + user=self.local_user, work=work, new=series, instance=None + ) self.assertEqual(models.Series.objects.count(), 1) - self.assertEqual(models.SeriesBook.objects.count(), 1) \ No newline at end of file + self.assertEqual(models.SeriesBook.objects.count(), 1) diff --git a/bookwyrm/tests/connectors/test_inventaire_connector.py b/bookwyrm/tests/connectors/test_inventaire_connector.py index adbb1ceaf4..1ea306a1f9 100644 --- a/bookwyrm/tests/connectors/test_inventaire_connector.py +++ b/bookwyrm/tests/connectors/test_inventaire_connector.py @@ -286,14 +286,12 @@ def test_remote_id_from_model(self): "https://inventaire.io?action=by-uris&uris=123", ) - def test_format_series(self): """make an activitypub object from Inventaire JSON-LD""" pass - def test_get_or_create_seriesbook_from_data(self): """create a seriesbook from activityjson""" - pass \ No newline at end of file + pass diff --git a/bookwyrm/tests/models/test_series.py b/bookwyrm/tests/models/test_series.py index 90af8dcbcf..249dfb22e7 100644 --- a/bookwyrm/tests/models/test_series.py +++ b/bookwyrm/tests/models/test_series.py @@ -6,6 +6,7 @@ from bookwyrm import models, settings + class TestSeriesModel(TestCase): """testing series""" @@ -21,21 +22,29 @@ def setUpTestData(cls): ) cls.work = models.Work.objects.create(title="Test Book") - cls.edition = models.Edition.objects.create(title="Test Book", parent_work=cls.work) - cls.series = models.Series.objects.create(name="Test series", user=cls.instance_user) + cls.edition = models.Edition.objects.create( + title="Test Book", parent_work=cls.work + ) + cls.series = models.Series.objects.create( + name="Test series", user=cls.instance_user + ) def test_seriesbook(self): self.assertEqual(models.SeriesBook.objects.count(), 0) - models.SeriesBook.objects.create(series=self.series, book=self.work, user=self.instance_user) + models.SeriesBook.objects.create( + series=self.series, book=self.work, user=self.instance_user + ) self.assertEqual(models.SeriesBook.objects.count(), 1) def test_seriesbook_fields(self): self.assertEqual(models.SeriesBook.objects.count(), 0) - seriesbook = models.SeriesBook.objects.create(series=self.series, book=self.work, user=self.instance_user) + seriesbook = models.SeriesBook.objects.create( + series=self.series, book=self.work, user=self.instance_user + ) self.assertEqual(models.SeriesBook.objects.count(), 1) self.assertEqual(self.work.seriesbooks.first(), seriesbook) self.assertEqual(self.work.book_series()[0], self.series) - self.assertEqual(self.series.seriesbooks.first(), seriesbook) \ No newline at end of file + self.assertEqual(self.series.seriesbooks.first(), seriesbook) diff --git a/bookwyrm/tests/views/books/test_series.py b/bookwyrm/tests/views/books/test_series.py index 2c6dcf46f2..7b6ec6f3b4 100644 --- a/bookwyrm/tests/views/books/test_series.py +++ b/bookwyrm/tests/views/books/test_series.py @@ -17,14 +17,16 @@ def setUpTestData(cls): """we need basic test data and mocks""" cls.local_user = models.User.objects.create_user( - "mouse@local.com", - "mouse@mouse.com", - "mouseword" + "mouse@local.com", "mouse@mouse.com", "mouseword" ) cls.book = models.Work.objects.create(title="test book") - cls.series = models.Series.objects.create(name="test series", user=cls.local_user) - cls.seriesbook = models.SeriesBook.objects.create(book=cls.book, series=cls.series, user=cls.local_user) + cls.series = models.Series.objects.create( + name="test series", user=cls.local_user + ) + cls.seriesbook = models.SeriesBook.objects.create( + book=cls.book, series=cls.series, user=cls.local_user + ) models.SiteSettings.objects.create() @@ -43,7 +45,6 @@ def test_series_page(self): self.assertEqual(result.status_code, 200) - def test_editseries_page(self): """there are so many views, this just makes sure it LOADS""" view = views.EditSeries.as_view() @@ -55,7 +56,6 @@ def test_editseries_page(self): self.assertEqual(result.status_code, 200) - def test_seriesbook_page_404s(self): """make sure it doesn't load for normal traffic""" view = views.SeriesBook.as_view() @@ -64,4 +64,3 @@ def test_seriesbook_page_404s(self): with self.assertRaises(Http404): result = view(request, self.seriesbook.id) - diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py index 79075a13d8..a5803c8f25 100644 --- a/bookwyrm/urls.py +++ b/bookwyrm/urls.py @@ -906,10 +906,13 @@ ), # series re_path( - rf"^series/(?P\d+)(.json)?{regex.SLUG}/?$", views.Series.as_view(), name="series" + rf"^series/(?P\d+)(.json)?{regex.SLUG}/?$", + views.Series.as_view(), + name="series", ), re_path( - rf"^series/(?P\d+)(.json)/?$", views.Series.as_view()), # activitypub + rf"^series/(?P\d+)(.json)/?$", views.Series.as_view() + ), # activitypub re_path( r"^series/(?P\d+)/edit/?$", views.EditSeries.as_view(), diff --git a/bookwyrm/views/books/series.py b/bookwyrm/views/books/series.py index 0e727de59c..4a5c90914b 100644 --- a/bookwyrm/views/books/series.py +++ b/bookwyrm/views/books/series.py @@ -67,7 +67,9 @@ def get(self, request, series_id=None): for item in seriesbooks: edition = item.book.work.default_edition number = item.series_number or "" - books.append({"edition": edition, "number": number, "id": item.book.work.id}) + books.append( + {"edition": edition, "number": number, "id": item.book.work.id} + ) print({"edition": edition, "number": number, "id": item.book.work.id}) paginated = Paginator(books, PAGE_LENGTH) From 5d350ad8c2732c7cb482c104a54f0219ffdd75fe Mon Sep 17 00:00:00 2001 From: Hugh Rundle Date: Wed, 19 Nov 2025 15:34:12 +1100 Subject: [PATCH 170/962] final commit for series --- bookwyrm/activitypub/book.py | 2 +- bookwyrm/connectors/abstract_connector.py | 2 +- bookwyrm/connectors/inventaire.py | 2 +- ...ergedseries_book_book_series_seriesbook.py | 225 ------------------ .../0221_remove_book_book_series.py | 17 -- .../0222_alter_seriesbook_options.py | 17 -- bookwyrm/models/book.py | 10 +- bookwyrm/models/bookwyrm_export_job.py | 42 ++-- bookwyrm/templates/book/edit/edit_series.html | 10 +- bookwyrm/templates/book/series.html | 6 +- bookwyrm/tests/activitypub/test_series.py | 55 ++--- .../connectors/test_inventaire_connector.py | 31 ++- bookwyrm/tests/models/test_series.py | 6 +- bookwyrm/tests/views/books/test_series.py | 75 +++++- bookwyrm/urls.py | 2 +- bookwyrm/views/books/series.py | 40 +--- 16 files changed, 164 insertions(+), 378 deletions(-) delete mode 100644 bookwyrm/migrations/0220_series_mergedseries_book_book_series_seriesbook.py delete mode 100644 bookwyrm/migrations/0221_remove_book_book_series.py delete mode 100644 bookwyrm/migrations/0222_alter_seriesbook_options.py diff --git a/bookwyrm/activitypub/book.py b/bookwyrm/activitypub/book.py index 8faadd7590..0f319d392e 100644 --- a/bookwyrm/activitypub/book.py +++ b/bookwyrm/activitypub/book.py @@ -113,5 +113,5 @@ class SeriesBook(ActivityObject): actor: str book: str series: str - seriesNumber: str = "" + seriesNumber: int = None type: str = "SeriesBook" diff --git a/bookwyrm/connectors/abstract_connector.py b/bookwyrm/connectors/abstract_connector.py index 5f843d4abe..dfe617fb3f 100644 --- a/bookwyrm/connectors/abstract_connector.py +++ b/bookwyrm/connectors/abstract_connector.py @@ -155,7 +155,7 @@ def get_or_create_seriesbook_from_data( # pylint: disable=no-self-use if work.series: edition.series = series.name edition.series_number = json.loads(work.series)[0].get( - "seriesNumber", "" + "series_number", "" ) edition.save() diff --git a/bookwyrm/connectors/inventaire.py b/bookwyrm/connectors/inventaire.py index 2503a18296..55d17609f8 100644 --- a/bookwyrm/connectors/inventaire.py +++ b/bookwyrm/connectors/inventaire.py @@ -80,7 +80,7 @@ def get_book_data(self, remote_id: str) -> JsonDict: **data.get("claims", {}), **{ k: data.get(k) - for k in ["uri", "image", "labels", "sitelinks", "type"] + for k in ["uri", "image", "labels", "sitelinks", "type", "originalLang"] if k in data }, } diff --git a/bookwyrm/migrations/0220_series_mergedseries_book_book_series_seriesbook.py b/bookwyrm/migrations/0220_series_mergedseries_book_book_series_seriesbook.py deleted file mode 100644 index 89d3cfb43f..0000000000 --- a/bookwyrm/migrations/0220_series_mergedseries_book_book_series_seriesbook.py +++ /dev/null @@ -1,225 +0,0 @@ -# Generated by Django 5.2.3 on 2025-11-09 03:53 - -import bookwyrm.models.activitypub_mixin -import bookwyrm.models.fields -import django.contrib.postgres.search -import django.db.models.deletion -from django.conf import settings -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("bookwyrm", "0219_datamigration_fix_isbn10_20251017_1810"), - ] - - operations = [ - migrations.CreateModel( - name="Series", - 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], - ), - ), - ("origin_id", models.CharField(blank=True, max_length=255, null=True)), - ( - "openlibrary_key", - bookwyrm.models.fields.CharField( - blank=True, max_length=255, null=True - ), - ), - ( - "finna_key", - bookwyrm.models.fields.CharField( - blank=True, max_length=255, null=True - ), - ), - ( - "inventaire_id", - bookwyrm.models.fields.CharField( - blank=True, max_length=255, null=True - ), - ), - ( - "librarything_key", - bookwyrm.models.fields.CharField( - blank=True, max_length=255, null=True - ), - ), - ( - "goodreads_key", - bookwyrm.models.fields.CharField( - blank=True, max_length=255, null=True - ), - ), - ( - "bnf_id", - bookwyrm.models.fields.CharField( - blank=True, max_length=255, null=True - ), - ), - ( - "viaf", - bookwyrm.models.fields.CharField( - blank=True, max_length=255, null=True - ), - ), - ( - "wikidata", - bookwyrm.models.fields.CharField( - blank=True, max_length=255, null=True - ), - ), - ( - "asin", - bookwyrm.models.fields.CharField( - blank=True, max_length=255, null=True - ), - ), - ( - "aasin", - bookwyrm.models.fields.CharField( - blank=True, max_length=255, null=True - ), - ), - ( - "isfdb", - bookwyrm.models.fields.CharField( - blank=True, max_length=255, null=True - ), - ), - ( - "search_vector", - django.contrib.postgres.search.SearchVectorField(null=True), - ), - ("name", bookwyrm.models.fields.TextField(max_length=255)), - ( - "alternative_names", - bookwyrm.models.fields.ArrayField( - base_field=models.CharField(max_length=255), - blank=True, - default=list, - size=None, - ), - ), - ( - "last_edited_by", - bookwyrm.models.fields.ForeignKey( - null=True, - on_delete=django.db.models.deletion.PROTECT, - to=settings.AUTH_USER_MODEL, - ), - ), - ( - "user", - bookwyrm.models.fields.ForeignKey( - on_delete=django.db.models.deletion.PROTECT, - related_name="+", - to=settings.AUTH_USER_MODEL, - ), - ), - ], - options={ - "abstract": False, - }, - bases=(bookwyrm.models.activitypub_mixin.ObjectMixin, models.Model), - ), - migrations.CreateModel( - name="MergedSeries", - fields=[ - ("deleted_id", models.IntegerField(primary_key=True, serialize=False)), - ( - "merged_into", - models.ForeignKey( - on_delete=django.db.models.deletion.PROTECT, - related_name="absorbed", - to="bookwyrm.series", - ), - ), - ], - options={ - "abstract": False, - }, - ), - migrations.AddField( - model_name="book", - name="book_series", - field=bookwyrm.models.fields.ManyToManyField( - related_name="books", to="bookwyrm.series" - ), - ), - migrations.CreateModel( - name="SeriesBook", - 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], - ), - ), - ( - "series_number", - bookwyrm.models.fields.CharField( - blank=True, max_length=255, null=True - ), - ), - ( - "book", - bookwyrm.models.fields.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name="seriesbooks", - to="bookwyrm.book", - ), - ), - ( - "series", - bookwyrm.models.fields.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name="seriesbooks", - to="bookwyrm.series", - ), - ), - ( - "user", - bookwyrm.models.fields.ForeignKey( - on_delete=django.db.models.deletion.PROTECT, - related_name="+", - to=settings.AUTH_USER_MODEL, - ), - ), - ], - options={ - "ordering": ("-series_number", "-created_date", "-updated_date"), - }, - bases=(bookwyrm.models.activitypub_mixin.ObjectMixin, models.Model), - ), - ] diff --git a/bookwyrm/migrations/0221_remove_book_book_series.py b/bookwyrm/migrations/0221_remove_book_book_series.py deleted file mode 100644 index d1fcef421a..0000000000 --- a/bookwyrm/migrations/0221_remove_book_book_series.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 5.2.3 on 2025-11-14 23:53 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ("bookwyrm", "0220_series_mergedseries_book_book_series_seriesbook"), - ] - - operations = [ - migrations.RemoveField( - model_name="book", - name="book_series", - ), - ] diff --git a/bookwyrm/migrations/0222_alter_seriesbook_options.py b/bookwyrm/migrations/0222_alter_seriesbook_options.py deleted file mode 100644 index c97c636d7f..0000000000 --- a/bookwyrm/migrations/0222_alter_seriesbook_options.py +++ /dev/null @@ -1,17 +0,0 @@ -# Generated by Django 5.2.3 on 2025-11-15 02:52 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ("bookwyrm", "0221_remove_book_book_series"), - ] - - operations = [ - migrations.AlterModelOptions( - name="seriesbook", - options={}, - ), - ] diff --git a/bookwyrm/models/book.py b/bookwyrm/models/book.py index 4be7175e9a..889ad49b1b 100644 --- a/bookwyrm/models/book.py +++ b/bookwyrm/models/book.py @@ -638,8 +638,14 @@ class Edition(Book): activity_serializer = activitypub.Edition name_field = "title" - serialize_reverse_fields = [("file_links", "fileLinks", "-created_date")] - deserialize_reverse_fields = [("file_links", "fileLinks")] + serialize_reverse_fields = [ + ("file_links", "fileLinks", "-created_date"), + ("seriesbooks", "seriesBooks", "-created_date"), + ] + deserialize_reverse_fields = [ + ("file_links", "fileLinks"), + ("seriesbooks", "seriesBooks"), + ] @property def hyphenated_isbn13(self): diff --git a/bookwyrm/models/bookwyrm_export_job.py b/bookwyrm/models/bookwyrm_export_job.py index 8fbb659ad0..3a9c16d090 100644 --- a/bookwyrm/models/bookwyrm_export_job.py +++ b/bookwyrm/models/bookwyrm_export_job.py @@ -6,6 +6,7 @@ from boto3.session import Session as BotoSession from s3_tar import S3Tar +from django.db import transaction from django.db.models import FileField, JSONField from django.core.serializers.json import DjangoJSONEncoder from django.core.files.base import ContentFile @@ -59,26 +60,27 @@ def create_export_json_task(**kwargs): if job.status == "stopped": return - try: - # generate JSON - data = export_user(job.user) - data["settings"] = export_settings(job.user) - data["goals"] = export_goals(job.user) - data["books"] = export_books(job.user) - data["saved_lists"] = export_saved_lists(job.user) - data["follows"] = export_follows(job.user) - data["blocks"] = export_blocks(job.user) - job.export_json = data - job.save(update_fields=["export_json"]) - - # trigger task to create tar file - create_archive_task.delay(job_id=job.id) - - except Exception as err: # pylint: disable=broad-except - logger.exception( - "create_export_json_task for job %s failed with error: %s", job.id, err - ) - job.set_status("failed") + with transaction.atomic(): + try: + # generate JSON + data = export_user(job.user) + data["settings"] = export_settings(job.user) + data["goals"] = export_goals(job.user) + data["books"] = export_books(job.user) + data["saved_lists"] = export_saved_lists(job.user) + data["follows"] = export_follows(job.user) + data["blocks"] = export_blocks(job.user) + job.export_json = data + job.save(update_fields=["export_json"]) + + # trigger task to create tar file + create_archive_task.delay(job_id=job.id) + + except Exception as err: # pylint: disable=broad-except + logger.exception( + "create_export_json_task for job %s failed with error: %s", job.id, err + ) + job.set_status("failed") def archive_file_location(file, directory="") -> str: diff --git a/bookwyrm/templates/book/edit/edit_series.html b/bookwyrm/templates/book/edit/edit_series.html index 19f08e5ef6..b0d44016a4 100644 --- a/bookwyrm/templates/book/edit/edit_series.html +++ b/bookwyrm/templates/book/edit/edit_series.html @@ -60,19 +60,17 @@

    {% blocktrans with name=series.name %}Edit "{{ name }}"{% endb
    - {% for book in books %} + {% for seriesbook in series.seriesbooks.all %}
    - + - {% include 'landing/small-book.html' with book=book.edition %} + {% include 'landing/small-book.html' with book=seriesbook.book.work.default_edition %}
    - {% with book=book %} - - {% endwith %} +
    {% endfor %} diff --git a/bookwyrm/templates/book/series.html b/bookwyrm/templates/book/series.html index 76cfd461e5..9d4d1bd62e 100644 --- a/bookwyrm/templates/book/series.html +++ b/bookwyrm/templates/book/series.html @@ -67,13 +67,13 @@

    {% trans "Identifiers" %}

    - {% for book in books %} + {% for seriesbook in series.seriesbooks.all %}
    - {% if book.series_number %}{% blocktrans with series_number=book.series_number %}Book #{{ series_number }}{% endblocktrans %}{% endif %} - {% include 'landing/small-book.html' with book=book.book %} + {% if seriesbook.series_number %}{% blocktrans with series_number=seriesbook.series_number %}Book #{{ series_number }}{% endblocktrans %}{% endif %} + {% include 'landing/small-book.html' with book=seriesbook.book.work.default_edition %}
    {% endfor %} diff --git a/bookwyrm/tests/activitypub/test_series.py b/bookwyrm/tests/activitypub/test_series.py index a22abc0d27..aad78a8cdd 100644 --- a/bookwyrm/tests/activitypub/test_series.py +++ b/bookwyrm/tests/activitypub/test_series.py @@ -52,7 +52,7 @@ def setUpTestData(cls): "languages": [], "series": "", "seriesNumber": "", - "bookSeries": ["https://example.com/series/2"], + "seriesBooks": ["https://example.com/seriesbook/2"], "subjects": [], "subjectPlaces": [], "authors": [], @@ -138,46 +138,30 @@ def test_deserialize_book_with_series(self): status=200, ) - # TODO: - # set_related_field.delay is in play here, we need to mock it so the seriesbook is unfurled + self.assertFalse(models.Work.objects.filter(title="Example Book 2").exists()) + self.assertFalse(models.Series.objects.filter(name="Example Series 2").exists()) + self.assertEqual(models.Series.objects.count(), 1) + self.assertEqual(models.Book.objects.count(), 1) book_data = activitypub.Work(**self.book_data) book = book_data.to_model() + with patch( + "bookwyrm.activitypub.base_activity.set_related_field.delay", + new_callable=set_related_field( + "SeriesBook", + "Work", + "book", + "https://example.com/book/2", + book_data.seriesBooks[0], + ), + ) as mocked: + book_data.to_model() # run it again to trigger the mock + mocked.assert_called() self.assertEqual(book.title, "Example Book 2") self.assertTrue(models.Series.objects.filter(name="Example Series 2").exists()) self.assertEqual(models.Series.objects.count(), 2) - - @responses.activate - def test_deserialize_book_series_no_duplicate(self): - """check that new-style series don't duplicate""" - - pass - # responses.add( - # responses.GET, - # "https://example.com/series/2", - # json=self.series_data, - # status=200, - # ) - - # responses.add( - # responses.GET, - # "https://example.com/seriesbook/2", - # json=self.seriesbook_data, - # status=200, - # ) - - # responses.add( - # responses.GET, - # "https://example.com/user/instance", - # json=self.user.to_activity(), - # status=200, - # ) - - # self.assertEqual(models.Series.objects.count(), 1) - # book_data = activitypub.Work(**self.book_data) - # book_data.to_model() - # self.assertEqual(models.Series.objects.count(), 1) + self.assertEqual(models.Book.objects.count(), 2) @responses.activate def test_deserialize_series(self): @@ -212,9 +196,6 @@ def test_deserialize_series(self): series_data = activitypub.Series(**self.series_data) s = series_data.to_model() - # related field seriesbook is created via a task - # so we have to mock it to be sure it's called - # and that when called it works properly with patch( "bookwyrm.activitypub.base_activity.set_related_field.delay", new_callable=set_related_field( diff --git a/bookwyrm/tests/connectors/test_inventaire_connector.py b/bookwyrm/tests/connectors/test_inventaire_connector.py index 1ea306a1f9..b5558dbb21 100644 --- a/bookwyrm/tests/connectors/test_inventaire_connector.py +++ b/bookwyrm/tests/connectors/test_inventaire_connector.py @@ -286,12 +286,33 @@ def test_remote_id_from_model(self): "https://inventaire.io?action=by-uris&uris=123", ) + @responses.activate def test_format_series(self): - """make an activitypub object from Inventaire JSON-LD""" + """make an activitypub series object from Inventaire JSON-LD""" + + ent = { + "uri": "wd:Q1234", + "originalLang": "fr", + "labels": {"fr": "Série de Tests", "en": "Test Series"}, + "claims": { + "wdt:P6947": ["grk123"], + "wdt:P1235": ["isfdb123"], + "wdt:P8513": ["ltk123"], + }, + } - pass + responses.add( + responses.GET, + "https://inventaire.io/?action=by-uris&uris=wd:999", + json={"entities": {"wd:999": ent}}, + ) - def test_get_or_create_seriesbook_from_data(self): - """create a seriesbook from activityjson""" + formatted = self.connector.format_series(["wd:999"]) + data = json.loads(formatted[0]) - pass + self.assertEqual(data["name"], "Série de Tests") + self.assertIsInstance(data["alternativeNames"], list) + self.assertEqual(data["wikidata"], "999") + self.assertEqual(data["goodreadsKey"], "grk123") + self.assertEqual(data["isfdb"], "isfdb123") + self.assertEqual(data["librarythingKey"], "ltk123") diff --git a/bookwyrm/tests/models/test_series.py b/bookwyrm/tests/models/test_series.py index 249dfb22e7..8d811c7c0a 100644 --- a/bookwyrm/tests/models/test_series.py +++ b/bookwyrm/tests/models/test_series.py @@ -1,7 +1,5 @@ """ testing series models """ -import json -from unittest.mock import patch -from django.db import IntegrityError + from django.test import TestCase from bookwyrm import models, settings @@ -30,6 +28,7 @@ def setUpTestData(cls): ) def test_seriesbook(self): + """making a seriesbook""" self.assertEqual(models.SeriesBook.objects.count(), 0) models.SeriesBook.objects.create( @@ -38,6 +37,7 @@ def test_seriesbook(self): self.assertEqual(models.SeriesBook.objects.count(), 1) def test_seriesbook_fields(self): + """do reverse fields work for seriesbook?""" self.assertEqual(models.SeriesBook.objects.count(), 0) seriesbook = models.SeriesBook.objects.create( diff --git a/bookwyrm/tests/views/books/test_series.py b/bookwyrm/tests/views/books/test_series.py index 7b6ec6f3b4..d4a8b4d674 100644 --- a/bookwyrm/tests/views/books/test_series.py +++ b/bookwyrm/tests/views/books/test_series.py @@ -1,11 +1,13 @@ """ test for app action functionality """ from unittest.mock import patch - +from django.contrib.auth.models import Group, Permission +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.http.response import Http404 -from bookwyrm import models, views +from bookwyrm import models, views, forms +from bookwyrm.activitypub import ActivitypubResponse from bookwyrm.tests.validate_html import validate_html @@ -16,16 +18,32 @@ class SeriesViews(TestCase): def setUpTestData(cls): """we need basic test data and mocks""" - cls.local_user = models.User.objects.create_user( - "mouse@local.com", "mouse@mouse.com", "mouseword" + cls.user = models.User.objects.create_user( + "instance", + "instance@example.example", + "pass", + local=True, + localname="instance", + ) + + cls.group = Group.objects.create(name="editor") + cls.group.permissions.add( + Permission.objects.create( + name="edit_book", + codename="edit_book", + content_type=ContentType.objects.get_for_model(models.User), + ).id ) cls.book = models.Work.objects.create(title="test book") cls.series = models.Series.objects.create( - name="test series", user=cls.local_user + name="test series", user=cls.user, remote_id="https://example.com/series/1" ) cls.seriesbook = models.SeriesBook.objects.create( - book=cls.book, series=cls.series, user=cls.local_user + book=cls.book, + series=cls.series, + user=cls.user, + remote_id="https://example.com/seriesbook/1", ) models.SiteSettings.objects.create() @@ -38,7 +56,7 @@ def test_series_page(self): """there are so many views, this just makes sure it LOADS""" view = views.Series.as_view() request = self.factory.get("") - request.user = self.local_user + request.user = self.user result = view(request, self.series.id) self.assertIsInstance(result, TemplateResponse) validate_html(result.render()) @@ -49,18 +67,57 @@ def test_editseries_page(self): """there are so many views, this just makes sure it LOADS""" view = views.EditSeries.as_view() request = self.factory.get("") - request.user = self.local_user + request.user = self.user result = view(request, self.series.id) self.assertIsInstance(result, TemplateResponse) validate_html(result.render()) self.assertEqual(result.status_code, 200) + def test_post_editseries_page(self): + """posting edit data""" + + self.assertEqual(self.seriesbook.series_number, None) + self.assertEqual(len(self.series.alternative_names), 0) + + view = views.EditSeries.as_view() + form = forms.SeriesForm(instance=self.series) + form.data["user"] = self.user.id + form.data["name"] = "New Series Name" + form.data["alternative_names"] = ["beep", "boop"] + form.data[f"series_number-{self.book.id}"] = "99" + request = self.factory.post("", form.data) + + self.user.groups.add(self.group) + request.user = self.user + + view(request, self.series.id) + self.series.refresh_from_db() + self.seriesbook.refresh_from_db() + + self.assertEqual(self.series.name, "New Series Name") + self.assertEqual(len(self.series.alternative_names), 2) + self.assertEqual(self.series.alternative_names[0], "beep") + self.assertEqual(self.series.alternative_names[1], "boop") + self.assertEqual(self.seriesbook.series_number, "99") + def test_seriesbook_page_404s(self): """make sure it doesn't load for normal traffic""" view = views.SeriesBook.as_view() request = self.factory.get("") - request.user = self.local_user + request.user = self.user with self.assertRaises(Http404): + view(request, self.seriesbook.id) + + def test_seriesbook_api(self): + """there are so many views, this just makes sure it LOADS""" + view = views.SeriesBook.as_view() + request = self.factory.get("") + request.user = self.user + + with patch("bookwyrm.views.books.series.is_api_request") as is_api: + is_api.return_value = True result = view(request, self.seriesbook.id) + self.assertIsInstance(result, ActivitypubResponse) + self.assertEqual(result.status_code, 200) diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py index a5803c8f25..b6c76ec83f 100644 --- a/bookwyrm/urls.py +++ b/bookwyrm/urls.py @@ -911,7 +911,7 @@ name="series", ), re_path( - rf"^series/(?P\d+)(.json)/?$", views.Series.as_view() + r"^series/(?P\d+)(.json)/?$", views.Series.as_view() ), # activitypub re_path( r"^series/(?P\d+)/edit/?$", diff --git a/bookwyrm/views/books/series.py b/bookwyrm/views/books/series.py index 4a5c90914b..f900dc08c2 100644 --- a/bookwyrm/views/books/series.py +++ b/bookwyrm/views/books/series.py @@ -62,24 +62,7 @@ def get(self, request, series_id=None): """edit page for series""" series = models.Series.objects.get(id=series_id) - seriesbooks = models.SeriesBook.objects.filter(series=series) - books = [] - for item in seriesbooks: - edition = item.book.work.default_edition - number = item.series_number or "" - books.append( - {"edition": edition, "number": number, "id": item.book.work.id} - ) - print({"edition": edition, "number": number, "id": item.book.work.id}) - - paginated = Paginator(books, PAGE_LENGTH) - page = paginated.get_page(request.GET.get("page")) - - data = { - "series": series, - "books": page, - "form": SeriesForm(instance=series), - } + data = {"series": series, "form": SeriesForm(instance=series)} return TemplateResponse(request, "book/edit/edit_series.html", data) @@ -87,23 +70,19 @@ def get(self, request, series_id=None): def post(self, request, series_id): """submit the series edit form""" - form = SeriesForm(request.POST) - data = {"form": form} + series = get_mergeable_object_or_404(models.Series, id=series_id) + form = SeriesForm(request.POST, instance=series) + data = {"series": series, "form": form} if not form.is_valid(): - # TODO do we need to persist seriesbook data also? - print("not valid") - print(form.errors) return TemplateResponse(request, "book/edit/edit_series.html", data) - instance = models.Series.objects.get(id=series_id) - form = SeriesForm(request.POST, instance=instance) series = form.save(request) - alt_titles = [] - for title in request.POST.getlist("alternative_names"): - if title != "": - alt_titles.append(title) - series.alternative_names = alt_titles + alt_names = [] + for a_name in request.POST.getlist("alternative_names"): + if a_name != "": + alt_names.append(a_name) + series.alternative_names = alt_names series.save(update_fields=["alternative_names"]) # update seriesbooks as needed @@ -123,6 +102,7 @@ class SeriesBook(View): @vary_on_headers("Accept") def get(self, request, seriesbook_id): """we just need this for resolving AP requests""" + seriesbook = get_mergeable_object_or_404(models.SeriesBook, id=seriesbook_id) if is_api_request(request): From 486a8aee283bcbfce313cb31f0c5f01fdf441f92 Mon Sep 17 00:00:00 2001 From: Hugh Rundle Date: Wed, 19 Nov 2025 15:37:58 +1100 Subject: [PATCH 171/962] add migration --- .../0224_series_mergedseries_seriesbook.py | 218 ++++++++++++++++++ 1 file changed, 218 insertions(+) create mode 100644 bookwyrm/migrations/0224_series_mergedseries_seriesbook.py diff --git a/bookwyrm/migrations/0224_series_mergedseries_seriesbook.py b/bookwyrm/migrations/0224_series_mergedseries_seriesbook.py new file mode 100644 index 0000000000..c0ad1cccd0 --- /dev/null +++ b/bookwyrm/migrations/0224_series_mergedseries_seriesbook.py @@ -0,0 +1,218 @@ +# Generated by Django 5.2.3 on 2025-11-19 04:37 + +import bookwyrm.models.activitypub_mixin +import bookwyrm.models.fields +import django.contrib.postgres.search +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0223_sitesettings_disable_federation"), + ] + + operations = [ + migrations.CreateModel( + name="Series", + 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], + ), + ), + ("origin_id", models.CharField(blank=True, max_length=255, null=True)), + ( + "openlibrary_key", + bookwyrm.models.fields.CharField( + blank=True, max_length=255, null=True + ), + ), + ( + "finna_key", + bookwyrm.models.fields.CharField( + blank=True, max_length=255, null=True + ), + ), + ( + "inventaire_id", + bookwyrm.models.fields.CharField( + blank=True, max_length=255, null=True + ), + ), + ( + "librarything_key", + bookwyrm.models.fields.CharField( + blank=True, max_length=255, null=True + ), + ), + ( + "goodreads_key", + bookwyrm.models.fields.CharField( + blank=True, max_length=255, null=True + ), + ), + ( + "bnf_id", + bookwyrm.models.fields.CharField( + blank=True, max_length=255, null=True + ), + ), + ( + "viaf", + bookwyrm.models.fields.CharField( + blank=True, max_length=255, null=True + ), + ), + ( + "wikidata", + bookwyrm.models.fields.CharField( + blank=True, max_length=255, null=True + ), + ), + ( + "asin", + bookwyrm.models.fields.CharField( + blank=True, max_length=255, null=True + ), + ), + ( + "aasin", + bookwyrm.models.fields.CharField( + blank=True, max_length=255, null=True + ), + ), + ( + "isfdb", + bookwyrm.models.fields.CharField( + blank=True, max_length=255, null=True + ), + ), + ( + "search_vector", + django.contrib.postgres.search.SearchVectorField(null=True), + ), + ("name", bookwyrm.models.fields.TextField(max_length=255)), + ( + "alternative_names", + bookwyrm.models.fields.ArrayField( + base_field=models.CharField(max_length=255), + blank=True, + default=list, + size=None, + ), + ), + ( + "last_edited_by", + bookwyrm.models.fields.ForeignKey( + null=True, + on_delete=django.db.models.deletion.PROTECT, + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "user", + bookwyrm.models.fields.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + ], + options={ + "abstract": False, + }, + bases=(bookwyrm.models.activitypub_mixin.ObjectMixin, models.Model), + ), + migrations.CreateModel( + name="MergedSeries", + fields=[ + ("deleted_id", models.IntegerField(primary_key=True, serialize=False)), + ( + "merged_into", + models.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="absorbed", + to="bookwyrm.series", + ), + ), + ], + options={ + "abstract": False, + }, + ), + migrations.CreateModel( + name="SeriesBook", + 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], + ), + ), + ( + "series_number", + bookwyrm.models.fields.CharField( + blank=True, max_length=255, null=True + ), + ), + ( + "book", + bookwyrm.models.fields.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="seriesbooks", + to="bookwyrm.book", + ), + ), + ( + "series", + bookwyrm.models.fields.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="seriesbooks", + to="bookwyrm.series", + ), + ), + ( + "user", + bookwyrm.models.fields.ForeignKey( + on_delete=django.db.models.deletion.PROTECT, + related_name="+", + to=settings.AUTH_USER_MODEL, + ), + ), + ], + options={ + "abstract": False, + }, + bases=(bookwyrm.models.activitypub_mixin.ObjectMixin, models.Model), + ), + ] From 77d67e2eeefd21bf434a62020b3c39633ac97d9f Mon Sep 17 00:00:00 2001 From: Hugh Rundle Date: Thu, 20 Nov 2025 11:25:58 +1100 Subject: [PATCH 172/962] use SearchVector in connectors - match to existing series using a search vector instead of exact matching - add series listing to author pages - clean up a few other details --- bookwyrm/connectors/abstract_connector.py | 56 ++++++++++++------- bookwyrm/connectors/inventaire.py | 10 ++-- bookwyrm/templates/author/author.html | 14 ++++- bookwyrm/templates/book/edit/edit_series.html | 4 ++ .../connectors/test_abstract_connector.py | 6 +- .../connectors/test_inventaire_connector.py | 8 +-- bookwyrm/views/author.py | 7 +++ bookwyrm/views/books/edit_book.py | 2 +- 8 files changed, 72 insertions(+), 35 deletions(-) diff --git a/bookwyrm/connectors/abstract_connector.py b/bookwyrm/connectors/abstract_connector.py index dfe617fb3f..c6ecf646da 100644 --- a/bookwyrm/connectors/abstract_connector.py +++ b/bookwyrm/connectors/abstract_connector.py @@ -13,9 +13,10 @@ from requests.exceptions import RequestException import aiohttp +from django.contrib.postgres.search import SearchRank, SearchVector from django.core.files.base import ContentFile from django.db import transaction -from django.db.models import Q +from django.db.models import Q, Subquery from bookwyrm import activitypub, models, settings from bookwyrm.settings import USER_AGENT, INSTANCE_ACTOR_USERNAME @@ -123,44 +124,57 @@ def get_or_create_seriesbook_from_data( # pylint: disable=no-self-use authors = work.authors.all().union(edition.authors.all()) # Inventaire series will be a list of activity strings - if work.series: - for data in json.loads(work.series): + if work.series and type(work.series) == list: + for data in work.series: series_data = models.Series(**data) series_to_process.append(series_data) - elif edition.series: + else: # otherwise it's just a a name - series_to_process.append(models.Series(name=edition.series)) - work.series_number = edition.series_number + name = work.series or edition.series + series_to_process.append(models.Series(name=name)) + work.series_number = work.series_number or edition.series_number for series in series_to_process: instance = None - possible_series = models.SeriesBook.objects.filter( - Q(series__name__iexact=series.name) - | Q(series__alternative_names__icontains=series.name) - | Q(series__alternative_names__in=series.alternative_names) + + vector = SearchVector("name", weight="A") + SearchVector( + "alternative_names", weight="B" + ) + possible_series = ( + models.Series.objects.annotate(search=vector) + .annotate(rank=SearchRank(vector, series.name, normalization=32)) + .filter( + rank__gt=0.19 + ) # short alias names like XY get rank around 0.1956 + # .prefetch_related("seriesbooks") + .order_by("-rank")[:5] ) if possible_series.exists(): - # there is probably a more efficient way to do this... - for seriesbook in possible_series.all(): - for author in seriesbook.book.authors.all(): - if author in authors.all(): - # we already have a series with same name - # and author, let's feel lucky - instance = seriesbook.series - break + for series in possible_series.all(): + books = models.Book.objects.filter( + authors__in=Subquery(authors.values("pk")) + ) + if models.SeriesBook.objects.filter(book__in=books).filter( + series=series + ): + # we already have a series name with matching author, let's feel lucky + instance = series + break if not instance: # leave it for the user to work out if work.series: edition.series = series.name - edition.series_number = json.loads(work.series)[0].get( - "series_number", "" - ) + edition.series_number = work.series_number edition.save() continue + edition.series = None + edition.series_number = None + edition.save() + activitydata_to_seriesbook( user=user, work=work, new=series, instance=instance ) diff --git a/bookwyrm/connectors/inventaire.py b/bookwyrm/connectors/inventaire.py index 55d17609f8..1f63cf3df5 100644 --- a/bookwyrm/connectors/inventaire.py +++ b/bookwyrm/connectors/inventaire.py @@ -267,16 +267,16 @@ def format_series(self, keys: Iterable[str]) -> list[dict]: else: alternative_names.add(v) - series["alternativeNames"] = list(alternative_names) - series["inventaireId"] = uri + series["alternative_names"] = list(alternative_names) + series["inventaire_id"] = uri series["wikidata"] = uri.split("wd:")[1] if series_data.get("wdt:P6947"): - series["goodreadsKey"] = series_data["wdt:P6947"][0] + series["goodreads_key"] = series_data["wdt:P6947"][0] if series_data.get("wdt:P1235"): series["isfdb"] = series_data["wdt:P1235"][0] if series_data.get("wdt:P8513"): - series["librarythingKey"] = series_data["wdt:P8513"][0] - series_list.append(json.dumps(series)) + series["librarything_key"] = series_data["wdt:P8513"][0] + series_list.append(series) return series_list diff --git a/bookwyrm/templates/author/author.html b/bookwyrm/templates/author/author.html index 043f3fa54d..cf8a970984 100644 --- a/bookwyrm/templates/author/author.html +++ b/bookwyrm/templates/author/author.html @@ -57,6 +57,18 @@

    {% trans "Author details" %}

    {{ author.died|naturalday }}
    {% endif %} + + {% if series %} +
    +
    {% trans "Series:" %}
    +
    + {% for s in series %} + {{ s.name }}{% if not forloop.last%},{% endif %} + {% endfor %} +
    +
    + + {% endif %} {% endif %} @@ -79,7 +91,7 @@

    {% trans "External links" %}

    {% trans "View on Wikidata" %} - {% endif %} + {% endif %} {% if author.website %}
    diff --git a/bookwyrm/templates/book/edit/edit_series.html b/bookwyrm/templates/book/edit/edit_series.html index b0d44016a4..f560cfd08c 100644 --- a/bookwyrm/templates/book/edit/edit_series.html +++ b/bookwyrm/templates/book/edit/edit_series.html @@ -19,6 +19,10 @@

    {% blocktrans with name=series.name %}Edit "{{ name }}"{% endblocktrans %}

    +{% for match in matches.all %} + {{match.name}} +{% endfor %} + {% csrf_token %} diff --git a/bookwyrm/tests/connectors/test_abstract_connector.py b/bookwyrm/tests/connectors/test_abstract_connector.py index e7e3693f48..a14b8c9cbe 100644 --- a/bookwyrm/tests/connectors/test_abstract_connector.py +++ b/bookwyrm/tests/connectors/test_abstract_connector.py @@ -182,7 +182,7 @@ def test_get_or_create_seriesbook_from_data(self): """do we make a seriesbook?""" work = models.Work.objects.create(title="Test Book") - work.series = json.dumps([{"name": "Test Series 1"}]) + work.series = [{"name": "Test Series 1"}] edition = self.book self.assertEqual(models.Series.objects.count(), 0) @@ -205,7 +205,7 @@ def test_get_or_create_seriesbook_from_existing_series(self): ) work = models.Work.objects.create(title="Test Book") - work.series = json.dumps([{"name": "Test Series 1"}]) + work.series = [{"name": "Test Series 1"}] edition = self.book edition.authors.add(author) @@ -229,7 +229,7 @@ def test_get_or_create_seriesbook_with_ambiguous_series(self): ) work = models.Work.objects.create(title="Test Book 2") - work.series = json.dumps([{"name": "Test Series 1"}]) + work.series = [{"name": "Test Series 1"}] edition = models.Edition.objects.create(title="Test Book 2") edition.authors.add(author) diff --git a/bookwyrm/tests/connectors/test_inventaire_connector.py b/bookwyrm/tests/connectors/test_inventaire_connector.py index b5558dbb21..278f93e42f 100644 --- a/bookwyrm/tests/connectors/test_inventaire_connector.py +++ b/bookwyrm/tests/connectors/test_inventaire_connector.py @@ -308,11 +308,11 @@ def test_format_series(self): ) formatted = self.connector.format_series(["wd:999"]) - data = json.loads(formatted[0]) + data = formatted[0] self.assertEqual(data["name"], "Série de Tests") - self.assertIsInstance(data["alternativeNames"], list) + self.assertIsInstance(data["alternative_names"], list) self.assertEqual(data["wikidata"], "999") - self.assertEqual(data["goodreadsKey"], "grk123") + self.assertEqual(data["goodreads_key"], "grk123") self.assertEqual(data["isfdb"], "isfdb123") - self.assertEqual(data["librarythingKey"], "ltk123") + self.assertEqual(data["librarything_key"], "ltk123") diff --git a/bookwyrm/views/author.py b/bookwyrm/views/author.py index 5ab9ff9f40..5f002cf484 100644 --- a/bookwyrm/views/author.py +++ b/bookwyrm/views/author.py @@ -42,10 +42,17 @@ def get(self, request, author_id, slug=None): .distinct() ) + series = ( + models.Series.objects.filter(seriesbooks__book__authors=author) + .order_by("created_date") + .distinct() + ) + paginated = Paginator(books, PAGE_LENGTH) page = paginated.get_page(request.GET.get("page")) data = { "author": author, + "series": series, "books": page, "page_range": paginated.get_elided_page_range( page.number, on_each_side=2, on_ends=1 diff --git a/bookwyrm/views/books/edit_book.py b/bookwyrm/views/books/edit_book.py index ab65e0841b..3851c17b1c 100644 --- a/bookwyrm/views/books/edit_book.py +++ b/bookwyrm/views/books/edit_book.py @@ -252,7 +252,7 @@ def add_series(request, data): matches = ( models.Series.objects.annotate(search=vector) .annotate(rank=SearchRank(vector, series, normalization=32)) - .filter(rank__gt=0.015) + .filter(rank__gt=0.019) .order_by("-rank")[:5] ) From dd189404b0f8536c4a4a5ce462605e124e3b23ee Mon Sep 17 00:00:00 2001 From: Hugh Rundle Date: Thu, 20 Nov 2025 18:24:28 +1100 Subject: [PATCH 173/962] add management command and improve connector series matching --- bookwyrm/connectors/abstract_connector.py | 26 +++---- bookwyrm/connectors/inventaire.py | 1 - .../management/commands/upgrade_series.py | 77 +++++++++++++++++++ .../connectors/test_abstract_connector.py | 9 ++- 4 files changed, 94 insertions(+), 19 deletions(-) create mode 100644 bookwyrm/management/commands/upgrade_series.py diff --git a/bookwyrm/connectors/abstract_connector.py b/bookwyrm/connectors/abstract_connector.py index c6ecf646da..5385bef8e8 100644 --- a/bookwyrm/connectors/abstract_connector.py +++ b/bookwyrm/connectors/abstract_connector.py @@ -4,7 +4,6 @@ from typing import Optional, TypedDict, Any, Callable, Union, Iterator from urllib.parse import quote_plus -import json import logging import re import asyncio @@ -16,7 +15,7 @@ from django.contrib.postgres.search import SearchRank, SearchVector from django.core.files.base import ContentFile from django.db import transaction -from django.db.models import Q, Subquery +from django.db.models import Subquery from bookwyrm import activitypub, models, settings from bookwyrm.settings import USER_AGENT, INSTANCE_ACTOR_USERNAME @@ -124,7 +123,7 @@ def get_or_create_seriesbook_from_data( # pylint: disable=no-self-use authors = work.authors.all().union(edition.authors.all()) # Inventaire series will be a list of activity strings - if work.series and type(work.series) == list: + if work.series and isinstance(work.series, list): for data in work.series: series_data = models.Series(**data) series_to_process.append(series_data) @@ -146,21 +145,20 @@ def get_or_create_seriesbook_from_data( # pylint: disable=no-self-use .filter( rank__gt=0.19 ) # short alias names like XY get rank around 0.1956 - # .prefetch_related("seriesbooks") .order_by("-rank")[:5] ) if possible_series.exists(): - for series in possible_series.all(): - books = models.Book.objects.filter( - authors__in=Subquery(authors.values("pk")) - ) - if models.SeriesBook.objects.filter(book__in=books).filter( - series=series - ): - # we already have a series name with matching author, let's feel lucky - instance = series - break + books = models.Book.objects.filter( + authors__in=Subquery(authors.values("pk")) + ) + + if same_author_sb := models.SeriesBook.objects.filter( + book__in=books + ).filter(series__in=Subquery(possible_series.values("pk"))): + # there is already a series with a seriesbook by a matching author + # let's feel lucky + instance = same_author_sb.first().series if not instance: # leave it for the user to work out diff --git a/bookwyrm/connectors/inventaire.py b/bookwyrm/connectors/inventaire.py index 1f63cf3df5..edd7807f23 100644 --- a/bookwyrm/connectors/inventaire.py +++ b/bookwyrm/connectors/inventaire.py @@ -1,5 +1,4 @@ """ inventaire data connector """ -import json import re from typing import Any, Union, Optional, Iterator, Iterable diff --git a/bookwyrm/management/commands/upgrade_series.py b/bookwyrm/management/commands/upgrade_series.py new file mode 100644 index 0000000000..e952317328 --- /dev/null +++ b/bookwyrm/management/commands/upgrade_series.py @@ -0,0 +1,77 @@ +"""fix legacy series""" + +from django.core.management.base import BaseCommand +from django.contrib.postgres.search import SearchRank, SearchVector +from django.db.models.functions import Length +from bookwyrm import activitypub +from bookwyrm.models import Book, Edition, Series, SeriesBook, User + + +def upgrade_series_data(): + """turn strings into things""" + + user = activitypub.get_representative() + series_count = Series.objects.count() + seriesbook_count = SeriesBook.objects.count() + + for book in ( + Edition.objects.filter(parent_work__seriesbooks=None).exclude(series=None).all() + ): + + vector = SearchVector("name", weight="A") + SearchVector( + "alternative_names", weight="B" + ) + possible_series = ( + Series.objects.annotate(search=vector) + .annotate(rank=SearchRank(vector, book.series, normalization=32)) + .filter(rank__gt=0.19) + .order_by("-rank")[:5] + ) + + if possible_series.exists(): + + books = Book.objects.filter(authors__in=Subquery(book.authors.values("pk"))) + + if same_author_sb := SeriesBook.objects.filter(book__in=books).filter( + series__in=Subquery(possible_series.values("pk")) + ): + # there is a series with a seriesbook by a matching author + # let's feel lucky + series = same_author_sb.first().series + + else: + # there might be a matching series but we don't know + # leave it for a user to work out manually + continue + else: + series = Series.objects.create(name=book.series, user=user) + + SeriesBook.objects.create( + series=series, + book=book.parent_work, + series_number=book.series_number, + user=user, + ) + + book.series = None + book.series_number = None + + # print how many things we created + new_series_count = Series.objects.count() + new_seriesbook_count = SeriesBook.objects.count() + net_series = new_series_count - series_count + net_books = new_seriesbook_count - seriesbook_count + + print("-------") + print(f"Created {net_series} new Series and {net_books} new SeriesBooks") + + +class Command(BaseCommand): + """Turn legacy series data into Series and SeriesBook objects""" + + help = "Turn legacy series data into Series and SeriesBook objects" + + # pylint: disable=no-self-use,unused-argument + def handle(self, *args, **options): + """run data migration""" + upgrade_series_data() diff --git a/bookwyrm/tests/connectors/test_abstract_connector.py b/bookwyrm/tests/connectors/test_abstract_connector.py index a14b8c9cbe..32b72de2e8 100644 --- a/bookwyrm/tests/connectors/test_abstract_connector.py +++ b/bookwyrm/tests/connectors/test_abstract_connector.py @@ -1,5 +1,5 @@ """ testing book data connectors """ -import json + from unittest.mock import patch from django.test import TestCase import responses @@ -206,8 +206,11 @@ def test_get_or_create_seriesbook_from_existing_series(self): work = models.Work.objects.create(title="Test Book") work.series = [{"name": "Test Series 1"}] - edition = self.book + edition = models.Edition.objects.create(title="Test Book 2") edition.authors.add(author) + self.book.authors.add(author) + edition.save() + self.book.save() self.assertEqual(models.Series.objects.count(), 1) self.assertEqual(models.SeriesBook.objects.count(), 1) @@ -220,7 +223,6 @@ def test_get_or_create_seriesbook_from_existing_series(self): def test_get_or_create_seriesbook_with_ambiguous_series(self): """do we get series info in the book when we can't match author?""" - author = models.Author.objects.create(name="Sammy") series = models.Series.objects.create( name="Test Series 1", user=self.local_user ) @@ -231,7 +233,6 @@ def test_get_or_create_seriesbook_with_ambiguous_series(self): work = models.Work.objects.create(title="Test Book 2") work.series = [{"name": "Test Series 1"}] edition = models.Edition.objects.create(title="Test Book 2") - edition.authors.add(author) self.assertEqual(models.Series.objects.count(), 1) self.assertEqual(models.SeriesBook.objects.count(), 1) From bfc8304bb6e023a0e9532c609086c17c29c73ddb Mon Sep 17 00:00:00 2001 From: Hugh Rundle Date: Thu, 20 Nov 2025 18:43:38 +1100 Subject: [PATCH 174/962] fix upgrade_series admin command --- bookwyrm/management/commands/upgrade_series.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bookwyrm/management/commands/upgrade_series.py b/bookwyrm/management/commands/upgrade_series.py index e952317328..102340915e 100644 --- a/bookwyrm/management/commands/upgrade_series.py +++ b/bookwyrm/management/commands/upgrade_series.py @@ -2,6 +2,7 @@ from django.core.management.base import BaseCommand from django.contrib.postgres.search import SearchRank, SearchVector +from django.db.models import Subquery from django.db.models.functions import Length from bookwyrm import activitypub from bookwyrm.models import Book, Edition, Series, SeriesBook, User @@ -55,6 +56,7 @@ def upgrade_series_data(): book.series = None book.series_number = None + book.save(broadcast=False) # print how many things we created new_series_count = Series.objects.count() From 57b70fdac90fa79f01f838df30199bde8ba261e7 Mon Sep 17 00:00:00 2001 From: Hugh Rundle Date: Fri, 21 Nov 2025 07:57:53 +1100 Subject: [PATCH 175/962] fix linters hopefully --- bookwyrm/connectors/abstract_connector.py | 10 +++++----- bookwyrm/connectors/inventaire.py | 2 +- bookwyrm/templates/book/series.html | 6 ++---- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/bookwyrm/connectors/abstract_connector.py b/bookwyrm/connectors/abstract_connector.py index 5385bef8e8..e885a9a261 100644 --- a/bookwyrm/connectors/abstract_connector.py +++ b/bookwyrm/connectors/abstract_connector.py @@ -125,12 +125,12 @@ def get_or_create_seriesbook_from_data( # pylint: disable=no-self-use # Inventaire series will be a list of activity strings if work.series and isinstance(work.series, list): for data in work.series: - series_data = models.Series(**data) + series_data = models.Series(**data) # type: ignore series_to_process.append(series_data) else: # otherwise it's just a a name name = work.series or edition.series - series_to_process.append(models.Series(name=name)) + series_to_process.append(models.Series(name=name)) # type: ignore work.series_number = work.series_number or edition.series_number for series in series_to_process: @@ -158,9 +158,9 @@ def get_or_create_seriesbook_from_data( # pylint: disable=no-self-use ).filter(series__in=Subquery(possible_series.values("pk"))): # there is already a series with a seriesbook by a matching author # let's feel lucky - instance = same_author_sb.first().series + instance = same_author_sb.first().series # type: ignore - if not instance: + else: # leave it for the user to work out if work.series: edition.series = series.name @@ -174,7 +174,7 @@ def get_or_create_seriesbook_from_data( # pylint: disable=no-self-use edition.save() activitydata_to_seriesbook( - user=user, work=work, new=series, instance=instance + user=user, work=work, new=series, instance=instance # type: ignore ) @abstractmethod diff --git a/bookwyrm/connectors/inventaire.py b/bookwyrm/connectors/inventaire.py index edd7807f23..ed3e536e70 100644 --- a/bookwyrm/connectors/inventaire.py +++ b/bookwyrm/connectors/inventaire.py @@ -242,7 +242,7 @@ def get_remote_id_from_model(self, obj: models.BookDataModel) -> str: remote_id_value = obj.inventaire_id return self.get_remote_id(remote_id_value) - def format_series(self, keys: Iterable[str]) -> list[dict]: + def format_series(self, keys: Iterable[str]) -> list[dict[str, str]]: """resolve series data into activitypub data""" series_list = [] diff --git a/bookwyrm/templates/book/series.html b/bookwyrm/templates/book/series.html index 9d4d1bd62e..968bdbf28c 100644 --- a/bookwyrm/templates/book/series.html +++ b/bookwyrm/templates/book/series.html @@ -4,8 +4,6 @@ {% block title %}{{ series.name }}{% endblock %} {% block content %} - -
    {% with user_authenticated=request.user.is_authenticated can_edit_book=perms.bookwyrm.edit_book %} {% if user_authenticated and can_edit_book %} @@ -24,7 +22,6 @@

    {{ series.name }}

    {% include 'snippets/authors.html' with book=series_authors limit=5 %}

    {% endif %} - {% endwith %}
    {% if series.alternative_names%} @@ -64,7 +61,7 @@

    {% trans "Identifiers" %}

    {% endif %}
    -
    +
    {% for seriesbook in series.seriesbooks.all %} @@ -78,5 +75,6 @@

    {% trans "Identifiers" %}

    {% endfor %} + {% endwith %} {% endblock %} From ece395fbc5db57160f6701d64fea89cd948aae3c Mon Sep 17 00:00:00 2001 From: Hugh Rundle Date: Fri, 21 Nov 2025 10:53:13 +1100 Subject: [PATCH 176/962] fix is_api_request This addresses a CodeQL error about unsafe regex. '.*' matches anything, which leaves us open to DDoS attacks. This fix matches anything that isn't whitespace, up to 100 characters. As we're only matching the path after the domain, this should be plenty. --- bookwyrm/views/helpers.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/views/helpers.py b/bookwyrm/views/helpers.py index aa8c254299..33a492e8b1 100644 --- a/bookwyrm/views/helpers.py +++ b/bookwyrm/views/helpers.py @@ -49,7 +49,7 @@ def get_user_from_username(viewer, username): def is_api_request(request): """check whether a request is asking for html or data""" is_api = "json" in request.headers.get("Accept", "") or re.match( - r".*\.json/?$", request.path + r"\S{1,100}\.json/?$", request.path ) if is_api: From 304d71f416027cba5ec77c00245abc08fc5c6321 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Thu, 20 Nov 2025 21:52:59 -0800 Subject: [PATCH 177/962] New translations django.po (Lithuanian) --- locale/lt_LT/LC_MESSAGES/django.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/lt_LT/LC_MESSAGES/django.po b/locale/lt_LT/LC_MESSAGES/django.po index dc0fec796c..90afbfa503 100644 --- a/locale/lt_LT/LC_MESSAGES/django.po +++ b/locale/lt_LT/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-11-16 19:21+0000\n" -"PO-Revision-Date: 2025-11-16 19:34\n" +"PO-Revision-Date: 2025-11-21 05:52\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Lithuanian\n" "Language: lt\n" @@ -79,7 +79,7 @@ msgstr "Vartotojas su šiuo el. pašto adresu jau yra." #: bookwyrm/forms/landing.py:69 msgid "This email address cannot be registered." -msgstr "" +msgstr "Šiuo el. pašto adresu negalima registruotis." #: bookwyrm/forms/landing.py:114 msgid "Password cannot be the same as your current password" From 829f872c2ebf916aff9e266028eaf29d002b9f4e Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Thu, 20 Nov 2025 22:53:06 -0800 Subject: [PATCH 178/962] New translations django.po (Lithuanian) --- locale/lt_LT/LC_MESSAGES/django.po | 106 ++++++++++++++--------------- 1 file changed, 53 insertions(+), 53 deletions(-) diff --git a/locale/lt_LT/LC_MESSAGES/django.po b/locale/lt_LT/LC_MESSAGES/django.po index 90afbfa503..ff54f09767 100644 --- a/locale/lt_LT/LC_MESSAGES/django.po +++ b/locale/lt_LT/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-11-16 19:21+0000\n" -"PO-Revision-Date: 2025-11-21 05:52\n" +"PO-Revision-Date: 2025-11-21 06:53\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Lithuanian\n" "Language: lt\n" @@ -75,7 +75,7 @@ msgstr "Toks naudotojo vardas jau egzistuoja" #: bookwyrm/forms/landing.py:65 msgid "A user with this email already exists." -msgstr "Vartotojas su šiuo el. pašto adresu jau yra." +msgstr "Naudotojas su šiuo el. pašto adresu jau yra." #: bookwyrm/forms/landing.py:69 msgid "This email address cannot be registered." @@ -83,7 +83,7 @@ msgstr "Šiuo el. pašto adresu negalima registruotis." #: bookwyrm/forms/landing.py:114 msgid "Password cannot be the same as your current password" -msgstr "" +msgstr "Naujasis slaptažodis turi skirtis nuo esamojo" #: bookwyrm/forms/landing.py:145 bookwyrm/forms/landing.py:153 msgid "Incorrect code" @@ -201,12 +201,12 @@ msgstr "Knyga minkštais viršeliais" #: bookwyrm/models/book.py:533 bookwyrm/models/book.py:538 #, python-format msgid "%(value)s doesn't look like an ISBN" -msgstr "" +msgstr "„%(value)s“ neatrodo kaip ISBN kodas" #: bookwyrm/models/book.py:515 bookwyrm/models/book.py:555 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" -msgstr "" +msgstr "Kode „%(value)s“ ISBN kontrolinis skaitmuo klaidingas – tikėtasi „%(check_version)s“" #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:84 #: bookwyrm/templates/settings/reports/report.html:115 @@ -239,28 +239,28 @@ msgstr "Blokuoti" #: bookwyrm/models/bookwyrm_import_job.py:398 msgid "Unknown error importing book" -msgstr "" +msgstr "Netikėta klaida importuojant knygą" #: bookwyrm/models/bookwyrm_import_job.py:496 msgid "unauthorized" -msgstr "" +msgstr "neleista" #: bookwyrm/models/bookwyrm_import_job.py:502 msgid "Unknown error importing book status" -msgstr "" +msgstr "Netikėta klaida importuojant knygos būseną" #: bookwyrm/models/bookwyrm_import_job.py:696 #: bookwyrm/models/bookwyrm_import_job.py:722 msgid "connection_error" -msgstr "" +msgstr "ryšio_klaida" #: bookwyrm/models/bookwyrm_import_job.py:732 msgid "invalid_relationship" -msgstr "" +msgstr "netinkamas_sąryšis" #: bookwyrm/models/bookwyrm_import_job.py:740 msgid "Unkown error importing relationship" -msgstr "" +msgstr "Netikėta klaida importuojant sąryšį" #: bookwyrm/models/federated_server.py:11 #: bookwyrm/templates/settings/federation/edit_instance.html:55 @@ -331,11 +331,11 @@ msgstr "Privatu" #: bookwyrm/models/housekeeping.py:116 msgid "Missing" -msgstr "" +msgstr "Nerasta" #: bookwyrm/models/housekeeping.py:117 msgid "Wrong Path" -msgstr "" +msgstr "Blogas kelias" #: bookwyrm/models/import_job.py:50 bookwyrm/models/job.py:19 #: bookwyrm/templates/import/import.html:184 @@ -379,7 +379,7 @@ msgstr "Nepavyko rasti tokios knygos" #: bookwyrm/models/job.py:22 #: bookwyrm/templates/import/user_import_status.html:69 msgid "Failed" -msgstr "" +msgstr "Nepavyko" #: bookwyrm/models/link.py:55 msgid "Free" @@ -396,75 +396,75 @@ msgstr "Galima pasiskolinti" #: bookwyrm/models/link.py:74 #: bookwyrm/templates/settings/link_domains/link_domains.html:23 msgid "Approved" -msgstr "Patvirtinti puslapiai" +msgstr "Patvirtinti" #: bookwyrm/models/report.py:85 msgid "Resolved report" -msgstr "" +msgstr "Pranešimas išspręstas" #: bookwyrm/models/report.py:86 msgid "Re-opened report" -msgstr "" +msgstr "Pranešimas atidarytas pakartotinai" #: bookwyrm/models/report.py:87 msgid "Messaged reporter" -msgstr "" +msgstr "Žinutė pranešėjui" #: bookwyrm/models/report.py:88 msgid "Messaged reported user" -msgstr "" +msgstr "Žinutė naudotojui, apie kurį pranešta" #: bookwyrm/models/report.py:89 msgid "Suspended user" -msgstr "" +msgstr "Naudotojas laikinai užblokuotas" #: bookwyrm/models/report.py:90 msgid "Un-suspended user" -msgstr "" +msgstr "Naudotojas atblokuotas" #: bookwyrm/models/report.py:91 msgid "Changed user permission level" -msgstr "" +msgstr "Pakeistos naudotojo teisių lygmuo" #: bookwyrm/models/report.py:92 msgid "Deleted user account" -msgstr "" +msgstr "Pašalinta naudotojo paskyra" #: bookwyrm/models/report.py:93 msgid "Blocked domain" -msgstr "" +msgstr "Domenas užblokuotas" #: bookwyrm/models/report.py:94 msgid "Approved domain" -msgstr "" +msgstr "Domenas patvirtintas" #: bookwyrm/models/report.py:95 msgid "Deleted item" -msgstr "" +msgstr "Elementas pašalintas" #: bookwyrm/models/session.py:42 msgid "Unknown" -msgstr "" +msgstr "Nežinomas" #: bookwyrm/models/status.py:192 #, python-format msgid "%(display_name)s's status" -msgstr "" +msgstr "%(display_name)s – būsena" #: bookwyrm/models/status.py:367 #, python-format msgid "%(display_name)s's comment on %(book_title)s" -msgstr "" +msgstr "%(display_name)s – knygos „%(book_title)s“ komentaras" #: bookwyrm/models/status.py:418 #, python-format msgid "%(display_name)s's quote from %(book_title)s" -msgstr "" +msgstr "%(display_name)s – knygos „%(book_title)s“ citata" #: bookwyrm/models/status.py:454 #, python-format msgid "%(display_name)s's review of %(book_title)s" -msgstr "" +msgstr "%(display_name)s – knygos „%(book_title)s“ recenzija" #: bookwyrm/models/status.py:486 #, python-format @@ -473,7 +473,7 @@ msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" msgstr[0] "" msgstr[1] "" msgstr[2] "" -msgstr[3] "" +msgstr[3] "%(display_name)s įvertino knygą „%(book_title)s“ %(display_rating).1f žvaigždučių" #: bookwyrm/models/user.py:39 bookwyrm/templates/book/book.html:336 msgid "Reviews" @@ -546,7 +546,7 @@ msgstr "Italų (Italian)" #: bookwyrm/settings.py:324 msgid "한국어 (Korean)" -msgstr "" +msgstr "한국어 (korėjiečių)" #: bookwyrm/settings.py:325 msgid "Suomi (Finnish)" @@ -562,7 +562,7 @@ msgstr "Lietuvių" #: bookwyrm/settings.py:328 msgid "Nederlands (Dutch)" -msgstr "" +msgstr "Nederlands (Olandų)" #: bookwyrm/settings.py:329 msgid "Norsk (Norwegian)" @@ -590,7 +590,7 @@ msgstr "Svenska (Švedų)" #: bookwyrm/settings.py:335 msgid "Українська (Ukrainian)" -msgstr "" +msgstr "Українська (Ukrainiečių)" #: bookwyrm/settings.py:336 msgid "简体中文 (Simplified Chinese)" @@ -602,7 +602,7 @@ msgstr "繁體中文 (Tradicinė kinų)" #: bookwyrm/templates/403.html:5 msgid "Oh no!" -msgstr "" +msgstr "O, ne!" #: bookwyrm/templates/403.html:9 bookwyrm/templates/landing/invite.html:21 msgid "Permission Denied" @@ -611,11 +611,11 @@ 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 "" +msgstr "Jums nesuteiktos teisės matyti šį tinklalapį ar atlikti veiksmą. Jūsų naudotojo teisių lygmuo yra %(level)s." #: bookwyrm/templates/403.html:15 msgid "If you think you should have access, please speak to your BookWyrm server administrator." -msgstr "" +msgstr "Jei manote, kad prieigą turėti turėtumėte, susisiekite su savo „BookWyrm“ serverio administratoriumi." #: bookwyrm/templates/404.html:4 bookwyrm/templates/404.html:8 msgid "Not Found" @@ -627,11 +627,11 @@ msgstr "Jūsų ieškomas puslapis neegzistuoja." #: bookwyrm/templates/413.html:4 bookwyrm/templates/413.html:8 msgid "File too large" -msgstr "" +msgstr "Failas per didelis" #: bookwyrm/templates/413.html:9 msgid "The file you are uploading is too large." -msgstr "" +msgstr "Mėginamas įkelit failas yra per didelis." #: bookwyrm/templates/413.html:11 msgid "You you can try using a smaller file, or ask your BookWyrm server administrator to increase the DATA_UPLOAD_MAX_MEMORY_SIZE setting." @@ -724,7 +724,7 @@ msgstr "Rekvizitai" #: bookwyrm/templates/about/layout.html:11 msgid "Active users:" -msgstr "Aktyvūs vartotojai:" +msgstr "Aktyvūs naudotojai:" #: bookwyrm/templates/about/layout.html:15 msgid "Statuses posted:" @@ -1682,7 +1682,7 @@ msgstr "Veiksmai" #: bookwyrm/templates/book/file_links/edit_links.html:48 #: bookwyrm/templates/settings/link_domains/link_table.html:21 msgid "Unknown user" -msgstr "Nežinomas vartotojas" +msgstr "Nežinomas naudotojas" #: bookwyrm/templates/book/file_links/edit_links.html:57 #: bookwyrm/templates/book/file_links/verification_modal.html:22 @@ -2202,7 +2202,7 @@ msgstr "Ką sekti" #: bookwyrm/templates/feed/suggested_users.html:9 msgid "Don't show suggested users" -msgstr "Nerodyti siūlomų vartotojų" +msgstr "Nerodyti siūlomų naudotojų" #: bookwyrm/templates/feed/suggested_users.html:14 msgid "View directory" @@ -2373,7 +2373,7 @@ msgstr "Jūsų paskyra atsiras kataloge ir gali būti rekomenduota kitiems „Bo #: bookwyrm/templates/get_started/users.html:8 msgid "You can follow users on other BookWyrm instances and federated services like Mastodon." -msgstr "Galite sekti vartotojus iš kitų BookWyrm serverių ar federacijos programų, tokių kaip Mastodon." +msgstr "Galite sekti naudotojus iš kitų „BookWyrm“ serverių ir federuotų tarnybų, kaip antai „Mastodon“." #: bookwyrm/templates/get_started/users.html:11 msgid "Search for a user" @@ -4563,7 +4563,7 @@ msgstr "Paskyra taps paslėpta, tačiau prisijungus prie saito bus galima aktyvu #: bookwyrm/templates/preferences/delete_user.html:20 msgid "Deactivate Account" -msgstr "Išjungti vartotojo vardą" +msgstr "Išjungti paskyrą" #: bookwyrm/templates/preferences/delete_user.html:26 msgid "Permanently delete account" @@ -4589,7 +4589,7 @@ msgstr "Išjungti dviejų lygių autentifikavimą" #: 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 "Išjungus 2FA bet kas, žinantis vartotojo vardą ir slaptažodį, galės prisijungti prie paskyros." +msgstr "Išjungus 2FA bet kas, žinantis naudotojo vardą ir slaptažodį, galės prisijungti prie paskyros." #: bookwyrm/templates/preferences/disable-2fa.html:20 msgid "Turn off 2FA" @@ -6014,7 +6014,7 @@ msgstr "Apriboti importo skaičių" #: 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 "Kai kurie vartotojai gali pabandyti importuoti daug knygų, ko galbūt nenorima." +msgstr "Kai kurie naudotojai gali bandyti importuoti daug knygų, ko galbūt nenorima." #: bookwyrm/templates/settings/imports/imports.html:76 #: bookwyrm/templates/settings/imports/imports.html:135 @@ -6092,7 +6092,7 @@ msgstr "" #: bookwyrm/templates/settings/imports/imports.html:198 #: bookwyrm/templates/settings/imports/imports.html:288 msgid "User" -msgstr "Vartotojas" +msgstr "Naudotojas" #: bookwyrm/templates/settings/imports/imports.html:207 #: bookwyrm/templates/settings/imports/imports.html:297 @@ -6734,7 +6734,7 @@ msgstr "" #: bookwyrm/templates/settings/users/delete_user_form.html:5 #: bookwyrm/templates/settings/users/user_moderation_actions.html:52 msgid "Permanently delete user" -msgstr "Visam laikui ištrinti vartotoją" +msgstr "Visam laikui pašalinti naudotoją" #: bookwyrm/templates/settings/users/delete_user_form.html:12 #, python-format @@ -6780,7 +6780,7 @@ msgstr "" #: bookwyrm/templates/settings/users/user_admin.html:9 #, python-format msgid "Users: %(instance_name)s" -msgstr "Vartotojai: %(instance_name)s" +msgstr "Naudotojai: %(instance_name)s" #: bookwyrm/templates/settings/users/user_admin.html:29 msgid "Deleted users" @@ -6789,7 +6789,7 @@ msgstr "Ištrinti naudotojus" #: bookwyrm/templates/settings/users/user_admin.html:44 #: bookwyrm/templates/settings/users/username_filter.html:5 msgid "Username" -msgstr "Vartotojo vardas" +msgstr "Naudotojo vardas" #: bookwyrm/templates/settings/users/user_admin.html:48 msgid "Date Added" @@ -6830,7 +6830,7 @@ msgstr "Nutolęs" #: bookwyrm/templates/settings/users/user_info.html:51 msgid "User details" -msgstr "Vartotojo duomenys" +msgstr "Naudotojo duomenys" #: bookwyrm/templates/settings/users/user_info.html:55 msgid "Email:" @@ -6890,7 +6890,7 @@ msgstr "" #: bookwyrm/templates/settings/users/user_moderation_actions.html:35 msgid "Activate user" -msgstr "Įjungti vartotoją" +msgstr "Įjungti naudotoją" #: bookwyrm/templates/settings/users/user_moderation_actions.html:41 msgid "Suspend user" From 2e86dd775031a6d24e3baea5716870b5dc2f90ff Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Fri, 21 Nov 2025 00:29:30 -0800 Subject: [PATCH 179/962] New translations django.po (Lithuanian) --- locale/lt_LT/LC_MESSAGES/django.po | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/locale/lt_LT/LC_MESSAGES/django.po b/locale/lt_LT/LC_MESSAGES/django.po index ff54f09767..701944bc5c 100644 --- a/locale/lt_LT/LC_MESSAGES/django.po +++ b/locale/lt_LT/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-11-16 19:21+0000\n" -"PO-Revision-Date: 2025-11-21 06:53\n" +"PO-Revision-Date: 2025-11-21 08:29\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Lithuanian\n" "Language: lt\n" @@ -635,7 +635,7 @@ msgstr "Mėginamas įkelit failas yra per didelis." #: bookwyrm/templates/413.html:11 msgid "You you can try using a smaller file, or ask your BookWyrm server administrator to increase the DATA_UPLOAD_MAX_MEMORY_SIZE setting." -msgstr "" +msgstr "Pamėginkite įkelti mažesnį failą arba susisiekite su savo „BookWyrm“ administratoriumi, kad šis padidintų DATA_UPLOAD_MAX_MEMORY_SIZE parametro reikšmę." #: bookwyrm/templates/500.html:4 msgid "Oops!" @@ -930,7 +930,7 @@ msgstr "Wikipedia" #: bookwyrm/templates/author/author.html:79 msgid "View on Wikidata" -msgstr "" +msgstr "Žiūrėti „Wikidata“ įrašą" #: bookwyrm/templates/author/author.html:87 msgid "Website" @@ -1022,7 +1022,7 @@ msgstr "Nuoroda į wikipediją:" #: bookwyrm/templates/author/edit_author.html:58 msgid "Wikidata:" -msgstr "" +msgstr "Wikidata:" #: bookwyrm/templates/author/edit_author.html:62 msgid "Website:" @@ -1156,7 +1156,7 @@ msgstr "Spustelėkite padidinti" #: bookwyrm/templates/book/book.html:190 msgid "View on Finna" -msgstr "" +msgstr "Žiūrėti „Finna“ įrašą" #: bookwyrm/templates/book/book.html:222 #, python-format @@ -1263,11 +1263,11 @@ msgstr "ISBN:" #: bookwyrm/templates/book/book_identifiers.html:12 #: bookwyrm/templates/book/book_identifiers.html:13 msgid "Copy ISBN" -msgstr "" +msgstr "Kopijuoti ISBN kodą" #: bookwyrm/templates/book/book_identifiers.html:16 msgid "Copied ISBN!" -msgstr "" +msgstr "ISBN kodas nukopijuotas!" #: bookwyrm/templates/book/book_identifiers.html:23 #: bookwyrm/templates/book/edit/edit_book_form.html:354 @@ -1301,7 +1301,7 @@ msgstr "Goodreads:" #: bookwyrm/templates/book/book_identifiers.html:58 #: bookwyrm/templates/book/edit/edit_book_form.html:390 msgid "Finna ID:" -msgstr "" +msgstr "Finna ID:" #: bookwyrm/templates/book/cover_add_modal.html:5 msgid "Add cover" @@ -1315,7 +1315,7 @@ msgstr "Įkelti viršelį:" #: bookwyrm/templates/book/cover_add_modal.html:23 #: bookwyrm/templates/book/edit/edit_book_form.html:252 msgid "Load cover from URL:" -msgstr "" +msgstr "Įkelti viršelį iš URL:" #: bookwyrm/templates/book/cover_show_modal.html:6 msgid "Book cover preview" @@ -1574,7 +1574,7 @@ msgstr "Knygos %(book_title)s leidimai" #: bookwyrm/templates/book/editions/editions.html:8 #, python-format msgid "Editions of %(work_title)s" -msgstr "" +msgstr "„%(work_title)s“ leidimai" #: bookwyrm/templates/book/editions/editions.html:55 msgid "Can't find the edition you're looking for?" @@ -1778,15 +1778,15 @@ msgstr "Duomenų įkėlimas prisijungs prie %(source_name)s ir #: bookwyrm/templates/compose.html:7 bookwyrm/templates/compose.html:21 msgid "Edit review" -msgstr "" +msgstr "Redaguoti recenziją" #: bookwyrm/templates/compose.html:9 bookwyrm/templates/compose.html:23 msgid "Edit quote" -msgstr "" +msgstr "Redaguoti citatą" #: bookwyrm/templates/compose.html:11 bookwyrm/templates/compose.html:25 msgid "Edit comment" -msgstr "" +msgstr "Redaguoti komentarą" #: bookwyrm/templates/compose.html:13 bookwyrm/templates/compose.html:27 msgid "Edit status" @@ -2047,7 +2047,7 @@ msgstr "Prisijungti dabar" #: bookwyrm/templates/email/invite/html_content.html:15 #, python-format msgid "Learn more about %(site_name)s." -msgstr "" +msgstr "Sužinokite apie „%(site_name)s“ daugiau." #: bookwyrm/templates/email/invite/text_content.html:4 #, python-format @@ -2503,7 +2503,7 @@ msgstr "Vadovas" #: bookwyrm/templates/groups/user_groups.html:35 msgid "No groups found." -msgstr "" +msgstr "Jokių grupių nerasta." #: 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!" From 1a1a56488cbcbb699d04d43a7ed040b26836fb85 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Sat, 22 Nov 2025 00:50:34 -0800 Subject: [PATCH 180/962] New translations django.po (Catalan) --- locale/ca_ES/LC_MESSAGES/django.po | 32 +++++++++++++++--------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/locale/ca_ES/LC_MESSAGES/django.po b/locale/ca_ES/LC_MESSAGES/django.po index bafb7262b9..b12af13c7a 100644 --- a/locale/ca_ES/LC_MESSAGES/django.po +++ b/locale/ca_ES/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-11-16 19:21+0000\n" -"PO-Revision-Date: 2025-11-17 21:31\n" +"PO-Revision-Date: 2025-11-22 08:50\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Catalan\n" "Language: ca\n" @@ -5903,19 +5903,19 @@ msgstr "Corregeix les rutes de fitxer trencades dels fitxers d'imatges de cobert #: bookwyrm/templates/settings/files.html:299 msgid "If you have lost your cover image files (e.g. due to server migration failure) the scheduled job above will not replace them. Run this job instead to attempt to find covers for books where the current cover filepath does not resolve to a file." -msgstr "" +msgstr "Si heu perdut els fitxers d'imatge de portada (per ex. a causa d'una fallada en la migració del servidor), la tasca programada anterior no els reemplaçarà. Executeu aquesta tasca en lloc d'intentar trobar les portades per als llibres, on la ruta cap al fitxer de portada actual no condueix cap al fitxer." #: bookwyrm/templates/settings/files.html:306 msgid "This job cannot be scheduled to run regularly" -msgstr "" +msgstr "Aquesta tasca no pot ser programada per activar-se regularment" #: bookwyrm/templates/settings/files.html:320 msgid "Editions checked" -msgstr "" +msgstr "Edicions comprovades" #: bookwyrm/templates/settings/files.html:321 msgid "Covers fixed" -msgstr "" +msgstr "Cobertes arreglades" #: bookwyrm/templates/settings/files.html:371 msgid "Successfully updated expiry time" @@ -6219,7 +6219,7 @@ msgstr "Gestiona usuaris" #: bookwyrm/templates/settings/users/force_password_reset.html:7 #: bookwyrm/templates/settings/users/force_password_reset.html:11 msgid "Force Password Reset" -msgstr "" +msgstr "Força el restabliment de la contrasenya" #: bookwyrm/templates/settings/layout.html:59 msgid "Moderation" @@ -6689,43 +6689,43 @@ msgstr "Suprimeix l'usuari de manera permanent" #: 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." -msgstr "" +msgstr "Estàs segur de voler esborrar el compte %(username)s? Això no pot desfer-se." #: bookwyrm/templates/settings/users/delete_user_form.html:18 msgid "I understand that this is a permanent action:" -msgstr "" +msgstr "Entenc que aquesta acció és permanent:" #: bookwyrm/templates/settings/users/force_password_reset.html:17 msgid "All users in the selected category will be logged out and required to set a new password to log back in." -msgstr "" +msgstr "Tots els usuaris de la categoria seleccionada hauran de tancar la sessió i establir una nova contrasenya per tornar a iniciar la sessió." #: bookwyrm/templates/settings/users/force_password_reset.html:18 msgid "If your account is in the group, you will be logged out out after submitting." -msgstr "" +msgstr "Si el vostre compte és al grup, se us tancarà la sessió després de l'enviament." #: bookwyrm/templates/settings/users/force_password_reset.html:22 msgid "Users given password resets:" -msgstr "" +msgstr "S'ha reinicialitzat la contrasenya pels usuaris:" #: bookwyrm/templates/settings/users/force_password_reset.html:35 msgid "All users" -msgstr "" +msgstr "Tots els usuaris" #: bookwyrm/templates/settings/users/force_password_reset.html:39 msgid "users" -msgstr "" +msgstr "usuaris" #: bookwyrm/templates/settings/users/force_password_reset.html:43 msgid "Force password reset" -msgstr "" +msgstr "Força el restabliment de contrasenya" #: bookwyrm/templates/settings/users/force_password_reset.html:48 msgid "Number of users that will be effected:" -msgstr "" +msgstr "Quantitat d'usuaris que en seran afectats:" #: bookwyrm/templates/settings/users/force_password_reset.html:53 msgid "Are you sure you want to force password reset for these users:" -msgstr "" +msgstr "Estàs segur que vols forçar el restabliment de la contrasenya per aquests usuaris:" #: bookwyrm/templates/settings/users/user_admin.html:9 #, python-format From dc127348de21473f5cee7645cb42f610a415d672 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Sun, 23 Nov 2025 04:32:07 -0800 Subject: [PATCH 181/962] New translations django.po (Lithuanian) --- locale/lt_LT/LC_MESSAGES/django.po | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/locale/lt_LT/LC_MESSAGES/django.po b/locale/lt_LT/LC_MESSAGES/django.po index 701944bc5c..0484f0267e 100644 --- a/locale/lt_LT/LC_MESSAGES/django.po +++ b/locale/lt_LT/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-11-16 19:21+0000\n" -"PO-Revision-Date: 2025-11-21 08:29\n" +"PO-Revision-Date: 2025-11-23 12:32\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Lithuanian\n" "Language: lt\n" @@ -2750,7 +2750,7 @@ msgstr "Brūkšninio kodo skaitytuvas" #: 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 "" +msgstr "Naudokitės nuorodomis Sąrašai, Atraskite ir Mano knygos skaitinių pasiūlymams ir naujausiems įrašams šiame serveryje atrasti bei knygų katalogui apžvelgti!" #: bookwyrm/templates/guided_tour/home.html:103 msgid "Navigation Bar" @@ -2782,7 +2782,7 @@ msgstr "Pranešimai" #: 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 "" +msgstr "Savo profilį, asmeninį sąrašą, tiesiogines žinutes ir nuostatas galite pasiekti, spustelėdami savo vardą šiame meniu." #: bookwyrm/templates/guided_tour/home.html:200 msgid "Try selecting Profile from the drop down menu to continue the tour." @@ -3033,7 +3033,7 @@ msgstr "Šioje grotžymėje nėra aktyvumo!" #: bookwyrm/templates/import/import.html:6 #: bookwyrm/templates/preferences/layout.html:43 msgid "Import Book List" -msgstr "" +msgstr "Importuoti knygų sąrašą" #: bookwyrm/templates/import/import.html:12 msgid "Not a valid CSV file" @@ -3046,7 +3046,7 @@ msgid_plural "Currently, you are allowed to import %(display_size)s books every msgstr[0] "" msgstr[1] "" msgstr[2] "" -msgstr[3] "" +msgstr[3] "Šiuo metu jums leidžiama importuoti po %(display_size)s knygų kas %(import_limit_reset)s d." #: bookwyrm/templates/import/import.html:26 #, python-format From 563a568d8c6d60c58569f83f2e481732a82eedc0 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Sun, 23 Nov 2025 05:27:30 -0800 Subject: [PATCH 182/962] New translations django.po (Lithuanian) --- locale/lt_LT/LC_MESSAGES/django.po | 38 +++++++++++++++--------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/locale/lt_LT/LC_MESSAGES/django.po b/locale/lt_LT/LC_MESSAGES/django.po index 0484f0267e..9e5827f3d6 100644 --- a/locale/lt_LT/LC_MESSAGES/django.po +++ b/locale/lt_LT/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-11-16 19:21+0000\n" -"PO-Revision-Date: 2025-11-23 12:32\n" +"PO-Revision-Date: 2025-11-23 13:27\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Lithuanian\n" "Language: lt\n" @@ -464,7 +464,7 @@ msgstr "%(display_name)s – knygos „%(book_title)s“ citata" #: bookwyrm/models/status.py:454 #, python-format msgid "%(display_name)s's review of %(book_title)s" -msgstr "%(display_name)s – knygos „%(book_title)s“ recenzija" +msgstr "%(display_name)s – knygos „%(book_title)s“ apžvalga" #: bookwyrm/models/status.py:486 #, python-format @@ -1778,7 +1778,7 @@ msgstr "Duomenų įkėlimas prisijungs prie %(source_name)s ir #: bookwyrm/templates/compose.html:7 bookwyrm/templates/compose.html:21 msgid "Edit review" -msgstr "Redaguoti recenziją" +msgstr "Redaguoti apžvalgą" #: bookwyrm/templates/compose.html:9 bookwyrm/templates/compose.html:23 msgid "Edit quote" @@ -3051,7 +3051,7 @@ msgstr[3] "Šiuo metu jums leidžiama importuoti po %(display_size)s knygų kas #: bookwyrm/templates/import/import.html:26 #, python-format msgid "You have %(display_left)s left." -msgstr "" +msgstr "Jūsų neišnaudotas likutis – %(display_left)s." #: bookwyrm/templates/import/import.html:33 #: bookwyrm/templates/import/import_user.html:40 @@ -3087,7 +3087,7 @@ msgstr "OpenLibrary (CSV)" #: bookwyrm/templates/import/import.html:70 msgid "OpenReads (CSV)" -msgstr "" +msgstr "„OpenReads“ (CSV)" #: bookwyrm/templates/import/import.html:73 msgid "Calibre (CSV)" @@ -3095,7 +3095,7 @@ msgstr "Calibre (CSV)" #: bookwyrm/templates/import/import.html:76 msgid "BookWyrm (CSV)" -msgstr "" +msgstr "„BookWyrm“ (CSV)" #: bookwyrm/templates/import/import.html:82 msgid "You can download your Goodreads data from the Import/Export page of your Goodreads account." @@ -3112,11 +3112,11 @@ msgstr "Įtraukti atsiliepimus" #: bookwyrm/templates/import/import.html:104 msgid "Create new shelves if they do not exist" -msgstr "" +msgstr "Jeigu tinkamos lentynos nėra, galite sukurti naują" #: bookwyrm/templates/import/import.html:109 msgid "Privacy setting for imported reviews and shelves:" -msgstr "" +msgstr "Importuojamų apžvalgų ir lentynų privatumas:" #: bookwyrm/templates/import/import.html:116 #: bookwyrm/templates/import/import.html:118 @@ -3309,41 +3309,41 @@ msgstr "Atnaujinti importą" #: bookwyrm/templates/import/import_user.html:6 #: bookwyrm/templates/preferences/layout.html:51 msgid "Import BookWyrm Account" -msgstr "" +msgstr "Importuoti „BookWyrm“ paskyrą" #: bookwyrm/templates/import/import_user.html:13 msgid "Not a valid import file" -msgstr "" +msgstr "Šis failas netinkamas importui" #: 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 "" +msgstr "Jei norite numigruoti įrašus (komentarus, apžvalgas ar citatas), pirma turite arba nurodyti šią paskyrą kaip paskyros, iš kurios migruojate, pseudonimą, arba perkelti paskyrą į šią, prieš importuodami naudotojo duomenis." #: bookwyrm/templates/import/import_user.html:32 #, python-format msgid "Currently you are allowed to import one user every %(hours)s hours." -msgstr "" +msgstr "Šiuo metu jums leidžiama importuoti vieną paskyrą kas %(hours)s val." #: bookwyrm/templates/import/import_user.html:33 #, python-format msgid "You will next be able to import a user file at %(next_time)s" -msgstr "" +msgstr "Kitąkart paskyrą galėsite importuoti %(next_time)s" #: bookwyrm/templates/import/import_user.html:56 msgid "Step 1:" -msgstr "" +msgstr "Pirmas žingsnis:" #: bookwyrm/templates/import/import_user.html:58 msgid "Select an export file generated from another BookWyrm account. The file format should be .tar.gz." -msgstr "" +msgstr "Parinkite eksporto failą, sugeneruotą naudojantis kita „BookWyrm“ paskyra. Failo prievardis turėtų būti .tar.gz." #: bookwyrm/templates/import/import_user.html:73 msgid "Step 2:" -msgstr "" +msgstr "Antras žingnis:" #: bookwyrm/templates/import/import_user.html:75 msgid "Deselect any checkboxes for data you do not wish to include in your import." -msgstr "" +msgstr "Nuimkite žymėjimą nuo varnelių ties tais duomenimis, kurių nenorite importuoti." #: bookwyrm/templates/import/import_user.html:86 #: bookwyrm/templates/preferences/export-user.html:21 @@ -3355,11 +3355,11 @@ msgstr "Nario paskyra" #: bookwyrm/templates/import/import_user.html:89 msgid "Overwrites display name, summary, and avatar" -msgstr "" +msgstr "Bus perrašytas rodomas vardas, prisistatymas ir avataras" #: bookwyrm/templates/import/import_user.html:95 msgid "User settings" -msgstr "" +msgstr "Naudotojo nustatymai" #: bookwyrm/templates/import/import_user.html:98 msgid "Overwrites:" From 3b12c2c49fe67ddc0718622412b18e58955c86a5 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Sun, 23 Nov 2025 06:35:16 -0800 Subject: [PATCH 183/962] New translations django.po (Lithuanian) --- locale/lt_LT/LC_MESSAGES/django.po | 108 ++++++++++++++--------------- 1 file changed, 54 insertions(+), 54 deletions(-) diff --git a/locale/lt_LT/LC_MESSAGES/django.po b/locale/lt_LT/LC_MESSAGES/django.po index 9e5827f3d6..53da2377f3 100644 --- a/locale/lt_LT/LC_MESSAGES/django.po +++ b/locale/lt_LT/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-11-16 19:21+0000\n" -"PO-Revision-Date: 2025-11-23 13:27\n" +"PO-Revision-Date: 2025-11-23 14:35\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Lithuanian\n" "Language: lt\n" @@ -1442,7 +1442,7 @@ msgstr "Pavadinimas:" #: bookwyrm/templates/book/edit/edit_book_form.html:36 msgid "Sort Title:" -msgstr "" +msgstr "Pavadinimas rikiavimo tikslais:" #: bookwyrm/templates/book/edit/edit_book_form.html:46 msgid "Subtitle:" @@ -2028,7 +2028,7 @@ msgstr "Labas!" #: bookwyrm/templates/email/html_layout.html:21 #, python-format msgid "BookWyrm hosted on %(site_name)s" -msgstr "" +msgstr "Svetainė „%(site_name)s“, veikianti „BookWyrm“ pagrindu" #: bookwyrm/templates/email/html_layout.html:23 msgid "Email preference" @@ -3043,9 +3043,9 @@ msgstr "Netinkamas CSV failas" #, 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] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "Šiuo metu jums leidžiama importuoti po %(display_size)s knygą kas %(import_limit_reset)s d." +msgstr[1] "Šiuo metu jums leidžiama importuoti po %(display_size)s knygas kas %(import_limit_reset)s d." +msgstr[2] "Šiuo metu jums leidžiama importuoti po %(display_size)s knygų kas %(import_limit_reset)s d." msgstr[3] "Šiuo metu jums leidžiama importuoti po %(display_size)s knygų kas %(import_limit_reset)s d." #: bookwyrm/templates/import/import.html:26 @@ -3355,7 +3355,7 @@ msgstr "Nario paskyra" #: bookwyrm/templates/import/import_user.html:89 msgid "Overwrites display name, summary, and avatar" -msgstr "Bus perrašytas rodomas vardas, prisistatymas ir avataras" +msgstr "Perrašyti rodomą vardą, prisistatymą ir avatarą" #: bookwyrm/templates/import/import_user.html:95 msgid "User settings" @@ -3363,79 +3363,79 @@ msgstr "Naudotojo nustatymai" #: bookwyrm/templates/import/import_user.html:98 msgid "Overwrites:" -msgstr "" +msgstr "Perrašyti šias parinktis:" #: bookwyrm/templates/import/import_user.html:101 msgid "Whether manual approval is required for other users to follow your account" -msgstr "" +msgstr "Ar, norint sekti jūsų paskyrą, būtina iš jūsų gauti patvirtinimą" #: bookwyrm/templates/import/import_user.html:104 msgid "Whether following/followers are shown on your profile" -msgstr "" +msgstr "Ar jūsų profilyje rodomi sekamų narių ir sekėjų skaičiai" #: bookwyrm/templates/import/import_user.html:107 msgid "Whether your reading goal is shown on your profile" -msgstr "" +msgstr "Ar jūsų profilyje rodomas jūsų skaitymo tikslas" #: bookwyrm/templates/import/import_user.html:110 msgid "Whether you see user follow suggestions" -msgstr "" +msgstr "Ar jums rodomi pasiūlymai ką sekti" #: bookwyrm/templates/import/import_user.html:113 msgid "Whether your account is suggested to others" -msgstr "" +msgstr "Ar jūsų paskyra siūloma sekti kitiems" #: bookwyrm/templates/import/import_user.html:116 msgid "Your timezone" -msgstr "" +msgstr "Jūsų laiko juosta" #: bookwyrm/templates/import/import_user.html:119 msgid "Your default post privacy setting" -msgstr "" +msgstr "Jūsų įrašų numatytasis privatumas" #: bookwyrm/templates/import/import_user.html:127 msgid "Followers and following" -msgstr "" +msgstr "Sekėjai ir sekamieji" #: bookwyrm/templates/import/import_user.html:131 msgid "User blocks" -msgstr "" +msgstr "Blokuojami naudotojai" #: bookwyrm/templates/import/import_user.html:138 #: bookwyrm/templates/preferences/export-user.html:23 msgid "Reading goals" -msgstr "" +msgstr "Skaitymo tikslai" #: bookwyrm/templates/import/import_user.html:141 msgid "Overwrites reading goals for all years listed in the import file" -msgstr "" +msgstr "Perrašyti skaitymo tikslus visiems metams, nurodytiems importuojamame faile" #: bookwyrm/templates/import/import_user.html:145 #: bookwyrm/templates/preferences/export-user.html:24 msgid "Shelves" -msgstr "" +msgstr "Lentynos" #: bookwyrm/templates/import/import_user.html:148 #: bookwyrm/templates/preferences/export-user.html:25 msgid "Reading history" -msgstr "" +msgstr "Skaitymo žurnalas" #: bookwyrm/templates/import/import_user.html:151 #: bookwyrm/templates/preferences/export-user.html:26 msgid "Book reviews" -msgstr "" +msgstr "Knygų apžvalgos" #: bookwyrm/templates/import/import_user.html:157 msgid "Comments about books" -msgstr "" +msgstr "Knygų komentarai" #: bookwyrm/templates/import/import_user.html:160 msgid "Book lists" -msgstr "" +msgstr "Knygų sąrašai" #: bookwyrm/templates/import/import_user.html:163 msgid "Saved lists" -msgstr "" +msgstr "Įsiminti sąrašai" #: bookwyrm/templates/import/manual_review.html:5 #: bookwyrm/templates/import/troubleshoot.html:4 @@ -3495,16 +3495,16 @@ msgstr "Jei matote netikėtų nesklandumų, susisiekite su administratoriumi arb #: bookwyrm/templates/import/user_import_status.html:15 #: bookwyrm/templates/import/user_import_status.html:26 msgid "User Import Status" -msgstr "" +msgstr "Naudotojo importo būsena" #: bookwyrm/templates/import/user_import_status.html:13 msgid "User Import Retry Status" -msgstr "" +msgstr "Pakartotinio naudotojo importo būsena" #: bookwyrm/templates/import/user_import_status.html:22 #: bookwyrm/templates/settings/imports/imports.html:264 msgid "User Imports" -msgstr "" +msgstr "Importuojami naudotojai" #: bookwyrm/templates/import/user_import_status.html:70 #: bookwyrm/templates/settings/dashboard/user_chart.html:11 @@ -3519,41 +3519,41 @@ msgstr "Būsenos" #: bookwyrm/templates/import/user_import_status.html:85 msgid "Follows & Blocks" -msgstr "" +msgstr "Sekimai ir blokavimai" #: bookwyrm/templates/import/user_import_status.html:144 msgid "Imported books" -msgstr "" +msgstr "Importuotos knygos" #: bookwyrm/templates/import/user_troubleshoot.html:5 msgid "User Import Troubleshooting" -msgstr "" +msgstr "Naudotojo importo trikčių sprendimas" #: bookwyrm/templates/import/user_troubleshoot.html:26 msgid "Your account was not set as an alias of the original user account" -msgstr "" +msgstr "Jūsų paskyra nesukonfigūruota kaip pirminės paskyros pseudonimas" #: bookwyrm/templates/import/user_troubleshoot.html:31 msgid "Re-trying an import will not work in cases such as:" -msgstr "" +msgstr "Pakartotinis importas neveiks tokiais atvejais, kaip antai:" #: bookwyrm/templates/import/user_troubleshoot.html:34 msgid "A user, status, or BookWyrm server was deleted after your import file was created" -msgstr "" +msgstr "Jei naudotojo paskyra, įrašai ar „BookWyrm“ serveris pašalinti sukūrus importo failą" #: bookwyrm/templates/import/user_troubleshoot.html:35 msgid "Importing statuses when your old account has been deleted" -msgstr "" +msgstr "Įrašų importas, kai senoji paskyra panaikinta" #: bookwyrm/templates/import/user_troubleshoot.html:43 #, python-format msgid "Currently you are allowed to import or retry one user every %(hours)s hours." -msgstr "" +msgstr "Šiuo metu jums leidžiama importuoti ar pakartotinai importuoti vieną naudotojo paskyrą kas %(hours)s val." #: bookwyrm/templates/import/user_troubleshoot.html:44 #, python-format msgid "You will be able to retry this import at %(next_time)s" -msgstr "" +msgstr "Šį importą galėsite kartoti %(next_time)s" #: bookwyrm/templates/import/user_troubleshoot.html:65 msgid "Relationship" @@ -3565,7 +3565,7 @@ msgstr "Priežastis" #: bookwyrm/templates/landing/force_password_reset.html:30 msgid "You must set a new password before logging in." -msgstr "" +msgstr "Prieš prisijungdami, turite susikurti naują slaptažodį." #: bookwyrm/templates/landing/force_password_reset.html:50 #: bookwyrm/templates/preferences/change_password.html:22 @@ -3701,7 +3701,7 @@ msgstr "%(site_name)s paieška" #: bookwyrm/templates/layout.html:39 msgid "Search for a book, author, user, or list" -msgstr "" +msgstr "Ieškoti knygos, autoriaus, naudotojo ar sąrašo" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 msgid "Scan Barcode" @@ -3717,7 +3717,7 @@ msgstr "slaptažodis" #: bookwyrm/templates/layout.html:136 msgid "Show/Hide password" -msgstr "" +msgstr "Rodyti/slėpti slaptažodį" #: bookwyrm/templates/layout.html:150 msgid "Join" @@ -3975,7 +3975,7 @@ msgstr "Išsaugota" #: bookwyrm/templates/lists/list_items.html:50 msgid "No lists found." -msgstr "" +msgstr "Sąrašų nerasta." #: bookwyrm/templates/lists/lists.html:14 bookwyrm/templates/user/lists.html:14 msgid "Your Lists" @@ -3992,15 +3992,15 @@ msgstr "Išsaugoti sąrašai" #: bookwyrm/templates/moved.html:27 #, python-format msgid "You have moved your account to %(username)s" -msgstr "" +msgstr "Jūs perkėlėte savo paskyrą į %(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 "" +msgstr "Jūs galite atšaukti perkėlimą ir sugrąžinti visą funkcionalumą šiai paskyrai, tačiau gali būti, kad kai kurie sekėjai ją jau bus nustoję sekti." #: bookwyrm/templates/moved.html:42 msgid "Undo move" -msgstr "" +msgstr "Atšaukti perkėlimą" #: bookwyrm/templates/moved.html:46 bookwyrm/templates/user_menu.html:77 msgid "Log out" @@ -4219,9 +4219,9 @@ msgstr "%(related_user)s pakvietė jus pri msgid "New invite request awaiting response" msgid_plural "%(display_count)s new invite requests awaiting response" msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[1] "Atsakymo laukia %(display_count)s naujos pakvietimo užklausos" +msgstr[2] "Atsakymo laukia %(display_count)s naujų pakvietimo užklausų" +msgstr[3] "Atsakymo laukia %(display_count)s naujų pakvietimo užklausų" #: bookwyrm/templates/notifications/items/join.html:16 #, python-format @@ -4275,12 +4275,12 @@ msgstr "%(related_user)s paminėjo jus %(username)s" -msgstr "" +msgstr "%(related_user)s perkėlė paskyrą į %(username)s" #: bookwyrm/templates/notifications/items/move_user.html:25 #, python-format msgid "%(related_user)s has undone their move" -msgstr "" +msgstr "%(related_user)s atšaukė savo paskyros perkėlimą" #: bookwyrm/templates/notifications/items/remove.html:17 #, python-format @@ -4344,12 +4344,12 @@ msgstr "pakeitė %(group_name)s aprašymą" #: bookwyrm/templates/notifications/items/user_export.html:14 #, python-format msgid "Your user export is ready." -msgstr "" +msgstr "Jūsų eksportuoti naudotojo duomenys parengti." #: bookwyrm/templates/notifications/items/user_import.html:14 #, python-format msgid "Your user import is complete." -msgstr "" +msgstr "Jūsų naudotojo duomenų importas užbaigtas." #: bookwyrm/templates/notifications/notifications_page.html:19 msgid "Delete notifications" @@ -4487,16 +4487,16 @@ msgstr "Dabar sekate %(display_name)s!" #: bookwyrm/templates/preferences/move_user.html:7 #: bookwyrm/templates/preferences/move_user.html:39 msgid "Move Account" -msgstr "" +msgstr "Perkelti paskyrą" #: bookwyrm/templates/preferences/alias_user.html:7 #: bookwyrm/templates/preferences/alias_user.html:34 msgid "Create Alias" -msgstr "" +msgstr "Pridėti pseudonimą" #: bookwyrm/templates/preferences/alias_user.html:12 msgid "Add another account as an alias" -msgstr "" +msgstr "Pridėti kitą paskyrą kaip šios pseudonimą" #: 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." From 57ef4c0d66843f61dc1da1c33496d563c0fb6e00 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Sun, 23 Nov 2025 07:32:19 -0800 Subject: [PATCH 184/962] New translations django.po (Lithuanian) --- locale/lt_LT/LC_MESSAGES/django.po | 66 +++++++++++++++--------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/locale/lt_LT/LC_MESSAGES/django.po b/locale/lt_LT/LC_MESSAGES/django.po index 53da2377f3..465bca314f 100644 --- a/locale/lt_LT/LC_MESSAGES/django.po +++ b/locale/lt_LT/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-11-16 19:21+0000\n" -"PO-Revision-Date: 2025-11-23 14:35\n" +"PO-Revision-Date: 2025-11-23 15:32\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Lithuanian\n" "Language: lt\n" @@ -3987,7 +3987,7 @@ msgstr "Visi sąrašai" #: bookwyrm/templates/lists/lists.html:40 msgid "Saved Lists" -msgstr "Išsaugoti sąrašai" +msgstr "Įsiminti sąrašai" #: bookwyrm/templates/moved.html:27 #, python-format @@ -4500,29 +4500,29 @@ msgstr "Pridėti kitą paskyrą kaip šios pseudonimą" #: 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 "" +msgstr "Jei norite kitą paskyrą perkelti į šią, turite ją pažymėti kaip šios pseudonimą." #: bookwyrm/templates/preferences/alias_user.html:19 msgid "This is a reversable action and will not change the functionality of this account." -msgstr "" +msgstr "Šį veiksmą galima atšaukti, o šios paskyros funkcionalumo jis nepakeičia." #: 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 "" +msgstr "Įvekite paskyros, kurią norite pridėti kaip šios pseudonimą, naudotojo vardą, pvz., naudotojas@example.com:" #: bookwyrm/templates/preferences/alias_user.html:30 #: bookwyrm/templates/preferences/move_user.html:35 msgid "Confirm your password:" -msgstr "" +msgstr "Patvirtinkite savo slaptažodį:" #: bookwyrm/templates/preferences/alias_user.html:39 #: bookwyrm/templates/preferences/layout.html:28 msgid "Aliases" -msgstr "" +msgstr "Paskyros pseudonimai" #: bookwyrm/templates/preferences/alias_user.html:49 msgid "Remove alias" -msgstr "" +msgstr "Pašalinti pseudonimą" #: bookwyrm/templates/preferences/blocks.html:4 #: bookwyrm/templates/preferences/blocks.html:7 @@ -4575,7 +4575,7 @@ msgstr "Nebegalėsite atstatyti ištrintos paskyros. Ateityje nebegalėsite naud #: bookwyrm/templates/preferences/delete_user.html:36 msgid "I understand that my account cannot be recovered:" -msgstr "" +msgstr "Aš suprantu, kad mano paskyros nebus įmanoma atkurti:" #: bookwyrm/templates/preferences/disable-2fa.html:4 #: bookwyrm/templates/preferences/disable-2fa.html:7 @@ -4627,7 +4627,7 @@ msgstr "Rodyti skaitymo tikslą sienoje" #: bookwyrm/templates/preferences/edit_user.html:75 msgid "Show ratings" -msgstr "" +msgstr "Rodyti įvertinimus" #: bookwyrm/templates/preferences/edit_user.html:81 msgid "Show suggested users" @@ -4671,65 +4671,65 @@ msgstr "Ieškai privačių lentynų? Gali nustatyti atskirus matomumo lygius kie #: bookwyrm/templates/preferences/export-user.html:9 #: bookwyrm/templates/preferences/layout.html:55 msgid "Export BookWyrm Account" -msgstr "" +msgstr "Eksportuoti „BookWyrm“ paskyrą" #: bookwyrm/templates/preferences/export-user.html:15 msgid "You can create an export file here. This will allow you to migrate your data to another BookWyrm account." -msgstr "" +msgstr "Čia galite eksportuoti savo paskyros duomenų failą Tai pravers, jei nuspręsite migruoti į kitą „BookWyrm“ paskyrą." #: bookwyrm/templates/preferences/export-user.html:19 msgid "Your file will include:" -msgstr "" +msgstr "Eksportuotas failas apims šiuos duomenis:" #: bookwyrm/templates/preferences/export-user.html:22 msgid "Most user settings" -msgstr "" +msgstr "Daugumą naudotojo nustatymų" #: bookwyrm/templates/preferences/export-user.html:28 msgid "Your own lists and saved lists" -msgstr "" +msgstr "Jūsų asmeninius sąrašus ir įsimintus sąrašus" #: bookwyrm/templates/preferences/export-user.html:29 msgid "Which users you follow and block" -msgstr "" +msgstr "Sekamų ir blokuojamų naudotojų sąrašus" #: bookwyrm/templates/preferences/export-user.html:33 msgid "Your file will not include:" -msgstr "" +msgstr "Faile nebus šių duomenų:" #: bookwyrm/templates/preferences/export-user.html:35 msgid "Direct messages" -msgstr "" +msgstr "Asmeninių žinučių" #: bookwyrm/templates/preferences/export-user.html:36 msgid "Replies to your statuses" -msgstr "" +msgstr "Atsakymų į jūsų įrašus" #: bookwyrm/templates/preferences/export-user.html:38 msgid "Favorites" -msgstr "" +msgstr "Žymelių" #: bookwyrm/templates/preferences/export-user.html:42 msgid "In your new BookWyrm account can choose what to import: you will not have to import everything that is exported." -msgstr "" +msgstr "Naujojoje savo „BookWyrm“ paskyroje galėsite pasirinkti norimus importuoti duomenis – galėsite atlikti ir dalinį importą." #: bookwyrm/templates/preferences/export-user.html:45 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 "" +msgstr "Jeigu norite migruoti įrašus (komentarus, apžvalgas ar citatas), turite arba prudėti naująją paskyrą kaip šios pseudonimą, arba perkelti šią paskyrą į naująją prieš importuodami naudotojo duomenis." #: bookwyrm/templates/preferences/export-user.html:50 msgid "New user exports are currently disabled." -msgstr "" +msgstr "Šiuo metu naujai eksportuoti naudotojo duomenų neleidžiama." #: bookwyrm/templates/preferences/export-user.html:54 #, python-format msgid "User exports settings can be changed from the Imports page in the Admin dashboard." -msgstr "" +msgstr "Naudotojo eksporto nustatymus galima keisti Importuojamų naudotojų puslapyje administratoriaus skydelyje." #: bookwyrm/templates/preferences/export-user.html:61 #, python-format msgid "You will be able to create a new export file at %(next_available)s" -msgstr "" +msgstr "Naują eksporto failą galėsite susikurti %(next_available)s" #: bookwyrm/templates/preferences/export-user.html:72 #, python-format @@ -4743,31 +4743,31 @@ msgstr "Vidutiniškai naujausi eksportai užtruko %(minutes)s minutes (-čių)." #: bookwyrm/templates/preferences/export-user.html:88 msgid "Create user export file" -msgstr "" +msgstr "Kurti naudotojo eksporto failą" #: bookwyrm/templates/preferences/export-user.html:95 msgid "Recent Exports" -msgstr "" +msgstr "Paskiausiai eksportuota" #: bookwyrm/templates/preferences/export-user.html:97 msgid "User export files will show 'complete' once ready. This may take a little while. Click the link to download your file." -msgstr "" +msgstr "Kai naudotojo eksporto failai parengiami, jie rodomi kaip „užbaigti“. Eksportas gali užtrukti. Failą parsisiųsite, spustelėję jo saitą." #: bookwyrm/templates/preferences/export-user.html:100 #, python-format msgid "Export files will be deleted after %(expiry_hours)s hour." msgid_plural "Export files will be deleted after %(expiry_hours)s hours." -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "Eksporto failai pašalinami po %(expiry_hours)s valandos." +msgstr[1] "Eksporto failai pašalinami po %(expiry_hours)s valandų." +msgstr[2] "Eksporto failai pašalinami po %(expiry_hours)s valandų." +msgstr[3] "Eksporto failai pašalinami po %(expiry_hours)s valandų." #: bookwyrm/templates/preferences/export-user.html:110 #: bookwyrm/templates/preferences/security.html:126 #: bookwyrm/templates/settings/files.html:136 #: bookwyrm/templates/settings/files.html:318 msgid "Date" -msgstr "" +msgstr "Data" #: bookwyrm/templates/preferences/export-user.html:116 msgid "Size" From 1010067a73576e893e85784d08c51b3513ed5bf7 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Sun, 23 Nov 2025 10:54:20 -0800 Subject: [PATCH 185/962] New translations django.po (Lithuanian) --- locale/lt_LT/LC_MESSAGES/django.po | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/locale/lt_LT/LC_MESSAGES/django.po b/locale/lt_LT/LC_MESSAGES/django.po index 465bca314f..8ecb881468 100644 --- a/locale/lt_LT/LC_MESSAGES/django.po +++ b/locale/lt_LT/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-11-16 19:21+0000\n" -"PO-Revision-Date: 2025-11-23 15:32\n" +"PO-Revision-Date: 2025-11-23 18:54\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Lithuanian\n" "Language: lt\n" @@ -5907,23 +5907,23 @@ msgstr "" #: bookwyrm/templates/settings/files.html:102 msgid "Export file expiration" -msgstr "" +msgstr "Eksporto failo galiojimas" #: bookwyrm/templates/settings/files.html:109 msgid "Maximum age of export files, in hours" -msgstr "" +msgstr "Ilgiausias laikas eksportuotiems failams saugoti, valandomis" #: bookwyrm/templates/settings/files.html:122 msgid "Files older than this will be deleted." -msgstr "" +msgstr "Senesni failai bus šalinami." #: bookwyrm/templates/settings/files.html:125 msgid "Set expiry hours" -msgstr "" +msgstr "Nustatyti galiojimo trukmę valandomis" #: bookwyrm/templates/settings/files.html:138 msgid "Expired files" -msgstr "" +msgstr "Nebegaliojantys failai" #: bookwyrm/templates/settings/files.html:186 #: bookwyrm/templates/settings/imports/imports.html:184 From 3b098eb36a05b106e5f3c403cb80500571081858 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Sun, 23 Nov 2025 11:59:46 -0800 Subject: [PATCH 186/962] New translations django.po (Slovak) --- locale/sk_SK/LC_MESSAGES/django.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/sk_SK/LC_MESSAGES/django.po b/locale/sk_SK/LC_MESSAGES/django.po index 4f9d2f06bc..d37e58f1b5 100644 --- a/locale/sk_SK/LC_MESSAGES/django.po +++ b/locale/sk_SK/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-11-16 19:21+0000\n" -"PO-Revision-Date: 2025-11-16 19:34\n" +"PO-Revision-Date: 2025-11-23 19:59\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Slovak\n" "Language: sk\n" @@ -83,7 +83,7 @@ msgstr "Táto emailová adresa nemôže byť zaregistrovaná." #: bookwyrm/forms/landing.py:114 msgid "Password cannot be the same as your current password" -msgstr "" +msgstr "Heslo nemôže byť rovnaké, ako súčasné heslo" #: bookwyrm/forms/landing.py:145 bookwyrm/forms/landing.py:153 msgid "Incorrect code" From 1706fc41cc537c4430467b9c9c65d8cc2bbabc52 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Sun, 23 Nov 2025 11:59:47 -0800 Subject: [PATCH 187/962] New translations django.po (Lithuanian) --- locale/lt_LT/LC_MESSAGES/django.po | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/locale/lt_LT/LC_MESSAGES/django.po b/locale/lt_LT/LC_MESSAGES/django.po index 8ecb881468..a8015fa518 100644 --- a/locale/lt_LT/LC_MESSAGES/django.po +++ b/locale/lt_LT/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-11-16 19:21+0000\n" -"PO-Revision-Date: 2025-11-23 18:54\n" +"PO-Revision-Date: 2025-11-23 19:59\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Lithuanian\n" "Language: lt\n" @@ -470,9 +470,9 @@ msgstr "%(display_name)s – knygos „%(book_title)s“ apžvalga" #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "%(display_name)s įvertino knygą „%(book_title)s“ %(display_rating).1f žvaigždute" +msgstr[1] "%(display_name)s įvertino knygą „%(book_title)s“ %(display_rating).1f žvaigždutėmis" +msgstr[2] "%(display_name)s įvertino knygą „%(book_title)s“ %(display_rating).1f žvaigždučių" msgstr[3] "%(display_name)s įvertino knygą „%(book_title)s“ %(display_rating).1f žvaigždučių" #: bookwyrm/models/user.py:39 bookwyrm/templates/book/book.html:336 @@ -4218,7 +4218,7 @@ msgstr "%(related_user)s pakvietė jus pri #, python-format msgid "New invite request awaiting response" msgid_plural "%(display_count)s new invite requests awaiting response" -msgstr[0] "" +msgstr[0] "Atsakymo laukia %(display_count)s naujos pakvietimo užklausos" msgstr[1] "Atsakymo laukia %(display_count)s naujos pakvietimo užklausos" msgstr[2] "Atsakymo laukia %(display_count)s naujų pakvietimo užklausų" msgstr[3] "Atsakymo laukia %(display_count)s naujų pakvietimo užklausų" @@ -4771,11 +4771,11 @@ msgstr "Data" #: bookwyrm/templates/preferences/export-user.html:116 msgid "Size" -msgstr "" +msgstr "Dydis" #: bookwyrm/templates/preferences/export-user.html:160 msgid "Download your export" -msgstr "" +msgstr "Parsisiųsti eksportuotą failą" #: bookwyrm/templates/preferences/export-user.html:164 msgid "Archive is no longer available" From 694f5c4f60594c6c427c38ecf7d75c6d3fca1cb8 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Sun, 23 Nov 2025 13:11:07 -0800 Subject: [PATCH 188/962] New translations django.po (Lithuanian) --- locale/lt_LT/LC_MESSAGES/django.po | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/locale/lt_LT/LC_MESSAGES/django.po b/locale/lt_LT/LC_MESSAGES/django.po index a8015fa518..da75671ef4 100644 --- a/locale/lt_LT/LC_MESSAGES/django.po +++ b/locale/lt_LT/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-11-16 19:21+0000\n" -"PO-Revision-Date: 2025-11-23 19:59\n" +"PO-Revision-Date: 2025-11-23 21:11\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Lithuanian\n" "Language: lt\n" @@ -4779,17 +4779,17 @@ msgstr "Parsisiųsti eksportuotą failą" #: bookwyrm/templates/preferences/export-user.html:164 msgid "Archive is no longer available" -msgstr "" +msgstr "Pakas nebeprieinamas" #: bookwyrm/templates/preferences/export.html:4 #: bookwyrm/templates/preferences/export.html:7 #: bookwyrm/templates/preferences/layout.html:47 msgid "Export Book List" -msgstr "" +msgstr "Eksportuoti knygų sąrašą" #: bookwyrm/templates/preferences/export.html:13 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 "" +msgstr "Į eksportuotą CSV failą bus įtrauktos visos knygos jūsų lentynose, visos apžvelgtos knygos bei skaitytos knygos.
    Šį failą galite importuoti į tokias tarnybas, kaip antai „Goodreads“." #: bookwyrm/templates/preferences/export.html:20 msgid "Download file" @@ -4801,11 +4801,11 @@ msgstr "Paskyra" #: bookwyrm/templates/preferences/layout.html:24 msgid "Security Settings" -msgstr "" +msgstr "Saugumo nustatymai" #: bookwyrm/templates/preferences/layout.html:32 msgid "Move Account" -msgstr "" +msgstr "Perkelti paskyrą" #: bookwyrm/templates/preferences/layout.html:39 msgid "Data" @@ -4817,7 +4817,7 @@ msgstr "Sąsajos" #: bookwyrm/templates/preferences/move_user.html:12 msgid "Migrate account to another server" -msgstr "" +msgstr "Migruoti paskyrą į kitą 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." From 53b5f48b6dced03703428e17227f08a1eb15dd47 Mon Sep 17 00:00:00 2001 From: kasiarog Date: Thu, 27 Nov 2025 08:33:08 +0100 Subject: [PATCH 189/962] striptags correction --- bookwyrm/templates/snippets/opengraph.html | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bookwyrm/templates/snippets/opengraph.html b/bookwyrm/templates/snippets/opengraph.html index 7f44c52238..803f95fa99 100644 --- a/bookwyrm/templates/snippets/opengraph.html +++ b/bookwyrm/templates/snippets/opengraph.html @@ -20,5 +20,6 @@ - - \ No newline at end of file +{% firstof description|striptags site.instance_tagline|striptags as description %} + + \ No newline at end of file From ec564891875bac7cf9feb8af601caa63209341fd Mon Sep 17 00:00:00 2001 From: Hugh Rundle Date: Sun, 30 Nov 2025 06:47:09 +1100 Subject: [PATCH 190/962] fix rank match value for series matches --- bookwyrm/views/books/edit_book.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/views/books/edit_book.py b/bookwyrm/views/books/edit_book.py index 3851c17b1c..a083d85e56 100644 --- a/bookwyrm/views/books/edit_book.py +++ b/bookwyrm/views/books/edit_book.py @@ -252,7 +252,7 @@ def add_series(request, data): matches = ( models.Series.objects.annotate(search=vector) .annotate(rank=SearchRank(vector, series, normalization=32)) - .filter(rank__gt=0.019) + .filter(rank__gt=0.19) .order_by("-rank")[:5] ) From 7e438e13f150339ae3aca945c0b21846a7ed3b56 Mon Sep 17 00:00:00 2001 From: kasiarog Date: Wed, 26 Nov 2025 21:16:42 +0100 Subject: [PATCH 191/962] first attempt in ruff migration --- .github/pull_request_template.md | 2 +- .github/workflows/python.yml | 19 +++---- README.md | 2 +- bookwyrm/activitypub/__init__.py | 3 +- bookwyrm/activitypub/base_activity.py | 9 ++-- bookwyrm/activitypub/book.py | 3 +- bookwyrm/activitypub/image.py | 3 +- bookwyrm/activitypub/note.py | 3 +- bookwyrm/activitypub/ordered_collection.py | 3 +- bookwyrm/activitypub/person.py | 3 +- bookwyrm/activitypub/response.py | 6 +-- bookwyrm/activitypub/verbs.py | 3 +- bookwyrm/activitystreams.py | 3 +- bookwyrm/admin.py | 3 +- bookwyrm/book_search.py | 11 ++-- bookwyrm/connectors/__init__.py | 3 +- bookwyrm/connectors/abstract_connector.py | 3 +- bookwyrm/connectors/bookwyrm_connector.py | 3 +- bookwyrm/connectors/connector_manager.py | 13 +++-- bookwyrm/connectors/finna.py | 3 +- bookwyrm/connectors/format_mappings.py | 3 +- bookwyrm/connectors/inventaire.py | 3 +- bookwyrm/connectors/openlibrary.py | 3 +- bookwyrm/connectors/openlibrary_languages.py | 3 +- bookwyrm/connectors/settings.py | 2 +- bookwyrm/context_processors.py | 3 +- bookwyrm/decorators.py | 3 +- bookwyrm/emailing.py | 3 +- bookwyrm/forms/__init__.py | 3 +- bookwyrm/forms/admin.py | 4 +- bookwyrm/forms/author.py | 3 +- bookwyrm/forms/books.py | 3 +- bookwyrm/forms/custom_form.py | 3 +- bookwyrm/forms/edit_user.py | 4 +- bookwyrm/forms/forms.py | 4 +- bookwyrm/forms/groups.py | 3 +- bookwyrm/forms/landing.py | 4 +- bookwyrm/forms/links.py | 2 +- bookwyrm/forms/lists.py | 3 +- bookwyrm/forms/status.py | 3 +- bookwyrm/forms/user_admin.py | 3 +- bookwyrm/forms/widgets.py | 3 +- bookwyrm/imagegenerators.py | 1 + bookwyrm/importers/__init__.py | 2 +- bookwyrm/importers/bookwyrm_import.py | 1 + bookwyrm/importers/calibre_import.py | 3 +- bookwyrm/importers/goodreads_import.py | 3 +- bookwyrm/importers/importer.py | 5 +- bookwyrm/importers/librarything_import.py | 3 +- bookwyrm/importers/openlibrary_import.py | 3 +- bookwyrm/importers/openreads_import.py | 3 +- bookwyrm/importers/storygraph_import.py | 3 +- bookwyrm/isbn/isbn.py | 3 +- bookwyrm/lists_stream.py | 3 +- .../commands/add_finna_connector.py | 6 +-- bookwyrm/management/commands/admin_code.py | 3 +- .../management/commands/compile_themes.py | 3 +- bookwyrm/management/commands/confirm_email.py | 3 +- .../commands/deduplicate_book_data.py | 4 +- .../commands/erase_deleted_user_data.py | 5 +- bookwyrm/management/commands/erase_streams.py | 4 +- .../commands/generate_preview_images.py | 3 +- bookwyrm/management/commands/initdb.py | 3 +- bookwyrm/management/commands/merge_authors.py | 5 +- .../management/commands/merge_editions.py | 5 +- bookwyrm/management/commands/merge_works.py | 5 +- .../commands/populate_lists_streams.py | 3 +- .../management/commands/populate_streams.py | 3 +- .../commands/populate_suggestions.py | 4 +- .../management/commands/remove_editions.py | 6 ++- .../remove_remote_user_preview_images.py | 5 +- .../management/commands/repair_editions.py | 3 +- .../commands/revoke_preview_image_tasks.py | 3 +- bookwyrm/middleware/__init__.py | 3 +- bookwyrm/middleware/file_too_big.py | 1 - bookwyrm/middleware/force_logout.py | 2 +- bookwyrm/middleware/ip_middleware.py | 3 +- bookwyrm/middleware/timezone_middleware.py | 3 +- bookwyrm/models/__init__.py | 3 +- bookwyrm/models/activitypub_mixin.py | 3 +- bookwyrm/models/announcement.py | 3 +- bookwyrm/models/annual_goal.py | 5 +- bookwyrm/models/antispam.py | 3 +- bookwyrm/models/attachment.py | 3 +- bookwyrm/models/author.py | 2 +- bookwyrm/models/base_model.py | 6 +-- bookwyrm/models/book.py | 4 +- bookwyrm/models/bookwyrm_export_job.py | 8 +-- bookwyrm/models/bookwyrm_import_job.py | 18 ++----- bookwyrm/models/connector.py | 3 +- bookwyrm/models/favorite.py | 3 +- bookwyrm/models/federated_server.py | 3 +- bookwyrm/models/fields.py | 3 +- bookwyrm/models/group.py | 3 +- bookwyrm/models/hashtag.py | 3 +- bookwyrm/models/housekeeping.py | 4 +- bookwyrm/models/import_job.py | 5 +- bookwyrm/models/job.py | 16 ++---- bookwyrm/models/link.py | 3 +- bookwyrm/models/list.py | 3 +- bookwyrm/models/move.py | 3 +- bookwyrm/models/notification.py | 3 +- bookwyrm/models/readthrough.py | 3 +- bookwyrm/models/relationship.py | 3 +- bookwyrm/models/report.py | 3 +- bookwyrm/models/session.py | 3 +- bookwyrm/models/shelf.py | 3 +- bookwyrm/models/site.py | 3 +- bookwyrm/models/status.py | 10 ++-- bookwyrm/models/user.py | 3 +- bookwyrm/preview_images.py | 2 +- bookwyrm/redis_store.py | 3 +- bookwyrm/signatures.py | 3 +- bookwyrm/status.py | 3 +- bookwyrm/suggested_users.py | 5 +- bookwyrm/tasks.py | 3 +- bookwyrm/templatetags/book_display_tags.py | 3 +- bookwyrm/templatetags/celery_tags.py | 3 +- bookwyrm/templatetags/date_ext.py | 3 +- bookwyrm/templatetags/feed_page_tags.py | 3 +- bookwyrm/templatetags/group_tags.py | 3 +- bookwyrm/templatetags/interaction.py | 3 +- bookwyrm/templatetags/landing_page_tags.py | 3 +- bookwyrm/templatetags/layout.py | 3 +- bookwyrm/templatetags/list_page_tags.py | 3 +- bookwyrm/templatetags/markdown.py | 3 +- .../templatetags/notification_page_tags.py | 3 +- bookwyrm/templatetags/rating_tags.py | 3 +- bookwyrm/templatetags/shelf_tags.py | 3 +- bookwyrm/templatetags/stars.py | 3 +- bookwyrm/templatetags/status_display.py | 3 +- bookwyrm/templatetags/user_page_tags.py | 3 +- bookwyrm/templatetags/utilities.py | 9 ++-- bookwyrm/tests/__init__.py | 3 +- bookwyrm/tests/activitypub/test_author.py | 1 + .../tests/activitypub/test_base_activity.py | 3 +- bookwyrm/tests/activitypub/test_note.py | 3 +- bookwyrm/tests/activitypub/test_quotation.py | 3 +- .../activitystreams/test_abstractstream.py | 3 +- .../tests/activitystreams/test_booksstream.py | 3 +- .../tests/activitystreams/test_homestream.py | 3 +- .../tests/activitystreams/test_localstream.py | 3 +- .../tests/activitystreams/test_signals.py | 3 +- bookwyrm/tests/activitystreams/test_tasks.py | 3 +- .../connectors/test_abstract_connector.py | 3 +- .../test_abstract_minimal_connector.py | 3 +- .../connectors/test_bookwyrm_connector.py | 3 +- .../connectors/test_connector_manager.py | 3 +- .../tests/connectors/test_finna_connector.py | 5 +- .../connectors/test_inventaire_connector.py | 3 +- .../connectors/test_openlibrary_connector.py | 3 +- .../tests/importers/test_bookwyrm_import.py | 3 +- .../importers/test_bookwyrm_user_import.py | 3 +- .../tests/importers/test_calibre_import.py | 3 +- .../tests/importers/test_goodreads_import.py | 3 +- bookwyrm/tests/importers/test_importer.py | 3 +- .../importers/test_librarything_import.py | 3 +- .../importers/test_openlibrary_import.py | 3 +- .../tests/importers/test_openreads_import.py | 3 +- .../tests/importers/test_storygraph_import.py | 3 +- bookwyrm/tests/lists_stream/test_signals.py | 3 +- bookwyrm/tests/lists_stream/test_stream.py | 3 +- bookwyrm/tests/lists_stream/test_tasks.py | 3 +- .../management/test_add_finna_connector.py | 3 +- bookwyrm/tests/management/test_initdb.py | 3 +- .../management/test_populate_lists_streams.py | 3 +- .../tests/management/test_populate_streams.py | 3 +- .../tests/models/test_activitypub_mixin.py | 7 ++- bookwyrm/tests/models/test_automod.py | 3 +- bookwyrm/tests/models/test_base_model.py | 3 +- bookwyrm/tests/models/test_book_model.py | 5 +- .../tests/models/test_bookwyrm_export_job.py | 2 +- .../tests/models/test_bookwyrm_import_job.py | 5 +- bookwyrm/tests/models/test_connector.py | 2 +- .../tests/models/test_federated_server.py | 3 +- bookwyrm/tests/models/test_fields.py | 4 +- bookwyrm/tests/models/test_group.py | 3 +- bookwyrm/tests/models/test_housekeeping.py | 26 +++++----- bookwyrm/tests/models/test_import_model.py | 3 +- bookwyrm/tests/models/test_job.py | 3 +- bookwyrm/tests/models/test_link.py | 3 +- bookwyrm/tests/models/test_list.py | 3 +- bookwyrm/tests/models/test_move.py | 3 +- bookwyrm/tests/models/test_notification.py | 3 +- .../tests/models/test_readthrough_model.py | 3 +- .../tests/models/test_relationship_models.py | 3 +- bookwyrm/tests/models/test_session.py | 3 +- bookwyrm/tests/models/test_shelf_model.py | 3 +- bookwyrm/tests/models/test_site.py | 3 +- bookwyrm/tests/models/test_status_model.py | 3 +- bookwyrm/tests/models/test_unicode_slugs.py | 3 +- bookwyrm/tests/models/test_user_model.py | 3 +- .../templatetags/test_book_display_tags.py | 3 +- bookwyrm/tests/templatetags/test_date_ext.py | 1 + .../tests/templatetags/test_feed_page_tags.py | 3 +- .../tests/templatetags/test_interaction.py | 3 +- bookwyrm/tests/templatetags/test_markdown.py | 3 +- .../test_notification_page_tags.py | 3 +- .../tests/templatetags/test_rating_tags.py | 3 +- .../tests/templatetags/test_shelf_tags.py | 3 +- .../tests/templatetags/test_status_display.py | 3 +- bookwyrm/tests/templatetags/test_utilities.py | 3 +- bookwyrm/tests/test_author_search.py | 3 +- bookwyrm/tests/test_book_search.py | 3 +- bookwyrm/tests/test_context_processors.py | 3 +- bookwyrm/tests/test_emailing.py | 3 +- bookwyrm/tests/test_isbn.py | 3 +- bookwyrm/tests/test_partial_date.py | 2 +- bookwyrm/tests/test_preview_images.py | 3 +- bookwyrm/tests/test_sanitize_html.py | 3 +- bookwyrm/tests/test_signing.py | 3 +- bookwyrm/tests/test_suggested_users.py | 3 +- bookwyrm/tests/test_utils.py | 3 +- bookwyrm/tests/validate_html.py | 3 +- .../tests/views/admin/test_announcements.py | 3 +- bookwyrm/tests/views/admin/test_automod.py | 3 +- bookwyrm/tests/views/admin/test_celery.py | 3 +- bookwyrm/tests/views/admin/test_connectors.py | 3 +- bookwyrm/tests/views/admin/test_dashboard.py | 3 +- .../tests/views/admin/test_email_blocks.py | 3 +- .../tests/views/admin/test_email_config.py | 3 +- bookwyrm/tests/views/admin/test_federation.py | 3 +- .../views/admin/test_files_maintenance.py | 3 +- bookwyrm/tests/views/admin/test_imports.py | 3 +- .../tests/views/admin/test_ip_blocklist.py | 3 +- .../tests/views/admin/test_link_domains.py | 3 +- bookwyrm/tests/views/admin/test_reports.py | 3 +- bookwyrm/tests/views/admin/test_site.py | 3 +- bookwyrm/tests/views/admin/test_themes.py | 3 +- bookwyrm/tests/views/admin/test_user_admin.py | 3 +- bookwyrm/tests/views/books/test_book.py | 3 +- bookwyrm/tests/views/books/test_edit_book.py | 3 +- bookwyrm/tests/views/books/test_editions.py | 3 +- bookwyrm/tests/views/books/test_links.py | 3 +- bookwyrm/tests/views/imports/test_import.py | 3 +- .../tests/views/imports/test_import_review.py | 3 +- .../views/imports/test_import_troubleshoot.py | 3 +- .../tests/views/imports/test_user_import.py | 3 +- bookwyrm/tests/views/inbox/test_inbox.py | 3 +- bookwyrm/tests/views/inbox/test_inbox_add.py | 3 +- .../tests/views/inbox/test_inbox_announce.py | 3 +- .../tests/views/inbox/test_inbox_block.py | 3 +- .../tests/views/inbox/test_inbox_create.py | 3 +- .../tests/views/inbox/test_inbox_delete.py | 1 + .../tests/views/inbox/test_inbox_follow.py | 3 +- bookwyrm/tests/views/inbox/test_inbox_like.py | 3 +- .../tests/views/inbox/test_inbox_remove.py | 3 +- .../tests/views/inbox/test_inbox_update.py | 3 +- bookwyrm/tests/views/landing/test_invite.py | 3 +- bookwyrm/tests/views/landing/test_landing.py | 3 +- bookwyrm/tests/views/landing/test_login.py | 3 +- bookwyrm/tests/views/landing/test_password.py | 3 +- bookwyrm/tests/views/landing/test_register.py | 3 +- bookwyrm/tests/views/lists/test_curate.py | 3 +- bookwyrm/tests/views/lists/test_embed.py | 3 +- bookwyrm/tests/views/lists/test_list.py | 5 +- bookwyrm/tests/views/lists/test_list_item.py | 3 +- bookwyrm/tests/views/lists/test_lists.py | 3 +- .../tests/views/preferences/test_block.py | 3 +- .../views/preferences/test_change_password.py | 3 +- .../views/preferences/test_delete_user.py | 3 +- .../tests/views/preferences/test_edit_user.py | 3 +- .../tests/views/preferences/test_export.py | 3 +- .../views/preferences/test_export_user.py | 3 +- bookwyrm/tests/views/preferences/test_move.py | 3 +- .../tests/views/preferences/test_security.py | 3 +- bookwyrm/tests/views/shelf/test_shelf.py | 3 +- .../tests/views/shelf/test_shelf_actions.py | 3 +- bookwyrm/tests/views/test_annual_summary.py | 1 + bookwyrm/tests/views/test_author.py | 3 +- bookwyrm/tests/views/test_directory.py | 3 +- bookwyrm/tests/views/test_discover.py | 3 +- bookwyrm/tests/views/test_feed.py | 3 +- bookwyrm/tests/views/test_follow.py | 3 +- bookwyrm/tests/views/test_get_started.py | 3 +- bookwyrm/tests/views/test_goal.py | 3 +- bookwyrm/tests/views/test_group.py | 4 +- bookwyrm/tests/views/test_hashtag.py | 3 +- bookwyrm/tests/views/test_helpers.py | 3 +- bookwyrm/tests/views/test_interaction.py | 3 +- bookwyrm/tests/views/test_isbn.py | 3 +- bookwyrm/tests/views/test_notifications.py | 3 +- bookwyrm/tests/views/test_outbox.py | 3 +- bookwyrm/tests/views/test_reading.py | 3 +- bookwyrm/tests/views/test_readthrough.py | 3 +- bookwyrm/tests/views/test_report.py | 3 +- bookwyrm/tests/views/test_rss_feed.py | 10 ++-- bookwyrm/tests/views/test_search.py | 3 +- bookwyrm/tests/views/test_setup.py | 3 +- bookwyrm/tests/views/test_status.py | 3 +- bookwyrm/tests/views/test_updates.py | 29 +++++++---- bookwyrm/tests/views/test_user.py | 3 +- bookwyrm/tests/views/test_wellknown.py | 3 +- bookwyrm/urls.py | 3 +- bookwyrm/utils/__init__.py | 3 +- bookwyrm/utils/cache.py | 5 +- bookwyrm/utils/db.py | 2 +- bookwyrm/utils/images.py | 2 +- bookwyrm/utils/isni.py | 3 +- bookwyrm/utils/log.py | 3 +- bookwyrm/utils/regex.py | 2 +- bookwyrm/utils/sanitizer.py | 1 + bookwyrm/utils/tar.py | 1 + bookwyrm/utils/validate.py | 1 + bookwyrm/views/__init__.py | 3 +- bookwyrm/views/admin/announcements.py | 3 +- bookwyrm/views/admin/automod.py | 3 +- bookwyrm/views/admin/celery_status.py | 4 +- bookwyrm/views/admin/connectors.py | 3 +- bookwyrm/views/admin/dashboard.py | 11 ++-- bookwyrm/views/admin/email_blocklist.py | 4 +- bookwyrm/views/admin/email_config.py | 4 +- bookwyrm/views/admin/federation.py | 5 +- bookwyrm/views/admin/federation_settings.py | 3 +- bookwyrm/views/admin/files_maintenance.py | 4 +- bookwyrm/views/admin/imports.py | 3 +- bookwyrm/views/admin/invite.py | 5 +- bookwyrm/views/admin/ip_blocklist.py | 4 +- bookwyrm/views/admin/link_domains.py | 4 +- bookwyrm/views/admin/reports.py | 3 +- bookwyrm/views/admin/schedule.py | 3 +- bookwyrm/views/admin/site.py | 3 +- bookwyrm/views/admin/themes.py | 3 +- bookwyrm/views/admin/user_admin.py | 3 +- bookwyrm/views/annual_summary.py | 1 + bookwyrm/views/author.py | 2 +- bookwyrm/views/books/books.py | 6 ++- bookwyrm/views/books/edit_book.py | 4 +- bookwyrm/views/books/editions.py | 2 +- bookwyrm/views/books/links.py | 2 +- bookwyrm/views/books/series.py | 2 +- bookwyrm/views/directory.py | 4 +- bookwyrm/views/discover.py | 3 +- bookwyrm/views/feed.py | 3 +- bookwyrm/views/follow.py | 4 +- bookwyrm/views/get_started.py | 2 +- bookwyrm/views/goal.py | 3 +- bookwyrm/views/group.py | 1 + bookwyrm/views/hashtag.py | 3 +- bookwyrm/views/helpers.py | 3 +- bookwyrm/views/imports/import_data.py | 4 +- bookwyrm/views/imports/import_status.py | 4 +- bookwyrm/views/imports/manually_review.py | 4 +- bookwyrm/views/imports/troubleshoot.py | 4 +- bookwyrm/views/imports/user_troubleshoot.py | 4 +- bookwyrm/views/inbox.py | 9 ++-- bookwyrm/views/interaction.py | 3 +- bookwyrm/views/isbn.py | 4 +- bookwyrm/views/landing/about.py | 3 +- bookwyrm/views/landing/landing.py | 3 +- bookwyrm/views/landing/login.py | 3 +- bookwyrm/views/landing/password.py | 3 +- bookwyrm/views/landing/register.py | 3 +- bookwyrm/views/list/curate.py | 3 +- bookwyrm/views/list/embed.py | 3 +- bookwyrm/views/list/list.py | 14 ++++-- bookwyrm/views/list/list_item.py | 3 +- bookwyrm/views/list/lists.py | 4 +- bookwyrm/views/notifications.py | 3 +- bookwyrm/views/outbox.py | 5 +- bookwyrm/views/preferences/block.py | 4 +- bookwyrm/views/preferences/change_password.py | 3 +- bookwyrm/views/preferences/delete_user.py | 3 +- bookwyrm/views/preferences/edit_user.py | 3 +- bookwyrm/views/preferences/export.py | 4 +- bookwyrm/views/preferences/move_user.py | 2 +- bookwyrm/views/preferences/security.py | 4 +- bookwyrm/views/reading.py | 2 +- bookwyrm/views/relationships.py | 3 +- bookwyrm/views/report.py | 3 +- bookwyrm/views/rss_feed.py | 7 ++- bookwyrm/views/search.py | 4 +- bookwyrm/views/server_error.py | 1 + bookwyrm/views/setup.py | 3 +- bookwyrm/views/shelf/shelf.py | 3 +- bookwyrm/views/shelf/shelf_actions.py | 2 +- bookwyrm/views/status.py | 2 +- bookwyrm/views/updates.py | 3 +- bookwyrm/views/user.py | 3 +- bookwyrm/views/wellknown.py | 2 +- bw-dev | 30 ++++++++--- celerywyrm/__init__.py | 3 +- celerywyrm/celery.py | 3 +- celerywyrm/settings.py | 3 +- celerywyrm/urls.py | 1 + complete_bwdev.fish | 10 +++- complete_bwdev.sh | 5 +- complete_bwdev.zsh | 5 +- dev-tools/requirements.txt | 2 +- pyproject.toml | 50 ++++++++++++++++++- requirements.txt | 3 +- 391 files changed, 931 insertions(+), 529 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 570174248a..d564973661 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -56,7 +56,7 @@ Our documentation is maintained in a separate repository at https://github.com/b - [ ] I intend to create a matching pull request in the Documentation repository after this PR is merged ### Tests diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index baa4f3a22b..5946b09675 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -52,8 +52,8 @@ jobs: - name: Run Tests run: pytest -n 3 - pylint: - name: Linting (pylint) + ruff: + name: Linting & Formatting (ruff) runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -66,8 +66,10 @@ jobs: run: | python -m pip install --upgrade pip pip install -r requirements.txt - - name: Analyse code with pylint - run: pylint bookwyrm/ + - name: Check code formatting with ruff + run: ruff format --check bookwyrm/ celerywyrm/ + - name: Lint code with ruff + run: ruff check bookwyrm/ celerywyrm/ mypy: name: Typing (mypy) @@ -88,12 +90,3 @@ jobs: - name: Analyse code with mypy run: mypy bookwyrm celerywyrm - black: - name: Formatting (black; run ./bw-dev black to fix) - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-python@v5 - - uses: psf/black@stable - with: - version: "22.*" diff --git a/README.md b/README.md index 0322308821..5afc0cdaf0 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [![](https://img.shields.io/github/release/bookwyrm-social/bookwyrm.svg?colorB=58839b)](https://github.com/bookwyrm-social/bookwyrm/releases) [![Run Python Tests](https://github.com/bookwyrm-social/bookwyrm/actions/workflows/django-tests.yml/badge.svg)](https://github.com/bookwyrm-social/bookwyrm/actions/workflows/django-tests.yml) -[![Pylint](https://github.com/bookwyrm-social/bookwyrm/actions/workflows/pylint.yml/badge.svg)](https://github.com/bookwyrm-social/bookwyrm/actions/workflows/pylint.yml) +[![Ruff](https://github.com/bookwyrm-social/bookwyrm/actions/workflows/python.yml/badge.svg?job=ruff)](https://github.com/bookwyrm-social/bookwyrm/actions/workflows/python.yml) BookWyrm is a social network for tracking your reading, talking about books, writing reviews, and discovering what to read next. Federation allows BookWyrm users to join small, trusted communities that can connect with one another, and with other ActivityPub services like [Mastodon](https://joinmastodon.org/) and [Pleroma](http://pleroma.social/). diff --git a/bookwyrm/activitypub/__init__.py b/bookwyrm/activitypub/__init__.py index 41decd68af..70f1097420 100644 --- a/bookwyrm/activitypub/__init__.py +++ b/bookwyrm/activitypub/__init__.py @@ -1,4 +1,5 @@ -""" bring activitypub functions into the namespace """ +"""bring activitypub functions into the namespace""" + import inspect import sys diff --git a/bookwyrm/activitypub/base_activity.py b/bookwyrm/activitypub/base_activity.py index 2a52d99f03..5560fafb78 100644 --- a/bookwyrm/activitypub/base_activity.py +++ b/bookwyrm/activitypub/base_activity.py @@ -1,4 +1,5 @@ -""" basics for an activitypub serializer """ +"""basics for an activitypub serializer""" + from __future__ import annotations from dataclasses import dataclass, fields, MISSING from json import JSONEncoder @@ -326,8 +327,7 @@ def resolve_remote_id( save: bool = True, get_activity: bool = False, allow_external_connections: bool = True, -) -> TBookWyrmModel: - ... +) -> TBookWyrmModel: ... # pylint: disable=too-many-arguments @@ -339,8 +339,7 @@ def resolve_remote_id( save: bool = True, get_activity: bool = False, allow_external_connections: bool = True, -) -> base_model.BookWyrmModel: - ... +) -> base_model.BookWyrmModel: ... # pylint: disable=too-many-arguments diff --git a/bookwyrm/activitypub/book.py b/bookwyrm/activitypub/book.py index 33c327d0fe..dd1bb22dfe 100644 --- a/bookwyrm/activitypub/book.py +++ b/bookwyrm/activitypub/book.py @@ -1,4 +1,5 @@ -""" book and author data """ +"""book and author data""" + from dataclasses import dataclass, field from typing import Optional diff --git a/bookwyrm/activitypub/image.py b/bookwyrm/activitypub/image.py index 7950faaf89..e92ea5c495 100644 --- a/bookwyrm/activitypub/image.py +++ b/bookwyrm/activitypub/image.py @@ -1,4 +1,5 @@ -""" an image, nothing fancy """ +"""an image, nothing fancy""" + from dataclasses import dataclass from .base_activity import ActivityObject diff --git a/bookwyrm/activitypub/note.py b/bookwyrm/activitypub/note.py index 376560f6e8..9139889d25 100644 --- a/bookwyrm/activitypub/note.py +++ b/bookwyrm/activitypub/note.py @@ -1,4 +1,5 @@ -""" note serializer and children thereof """ +"""note serializer and children thereof""" + from dataclasses import dataclass, field from typing import Dict, List import re diff --git a/bookwyrm/activitypub/ordered_collection.py b/bookwyrm/activitypub/ordered_collection.py index 250490041d..65e386a6a2 100644 --- a/bookwyrm/activitypub/ordered_collection.py +++ b/bookwyrm/activitypub/ordered_collection.py @@ -1,4 +1,5 @@ -""" defines activitypub collections (lists) """ +"""defines activitypub collections (lists)""" + from dataclasses import dataclass, field from typing import List diff --git a/bookwyrm/activitypub/person.py b/bookwyrm/activitypub/person.py index dfec92e4cf..1f978f3c32 100644 --- a/bookwyrm/activitypub/person.py +++ b/bookwyrm/activitypub/person.py @@ -1,4 +1,5 @@ -""" actor serializer """ +"""actor serializer""" + from dataclasses import dataclass from typing import Dict diff --git a/bookwyrm/activitypub/response.py b/bookwyrm/activitypub/response.py index e480b85dfa..dcc6767f48 100644 --- a/bookwyrm/activitypub/response.py +++ b/bookwyrm/activitypub/response.py @@ -1,4 +1,5 @@ -""" ActivityPub-specific json response wrapper """ +"""ActivityPub-specific json response wrapper""" + from django.http import JsonResponse from .base_activity import ActivityEncoder @@ -18,9 +19,8 @@ def __init__( encoder=ActivityEncoder, safe=False, json_dumps_params=None, - **kwargs + **kwargs, ): - if "content_type" not in kwargs: kwargs["content_type"] = "application/activity+json" diff --git a/bookwyrm/activitypub/verbs.py b/bookwyrm/activitypub/verbs.py index 549f14c9c0..4e3f3ed07b 100644 --- a/bookwyrm/activitypub/verbs.py +++ b/bookwyrm/activitypub/verbs.py @@ -1,4 +1,5 @@ -""" activities that do things """ +"""activities that do things""" + from dataclasses import dataclass, field from typing import List from django.apps import apps diff --git a/bookwyrm/activitystreams.py b/bookwyrm/activitystreams.py index 08fb757d5a..ef02c8ca23 100644 --- a/bookwyrm/activitystreams.py +++ b/bookwyrm/activitystreams.py @@ -1,4 +1,5 @@ -""" access the activity streams stored in redis """ +"""access the activity streams stored in redis""" + from datetime import timedelta from django.dispatch import receiver from django.db import transaction diff --git a/bookwyrm/admin.py b/bookwyrm/admin.py index f028dea083..0611060280 100644 --- a/bookwyrm/admin.py +++ b/bookwyrm/admin.py @@ -1,4 +1,5 @@ -""" models that will show up in django admin for superuser """ +"""models that will show up in django admin for superuser""" + from django.contrib import admin from bookwyrm import models diff --git a/bookwyrm/book_search.py b/bookwyrm/book_search.py index 106c68a83a..8a472127e3 100644 --- a/bookwyrm/book_search.py +++ b/bookwyrm/book_search.py @@ -1,4 +1,5 @@ -""" using a bookwyrm instance as a source of book data """ +"""using a bookwyrm instance as a source of book data""" + from __future__ import annotations from dataclasses import asdict, dataclass from functools import reduce @@ -21,8 +22,7 @@ def search( min_confidence: float = 0, filters: Optional[list[Any]] = None, return_first: Literal[False], -) -> QuerySet[models.Edition]: - ... +) -> QuerySet[models.Edition]: ... @overload @@ -32,8 +32,7 @@ def search( min_confidence: float = 0, filters: Optional[list[Any]] = None, return_first: Literal[True], -) -> Optional[models.Edition]: - ... +) -> Optional[models.Edition]: ... def search( @@ -53,7 +52,7 @@ def search( results = None # first, try searching unique identifiers # unique identifiers never have spaces, title/author usually do - if not " " in query: + if " " not in query: results = search_identifiers( query, *filters, return_first=return_first, books=books ) diff --git a/bookwyrm/connectors/__init__.py b/bookwyrm/connectors/__init__.py index ada2a78261..83d1da2b67 100644 --- a/bookwyrm/connectors/__init__.py +++ b/bookwyrm/connectors/__init__.py @@ -1,4 +1,5 @@ -""" bring connectors into the namespace """ +"""bring connectors into the namespace""" + from .settings import CONNECTORS from .abstract_connector import ConnectorException from .abstract_connector import get_data, get_image, maybe_isbn diff --git a/bookwyrm/connectors/abstract_connector.py b/bookwyrm/connectors/abstract_connector.py index 6bd9f54eb4..6e71eb39db 100644 --- a/bookwyrm/connectors/abstract_connector.py +++ b/bookwyrm/connectors/abstract_connector.py @@ -1,4 +1,5 @@ -""" functionality outline for a book data connector """ +"""functionality outline for a book data connector""" + from __future__ import annotations from abc import ABC, abstractmethod from typing import Optional, TypedDict, Any, Callable, Union, Iterator diff --git a/bookwyrm/connectors/bookwyrm_connector.py b/bookwyrm/connectors/bookwyrm_connector.py index 9aaa562648..477dd9c20d 100644 --- a/bookwyrm/connectors/bookwyrm_connector.py +++ b/bookwyrm/connectors/bookwyrm_connector.py @@ -1,4 +1,5 @@ -""" using another bookwyrm instance as a source of book data """ +"""using another bookwyrm instance as a source of book data""" + from __future__ import annotations from typing import Any, Iterator diff --git a/bookwyrm/connectors/connector_manager.py b/bookwyrm/connectors/connector_manager.py index a0ff1d4bb1..a24dc8b357 100644 --- a/bookwyrm/connectors/connector_manager.py +++ b/bookwyrm/connectors/connector_manager.py @@ -1,4 +1,5 @@ -""" interface with whatever connectors the app has """ +"""interface with whatever connectors the app has""" + from __future__ import annotations import asyncio import importlib @@ -50,15 +51,13 @@ async def async_connector_search( @overload def search( query: str, *, min_confidence: float = 0.1, return_first: Literal[False] -) -> list[abstract_connector.ConnectorResults]: - ... +) -> list[abstract_connector.ConnectorResults]: ... @overload def search( query: str, *, min_confidence: float = 0.1, return_first: Literal[True] -) -> Optional[SearchResult]: - ... +) -> Optional[SearchResult]: ... def search( @@ -195,7 +194,7 @@ def create_connector( def raise_not_valid_url(url: str) -> None: """do some basic reality checks on the url""" parsed = urlparse(url) - if not parsed.scheme in ["http", "https"]: + if parsed.scheme not in ["http", "https"]: raise ConnectorException("Invalid scheme: ", url) if not parsed.hostname: @@ -220,7 +219,7 @@ def create_finna_connector() -> None: name="Finna API", connector_file="finna", base_url="https://www.finna.fi", - books_url="https://api.finna.fi/api/v1/record" "?id=", + books_url="https://api.finna.fi/api/v1/record?id=", covers_url="https://api.finna.fi", search_url="https://api.finna.fi/api/v1/search?limit=20" "&filter[]=format%3a%220%2fBook%2f%22" diff --git a/bookwyrm/connectors/finna.py b/bookwyrm/connectors/finna.py index 59eedfbdcd..b54f92fd53 100644 --- a/bookwyrm/connectors/finna.py +++ b/bookwyrm/connectors/finna.py @@ -88,7 +88,8 @@ def get_book_data(self, remote_id: str) -> JsonDict: ] } data = get_data( - url=remote_id, params=request_parameters # type:ignore[arg-type] + url=remote_id, + params=request_parameters, # type:ignore[arg-type] ) extracted = data.get("records", []) try: diff --git a/bookwyrm/connectors/format_mappings.py b/bookwyrm/connectors/format_mappings.py index 61f61efaad..f998a23787 100644 --- a/bookwyrm/connectors/format_mappings.py +++ b/bookwyrm/connectors/format_mappings.py @@ -1,4 +1,5 @@ -""" comparing a free text format to the standardized one """ +"""comparing a free text format to the standardized one""" + format_mappings = { "paperback": "Paperback", "soft": "Paperback", diff --git a/bookwyrm/connectors/inventaire.py b/bookwyrm/connectors/inventaire.py index 3f4c179e8c..1cacd44bf6 100644 --- a/bookwyrm/connectors/inventaire.py +++ b/bookwyrm/connectors/inventaire.py @@ -1,4 +1,5 @@ -""" inventaire data connector """ +"""inventaire data connector""" + import re from typing import Any, Union, Optional, Iterator, Iterable diff --git a/bookwyrm/connectors/openlibrary.py b/bookwyrm/connectors/openlibrary.py index 4778a32332..032a86f580 100644 --- a/bookwyrm/connectors/openlibrary.py +++ b/bookwyrm/connectors/openlibrary.py @@ -1,4 +1,5 @@ -""" openlibrary data connector """ +"""openlibrary data connector""" + import re from typing import Any, Optional, Union, Iterator, Iterable diff --git a/bookwyrm/connectors/openlibrary_languages.py b/bookwyrm/connectors/openlibrary_languages.py index 2520d1ea15..3a6276e74a 100644 --- a/bookwyrm/connectors/openlibrary_languages.py +++ b/bookwyrm/connectors/openlibrary_languages.py @@ -1,4 +1,5 @@ -""" key lookups for openlibrary languages """ +"""key lookups for openlibrary languages""" + languages = { "/languages/eng": "English", "/languages/fre": "French", diff --git a/bookwyrm/connectors/settings.py b/bookwyrm/connectors/settings.py index 4ef149a21d..85aff80f17 100644 --- a/bookwyrm/connectors/settings.py +++ b/bookwyrm/connectors/settings.py @@ -1,4 +1,4 @@ -""" settings book data connectors """ +"""settings book data connectors""" CONNECTORS = [ "openlibrary", diff --git a/bookwyrm/context_processors.py b/bookwyrm/context_processors.py index 1dac54997d..1406a84a18 100644 --- a/bookwyrm/context_processors.py +++ b/bookwyrm/context_processors.py @@ -1,4 +1,5 @@ -""" customize the info available in context for rendering templates """ +"""customize the info available in context for rendering templates""" + from bookwyrm import models, settings diff --git a/bookwyrm/decorators.py b/bookwyrm/decorators.py index b8285cfb85..ba9526bf9e 100644 --- a/bookwyrm/decorators.py +++ b/bookwyrm/decorators.py @@ -1,4 +1,5 @@ -""" Custom view decorators """ +"""Custom view decorators""" + from functools import wraps from bookwyrm.models.site import SiteSettings diff --git a/bookwyrm/emailing.py b/bookwyrm/emailing.py index 4a0ae7423e..1662bd4c65 100644 --- a/bookwyrm/emailing.py +++ b/bookwyrm/emailing.py @@ -1,4 +1,5 @@ -""" send emails """ +"""send emails""" + from django.core.mail import EmailMultiAlternatives from django.template.loader import get_template diff --git a/bookwyrm/forms/__init__.py b/bookwyrm/forms/__init__.py index a37d126ac9..00709a7c77 100644 --- a/bookwyrm/forms/__init__.py +++ b/bookwyrm/forms/__init__.py @@ -1,4 +1,5 @@ -""" make forms available to the app """ +"""make forms available to the app""" + # site admin from .admin import * from .author import * diff --git a/bookwyrm/forms/admin.py b/bookwyrm/forms/admin.py index e3586cd342..2bae65a030 100644 --- a/bookwyrm/forms/admin.py +++ b/bookwyrm/forms/admin.py @@ -1,4 +1,5 @@ -""" using django model forms """ +"""using django model forms""" + import datetime from django import forms @@ -216,5 +217,4 @@ def save(self, request, *args, **kwargs): class ExportFileExpiryForm(forms.Form): - hours = forms.IntegerField(min_value=1) diff --git a/bookwyrm/forms/author.py b/bookwyrm/forms/author.py index a3a759af7c..2364b488b2 100644 --- a/bookwyrm/forms/author.py +++ b/bookwyrm/forms/author.py @@ -1,4 +1,5 @@ -""" using django model forms """ +"""using django model forms""" + from django import forms from bookwyrm import models diff --git a/bookwyrm/forms/books.py b/bookwyrm/forms/books.py index f9a110efc9..e2206d9e7b 100644 --- a/bookwyrm/forms/books.py +++ b/bookwyrm/forms/books.py @@ -1,4 +1,5 @@ -""" using django model forms """ +"""using django model forms""" + from django import forms from file_resubmit.widgets import ResubmitImageWidget diff --git a/bookwyrm/forms/custom_form.py b/bookwyrm/forms/custom_form.py index 6b425d216a..98a77aa93d 100644 --- a/bookwyrm/forms/custom_form.py +++ b/bookwyrm/forms/custom_form.py @@ -1,4 +1,5 @@ -""" Overrides django's default form class """ +"""Overrides django's default form class""" + from collections import defaultdict from django.forms import ModelForm from django.forms.widgets import Textarea diff --git a/bookwyrm/forms/edit_user.py b/bookwyrm/forms/edit_user.py index da69243e11..1fe794045f 100644 --- a/bookwyrm/forms/edit_user.py +++ b/bookwyrm/forms/edit_user.py @@ -1,4 +1,5 @@ -""" using django model forms """ +"""using django model forms""" + from django import forms from django.contrib.auth.password_validation import validate_password from django.core.exceptions import ValidationError @@ -8,6 +9,7 @@ from bookwyrm.models.fields import ClearableFileInputWithWarning from .custom_form import CustomForm + # pylint: disable=missing-class-docstring class EditUserForm(CustomForm): class Meta: diff --git a/bookwyrm/forms/forms.py b/bookwyrm/forms/forms.py index 0ecf3e3018..52d327a22f 100644 --- a/bookwyrm/forms/forms.py +++ b/bookwyrm/forms/forms.py @@ -1,4 +1,5 @@ -""" using django model forms """ +"""using django model forms""" + import datetime from django import forms from django.forms import widgets @@ -9,6 +10,7 @@ from bookwyrm.models.fields import ClearableFileInputWithWarning from .custom_form import CustomForm + # pylint: disable=missing-class-docstring class FeedStatusTypesForm(CustomForm): class Meta: diff --git a/bookwyrm/forms/groups.py b/bookwyrm/forms/groups.py index 90aace3baf..3138d3f7a2 100644 --- a/bookwyrm/forms/groups.py +++ b/bookwyrm/forms/groups.py @@ -1,4 +1,5 @@ -""" using django model forms """ +"""using django model forms""" + from bookwyrm import models from .custom_form import CustomForm diff --git a/bookwyrm/forms/landing.py b/bookwyrm/forms/landing.py index 6e43dbad49..c14b1d4722 100644 --- a/bookwyrm/forms/landing.py +++ b/bookwyrm/forms/landing.py @@ -1,4 +1,5 @@ -""" Forms for the landing pages """ +"""Forms for the landing pages""" + from django import forms from django.contrib.auth.password_validation import validate_password from django.core.exceptions import ValidationError @@ -131,7 +132,6 @@ def clean_otp(self): totp = pyotp.TOTP(self.instance.otp_secret) if not totp.verify(otp, valid_window=TWO_FACTOR_LOGIN_VALIDITY_WINDOW): - if self.instance.hotp_secret: # maybe it's a backup code? hotp = pyotp.HOTP(self.instance.hotp_secret) diff --git a/bookwyrm/forms/links.py b/bookwyrm/forms/links.py index 06de9a304d..eda5b675c1 100644 --- a/bookwyrm/forms/links.py +++ b/bookwyrm/forms/links.py @@ -1,4 +1,4 @@ -""" using django model forms """ +"""using django model forms""" from urllib.parse import urlparse diff --git a/bookwyrm/forms/lists.py b/bookwyrm/forms/lists.py index f5008baa3c..5a5392ca70 100644 --- a/bookwyrm/forms/lists.py +++ b/bookwyrm/forms/lists.py @@ -1,4 +1,5 @@ -""" using django model forms """ +"""using django model forms""" + from django import forms from django.forms import ChoiceField from django.utils.translation import gettext_lazy as _ diff --git a/bookwyrm/forms/status.py b/bookwyrm/forms/status.py index b562595eeb..f026780746 100644 --- a/bookwyrm/forms/status.py +++ b/bookwyrm/forms/status.py @@ -1,4 +1,5 @@ -""" using django model forms """ +"""using django model forms""" + from bookwyrm import models from .custom_form import CustomForm diff --git a/bookwyrm/forms/user_admin.py b/bookwyrm/forms/user_admin.py index a3bf6fa8ec..1efd366a40 100644 --- a/bookwyrm/forms/user_admin.py +++ b/bookwyrm/forms/user_admin.py @@ -1,4 +1,5 @@ -""" using django model forms """ +"""using django model forms""" + from bookwyrm import models from .custom_form import CustomForm diff --git a/bookwyrm/forms/widgets.py b/bookwyrm/forms/widgets.py index 001fdbec40..97088cf826 100644 --- a/bookwyrm/forms/widgets.py +++ b/bookwyrm/forms/widgets.py @@ -1,4 +1,5 @@ -""" using django model forms """ +"""using django model forms""" + from django import forms diff --git a/bookwyrm/imagegenerators.py b/bookwyrm/imagegenerators.py index 1d065192e8..dc51683d06 100644 --- a/bookwyrm/imagegenerators.py +++ b/bookwyrm/imagegenerators.py @@ -1,4 +1,5 @@ """Generators for all the different thumbnail sizes""" + from imagekit import ImageSpec, register from imagekit.processors import ResizeToFit diff --git a/bookwyrm/importers/__init__.py b/bookwyrm/importers/__init__.py index 497eebcf69..3c8bab23f0 100644 --- a/bookwyrm/importers/__init__.py +++ b/bookwyrm/importers/__init__.py @@ -1,4 +1,4 @@ -""" import classes """ +"""import classes""" from .importer import Importer from .bookwyrm_import import BookwyrmImporter, BookwyrmBooksImporter diff --git a/bookwyrm/importers/bookwyrm_import.py b/bookwyrm/importers/bookwyrm_import.py index d4fedb4f79..a1cdec811d 100644 --- a/bookwyrm/importers/bookwyrm_import.py +++ b/bookwyrm/importers/bookwyrm_import.py @@ -1,4 +1,5 @@ """Import data from Bookwyrm export files""" + from django.http import QueryDict from bookwyrm.models import User diff --git a/bookwyrm/importers/calibre_import.py b/bookwyrm/importers/calibre_import.py index 542175dd7a..76b7ae63fa 100644 --- a/bookwyrm/importers/calibre_import.py +++ b/bookwyrm/importers/calibre_import.py @@ -1,4 +1,5 @@ -""" handle reading a csv from calibre """ +"""handle reading a csv from calibre""" + from typing import Any, Optional from bookwyrm.models import Shelf diff --git a/bookwyrm/importers/goodreads_import.py b/bookwyrm/importers/goodreads_import.py index 8b3e94cbc7..e7c5b6aaf4 100644 --- a/bookwyrm/importers/goodreads_import.py +++ b/bookwyrm/importers/goodreads_import.py @@ -1,4 +1,5 @@ -""" handle reading a csv from goodreads """ +"""handle reading a csv from goodreads""" + from typing import Optional from . import Importer diff --git a/bookwyrm/importers/importer.py b/bookwyrm/importers/importer.py index e321303f1f..926fa4a726 100644 --- a/bookwyrm/importers/importer.py +++ b/bookwyrm/importers/importer.py @@ -1,4 +1,5 @@ -""" handle reading a csv from an external service, defaults are from Goodreads """ +"""handle reading a csv from an external service, defaults are from Goodreads""" + import csv from datetime import timedelta from typing import Iterable, Optional @@ -106,7 +107,7 @@ def update_legacy_job(self, job: ImportJob) -> None: def create_row_mappings(self, headers: list[str]) -> dict[str, Optional[str]]: """guess what the headers mean""" mappings = {} - for (key, guesses) in self.row_mappings_guesses: + for key, guesses in self.row_mappings_guesses: values = [h for h in headers if h.lower() in guesses] value = values[0] if len(values) else None if value: diff --git a/bookwyrm/importers/librarything_import.py b/bookwyrm/importers/librarything_import.py index 24a2626bf6..f118d7ea20 100644 --- a/bookwyrm/importers/librarything_import.py +++ b/bookwyrm/importers/librarything_import.py @@ -1,4 +1,5 @@ -""" handle reading a tsv from librarything """ +"""handle reading a tsv from librarything""" + import re from typing import Optional diff --git a/bookwyrm/importers/openlibrary_import.py b/bookwyrm/importers/openlibrary_import.py index 6a954ed3c7..6cb7c615b9 100644 --- a/bookwyrm/importers/openlibrary_import.py +++ b/bookwyrm/importers/openlibrary_import.py @@ -1,4 +1,5 @@ -""" handle reading a csv from openlibrary""" +"""handle reading a csv from openlibrary""" + from typing import Any from . import Importer diff --git a/bookwyrm/importers/openreads_import.py b/bookwyrm/importers/openreads_import.py index e6e12c2ef1..f17ce8425a 100644 --- a/bookwyrm/importers/openreads_import.py +++ b/bookwyrm/importers/openreads_import.py @@ -1,4 +1,5 @@ -""" handle reading a csv from openreads""" +"""handle reading a csv from openreads""" + from typing import Any, Optional from datetime import datetime from bookwyrm.models import Shelf diff --git a/bookwyrm/importers/storygraph_import.py b/bookwyrm/importers/storygraph_import.py index 67cbaa663c..b5954ea345 100644 --- a/bookwyrm/importers/storygraph_import.py +++ b/bookwyrm/importers/storygraph_import.py @@ -1,4 +1,5 @@ -""" handle reading a csv from storygraph""" +"""handle reading a csv from storygraph""" + from . import Importer diff --git a/bookwyrm/isbn/isbn.py b/bookwyrm/isbn/isbn.py index d14dc26196..db67060f58 100644 --- a/bookwyrm/isbn/isbn.py +++ b/bookwyrm/isbn/isbn.py @@ -1,4 +1,5 @@ -""" Use the range message from isbn-international to hyphenate ISBNs """ +"""Use the range message from isbn-international to hyphenate ISBNs""" + import os from typing import Optional from xml.etree import ElementTree diff --git a/bookwyrm/lists_stream.py b/bookwyrm/lists_stream.py index 479eacb193..1030b3834d 100644 --- a/bookwyrm/lists_stream.py +++ b/bookwyrm/lists_stream.py @@ -1,4 +1,5 @@ -""" access the list streams stored in redis """ +"""access the list streams stored in redis""" + from django.dispatch import receiver from django.db import transaction from django.db.models import signals, Count, Q diff --git a/bookwyrm/management/commands/add_finna_connector.py b/bookwyrm/management/commands/add_finna_connector.py index 6da28570a3..94250d8d06 100644 --- a/bookwyrm/management/commands/add_finna_connector.py +++ b/bookwyrm/management/commands/add_finna_connector.py @@ -1,17 +1,17 @@ -""" Add finna connector to connectors """ +"""Add finna connector to connectors""" + from django.core.management.base import BaseCommand from bookwyrm import models def enable_finna_connector(): - models.Connector.objects.create( identifier="api.finna.fi", name="Finna API", connector_file="finna", base_url="https://www.finna.fi", - books_url="https://api.finna.fi/api/v1/record" "?id=", + books_url="https://api.finna.fi/api/v1/record?id=", covers_url="https://api.finna.fi", search_url="https://api.finna.fi/api/v1/search?limit=20" "&filter[]=format%3a%220%2fBook%2f%22" diff --git a/bookwyrm/management/commands/admin_code.py b/bookwyrm/management/commands/admin_code.py index 75322163f5..90da08f28a 100644 --- a/bookwyrm/management/commands/admin_code.py +++ b/bookwyrm/management/commands/admin_code.py @@ -1,4 +1,5 @@ -""" Get your admin code to allow install """ +"""Get your admin code to allow install""" + from django.core.management.base import BaseCommand from bookwyrm import models diff --git a/bookwyrm/management/commands/compile_themes.py b/bookwyrm/management/commands/compile_themes.py index 95c6699ba5..c120f977e2 100644 --- a/bookwyrm/management/commands/compile_themes.py +++ b/bookwyrm/management/commands/compile_themes.py @@ -1,4 +1,5 @@ -""" Our own command to all scss themes """ +"""Our own command to all scss themes""" + import glob import os diff --git a/bookwyrm/management/commands/confirm_email.py b/bookwyrm/management/commands/confirm_email.py index 450da7eecf..38f4c34321 100644 --- a/bookwyrm/management/commands/confirm_email.py +++ b/bookwyrm/management/commands/confirm_email.py @@ -1,4 +1,5 @@ -""" manually confirm e-mail of user """ +"""manually confirm e-mail of user""" + from django.core.management.base import BaseCommand from bookwyrm import models diff --git a/bookwyrm/management/commands/deduplicate_book_data.py b/bookwyrm/management/commands/deduplicate_book_data.py index c2d897ce33..2637079ccf 100644 --- a/bookwyrm/management/commands/deduplicate_book_data.py +++ b/bookwyrm/management/commands/deduplicate_book_data.py @@ -1,5 +1,5 @@ -""" PROCEED WITH CAUTION: uses deduplication fields to permanently -merge book data objects """ +"""PROCEED WITH CAUTION: uses deduplication fields to permanently +merge book data objects""" from django.core.management.base import BaseCommand from django.db.models import Count diff --git a/bookwyrm/management/commands/erase_deleted_user_data.py b/bookwyrm/management/commands/erase_deleted_user_data.py index 40c3f042b3..d907327d22 100644 --- a/bookwyrm/management/commands/erase_deleted_user_data.py +++ b/bookwyrm/management/commands/erase_deleted_user_data.py @@ -1,9 +1,11 @@ -""" Erase any data stored about deleted users """ +"""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""" @@ -18,7 +20,6 @@ def add_arguments(self, parser): # pylint: disable=no-self-use ) 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(): diff --git a/bookwyrm/management/commands/erase_streams.py b/bookwyrm/management/commands/erase_streams.py index ecd36006cc..4c2964e673 100644 --- a/bookwyrm/management/commands/erase_streams.py +++ b/bookwyrm/management/commands/erase_streams.py @@ -1,4 +1,5 @@ -""" Delete user streams """ +"""Delete user streams""" + from django.core.management.base import BaseCommand import redis @@ -16,6 +17,7 @@ class Command(BaseCommand): """delete activity streams for all users""" help = "Delete all the user streams" + # pylint: disable=no-self-use,unused-argument def handle(self, *args, **options): """flush all, baby""" diff --git a/bookwyrm/management/commands/generate_preview_images.py b/bookwyrm/management/commands/generate_preview_images.py index 9ff16c26ae..6adf265354 100644 --- a/bookwyrm/management/commands/generate_preview_images.py +++ b/bookwyrm/management/commands/generate_preview_images.py @@ -1,4 +1,5 @@ -""" Generate preview images """ +"""Generate preview images""" + from django.core.management.base import BaseCommand from bookwyrm import models, preview_images diff --git a/bookwyrm/management/commands/initdb.py b/bookwyrm/management/commands/initdb.py index 88941a653e..9192f0173f 100644 --- a/bookwyrm/management/commands/initdb.py +++ b/bookwyrm/management/commands/initdb.py @@ -1,4 +1,5 @@ -""" What you need in the database to make it work """ +"""What you need in the database to make it work""" + from django.core.management.base import BaseCommand from django.contrib.auth.models import Group, Permission from django.contrib.contenttypes.models import ContentType diff --git a/bookwyrm/management/commands/merge_authors.py b/bookwyrm/management/commands/merge_authors.py index 7465df1479..a05029e9eb 100644 --- a/bookwyrm/management/commands/merge_authors.py +++ b/bookwyrm/management/commands/merge_authors.py @@ -1,5 +1,6 @@ -""" PROCEED WITH CAUTION: uses deduplication fields to permanently -merge author data objects """ +"""PROCEED WITH CAUTION: uses deduplication fields to permanently +merge author data objects""" + from bookwyrm import models from bookwyrm.management.merge_command import MergeCommand diff --git a/bookwyrm/management/commands/merge_editions.py b/bookwyrm/management/commands/merge_editions.py index 9ed6962019..4b7f367809 100644 --- a/bookwyrm/management/commands/merge_editions.py +++ b/bookwyrm/management/commands/merge_editions.py @@ -1,5 +1,6 @@ -""" PROCEED WITH CAUTION: uses deduplication fields to permanently -merge edition data objects """ +"""PROCEED WITH CAUTION: uses deduplication fields to permanently +merge edition data objects""" + from bookwyrm import models from bookwyrm.management.merge_command import MergeCommand diff --git a/bookwyrm/management/commands/merge_works.py b/bookwyrm/management/commands/merge_works.py index 619d0509ac..e8c5e08319 100644 --- a/bookwyrm/management/commands/merge_works.py +++ b/bookwyrm/management/commands/merge_works.py @@ -1,5 +1,6 @@ -""" PROCEED WITH CAUTION: uses deduplication fields to permanently -merge work data objects """ +"""PROCEED WITH CAUTION: uses deduplication fields to permanently +merge work data objects""" + from bookwyrm import models from bookwyrm.management.merge_command import MergeCommand diff --git a/bookwyrm/management/commands/populate_lists_streams.py b/bookwyrm/management/commands/populate_lists_streams.py index 0a057401cc..313502e5c3 100644 --- a/bookwyrm/management/commands/populate_lists_streams.py +++ b/bookwyrm/management/commands/populate_lists_streams.py @@ -1,4 +1,5 @@ -""" Re-create list streams """ +"""Re-create list streams""" + from django.core.management.base import BaseCommand from bookwyrm import lists_stream, models diff --git a/bookwyrm/management/commands/populate_streams.py b/bookwyrm/management/commands/populate_streams.py index 5f83670c20..2aa769699a 100644 --- a/bookwyrm/management/commands/populate_streams.py +++ b/bookwyrm/management/commands/populate_streams.py @@ -1,4 +1,5 @@ -""" Re-create user streams """ +"""Re-create user streams""" + from django.core.management.base import BaseCommand from bookwyrm import activitystreams, lists_stream, models diff --git a/bookwyrm/management/commands/populate_suggestions.py b/bookwyrm/management/commands/populate_suggestions.py index 32495497e4..fd195d4ac8 100644 --- a/bookwyrm/management/commands/populate_suggestions.py +++ b/bookwyrm/management/commands/populate_suggestions.py @@ -1,4 +1,5 @@ -""" Populate suggested users """ +"""Populate suggested users""" + from django.core.management.base import BaseCommand from bookwyrm import models @@ -19,6 +20,7 @@ class Command(BaseCommand): """start all over with user suggestions""" help = "Populate suggested users for all users" + # pylint: disable=no-self-use,unused-argument def handle(self, *args, **options): """run builder""" diff --git a/bookwyrm/management/commands/remove_editions.py b/bookwyrm/management/commands/remove_editions.py index 5cb430a93b..f07d075ac4 100644 --- a/bookwyrm/management/commands/remove_editions.py +++ b/bookwyrm/management/commands/remove_editions.py @@ -1,4 +1,5 @@ -""" PROCEED WITH CAUTION: this permanently deletes book data """ +"""PROCEED WITH CAUTION: this permanently deletes book data""" + from django.core.management.base import BaseCommand from django.db.models import Count, Q from bookwyrm import models @@ -20,7 +21,7 @@ def remove_editions(): models.Edition.objects.filter( Q(languages=[]) | Q(languages__contains=["English"]), **filters, - **null_fields + **null_fields, ) .annotate(Count("parent_work__editions")) .filter( @@ -36,6 +37,7 @@ class Command(BaseCommand): """deduplicate allllll the book data models""" help = "merges duplicate book data" + # pylint: disable=no-self-use,unused-argument def handle(self, *args, **options): """run deduplications""" diff --git a/bookwyrm/management/commands/remove_remote_user_preview_images.py b/bookwyrm/management/commands/remove_remote_user_preview_images.py index d4dc131d82..d7d816e6d6 100644 --- a/bookwyrm/management/commands/remove_remote_user_preview_images.py +++ b/bookwyrm/management/commands/remove_remote_user_preview_images.py @@ -1,4 +1,5 @@ -""" Remove preview images for remote users """ +"""Remove preview images for remote users""" + from django.core.management.base import BaseCommand from django.db.models import Q @@ -35,6 +36,6 @@ def handle(self, *args, **options): self.stdout.write(".", ending="") self.stdout.write(" OK 🖼") else: - self.stdout.write(f" | There was no remote users with preview images.") + self.stdout.write(" | There was no remote users with preview images.") self.stdout.write("🧑‍🚒 ⎨ I’m all done! ✧ Enjoy ✧") diff --git a/bookwyrm/management/commands/repair_editions.py b/bookwyrm/management/commands/repair_editions.py index 304cd5e51f..56ffd93591 100644 --- a/bookwyrm/management/commands/repair_editions.py +++ b/bookwyrm/management/commands/repair_editions.py @@ -1,4 +1,5 @@ -""" Repair editions with missing works """ +"""Repair editions with missing works""" + from django.core.management.base import BaseCommand from bookwyrm import models diff --git a/bookwyrm/management/commands/revoke_preview_image_tasks.py b/bookwyrm/management/commands/revoke_preview_image_tasks.py index 7b0947b12c..311811017c 100644 --- a/bookwyrm/management/commands/revoke_preview_image_tasks.py +++ b/bookwyrm/management/commands/revoke_preview_image_tasks.py @@ -1,4 +1,5 @@ -""" Actually let's not generate those preview images """ +"""Actually let's not generate those preview images""" + import json from django.core.management.base import BaseCommand from bookwyrm.tasks import app diff --git a/bookwyrm/middleware/__init__.py b/bookwyrm/middleware/__init__.py index 5b9c658832..2656a29f12 100644 --- a/bookwyrm/middleware/__init__.py +++ b/bookwyrm/middleware/__init__.py @@ -1,4 +1,5 @@ -""" look at all this nice middleware! """ +"""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 index de1349d96a..0949821cfb 100644 --- a/bookwyrm/middleware/file_too_big.py +++ b/bookwyrm/middleware/file_too_big.py @@ -21,7 +21,6 @@ def __call__(self, request): body = request.body # pylint: disable=unused-variable except RequestDataTooBig: - rendered = render(request, "413.html") response = HttpResponse(rendered) return response diff --git a/bookwyrm/middleware/force_logout.py b/bookwyrm/middleware/force_logout.py index 02cd28a31e..d901e1a2e8 100644 --- a/bookwyrm/middleware/force_logout.py +++ b/bookwyrm/middleware/force_logout.py @@ -1,4 +1,4 @@ -""" Check if user needs to reset their password and log them out """ +"""Check if user needs to reset their password and log them out""" from django.contrib.auth import logout diff --git a/bookwyrm/middleware/ip_middleware.py b/bookwyrm/middleware/ip_middleware.py index 8063dd1f60..4d9f2bbf63 100644 --- a/bookwyrm/middleware/ip_middleware.py +++ b/bookwyrm/middleware/ip_middleware.py @@ -1,4 +1,5 @@ -""" Block IP addresses """ +"""Block IP addresses""" + from django.http import Http404 from bookwyrm import models diff --git a/bookwyrm/middleware/timezone_middleware.py b/bookwyrm/middleware/timezone_middleware.py index 3cf084154c..4337d04193 100644 --- a/bookwyrm/middleware/timezone_middleware.py +++ b/bookwyrm/middleware/timezone_middleware.py @@ -1,4 +1,5 @@ -""" Makes the app aware of the users timezone """ +"""Makes the app aware of the users timezone""" + import zoneinfo from django.utils import timezone diff --git a/bookwyrm/models/__init__.py b/bookwyrm/models/__init__.py index 9c93d3b1ac..a21f847623 100644 --- a/bookwyrm/models/__init__.py +++ b/bookwyrm/models/__init__.py @@ -1,4 +1,5 @@ -""" bring all the models into the app namespace """ +"""bring all the models into the app namespace""" + import inspect import sys diff --git a/bookwyrm/models/activitypub_mixin.py b/bookwyrm/models/activitypub_mixin.py index dfce4d5af9..1e8ab6c4b8 100644 --- a/bookwyrm/models/activitypub_mixin.py +++ b/bookwyrm/models/activitypub_mixin.py @@ -1,4 +1,5 @@ -""" activitypub model functionality """ +"""activitypub model functionality""" + import asyncio from base64 import b64encode from collections import namedtuple diff --git a/bookwyrm/models/announcement.py b/bookwyrm/models/announcement.py index 4581dbdae2..a1a25fb418 100644 --- a/bookwyrm/models/announcement.py +++ b/bookwyrm/models/announcement.py @@ -1,4 +1,5 @@ -""" admin announcements """ +"""admin announcements""" + from django.db import models from django.db.models import Q from django.utils import timezone diff --git a/bookwyrm/models/annual_goal.py b/bookwyrm/models/annual_goal.py index d36b822df2..7cce07115f 100644 --- a/bookwyrm/models/annual_goal.py +++ b/bookwyrm/models/annual_goal.py @@ -1,11 +1,12 @@ -""" How many books do you want to read this year """ +"""How many books do you want to read this year""" + from django.core.validators import MinValueValidator from django.db import models from django.utils import timezone from bookwyrm.models.status import Review from .base_model import BookWyrmModel -from . import fields, Review +from . import fields def get_current_year(): diff --git a/bookwyrm/models/antispam.py b/bookwyrm/models/antispam.py index 1067cbf1d7..da09014582 100644 --- a/bookwyrm/models/antispam.py +++ b/bookwyrm/models/antispam.py @@ -1,4 +1,5 @@ -""" Lets try NOT to sell viagra """ +"""Lets try NOT to sell viagra""" + from functools import reduce import operator diff --git a/bookwyrm/models/attachment.py b/bookwyrm/models/attachment.py index c8b2e51c2d..ae3fad950a 100644 --- a/bookwyrm/models/attachment.py +++ b/bookwyrm/models/attachment.py @@ -1,4 +1,5 @@ -""" media that is posted in the app """ +"""media that is posted in the app""" + from django.db import models from bookwyrm import activitypub diff --git a/bookwyrm/models/author.py b/bookwyrm/models/author.py index 20c4e9e005..29e2954f92 100644 --- a/bookwyrm/models/author.py +++ b/bookwyrm/models/author.py @@ -1,4 +1,4 @@ -""" database schema for info about authors """ +"""database schema for info about authors""" import re from typing import Any diff --git a/bookwyrm/models/base_model.py b/bookwyrm/models/base_model.py index 814e59a733..837c18ecb9 100644 --- a/bookwyrm/models/base_model.py +++ b/bookwyrm/models/base_model.py @@ -1,4 +1,5 @@ -""" base model with default fields """ +"""base model with default fields""" + import base64 from Crypto import Random @@ -93,7 +94,6 @@ def raise_visible_to_user(self, viewer): self.privacy in ["direct", "followers"] and self.mention_users.filter(id=viewer.id).first() ): - return # you can see groups of which you are a member @@ -149,7 +149,7 @@ def privacy_filter(cls, viewer, privacy_levels=None): # you can't see followers only or direct messages if you're not logged in if viewer.is_anonymous: privacy_levels = [ - p for p in privacy_levels if not p in ["followers", "direct"] + p for p in privacy_levels if p not in ["followers", "direct"] ] else: # exclude blocks from both directions diff --git a/bookwyrm/models/book.py b/bookwyrm/models/book.py index 5f71221ea8..a16b0a7f40 100644 --- a/bookwyrm/models/book.py +++ b/bookwyrm/models/book.py @@ -1,4 +1,4 @@ -""" database schema for books and shelves """ +"""database schema for books and shelves""" from itertools import chain import re @@ -371,7 +371,7 @@ def guess_sort_title(self, user=None): *(LANGUAGE_ARTICLES[language].get("articles") for language in lang_codes) ) - return re.sub(f'^{" |^".join(articles)} ', "", str(self.title).lower()) + return re.sub(f"^{' |^'.join(articles)} ", "", str(self.title).lower()) def __repr__(self): # pylint: disable=consider-using-f-string diff --git a/bookwyrm/models/bookwyrm_export_job.py b/bookwyrm/models/bookwyrm_export_job.py index 8fbb659ad0..25eea2b862 100644 --- a/bookwyrm/models/bookwyrm_export_job.py +++ b/bookwyrm/models/bookwyrm_export_job.py @@ -193,7 +193,7 @@ def export_settings(user: User): def export_saved_lists(user: User): """add user saved lists to export JSON""" - return [l.remote_id for l in user.saved_lists.all()] + return [saved_list.remote_id for saved_list in user.saved_lists.all()] def export_follows(user: User): @@ -256,9 +256,9 @@ def export_book(user: User, edition: Edition): data["lists"] = [] 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["privacy"] = ( + item.book_list.privacy + ) # this isn't serialized so we add it list_info["list_item"] = item.to_activity() data["lists"].append(list_info) diff --git a/bookwyrm/models/bookwyrm_import_job.py b/bookwyrm/models/bookwyrm_import_job.py index d679be2928..9e545e025b 100644 --- a/bookwyrm/models/bookwyrm_import_job.py +++ b/bookwyrm/models/bookwyrm_import_job.py @@ -217,7 +217,7 @@ class UserImportSubTask(SubTask): def before_start(self, task_id, args, kwargs): """Handler called before the task starts.""" - model = apps.get_model(f'bookwyrm.{kwargs["job_type"]}', require_ready=True) + model = apps.get_model(f"bookwyrm.{kwargs['job_type']}", require_ready=True) child_job = model.objects.get(id=kwargs["child_id"]) child_job.task_id = task_id child_job.save(update_fields=["task_id"]) @@ -227,7 +227,7 @@ def on_success(self, retval, task_id, args, kwargs): """Run by the worker if the task executes successfully""" # we want to complete our own UserImportBook job, not ChildJob - model = apps.get_model(f'bookwyrm.{kwargs["job_type"]}', require_ready=True) + model = apps.get_model(f"bookwyrm.{kwargs['job_type']}", require_ready=True) subtask = model.objects.get(id=kwargs["child_id"]) subtask.complete_job() @@ -297,7 +297,6 @@ def start_import_task(**kwargs): requests.exceptions.ConnectionError, ConnectionRefusedError, ): - origin_is_ok = False for data in job.import_data.get("books"): @@ -364,7 +363,6 @@ def import_book_task(**kwargs): # pylint: disable=too-many-branches edition = book_data.get("edition") book = models.Edition.find_existing(edition) if not book: - if kwargs["origin_is_ok"]: # try importing from the instance the user is coming from remote_id = edition.get("id") @@ -461,15 +459,12 @@ def upsert_status_task(**kwargs): status["cc"] = update_followers_address(user, status["cc"]) status[ "replies" - ] = ( - {} - ) # this parses incorrectly but we can't set it without knowing the new id + ] = {} # this parses incorrectly but we can't set it without knowing the new id status["inReplyToBook"] = task.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=status_class, save=True, overwrite=True ) @@ -509,7 +504,6 @@ def upsert_readthroughs(user, book_id, data): find or create the instances in the database""" for read_through in data: - obj = {} keys = [ "progress_mode", @@ -547,7 +541,6 @@ def upsert_lists( 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) @@ -575,7 +568,6 @@ def upsert_shelves(user, book, shelves): DB entries if they don't already exist""" for shelf in shelves: - book_shelf = models.Shelf.objects.filter(name=shelf["name"], user=user).first() if not book_shelf: @@ -617,7 +609,7 @@ def update_user_settings(user, data): ("discoverable", "discoverable"), ] - for (ap_field, bw_field) in ap_fields: + for ap_field, bw_field in ap_fields: setattr(user, bw_field, data[ap_field]) bw_fields = [ @@ -669,7 +661,6 @@ def import_user_relationship_task(**kwargs): try: if task.relationship == "follow": - followee = activitypub.resolve_remote_id(task.remote_id, models.User) if followee: ( @@ -698,7 +689,6 @@ def import_user_relationship_task(**kwargs): task.set_status("failed") elif task.relationship == "block": - user_object = activitypub.resolve_remote_id(task.remote_id, models.User) if user_object: exists = models.UserBlocks.objects.filter( diff --git a/bookwyrm/models/connector.py b/bookwyrm/models/connector.py index d62f97f02e..f573720926 100644 --- a/bookwyrm/models/connector.py +++ b/bookwyrm/models/connector.py @@ -1,4 +1,5 @@ -""" manages interfaces with external sources of book data """ +"""manages interfaces with external sources of book data""" + from typing import Optional from django.db import models diff --git a/bookwyrm/models/favorite.py b/bookwyrm/models/favorite.py index 98fbce550d..5df23bac9a 100644 --- a/bookwyrm/models/favorite.py +++ b/bookwyrm/models/favorite.py @@ -1,4 +1,5 @@ -""" like/fav/star a status """ +"""like/fav/star a status""" + from django.db import models from bookwyrm import activitypub diff --git a/bookwyrm/models/federated_server.py b/bookwyrm/models/federated_server.py index 5e08fc11d6..599701efc4 100644 --- a/bookwyrm/models/federated_server.py +++ b/bookwyrm/models/federated_server.py @@ -1,4 +1,5 @@ -""" connections to external ActivityPub servers """ +"""connections to external ActivityPub servers""" + from urllib.parse import urlparse from django.apps import apps diff --git a/bookwyrm/models/fields.py b/bookwyrm/models/fields.py index 3cf455603e..317293cb40 100644 --- a/bookwyrm/models/fields.py +++ b/bookwyrm/models/fields.py @@ -1,4 +1,5 @@ -""" activitypub-aware django model fields """ +"""activitypub-aware django model fields""" + from dataclasses import MISSING from datetime import datetime import re diff --git a/bookwyrm/models/group.py b/bookwyrm/models/group.py index 40a32b5dcf..9314cf569f 100644 --- a/bookwyrm/models/group.py +++ b/bookwyrm/models/group.py @@ -1,4 +1,5 @@ -""" do book related things with other users """ +"""do book related things with other users""" + from django.db import models, IntegrityError, transaction from django.db.models import Q from bookwyrm.settings import BASE_URL diff --git a/bookwyrm/models/hashtag.py b/bookwyrm/models/hashtag.py index 5126f012db..1a955e98a0 100644 --- a/bookwyrm/models/hashtag.py +++ b/bookwyrm/models/hashtag.py @@ -1,4 +1,5 @@ -""" model for tags """ +"""model for tags""" + from bookwyrm import activitypub from .activitypub_mixin import ActivitypubMixin from .base_model import BookWyrmModel diff --git a/bookwyrm/models/housekeeping.py b/bookwyrm/models/housekeeping.py index e8f8ae45dd..f9525dee05 100644 --- a/bookwyrm/models/housekeeping.py +++ b/bookwyrm/models/housekeeping.py @@ -1,4 +1,5 @@ -""" cleanup tasks """ +"""cleanup tasks""" + import math from datetime import datetime, timedelta, timezone @@ -139,7 +140,6 @@ def start_job(self): get_missing_cover_task.delay(job_id=self.id, edition_id=edition.id) if self.editions.count() == 0: - self.complete_job() diff --git a/bookwyrm/models/import_job.py b/bookwyrm/models/import_job.py index 25cab635d3..2b0ed9edb6 100644 --- a/bookwyrm/models/import_job.py +++ b/bookwyrm/models/import_job.py @@ -1,4 +1,5 @@ -""" track progress of goodreads imports """ +"""track progress of goodreads imports""" + from datetime import datetime import math import re @@ -419,7 +420,6 @@ def handle_imported_book(item): # pylint: disable=too-many-branches try: shelf = Shelf.objects.get(identifier=item.shelf, user=user) except ObjectDoesNotExist: - shelf = Shelf.objects.create( user=user, identifier=item.shelf, @@ -455,7 +455,6 @@ def handle_imported_book(item): # pylint: disable=too-many-branches item.date_reviewed or item.date_read or item.date_added or timezone.now() ) if item.review: - # pylint: disable=consider-using-f-string review_title = "Review of {!r} on {!r}".format( item.book.title, diff --git a/bookwyrm/models/job.py b/bookwyrm/models/job.py index ff4895dc60..1c7c2e6f09 100644 --- a/bookwyrm/models/job.py +++ b/bookwyrm/models/job.py @@ -186,9 +186,7 @@ class ParentTask(app.Task): Usage e.g. @app.task(base=ParentTask) """ - def before_start( - self, task_id, args, kwargs - ): # pylint: disable=no-self-use, unused-argument + 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. @@ -213,9 +211,7 @@ def before_start( if kwargs.get("no_children"): job.set_status(ChildJob.Status.ACTIVE) - def on_success( - self, retval, task_id, args, kwargs - ): # pylint: disable=no-self-use, unused-argument + 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. @@ -248,9 +244,7 @@ class SubTask(app.Task): Usage e.g. @app.task(base=SubTask) """ - def before_start( - self, task_id, args, kwargs - ): # pylint: disable=no-self-use, unused-argument + 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. @@ -272,9 +266,7 @@ def before_start( 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 + 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. diff --git a/bookwyrm/models/link.py b/bookwyrm/models/link.py index 4519f0c81e..7d58423b8f 100644 --- a/bookwyrm/models/link.py +++ b/bookwyrm/models/link.py @@ -1,4 +1,5 @@ -""" outlink data """ +"""outlink data""" + from typing import Optional, Iterable from urllib.parse import urlparse diff --git a/bookwyrm/models/list.py b/bookwyrm/models/list.py index df7e8162c2..0f725d1643 100644 --- a/bookwyrm/models/list.py +++ b/bookwyrm/models/list.py @@ -1,4 +1,5 @@ -""" make a list of books!! """ +"""make a list of books!!""" + from typing import Optional, Iterable import uuid diff --git a/bookwyrm/models/move.py b/bookwyrm/models/move.py index 5038058b78..f7c891cef9 100644 --- a/bookwyrm/models/move.py +++ b/bookwyrm/models/move.py @@ -1,4 +1,5 @@ -""" move an object including migrating a user account """ +"""move an object including migrating a user account""" + from django.core.exceptions import PermissionDenied from django.db import models diff --git a/bookwyrm/models/notification.py b/bookwyrm/models/notification.py index ca1e2aeb05..fefc8dd807 100644 --- a/bookwyrm/models/notification.py +++ b/bookwyrm/models/notification.py @@ -1,4 +1,5 @@ -""" alert a user to activity """ +"""alert a user to activity""" + from django.db import models, transaction from django.dispatch import receiver from bookwyrm.models.bookwyrm_export_job import BookwyrmExportJob diff --git a/bookwyrm/models/readthrough.py b/bookwyrm/models/readthrough.py index 670b35821f..46feaafaa9 100644 --- a/bookwyrm/models/readthrough.py +++ b/bookwyrm/models/readthrough.py @@ -1,4 +1,5 @@ -""" progress in a book """ +"""progress in a book""" + from typing import Optional, Iterable from django.core import validators diff --git a/bookwyrm/models/relationship.py b/bookwyrm/models/relationship.py index c4344d812c..5117bef084 100644 --- a/bookwyrm/models/relationship.py +++ b/bookwyrm/models/relationship.py @@ -1,4 +1,5 @@ -""" defines relationships between users """ +"""defines relationships between users""" + from django.core.cache import cache from django.db import models, transaction, IntegrityError from django.db.models import Q diff --git a/bookwyrm/models/report.py b/bookwyrm/models/report.py index 64ade3a406..7f396fa700 100644 --- a/bookwyrm/models/report.py +++ b/bookwyrm/models/report.py @@ -1,4 +1,5 @@ -""" flagged for moderation """ +"""flagged for moderation""" + from django.core.exceptions import PermissionDenied from django.db import models from django.utils.translation import gettext_lazy as _ diff --git a/bookwyrm/models/session.py b/bookwyrm/models/session.py index 3de199d299..d99d03483a 100644 --- a/bookwyrm/models/session.py +++ b/bookwyrm/models/session.py @@ -1,4 +1,5 @@ -""" functions for managing user sessions """ +"""functions for managing user sessions""" + from importlib import import_module import ua_parser diff --git a/bookwyrm/models/shelf.py b/bookwyrm/models/shelf.py index 0b9ef2b09e..8815400c4d 100644 --- a/bookwyrm/models/shelf.py +++ b/bookwyrm/models/shelf.py @@ -1,4 +1,5 @@ -""" puttin' books on shelves """ +"""puttin' books on shelves""" + import re from typing import Optional, Iterable from django.core.cache import cache diff --git a/bookwyrm/models/site.py b/bookwyrm/models/site.py index dafa185fee..efe8fd1009 100644 --- a/bookwyrm/models/site.py +++ b/bookwyrm/models/site.py @@ -1,4 +1,5 @@ -""" the particulars for this instance of BookWyrm """ +"""the particulars for this instance of BookWyrm""" + from __future__ import annotations import datetime from typing import Any, Optional, Iterable diff --git a/bookwyrm/models/status.py b/bookwyrm/models/status.py index 2b357ebd22..ed04b2ee80 100644 --- a/bookwyrm/models/status.py +++ b/bookwyrm/models/status.py @@ -1,4 +1,5 @@ -""" models for storing different kinds of Activities """ +"""models for storing different kinds of Activities""" + from dataclasses import MISSING from typing import Optional, Iterable import re @@ -125,9 +126,7 @@ def recipients(self): return list(mentions) @classmethod - def ignore_activity( - cls, activity, allow_external_connections=True - ): # pylint: disable=too-many-return-statements + def ignore_activity(cls, activity, allow_external_connections=True): # pylint: disable=too-many-return-statements """keep notes if they are replies to existing statuses""" if activity.type == "Announce": boosted = activitypub.resolve_remote_id( @@ -353,8 +352,7 @@ def pure_content(self): """indicate the book in question for mastodon (or w/e) users""" progress = self.progress or 0 citation = ( - f'comment on ' - f"{self.book.title}" + f'comment on {self.book.title}' ) if self.progress_mode == "PG" and progress > 0: citation += f", p. {progress}" diff --git a/bookwyrm/models/user.py b/bookwyrm/models/user.py index c1e6d9fb1f..bc363909a0 100644 --- a/bookwyrm/models/user.py +++ b/bookwyrm/models/user.py @@ -1,4 +1,5 @@ -""" database schema for user data """ +"""database schema for user data""" + import datetime from importlib import import_module import re diff --git a/bookwyrm/preview_images.py b/bookwyrm/preview_images.py index 446199c397..ed0a1d5196 100644 --- a/bookwyrm/preview_images.py +++ b/bookwyrm/preview_images.py @@ -1,4 +1,4 @@ -""" Generate social media preview images for twitter/mastodon/etc """ +"""Generate social media preview images for twitter/mastodon/etc""" import math import os diff --git a/bookwyrm/redis_store.py b/bookwyrm/redis_store.py index e188487aaa..f7520152cf 100644 --- a/bookwyrm/redis_store.py +++ b/bookwyrm/redis_store.py @@ -1,4 +1,5 @@ -""" access the activity stores stored in redis """ +"""access the activity stores stored in redis""" + from abc import ABC, abstractmethod import redis diff --git a/bookwyrm/signatures.py b/bookwyrm/signatures.py index f59367b51e..e33033d094 100644 --- a/bookwyrm/signatures.py +++ b/bookwyrm/signatures.py @@ -1,4 +1,5 @@ -""" signs activitypub activities """ +"""signs activitypub activities""" + import hashlib from urllib.parse import urlparse import datetime diff --git a/bookwyrm/status.py b/bookwyrm/status.py index de7682ee72..31141b525a 100644 --- a/bookwyrm/status.py +++ b/bookwyrm/status.py @@ -1,4 +1,5 @@ -""" Handle user activity """ +"""Handle user activity""" + from django.db import transaction from bookwyrm import models diff --git a/bookwyrm/suggested_users.py b/bookwyrm/suggested_users.py index 9f31a97bf6..7efadcb6c1 100644 --- a/bookwyrm/suggested_users.py +++ b/bookwyrm/suggested_users.py @@ -1,4 +1,5 @@ -""" store recommended follows in redis """ +"""store recommended follows in redis""" + import math import logging from django.dispatch import receiver @@ -211,7 +212,7 @@ def update_user(sender, instance, created, update_fields=None, **kwargs): # we know what fields were updated and discoverability didn't change if not instance.bookwyrm_user or ( - update_fields and not "discoverable" in update_fields + update_fields and "discoverable" not in update_fields ): return diff --git a/bookwyrm/tasks.py b/bookwyrm/tasks.py index 79e1b63408..3c65dfde90 100644 --- a/bookwyrm/tasks.py +++ b/bookwyrm/tasks.py @@ -1,4 +1,5 @@ -""" background tasks """ +"""background tasks""" + import os from celery import Celery diff --git a/bookwyrm/templatetags/book_display_tags.py b/bookwyrm/templatetags/book_display_tags.py index 0a0f228d88..0fbb293f77 100644 --- a/bookwyrm/templatetags/book_display_tags.py +++ b/bookwyrm/templatetags/book_display_tags.py @@ -1,4 +1,5 @@ -""" template filters """ +"""template filters""" + from django import template from bookwyrm import models diff --git a/bookwyrm/templatetags/celery_tags.py b/bookwyrm/templatetags/celery_tags.py index 6168d048e2..d66e67a646 100644 --- a/bookwyrm/templatetags/celery_tags.py +++ b/bookwyrm/templatetags/celery_tags.py @@ -1,4 +1,5 @@ -""" template filters for really common utilities """ +"""template filters for really common utilities""" + import datetime from django import template diff --git a/bookwyrm/templatetags/date_ext.py b/bookwyrm/templatetags/date_ext.py index efe55f2d9c..c73a3a7e65 100644 --- a/bookwyrm/templatetags/date_ext.py +++ b/bookwyrm/templatetags/date_ext.py @@ -1,4 +1,5 @@ -""" additional formatting of dates """ +"""additional formatting of dates""" + from django import template from django.template import defaultfilters from django.contrib.humanize.templatetags.humanize import naturalday diff --git a/bookwyrm/templatetags/feed_page_tags.py b/bookwyrm/templatetags/feed_page_tags.py index 3d346b9a27..dc6ebefdfd 100644 --- a/bookwyrm/templatetags/feed_page_tags.py +++ b/bookwyrm/templatetags/feed_page_tags.py @@ -1,4 +1,5 @@ -""" tags used on the feed pages """ +"""tags used on the feed pages""" + from django import template from bookwyrm.views.feed import get_suggested_books diff --git a/bookwyrm/templatetags/group_tags.py b/bookwyrm/templatetags/group_tags.py index fde7997e83..e4caeba4fd 100644 --- a/bookwyrm/templatetags/group_tags.py +++ b/bookwyrm/templatetags/group_tags.py @@ -1,4 +1,5 @@ -""" template filters """ +"""template filters""" + from django import template from bookwyrm import models diff --git a/bookwyrm/templatetags/interaction.py b/bookwyrm/templatetags/interaction.py index 9c73aa1afe..894b28336b 100644 --- a/bookwyrm/templatetags/interaction.py +++ b/bookwyrm/templatetags/interaction.py @@ -1,4 +1,5 @@ -""" template filters for status interaction buttons """ +"""template filters for status interaction buttons""" + from django import template from bookwyrm import models diff --git a/bookwyrm/templatetags/landing_page_tags.py b/bookwyrm/templatetags/landing_page_tags.py index bc7594fc47..50e0471fec 100644 --- a/bookwyrm/templatetags/landing_page_tags.py +++ b/bookwyrm/templatetags/landing_page_tags.py @@ -1,4 +1,5 @@ -""" template filters """ +"""template filters""" + from django import template from django.db.models import Avg, StdDev, Count, F, Q diff --git a/bookwyrm/templatetags/layout.py b/bookwyrm/templatetags/layout.py index f42f3bda18..409e134566 100644 --- a/bookwyrm/templatetags/layout.py +++ b/bookwyrm/templatetags/layout.py @@ -1,4 +1,5 @@ -""" template filters used for creating the layout""" +"""template filters used for creating the layout""" + from django import template, utils register = template.Library() diff --git a/bookwyrm/templatetags/list_page_tags.py b/bookwyrm/templatetags/list_page_tags.py index c5445050f5..9eba4e97e2 100644 --- a/bookwyrm/templatetags/list_page_tags.py +++ b/bookwyrm/templatetags/list_page_tags.py @@ -1,4 +1,5 @@ -""" template filters for list page """ +"""template filters for list page""" + from django import template from django.utils.translation import gettext_lazy as _, ngettext diff --git a/bookwyrm/templatetags/markdown.py b/bookwyrm/templatetags/markdown.py index 370d60a1a8..6ca34a2546 100644 --- a/bookwyrm/templatetags/markdown.py +++ b/bookwyrm/templatetags/markdown.py @@ -1,4 +1,5 @@ -""" template filters """ +"""template filters""" + from django import template from bookwyrm.views.status import to_markdown diff --git a/bookwyrm/templatetags/notification_page_tags.py b/bookwyrm/templatetags/notification_page_tags.py index 7a365e689a..029b3acced 100644 --- a/bookwyrm/templatetags/notification_page_tags.py +++ b/bookwyrm/templatetags/notification_page_tags.py @@ -1,4 +1,5 @@ -""" tags used on the feed pages """ +"""tags used on the feed pages""" + from django import template from bookwyrm.templatetags.feed_page_tags import load_subclass diff --git a/bookwyrm/templatetags/rating_tags.py b/bookwyrm/templatetags/rating_tags.py index 367463a8f0..d7b7717a32 100644 --- a/bookwyrm/templatetags/rating_tags.py +++ b/bookwyrm/templatetags/rating_tags.py @@ -1,4 +1,5 @@ -""" template filters """ +"""template filters""" + from django import template from django.db.models import Avg diff --git a/bookwyrm/templatetags/shelf_tags.py b/bookwyrm/templatetags/shelf_tags.py index 36065d575b..320d508a2b 100644 --- a/bookwyrm/templatetags/shelf_tags.py +++ b/bookwyrm/templatetags/shelf_tags.py @@ -1,4 +1,5 @@ -""" Filters and tags related to shelving books """ +"""Filters and tags related to shelving books""" + from django import template from django.utils.translation import gettext_lazy as _ diff --git a/bookwyrm/templatetags/stars.py b/bookwyrm/templatetags/stars.py index d08dd8ef0f..15e662ec41 100644 --- a/bookwyrm/templatetags/stars.py +++ b/bookwyrm/templatetags/stars.py @@ -1,4 +1,5 @@ -""" template filters """ +"""template filters""" + from django import template diff --git a/bookwyrm/templatetags/status_display.py b/bookwyrm/templatetags/status_display.py index 5d1f86caf2..3bc853962f 100644 --- a/bookwyrm/templatetags/status_display.py +++ b/bookwyrm/templatetags/status_display.py @@ -1,4 +1,5 @@ -""" template filters """ +"""template filters""" + from dateutil.relativedelta import relativedelta from django import template from django.conf import settings diff --git a/bookwyrm/templatetags/user_page_tags.py b/bookwyrm/templatetags/user_page_tags.py index b3a82597ea..9cae2fedb1 100644 --- a/bookwyrm/templatetags/user_page_tags.py +++ b/bookwyrm/templatetags/user_page_tags.py @@ -1,4 +1,5 @@ -""" template filters """ +"""template filters""" + from django import template diff --git a/bookwyrm/templatetags/utilities.py b/bookwyrm/templatetags/utilities.py index ce8b6d16f3..67d3e746c0 100644 --- a/bookwyrm/templatetags/utilities.py +++ b/bookwyrm/templatetags/utilities.py @@ -1,4 +1,5 @@ -""" template filters for really common utilities """ +"""template filters for really common utilities""" + import os import re from uuid import uuid4 @@ -145,10 +146,10 @@ def get_file_size(nbytes): if raw_size < 1024: return f"{raw_size} bytes" if raw_size < 1024**2: - return f"{raw_size/1024:.2f} KB" + 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" + return f"{raw_size / 1024**2:.2f} MB" + return f"{raw_size / 1024**3:.2f} GB" @register.filter(name="get_user_permission") diff --git a/bookwyrm/tests/__init__.py b/bookwyrm/tests/__init__.py index 0879d4ecd5..998288ed5d 100644 --- a/bookwyrm/tests/__init__.py +++ b/bookwyrm/tests/__init__.py @@ -1,2 +1,3 @@ -""" import ALL the tests """ +"""import ALL the tests""" + from . import * # pylint: disable=import-self diff --git a/bookwyrm/tests/activitypub/test_author.py b/bookwyrm/tests/activitypub/test_author.py index 7f21e570c1..55c4f869d5 100644 --- a/bookwyrm/tests/activitypub/test_author.py +++ b/bookwyrm/tests/activitypub/test_author.py @@ -1,4 +1,5 @@ """test author serializer""" + from django.test import TestCase from bookwyrm import models diff --git a/bookwyrm/tests/activitypub/test_base_activity.py b/bookwyrm/tests/activitypub/test_base_activity.py index 7321b18009..7b79c6a206 100644 --- a/bookwyrm/tests/activitypub/test_base_activity.py +++ b/bookwyrm/tests/activitypub/test_base_activity.py @@ -1,4 +1,5 @@ -""" tests the base functionality for activitypub dataclasses """ +"""tests the base functionality for activitypub dataclasses""" + import json import pathlib from unittest.mock import patch diff --git a/bookwyrm/tests/activitypub/test_note.py b/bookwyrm/tests/activitypub/test_note.py index 33fc04d911..1de9b1fd85 100644 --- a/bookwyrm/tests/activitypub/test_note.py +++ b/bookwyrm/tests/activitypub/test_note.py @@ -1,4 +1,5 @@ -""" tests functionality specifically for the Note ActivityPub dataclass""" +"""tests functionality specifically for the Note ActivityPub dataclass""" + from unittest.mock import patch from django.test import TestCase diff --git a/bookwyrm/tests/activitypub/test_quotation.py b/bookwyrm/tests/activitypub/test_quotation.py index 50aeb58345..1f5da9a043 100644 --- a/bookwyrm/tests/activitypub/test_quotation.py +++ b/bookwyrm/tests/activitypub/test_quotation.py @@ -1,4 +1,5 @@ -""" quotation activity object serializer class """ +"""quotation activity object serializer class""" + import json import pathlib from unittest.mock import patch diff --git a/bookwyrm/tests/activitystreams/test_abstractstream.py b/bookwyrm/tests/activitystreams/test_abstractstream.py index addbd00f74..4b61ea9dec 100644 --- a/bookwyrm/tests/activitystreams/test_abstractstream.py +++ b/bookwyrm/tests/activitystreams/test_abstractstream.py @@ -1,4 +1,5 @@ -""" testing activitystreams """ +"""testing activitystreams""" + from datetime import datetime, timezone from unittest.mock import patch from django.test import TestCase diff --git a/bookwyrm/tests/activitystreams/test_booksstream.py b/bookwyrm/tests/activitystreams/test_booksstream.py index 07a4c52f4d..bf5024edf7 100644 --- a/bookwyrm/tests/activitystreams/test_booksstream.py +++ b/bookwyrm/tests/activitystreams/test_booksstream.py @@ -1,4 +1,5 @@ -""" testing activitystreams """ +"""testing activitystreams""" + import itertools from unittest.mock import patch diff --git a/bookwyrm/tests/activitystreams/test_homestream.py b/bookwyrm/tests/activitystreams/test_homestream.py index feadaab1b8..ae55388e12 100644 --- a/bookwyrm/tests/activitystreams/test_homestream.py +++ b/bookwyrm/tests/activitystreams/test_homestream.py @@ -1,4 +1,5 @@ -""" testing activitystreams """ +"""testing activitystreams""" + from unittest.mock import patch from django.test import TestCase from bookwyrm import activitystreams, models diff --git a/bookwyrm/tests/activitystreams/test_localstream.py b/bookwyrm/tests/activitystreams/test_localstream.py index 508a289b22..e58c1d45a7 100644 --- a/bookwyrm/tests/activitystreams/test_localstream.py +++ b/bookwyrm/tests/activitystreams/test_localstream.py @@ -1,4 +1,5 @@ -""" testing activitystreams """ +"""testing activitystreams""" + from unittest.mock import patch from django.test import TestCase from bookwyrm import activitystreams, models diff --git a/bookwyrm/tests/activitystreams/test_signals.py b/bookwyrm/tests/activitystreams/test_signals.py index 42bf262893..a3f694a11b 100644 --- a/bookwyrm/tests/activitystreams/test_signals.py +++ b/bookwyrm/tests/activitystreams/test_signals.py @@ -1,4 +1,5 @@ -""" testing activitystreams """ +"""testing activitystreams""" + import datetime from unittest.mock import patch diff --git a/bookwyrm/tests/activitystreams/test_tasks.py b/bookwyrm/tests/activitystreams/test_tasks.py index 28bd68bf25..3d3e8ad2e1 100644 --- a/bookwyrm/tests/activitystreams/test_tasks.py +++ b/bookwyrm/tests/activitystreams/test_tasks.py @@ -1,4 +1,5 @@ -""" testing activitystreams """ +"""testing activitystreams""" + from unittest.mock import patch from django.test import TestCase from bookwyrm import activitystreams, models diff --git a/bookwyrm/tests/connectors/test_abstract_connector.py b/bookwyrm/tests/connectors/test_abstract_connector.py index d849f23d7a..531b8a73b6 100644 --- a/bookwyrm/tests/connectors/test_abstract_connector.py +++ b/bookwyrm/tests/connectors/test_abstract_connector.py @@ -1,4 +1,5 @@ -""" testing book data connectors """ +"""testing book data connectors""" + from unittest.mock import patch from django.test import TestCase import responses diff --git a/bookwyrm/tests/connectors/test_abstract_minimal_connector.py b/bookwyrm/tests/connectors/test_abstract_minimal_connector.py index cbbecf652b..5008b7ab67 100644 --- a/bookwyrm/tests/connectors/test_abstract_minimal_connector.py +++ b/bookwyrm/tests/connectors/test_abstract_minimal_connector.py @@ -1,4 +1,5 @@ -""" testing book data connectors """ +"""testing book data connectors""" + from django.test import TestCase from bookwyrm import models diff --git a/bookwyrm/tests/connectors/test_bookwyrm_connector.py b/bookwyrm/tests/connectors/test_bookwyrm_connector.py index 9a909aa8a4..e955ccfa12 100644 --- a/bookwyrm/tests/connectors/test_bookwyrm_connector.py +++ b/bookwyrm/tests/connectors/test_bookwyrm_connector.py @@ -1,4 +1,5 @@ -""" testing book data connectors """ +"""testing book data connectors""" + import json import pathlib from django.test import TestCase diff --git a/bookwyrm/tests/connectors/test_connector_manager.py b/bookwyrm/tests/connectors/test_connector_manager.py index f40c32ac2f..25b23ca551 100644 --- a/bookwyrm/tests/connectors/test_connector_manager.py +++ b/bookwyrm/tests/connectors/test_connector_manager.py @@ -1,4 +1,5 @@ -""" interface between the app and various connectors """ +"""interface between the app and various connectors""" + from django.test import TestCase import responses diff --git a/bookwyrm/tests/connectors/test_finna_connector.py b/bookwyrm/tests/connectors/test_finna_connector.py index 74002d3cb0..2d5b2d6454 100644 --- a/bookwyrm/tests/connectors/test_finna_connector.py +++ b/bookwyrm/tests/connectors/test_finna_connector.py @@ -1,4 +1,5 @@ -""" testing book data connectors """ +"""testing book data connectors""" + import json import pathlib @@ -20,7 +21,7 @@ def setUpTestData(cls): name="Finna API", connector_file="finna", base_url="https://www.finna.fi", - books_url="https://api.finna.fi/api/v1/record" "?id=", + books_url="https://api.finna.fi/api/v1/record?id=", covers_url="https://api.finna.fi", search_url="https://api.finna.fi/api/v1/search?limit=20" "&filter[]=format%3a%220%2fBook%2f%22" diff --git a/bookwyrm/tests/connectors/test_inventaire_connector.py b/bookwyrm/tests/connectors/test_inventaire_connector.py index 1cd88195f1..cded12502f 100644 --- a/bookwyrm/tests/connectors/test_inventaire_connector.py +++ b/bookwyrm/tests/connectors/test_inventaire_connector.py @@ -1,4 +1,5 @@ -""" testing book data connectors """ +"""testing book data connectors""" + import json import pathlib from unittest.mock import patch diff --git a/bookwyrm/tests/connectors/test_openlibrary_connector.py b/bookwyrm/tests/connectors/test_openlibrary_connector.py index b3157f4577..380ae2c82b 100644 --- a/bookwyrm/tests/connectors/test_openlibrary_connector.py +++ b/bookwyrm/tests/connectors/test_openlibrary_connector.py @@ -1,4 +1,5 @@ -""" testing book data connectors """ +"""testing book data connectors""" + import json import pathlib from unittest.mock import patch diff --git a/bookwyrm/tests/importers/test_bookwyrm_import.py b/bookwyrm/tests/importers/test_bookwyrm_import.py index 86cf08e815..5fca685f6d 100644 --- a/bookwyrm/tests/importers/test_bookwyrm_import.py +++ b/bookwyrm/tests/importers/test_bookwyrm_import.py @@ -1,4 +1,5 @@ -""" testing bookwyrm csv import """ +"""testing bookwyrm csv import""" + import pathlib from unittest.mock import patch import datetime diff --git a/bookwyrm/tests/importers/test_bookwyrm_user_import.py b/bookwyrm/tests/importers/test_bookwyrm_user_import.py index 72aafd29a4..33021550e4 100644 --- a/bookwyrm/tests/importers/test_bookwyrm_user_import.py +++ b/bookwyrm/tests/importers/test_bookwyrm_user_import.py @@ -1,4 +1,5 @@ -""" testing bookwyrm user import """ +"""testing bookwyrm user import""" + from unittest.mock import patch from django.test import TestCase from bookwyrm import models diff --git a/bookwyrm/tests/importers/test_calibre_import.py b/bookwyrm/tests/importers/test_calibre_import.py index 1d3d5fe8a4..1a1f1875e5 100644 --- a/bookwyrm/tests/importers/test_calibre_import.py +++ b/bookwyrm/tests/importers/test_calibre_import.py @@ -1,4 +1,5 @@ -""" testing import """ +"""testing import""" + import pathlib from unittest.mock import patch diff --git a/bookwyrm/tests/importers/test_goodreads_import.py b/bookwyrm/tests/importers/test_goodreads_import.py index dedae57098..615719ff43 100644 --- a/bookwyrm/tests/importers/test_goodreads_import.py +++ b/bookwyrm/tests/importers/test_goodreads_import.py @@ -1,4 +1,5 @@ -""" testing import """ +"""testing import""" + import pathlib from unittest.mock import patch import datetime diff --git a/bookwyrm/tests/importers/test_importer.py b/bookwyrm/tests/importers/test_importer.py index 5eb4487193..a051d5c082 100644 --- a/bookwyrm/tests/importers/test_importer.py +++ b/bookwyrm/tests/importers/test_importer.py @@ -1,4 +1,5 @@ -""" testing import """ +"""testing import""" + from collections import namedtuple import pathlib import io diff --git a/bookwyrm/tests/importers/test_librarything_import.py b/bookwyrm/tests/importers/test_librarything_import.py index 5453f2b53d..6ce41a5d78 100644 --- a/bookwyrm/tests/importers/test_librarything_import.py +++ b/bookwyrm/tests/importers/test_librarything_import.py @@ -1,4 +1,5 @@ -""" testing import """ +"""testing import""" + import pathlib from unittest.mock import patch import datetime diff --git a/bookwyrm/tests/importers/test_openlibrary_import.py b/bookwyrm/tests/importers/test_openlibrary_import.py index aa330e2299..cbb2310fb1 100644 --- a/bookwyrm/tests/importers/test_openlibrary_import.py +++ b/bookwyrm/tests/importers/test_openlibrary_import.py @@ -1,4 +1,5 @@ -""" testing import """ +"""testing import""" + import pathlib from unittest.mock import patch import datetime diff --git a/bookwyrm/tests/importers/test_openreads_import.py b/bookwyrm/tests/importers/test_openreads_import.py index e7344e692f..affba3078f 100644 --- a/bookwyrm/tests/importers/test_openreads_import.py +++ b/bookwyrm/tests/importers/test_openreads_import.py @@ -1,4 +1,5 @@ -""" testing import """ +"""testing import""" + import pathlib from unittest.mock import patch import datetime diff --git a/bookwyrm/tests/importers/test_storygraph_import.py b/bookwyrm/tests/importers/test_storygraph_import.py index 182fa794ca..4ba4be2533 100644 --- a/bookwyrm/tests/importers/test_storygraph_import.py +++ b/bookwyrm/tests/importers/test_storygraph_import.py @@ -1,4 +1,5 @@ -""" testing import """ +"""testing import""" + import pathlib from unittest.mock import patch import datetime diff --git a/bookwyrm/tests/lists_stream/test_signals.py b/bookwyrm/tests/lists_stream/test_signals.py index f9e7e4d12e..d536bb58ca 100644 --- a/bookwyrm/tests/lists_stream/test_signals.py +++ b/bookwyrm/tests/lists_stream/test_signals.py @@ -1,4 +1,5 @@ -""" testing lists_stream """ +"""testing lists_stream""" + from unittest.mock import patch from django.test import TestCase from bookwyrm import lists_stream, models diff --git a/bookwyrm/tests/lists_stream/test_stream.py b/bookwyrm/tests/lists_stream/test_stream.py index 5d752dd570..62db97bc3e 100644 --- a/bookwyrm/tests/lists_stream/test_stream.py +++ b/bookwyrm/tests/lists_stream/test_stream.py @@ -1,4 +1,5 @@ -""" testing activitystreams """ +"""testing activitystreams""" + from datetime import datetime from unittest.mock import patch diff --git a/bookwyrm/tests/lists_stream/test_tasks.py b/bookwyrm/tests/lists_stream/test_tasks.py index a127d363c1..eb448c5744 100644 --- a/bookwyrm/tests/lists_stream/test_tasks.py +++ b/bookwyrm/tests/lists_stream/test_tasks.py @@ -1,4 +1,5 @@ -""" testing lists_stream """ +"""testing lists_stream""" + from unittest.mock import patch from django.test import TestCase from bookwyrm import lists_stream, models diff --git a/bookwyrm/tests/management/test_add_finna_connector.py b/bookwyrm/tests/management/test_add_finna_connector.py index 671fac0a33..78fd586e71 100644 --- a/bookwyrm/tests/management/test_add_finna_connector.py +++ b/bookwyrm/tests/management/test_add_finna_connector.py @@ -1,4 +1,5 @@ -""" test populating user streams """ +"""test populating user streams""" + from django.test import TestCase from bookwyrm.models import Connector diff --git a/bookwyrm/tests/management/test_initdb.py b/bookwyrm/tests/management/test_initdb.py index a76fac04d0..648168713a 100644 --- a/bookwyrm/tests/management/test_initdb.py +++ b/bookwyrm/tests/management/test_initdb.py @@ -1,4 +1,5 @@ -""" test populating user streams """ +"""test populating user streams""" + from django.contrib.auth.models import Group, Permission from django.test import TestCase diff --git a/bookwyrm/tests/management/test_populate_lists_streams.py b/bookwyrm/tests/management/test_populate_lists_streams.py index 011011903e..a2a765d56e 100644 --- a/bookwyrm/tests/management/test_populate_lists_streams.py +++ b/bookwyrm/tests/management/test_populate_lists_streams.py @@ -1,4 +1,5 @@ -""" test populating user streams """ +"""test populating user streams""" + from unittest.mock import patch from django.test import TestCase diff --git a/bookwyrm/tests/management/test_populate_streams.py b/bookwyrm/tests/management/test_populate_streams.py index c5b745c08f..07e0cc7cd1 100644 --- a/bookwyrm/tests/management/test_populate_streams.py +++ b/bookwyrm/tests/management/test_populate_streams.py @@ -1,4 +1,5 @@ -""" test populating user streams """ +"""test populating user streams""" + from unittest.mock import patch from django.test import TestCase diff --git a/bookwyrm/tests/models/test_activitypub_mixin.py b/bookwyrm/tests/models/test_activitypub_mixin.py index d5967b1a38..1562cb51fb 100644 --- a/bookwyrm/tests/models/test_activitypub_mixin.py +++ b/bookwyrm/tests/models/test_activitypub_mixin.py @@ -1,4 +1,5 @@ -""" testing model activitypub utilities """ +"""testing model activitypub utilities""" + from unittest.mock import patch from collections import namedtuple from dataclasses import dataclass @@ -287,9 +288,7 @@ def save(self, *args, **kwargs): with patch("django.db.models.Model.save"): super().save(*args, **kwargs) - def broadcast( - self, activity, sender, **kwargs - ): # pylint: disable=arguments-differ + def broadcast(self, activity, sender, **kwargs): # pylint: disable=arguments-differ """do something""" raise Success() diff --git a/bookwyrm/tests/models/test_automod.py b/bookwyrm/tests/models/test_automod.py index 5e10eb4d07..450e99fb63 100644 --- a/bookwyrm/tests/models/test_automod.py +++ b/bookwyrm/tests/models/test_automod.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch from django.test import TestCase diff --git a/bookwyrm/tests/models/test_base_model.py b/bookwyrm/tests/models/test_base_model.py index ddde41d048..62e1b9b5ae 100644 --- a/bookwyrm/tests/models/test_base_model.py +++ b/bookwyrm/tests/models/test_base_model.py @@ -1,4 +1,5 @@ -""" testing models """ +"""testing models""" + from unittest.mock import patch from django.http import Http404 from django.test import TestCase diff --git a/bookwyrm/tests/models/test_book_model.py b/bookwyrm/tests/models/test_book_model.py index ac5c9f93ad..ebf01de2e2 100644 --- a/bookwyrm/tests/models/test_book_model.py +++ b/bookwyrm/tests/models/test_book_model.py @@ -1,4 +1,5 @@ -""" testing models """ +"""testing models""" + import pathlib import pytest @@ -215,7 +216,7 @@ def test_thumbnail_fields(self): def test_populate_sort_title(self): """The sort title should remove the initial article on save""" books = [] - for (k, v) in settings.LANGUAGE_ARTICLES.items(): + for k, v in settings.LANGUAGE_ARTICLES.items(): lang_books = [ models.Edition.objects.create( title=f"{article} Test Edition", languages=[string] diff --git a/bookwyrm/tests/models/test_bookwyrm_export_job.py b/bookwyrm/tests/models/test_bookwyrm_export_job.py index fa971664f8..5c9d756149 100644 --- a/bookwyrm/tests/models/test_bookwyrm_export_job.py +++ b/bookwyrm/tests/models/test_bookwyrm_export_job.py @@ -1,4 +1,5 @@ """test bookwyrm user export functions""" + import datetime import json import pathlib @@ -27,7 +28,6 @@ def setUpTestData(self): # pylint: disable=bad-classmethod-argument 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", diff --git a/bookwyrm/tests/models/test_bookwyrm_import_job.py b/bookwyrm/tests/models/test_bookwyrm_import_job.py index 63745f6748..5c5853a1f3 100644 --- a/bookwyrm/tests/models/test_bookwyrm_import_job.py +++ b/bookwyrm/tests/models/test_bookwyrm_import_job.py @@ -1,4 +1,4 @@ -""" testing models """ +"""testing models""" import json import os @@ -146,7 +146,6 @@ def test_update_goals(self): 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() @@ -226,7 +225,6 @@ def test_follow_relationship(self): patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"), patch("bookwyrm.activitypub.resolve_remote_id", return_value=self.rat_user), ): - bookwyrm_import_job.import_user_relationship_task(child_id=task.id) after_follow = models.UserFollows.objects.filter( @@ -757,7 +755,6 @@ def test_is_alias(self): with patch( "bookwyrm.activitypub.resolve_remote_id", return_value=self.rat_user ): - alias = bookwyrm_import_job.is_alias( self.local_user, self.rat_user.remote_id ) diff --git a/bookwyrm/tests/models/test_connector.py b/bookwyrm/tests/models/test_connector.py index b81e9092c8..a9c452069b 100644 --- a/bookwyrm/tests/models/test_connector.py +++ b/bookwyrm/tests/models/test_connector.py @@ -1,4 +1,4 @@ -""" testing connector model """ +"""testing connector model""" import pytest from django.test import TestCase diff --git a/bookwyrm/tests/models/test_federated_server.py b/bookwyrm/tests/models/test_federated_server.py index 43724568df..b3d8a0dd2a 100644 --- a/bookwyrm/tests/models/test_federated_server.py +++ b/bookwyrm/tests/models/test_federated_server.py @@ -1,4 +1,5 @@ -""" testing models """ +"""testing models""" + from unittest.mock import patch from django.test import TestCase diff --git a/bookwyrm/tests/models/test_fields.py b/bookwyrm/tests/models/test_fields.py index 7c1dcadc97..d0ab4868e8 100644 --- a/bookwyrm/tests/models/test_fields.py +++ b/bookwyrm/tests/models/test_fields.py @@ -1,4 +1,5 @@ -""" testing models """ +"""testing models""" + from collections import namedtuple from dataclasses import dataclass import datetime @@ -24,6 +25,7 @@ from bookwyrm.models.activitypub_mixin import ActivitypubMixin from bookwyrm.settings import PROTOCOL, NETLOC + # pylint: disable=too-many-public-methods @patch("bookwyrm.suggested_users.rerank_suggestions_task.delay") @patch("bookwyrm.activitystreams.populate_stream_task.delay") diff --git a/bookwyrm/tests/models/test_group.py b/bookwyrm/tests/models/test_group.py index 2c2960ac4f..3a3adda428 100644 --- a/bookwyrm/tests/models/test_group.py +++ b/bookwyrm/tests/models/test_group.py @@ -1,4 +1,5 @@ -""" testing models """ +"""testing models""" + from unittest.mock import patch from django.test import TestCase diff --git a/bookwyrm/tests/models/test_housekeeping.py b/bookwyrm/tests/models/test_housekeeping.py index 7df7ae0cd0..b4279808ae 100644 --- a/bookwyrm/tests/models/test_housekeeping.py +++ b/bookwyrm/tests/models/test_housekeeping.py @@ -1,4 +1,5 @@ -""" test file management """ +"""test file management""" + from datetime import datetime, timedelta, timezone from os import listdir import pathlib @@ -124,7 +125,6 @@ def tearDown(self): """clean up any files""" for filename in listdir("exports"): - if "zzz_testfile.tar" in filename: pathlib.Path(f"exports/{filename}").unlink(missing_ok=True) @@ -197,7 +197,6 @@ def test_get_cover_from_identifer(self): """Get missing cover from remote source""" with open("test_image.jpg", "r+b") as f: - self.second_edition.cover.save("test_image.jpeg", f) responses.add( responses.GET, @@ -207,13 +206,18 @@ def test_get_cover_from_identifer(self): self.assertEqual(self.first_edition.cover, None) - with patch( - "bookwyrm.models.housekeeping.search", return_value=self.query_response - ), patch( - "bookwyrm.models.housekeeping.get_data", return_value=self.book_json - ), patch( - "bookwyrm.models.housekeeping.set_cover_from_url", - return_value=["test_image.jpeg", f], + with ( + patch( + "bookwyrm.models.housekeeping.search", + return_value=self.query_response, + ), + patch( + "bookwyrm.models.housekeeping.get_data", return_value=self.book_json + ), + patch( + "bookwyrm.models.housekeeping.set_cover_from_url", + return_value=["test_image.jpeg", f], + ), ): get_cover_from_identifiers(self.first_edition) @@ -223,7 +227,6 @@ def test_get_covers_with_incorrect_filepaths(self): """does get_coverless_books return books with wrong cover filepaths?""" with open("test_image.jpg", "r+b") as f: - self.second_edition.cover.save("test_image2.jpeg", f) self.assertNotEqual(self.second_edition.cover, None) @@ -273,5 +276,4 @@ def tearDown(self): "covers/test_image2.jpeg", "covers/test_image3.jpeg", ]: - pathlib.Path(filename).unlink(missing_ok=True) diff --git a/bookwyrm/tests/models/test_import_model.py b/bookwyrm/tests/models/test_import_model.py index 5445a79dbd..e14dc10827 100644 --- a/bookwyrm/tests/models/test_import_model.py +++ b/bookwyrm/tests/models/test_import_model.py @@ -1,4 +1,5 @@ -""" testing models """ +"""testing models""" + import datetime from datetime import timezone import json diff --git a/bookwyrm/tests/models/test_job.py b/bookwyrm/tests/models/test_job.py index 41e28ba7b3..eaa5575f4f 100644 --- a/bookwyrm/tests/models/test_job.py +++ b/bookwyrm/tests/models/test_job.py @@ -1,4 +1,5 @@ -""" testing models """ +"""testing models""" + from unittest.mock import patch from django.test import TestCase diff --git a/bookwyrm/tests/models/test_link.py b/bookwyrm/tests/models/test_link.py index f72bdc2396..01990253be 100644 --- a/bookwyrm/tests/models/test_link.py +++ b/bookwyrm/tests/models/test_link.py @@ -1,4 +1,5 @@ -""" testing models """ +"""testing models""" + from unittest.mock import patch from django.test import TestCase diff --git a/bookwyrm/tests/models/test_list.py b/bookwyrm/tests/models/test_list.py index a902f6cca0..cbeb26dfb9 100644 --- a/bookwyrm/tests/models/test_list.py +++ b/bookwyrm/tests/models/test_list.py @@ -1,4 +1,5 @@ -""" testing models """ +"""testing models""" + from uuid import UUID from unittest.mock import patch from django.test import TestCase diff --git a/bookwyrm/tests/models/test_move.py b/bookwyrm/tests/models/test_move.py index 92c7a6cce8..e87a1aad9f 100644 --- a/bookwyrm/tests/models/test_move.py +++ b/bookwyrm/tests/models/test_move.py @@ -1,4 +1,5 @@ -""" testing move models """ +"""testing move models""" + from unittest.mock import patch from django.core.exceptions import PermissionDenied from django.test import TestCase diff --git a/bookwyrm/tests/models/test_notification.py b/bookwyrm/tests/models/test_notification.py index 976ac39c98..6d9a8708da 100644 --- a/bookwyrm/tests/models/test_notification.py +++ b/bookwyrm/tests/models/test_notification.py @@ -1,4 +1,5 @@ -""" testing models """ +"""testing models""" + from unittest.mock import patch from django.test import TestCase from bookwyrm import models diff --git a/bookwyrm/tests/models/test_readthrough_model.py b/bookwyrm/tests/models/test_readthrough_model.py index 239537df4a..6d4ed024eb 100644 --- a/bookwyrm/tests/models/test_readthrough_model.py +++ b/bookwyrm/tests/models/test_readthrough_model.py @@ -1,4 +1,5 @@ -""" testing models """ +"""testing models""" + import datetime from unittest.mock import patch from django.test import TestCase diff --git a/bookwyrm/tests/models/test_relationship_models.py b/bookwyrm/tests/models/test_relationship_models.py index ec9f751a42..27758a7208 100644 --- a/bookwyrm/tests/models/test_relationship_models.py +++ b/bookwyrm/tests/models/test_relationship_models.py @@ -1,4 +1,5 @@ -""" testing models """ +"""testing models""" + import json from unittest.mock import patch from django.db import IntegrityError diff --git a/bookwyrm/tests/models/test_session.py b/bookwyrm/tests/models/test_session.py index 8298391200..353f8eedc1 100644 --- a/bookwyrm/tests/models/test_session.py +++ b/bookwyrm/tests/models/test_session.py @@ -1,4 +1,5 @@ -""" test session functions """ +"""test session functions""" + from importlib import import_module from django.conf import settings diff --git a/bookwyrm/tests/models/test_shelf_model.py b/bookwyrm/tests/models/test_shelf_model.py index f17970c509..fe75af3f7f 100644 --- a/bookwyrm/tests/models/test_shelf_model.py +++ b/bookwyrm/tests/models/test_shelf_model.py @@ -1,4 +1,5 @@ -""" testing models """ +"""testing models""" + import json from unittest.mock import patch from django.test import TestCase diff --git a/bookwyrm/tests/models/test_site.py b/bookwyrm/tests/models/test_site.py index c9f9a13159..0994e7fcff 100644 --- a/bookwyrm/tests/models/test_site.py +++ b/bookwyrm/tests/models/test_site.py @@ -1,4 +1,5 @@ -""" testing models """ +"""testing models""" + from datetime import timedelta from unittest.mock import patch diff --git a/bookwyrm/tests/models/test_status_model.py b/bookwyrm/tests/models/test_status_model.py index 5837b41888..2dd40d513b 100644 --- a/bookwyrm/tests/models/test_status_model.py +++ b/bookwyrm/tests/models/test_status_model.py @@ -1,4 +1,5 @@ -""" testing models """ +"""testing models""" + from unittest.mock import patch import pathlib import re diff --git a/bookwyrm/tests/models/test_unicode_slugs.py b/bookwyrm/tests/models/test_unicode_slugs.py index c51a3d3c06..52400b97d6 100644 --- a/bookwyrm/tests/models/test_unicode_slugs.py +++ b/bookwyrm/tests/models/test_unicode_slugs.py @@ -1,4 +1,5 @@ -""" Test Unicode slug generation and URL routing """ +"""Test Unicode slug generation and URL routing""" + import re from unittest.mock import patch from django.test import TestCase diff --git a/bookwyrm/tests/models/test_user_model.py b/bookwyrm/tests/models/test_user_model.py index 2e122872dc..e80c88d501 100644 --- a/bookwyrm/tests/models/test_user_model.py +++ b/bookwyrm/tests/models/test_user_model.py @@ -1,4 +1,5 @@ -""" testing models """ +"""testing models""" + import json from unittest.mock import patch diff --git a/bookwyrm/tests/templatetags/test_book_display_tags.py b/bookwyrm/tests/templatetags/test_book_display_tags.py index 40fa0f7d6f..91bcf00e7e 100644 --- a/bookwyrm/tests/templatetags/test_book_display_tags.py +++ b/bookwyrm/tests/templatetags/test_book_display_tags.py @@ -1,4 +1,5 @@ -""" style fixes and lookups for templates """ +"""style fixes and lookups for templates""" + from unittest.mock import patch from django.test import TestCase diff --git a/bookwyrm/tests/templatetags/test_date_ext.py b/bookwyrm/tests/templatetags/test_date_ext.py index bd31a95c9c..cec22b47c0 100644 --- a/bookwyrm/tests/templatetags/test_date_ext.py +++ b/bookwyrm/tests/templatetags/test_date_ext.py @@ -1,4 +1,5 @@ """Test date extensions in templates""" + from dateutil.parser import isoparse from django.test import TestCase, override_settings diff --git a/bookwyrm/tests/templatetags/test_feed_page_tags.py b/bookwyrm/tests/templatetags/test_feed_page_tags.py index 7e3ba6a9f7..a82e71681a 100644 --- a/bookwyrm/tests/templatetags/test_feed_page_tags.py +++ b/bookwyrm/tests/templatetags/test_feed_page_tags.py @@ -1,4 +1,5 @@ -""" style fixes and lookups for templates """ +"""style fixes and lookups for templates""" + from unittest.mock import patch from django.test import TestCase diff --git a/bookwyrm/tests/templatetags/test_interaction.py b/bookwyrm/tests/templatetags/test_interaction.py index 6d707ffac5..8fcc7987c1 100644 --- a/bookwyrm/tests/templatetags/test_interaction.py +++ b/bookwyrm/tests/templatetags/test_interaction.py @@ -1,4 +1,5 @@ -""" style fixes and lookups for templates """ +"""style fixes and lookups for templates""" + from unittest.mock import patch from django.test import TestCase diff --git a/bookwyrm/tests/templatetags/test_markdown.py b/bookwyrm/tests/templatetags/test_markdown.py index 5b5959ad3f..2739e0435e 100644 --- a/bookwyrm/tests/templatetags/test_markdown.py +++ b/bookwyrm/tests/templatetags/test_markdown.py @@ -1,4 +1,5 @@ -""" style fixes and lookups for templates """ +"""style fixes and lookups for templates""" + from django.test import TestCase from bookwyrm.templatetags import markdown diff --git a/bookwyrm/tests/templatetags/test_notification_page_tags.py b/bookwyrm/tests/templatetags/test_notification_page_tags.py index 2d18a5ca7d..14e3ef1914 100644 --- a/bookwyrm/tests/templatetags/test_notification_page_tags.py +++ b/bookwyrm/tests/templatetags/test_notification_page_tags.py @@ -1,4 +1,5 @@ -""" style fixes and lookups for templates """ +"""style fixes and lookups for templates""" + from unittest.mock import patch from django.test import TestCase diff --git a/bookwyrm/tests/templatetags/test_rating_tags.py b/bookwyrm/tests/templatetags/test_rating_tags.py index cb28fd7886..6d03332dc6 100644 --- a/bookwyrm/tests/templatetags/test_rating_tags.py +++ b/bookwyrm/tests/templatetags/test_rating_tags.py @@ -1,4 +1,5 @@ -""" Gettings book ratings """ +"""Gettings book ratings""" + from unittest.mock import patch from django.test import TestCase diff --git a/bookwyrm/tests/templatetags/test_shelf_tags.py b/bookwyrm/tests/templatetags/test_shelf_tags.py index 8b3ec82d1c..95eadd3ac8 100644 --- a/bookwyrm/tests/templatetags/test_shelf_tags.py +++ b/bookwyrm/tests/templatetags/test_shelf_tags.py @@ -1,4 +1,5 @@ -""" style fixes and lookups for templates """ +"""style fixes and lookups for templates""" + from unittest.mock import patch from django.test import TestCase diff --git a/bookwyrm/tests/templatetags/test_status_display.py b/bookwyrm/tests/templatetags/test_status_display.py index de7d3ae2fe..13eb95f9da 100644 --- a/bookwyrm/tests/templatetags/test_status_display.py +++ b/bookwyrm/tests/templatetags/test_status_display.py @@ -1,4 +1,5 @@ -""" style fixes and lookups for templates """ +"""style fixes and lookups for templates""" + import datetime from unittest.mock import patch diff --git a/bookwyrm/tests/templatetags/test_utilities.py b/bookwyrm/tests/templatetags/test_utilities.py index a6571075ee..6833ee9358 100644 --- a/bookwyrm/tests/templatetags/test_utilities.py +++ b/bookwyrm/tests/templatetags/test_utilities.py @@ -1,4 +1,5 @@ -""" style fixes and lookups for templates """ +"""style fixes and lookups for templates""" + from collections import namedtuple import re from unittest.mock import patch diff --git a/bookwyrm/tests/test_author_search.py b/bookwyrm/tests/test_author_search.py index e6b20a2c60..207b5652cb 100644 --- a/bookwyrm/tests/test_author_search.py +++ b/bookwyrm/tests/test_author_search.py @@ -1,4 +1,5 @@ -""" test searching for authors """ +"""test searching for authors""" + from django.test import TestCase from django.contrib.postgres.search import SearchRank, SearchQuery diff --git a/bookwyrm/tests/test_book_search.py b/bookwyrm/tests/test_book_search.py index cc9a00154f..9a74051046 100644 --- a/bookwyrm/tests/test_book_search.py +++ b/bookwyrm/tests/test_book_search.py @@ -1,4 +1,5 @@ -""" test searching for books """ +"""test searching for books""" + import datetime from datetime import timezone diff --git a/bookwyrm/tests/test_context_processors.py b/bookwyrm/tests/test_context_processors.py index 7c1fbb1dd6..c5155313f5 100644 --- a/bookwyrm/tests/test_context_processors.py +++ b/bookwyrm/tests/test_context_processors.py @@ -1,4 +1,5 @@ -""" test for context processor """ +"""test for context processor""" + from unittest.mock import patch from django.contrib.auth.models import AnonymousUser from django.test import TestCase diff --git a/bookwyrm/tests/test_emailing.py b/bookwyrm/tests/test_emailing.py index 186cce9302..7db550b55f 100644 --- a/bookwyrm/tests/test_emailing.py +++ b/bookwyrm/tests/test_emailing.py @@ -1,4 +1,5 @@ -""" test creating emails """ +"""test creating emails""" + from unittest.mock import patch from django.test import TestCase diff --git a/bookwyrm/tests/test_isbn.py b/bookwyrm/tests/test_isbn.py index 5486c7151d..f348da54b4 100644 --- a/bookwyrm/tests/test_isbn.py +++ b/bookwyrm/tests/test_isbn.py @@ -1,4 +1,5 @@ -""" test ISBN hyphenator for books """ +"""test ISBN hyphenator for books""" + from django.test import TestCase from bookwyrm.isbn.isbn import hyphenator_singleton as hyphenator diff --git a/bookwyrm/tests/test_partial_date.py b/bookwyrm/tests/test_partial_date.py index 12d8c768dd..740a502590 100644 --- a/bookwyrm/tests/test_partial_date.py +++ b/bookwyrm/tests/test_partial_date.py @@ -1,4 +1,4 @@ -""" test partial_date module """ +"""test partial_date module""" import datetime from datetime import timezone diff --git a/bookwyrm/tests/test_preview_images.py b/bookwyrm/tests/test_preview_images.py index 726118de14..32894ba9f5 100644 --- a/bookwyrm/tests/test_preview_images.py +++ b/bookwyrm/tests/test_preview_images.py @@ -1,4 +1,5 @@ -""" test generating preview images """ +"""test generating preview images""" + import pathlib from unittest.mock import patch from PIL import Image diff --git a/bookwyrm/tests/test_sanitize_html.py b/bookwyrm/tests/test_sanitize_html.py index 449acdafbe..c8c7659e6d 100644 --- a/bookwyrm/tests/test_sanitize_html.py +++ b/bookwyrm/tests/test_sanitize_html.py @@ -1,4 +1,5 @@ -""" make sure only valid html gets to the app """ +"""make sure only valid html gets to the app""" + from django.test import TestCase from bookwyrm.utils.sanitizer import clean diff --git a/bookwyrm/tests/test_signing.py b/bookwyrm/tests/test_signing.py index 45ffbde20d..3d92d842c1 100644 --- a/bookwyrm/tests/test_signing.py +++ b/bookwyrm/tests/test_signing.py @@ -1,4 +1,5 @@ -""" getting and verifying signatures """ +"""getting and verifying signatures""" + import time from collections import namedtuple from urllib.parse import urlsplit diff --git a/bookwyrm/tests/test_suggested_users.py b/bookwyrm/tests/test_suggested_users.py index 0a6dd8abe9..3cb391be27 100644 --- a/bookwyrm/tests/test_suggested_users.py +++ b/bookwyrm/tests/test_suggested_users.py @@ -1,4 +1,5 @@ -""" testing user follow suggestions """ +"""testing user follow suggestions""" + from collections import namedtuple from unittest.mock import patch diff --git a/bookwyrm/tests/test_utils.py b/bookwyrm/tests/test_utils.py index 82a9d6248f..85c614deae 100644 --- a/bookwyrm/tests/test_utils.py +++ b/bookwyrm/tests/test_utils.py @@ -1,4 +1,5 @@ -""" test searching for books """ +"""test searching for books""" + import os import re from io import BytesIO diff --git a/bookwyrm/tests/validate_html.py b/bookwyrm/tests/validate_html.py index 618d27f6c9..a94ade3491 100644 --- a/bookwyrm/tests/validate_html.py +++ b/bookwyrm/tests/validate_html.py @@ -1,4 +1,5 @@ -""" html validation on rendered templates """ +"""html validation on rendered templates""" + from html.parser import HTMLParser from tidylib import tidy_document diff --git a/bookwyrm/tests/views/admin/test_announcements.py b/bookwyrm/tests/views/admin/test_announcements.py index 7e8925d214..3ee18802e4 100644 --- a/bookwyrm/tests/views/admin/test_announcements.py +++ b/bookwyrm/tests/views/admin/test_announcements.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch from django.template.response import TemplateResponse from django.test import TestCase diff --git a/bookwyrm/tests/views/admin/test_automod.py b/bookwyrm/tests/views/admin/test_automod.py index d1dbd79096..dfcd605018 100644 --- a/bookwyrm/tests/views/admin/test_automod.py +++ b/bookwyrm/tests/views/admin/test_automod.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch from django.contrib.auth.models import Group diff --git a/bookwyrm/tests/views/admin/test_celery.py b/bookwyrm/tests/views/admin/test_celery.py index 9233552fa9..810b0ae461 100644 --- a/bookwyrm/tests/views/admin/test_celery.py +++ b/bookwyrm/tests/views/admin/test_celery.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch from django.contrib.auth.models import Group diff --git a/bookwyrm/tests/views/admin/test_connectors.py b/bookwyrm/tests/views/admin/test_connectors.py index 73ee3f0190..558f60b3ca 100644 --- a/bookwyrm/tests/views/admin/test_connectors.py +++ b/bookwyrm/tests/views/admin/test_connectors.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch import pytest diff --git a/bookwyrm/tests/views/admin/test_dashboard.py b/bookwyrm/tests/views/admin/test_dashboard.py index 3289ad9f68..06232c6641 100644 --- a/bookwyrm/tests/views/admin/test_dashboard.py +++ b/bookwyrm/tests/views/admin/test_dashboard.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch from django.contrib.auth.models import Group diff --git a/bookwyrm/tests/views/admin/test_email_blocks.py b/bookwyrm/tests/views/admin/test_email_blocks.py index 4315c40c97..ad75c94f2a 100644 --- a/bookwyrm/tests/views/admin/test_email_blocks.py +++ b/bookwyrm/tests/views/admin/test_email_blocks.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch from django.contrib.auth.models import Group diff --git a/bookwyrm/tests/views/admin/test_email_config.py b/bookwyrm/tests/views/admin/test_email_config.py index b8218a284c..496d7c1d97 100644 --- a/bookwyrm/tests/views/admin/test_email_config.py +++ b/bookwyrm/tests/views/admin/test_email_config.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch from django.contrib.auth.models import Group diff --git a/bookwyrm/tests/views/admin/test_federation.py b/bookwyrm/tests/views/admin/test_federation.py index 818c949f5a..2d9c38a92a 100644 --- a/bookwyrm/tests/views/admin/test_federation.py +++ b/bookwyrm/tests/views/admin/test_federation.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + import json from unittest.mock import patch diff --git a/bookwyrm/tests/views/admin/test_files_maintenance.py b/bookwyrm/tests/views/admin/test_files_maintenance.py index b23f332d7d..5dd97e3549 100644 --- a/bookwyrm/tests/views/admin/test_files_maintenance.py +++ b/bookwyrm/tests/views/admin/test_files_maintenance.py @@ -1,4 +1,5 @@ -""" test for files maintenance page functionality """ +"""test for files maintenance page functionality""" + from unittest.mock import patch from django.contrib.auth.models import Group diff --git a/bookwyrm/tests/views/admin/test_imports.py b/bookwyrm/tests/views/admin/test_imports.py index a8fdfbf04c..d901f1689f 100644 --- a/bookwyrm/tests/views/admin/test_imports.py +++ b/bookwyrm/tests/views/admin/test_imports.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch from django.contrib.auth.models import Group diff --git a/bookwyrm/tests/views/admin/test_ip_blocklist.py b/bookwyrm/tests/views/admin/test_ip_blocklist.py index dfbc067973..c814907821 100644 --- a/bookwyrm/tests/views/admin/test_ip_blocklist.py +++ b/bookwyrm/tests/views/admin/test_ip_blocklist.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch from django.contrib.auth.models import Group diff --git a/bookwyrm/tests/views/admin/test_link_domains.py b/bookwyrm/tests/views/admin/test_link_domains.py index 57e909567f..a075507b8d 100644 --- a/bookwyrm/tests/views/admin/test_link_domains.py +++ b/bookwyrm/tests/views/admin/test_link_domains.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch from django.contrib.auth.models import Group diff --git a/bookwyrm/tests/views/admin/test_reports.py b/bookwyrm/tests/views/admin/test_reports.py index 73fbef40f7..6c91f40483 100644 --- a/bookwyrm/tests/views/admin/test_reports.py +++ b/bookwyrm/tests/views/admin/test_reports.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + import json from unittest.mock import patch diff --git a/bookwyrm/tests/views/admin/test_site.py b/bookwyrm/tests/views/admin/test_site.py index 0804bfe890..76dac0e6d1 100644 --- a/bookwyrm/tests/views/admin/test_site.py +++ b/bookwyrm/tests/views/admin/test_site.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch from django.contrib.auth.models import Group diff --git a/bookwyrm/tests/views/admin/test_themes.py b/bookwyrm/tests/views/admin/test_themes.py index d7d4f8bf30..95af626927 100644 --- a/bookwyrm/tests/views/admin/test_themes.py +++ b/bookwyrm/tests/views/admin/test_themes.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch from django.contrib.auth.models import Group diff --git a/bookwyrm/tests/views/admin/test_user_admin.py b/bookwyrm/tests/views/admin/test_user_admin.py index d2bda4f96e..2abcdd7ac9 100644 --- a/bookwyrm/tests/views/admin/test_user_admin.py +++ b/bookwyrm/tests/views/admin/test_user_admin.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch from django.contrib.auth.models import Group diff --git a/bookwyrm/tests/views/books/test_book.py b/bookwyrm/tests/views/books/test_book.py index 3adc2c0886..7df079ce30 100644 --- a/bookwyrm/tests/views/books/test_book.py +++ b/bookwyrm/tests/views/books/test_book.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + import pathlib from unittest.mock import patch diff --git a/bookwyrm/tests/views/books/test_edit_book.py b/bookwyrm/tests/views/books/test_edit_book.py index 0ef6bf4bdb..5d6e0eac1a 100644 --- a/bookwyrm/tests/views/books/test_edit_book.py +++ b/bookwyrm/tests/views/books/test_edit_book.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch import responses from responses import matchers diff --git a/bookwyrm/tests/views/books/test_editions.py b/bookwyrm/tests/views/books/test_editions.py index e54f0eb13b..36480d9273 100644 --- a/bookwyrm/tests/views/books/test_editions.py +++ b/bookwyrm/tests/views/books/test_editions.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch from django.template.response import TemplateResponse diff --git a/bookwyrm/tests/views/books/test_links.py b/bookwyrm/tests/views/books/test_links.py index d8918ed2be..06b8683946 100644 --- a/bookwyrm/tests/views/books/test_links.py +++ b/bookwyrm/tests/views/books/test_links.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + import json from unittest.mock import patch diff --git a/bookwyrm/tests/views/imports/test_import.py b/bookwyrm/tests/views/imports/test_import.py index de73f4134a..6cf0de68c5 100644 --- a/bookwyrm/tests/views/imports/test_import.py +++ b/bookwyrm/tests/views/imports/test_import.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + import datetime import pathlib from unittest.mock import patch diff --git a/bookwyrm/tests/views/imports/test_import_review.py b/bookwyrm/tests/views/imports/test_import_review.py index 989560c6ac..263042d4e6 100644 --- a/bookwyrm/tests/views/imports/test_import_review.py +++ b/bookwyrm/tests/views/imports/test_import_review.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch from django.template.response import TemplateResponse from django.test import TestCase diff --git a/bookwyrm/tests/views/imports/test_import_troubleshoot.py b/bookwyrm/tests/views/imports/test_import_troubleshoot.py index 1ed04d208f..789e0d3609 100644 --- a/bookwyrm/tests/views/imports/test_import_troubleshoot.py +++ b/bookwyrm/tests/views/imports/test_import_troubleshoot.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from collections import namedtuple from unittest.mock import patch from django.template.response import TemplateResponse diff --git a/bookwyrm/tests/views/imports/test_user_import.py b/bookwyrm/tests/views/imports/test_user_import.py index d5e9aef510..8f672218a6 100644 --- a/bookwyrm/tests/views/imports/test_user_import.py +++ b/bookwyrm/tests/views/imports/test_user_import.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + import pathlib from unittest.mock import patch diff --git a/bookwyrm/tests/views/inbox/test_inbox.py b/bookwyrm/tests/views/inbox/test_inbox.py index b3e69b4d6c..c2356d929b 100644 --- a/bookwyrm/tests/views/inbox/test_inbox.py +++ b/bookwyrm/tests/views/inbox/test_inbox.py @@ -1,4 +1,5 @@ -""" tests incoming activities""" +"""tests incoming activities""" + import json import pathlib from unittest.mock import patch diff --git a/bookwyrm/tests/views/inbox/test_inbox_add.py b/bookwyrm/tests/views/inbox/test_inbox_add.py index 3ada89ec29..0f8776774a 100644 --- a/bookwyrm/tests/views/inbox/test_inbox_add.py +++ b/bookwyrm/tests/views/inbox/test_inbox_add.py @@ -1,4 +1,5 @@ -""" tests incoming activities""" +"""tests incoming activities""" + from unittest.mock import patch from django.test import TestCase diff --git a/bookwyrm/tests/views/inbox/test_inbox_announce.py b/bookwyrm/tests/views/inbox/test_inbox_announce.py index 6afb2e0e95..73d18ea600 100644 --- a/bookwyrm/tests/views/inbox/test_inbox_announce.py +++ b/bookwyrm/tests/views/inbox/test_inbox_announce.py @@ -1,4 +1,5 @@ -""" tests incoming activities""" +"""tests incoming activities""" + from unittest.mock import patch from django.test import TestCase diff --git a/bookwyrm/tests/views/inbox/test_inbox_block.py b/bookwyrm/tests/views/inbox/test_inbox_block.py index 956c736b43..bf8c64a25f 100644 --- a/bookwyrm/tests/views/inbox/test_inbox_block.py +++ b/bookwyrm/tests/views/inbox/test_inbox_block.py @@ -1,4 +1,5 @@ -""" tests incoming activities""" +"""tests incoming activities""" + from unittest.mock import patch from django.test import TestCase diff --git a/bookwyrm/tests/views/inbox/test_inbox_create.py b/bookwyrm/tests/views/inbox/test_inbox_create.py index 73a35665ab..151bf0e6bf 100644 --- a/bookwyrm/tests/views/inbox/test_inbox_create.py +++ b/bookwyrm/tests/views/inbox/test_inbox_create.py @@ -1,4 +1,5 @@ -""" tests incoming activities""" +"""tests incoming activities""" + import json import pathlib from unittest.mock import patch diff --git a/bookwyrm/tests/views/inbox/test_inbox_delete.py b/bookwyrm/tests/views/inbox/test_inbox_delete.py index 52b26e00a3..3ff426d47a 100644 --- a/bookwyrm/tests/views/inbox/test_inbox_delete.py +++ b/bookwyrm/tests/views/inbox/test_inbox_delete.py @@ -1,4 +1,5 @@ """tests incoming activities""" + from datetime import datetime from unittest.mock import patch diff --git a/bookwyrm/tests/views/inbox/test_inbox_follow.py b/bookwyrm/tests/views/inbox/test_inbox_follow.py index 058d660052..ac62ea2b0b 100644 --- a/bookwyrm/tests/views/inbox/test_inbox_follow.py +++ b/bookwyrm/tests/views/inbox/test_inbox_follow.py @@ -1,4 +1,5 @@ -""" tests incoming activities""" +"""tests incoming activities""" + import json from unittest.mock import patch diff --git a/bookwyrm/tests/views/inbox/test_inbox_like.py b/bookwyrm/tests/views/inbox/test_inbox_like.py index 3675e91760..92fb719ddb 100644 --- a/bookwyrm/tests/views/inbox/test_inbox_like.py +++ b/bookwyrm/tests/views/inbox/test_inbox_like.py @@ -1,4 +1,5 @@ -""" tests incoming activities""" +"""tests incoming activities""" + from unittest.mock import patch from django.test import TestCase diff --git a/bookwyrm/tests/views/inbox/test_inbox_remove.py b/bookwyrm/tests/views/inbox/test_inbox_remove.py index 4bd5840fbd..4a44635eab 100644 --- a/bookwyrm/tests/views/inbox/test_inbox_remove.py +++ b/bookwyrm/tests/views/inbox/test_inbox_remove.py @@ -1,4 +1,5 @@ -""" tests incoming activities""" +"""tests incoming activities""" + from unittest.mock import patch from django.test import TestCase diff --git a/bookwyrm/tests/views/inbox/test_inbox_update.py b/bookwyrm/tests/views/inbox/test_inbox_update.py index d22a598629..e9244ea11c 100644 --- a/bookwyrm/tests/views/inbox/test_inbox_update.py +++ b/bookwyrm/tests/views/inbox/test_inbox_update.py @@ -1,4 +1,5 @@ -""" tests incoming activities""" +"""tests incoming activities""" + import json import pathlib from unittest.mock import patch diff --git a/bookwyrm/tests/views/landing/test_invite.py b/bookwyrm/tests/views/landing/test_invite.py index eca0fa0b16..22fa5f6b0b 100644 --- a/bookwyrm/tests/views/landing/test_invite.py +++ b/bookwyrm/tests/views/landing/test_invite.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch from django.contrib.auth.models import AnonymousUser diff --git a/bookwyrm/tests/views/landing/test_landing.py b/bookwyrm/tests/views/landing/test_landing.py index 26d9b4b937..c9a1296fd5 100644 --- a/bookwyrm/tests/views/landing/test_landing.py +++ b/bookwyrm/tests/views/landing/test_landing.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch from django.contrib.auth.models import AnonymousUser from django.http import Http404 diff --git a/bookwyrm/tests/views/landing/test_login.py b/bookwyrm/tests/views/landing/test_login.py index be08c13ad2..bc48767baf 100644 --- a/bookwyrm/tests/views/landing/test_login.py +++ b/bookwyrm/tests/views/landing/test_login.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from importlib import import_module from unittest.mock import patch diff --git a/bookwyrm/tests/views/landing/test_password.py b/bookwyrm/tests/views/landing/test_password.py index 33ada7dd89..18bb13260c 100644 --- a/bookwyrm/tests/views/landing/test_password.py +++ b/bookwyrm/tests/views/landing/test_password.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from datetime import timedelta from unittest.mock import patch diff --git a/bookwyrm/tests/views/landing/test_register.py b/bookwyrm/tests/views/landing/test_register.py index 3c93da8f82..34ed699927 100644 --- a/bookwyrm/tests/views/landing/test_register.py +++ b/bookwyrm/tests/views/landing/test_register.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch from django.contrib.auth.models import AnonymousUser diff --git a/bookwyrm/tests/views/lists/test_curate.py b/bookwyrm/tests/views/lists/test_curate.py index bb6dfb0601..adc040ea3e 100644 --- a/bookwyrm/tests/views/lists/test_curate.py +++ b/bookwyrm/tests/views/lists/test_curate.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + import json from unittest.mock import patch diff --git a/bookwyrm/tests/views/lists/test_embed.py b/bookwyrm/tests/views/lists/test_embed.py index ea8760cbf3..4b5455f17b 100644 --- a/bookwyrm/tests/views/lists/test_embed.py +++ b/bookwyrm/tests/views/lists/test_embed.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch from django.contrib.auth.models import AnonymousUser diff --git a/bookwyrm/tests/views/lists/test_list.py b/bookwyrm/tests/views/lists/test_list.py index 724d693de6..c4a04937b2 100644 --- a/bookwyrm/tests/views/lists/test_list.py +++ b/bookwyrm/tests/views/lists/test_list.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + import json from unittest.mock import patch @@ -117,7 +118,7 @@ def test_list_page_sorted(self): """there are so many views, this just makes sure it LOADS""" view = views.List.as_view() with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): - for (i, book) in enumerate([self.book, self.book_two, self.book_three]): + for i, book in enumerate([self.book, self.book_two, self.book_three]): models.ListItem.objects.create( book_list=self.list, user=self.local_user, diff --git a/bookwyrm/tests/views/lists/test_list_item.py b/bookwyrm/tests/views/lists/test_list_item.py index bc7d829989..d5637ff1ad 100644 --- a/bookwyrm/tests/views/lists/test_list_item.py +++ b/bookwyrm/tests/views/lists/test_list_item.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch from django.test import TestCase diff --git a/bookwyrm/tests/views/lists/test_lists.py b/bookwyrm/tests/views/lists/test_lists.py index 43deb9379e..ca052a11fb 100644 --- a/bookwyrm/tests/views/lists/test_lists.py +++ b/bookwyrm/tests/views/lists/test_lists.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + import json from unittest.mock import patch diff --git a/bookwyrm/tests/views/preferences/test_block.py b/bookwyrm/tests/views/preferences/test_block.py index 0e35425333..c65a824bf2 100644 --- a/bookwyrm/tests/views/preferences/test_block.py +++ b/bookwyrm/tests/views/preferences/test_block.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch from django.template.response import TemplateResponse diff --git a/bookwyrm/tests/views/preferences/test_change_password.py b/bookwyrm/tests/views/preferences/test_change_password.py index 76ad5d8efc..efa6521b42 100644 --- a/bookwyrm/tests/views/preferences/test_change_password.py +++ b/bookwyrm/tests/views/preferences/test_change_password.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch from django.template.response import TemplateResponse diff --git a/bookwyrm/tests/views/preferences/test_delete_user.py b/bookwyrm/tests/views/preferences/test_delete_user.py index 9566524832..fdcf8469c5 100644 --- a/bookwyrm/tests/views/preferences/test_delete_user.py +++ b/bookwyrm/tests/views/preferences/test_delete_user.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + import json from unittest.mock import patch diff --git a/bookwyrm/tests/views/preferences/test_edit_user.py b/bookwyrm/tests/views/preferences/test_edit_user.py index 8c1b8c8d5f..a31ee08f5f 100644 --- a/bookwyrm/tests/views/preferences/test_edit_user.py +++ b/bookwyrm/tests/views/preferences/test_edit_user.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + import pathlib from unittest.mock import patch from PIL import Image diff --git a/bookwyrm/tests/views/preferences/test_export.py b/bookwyrm/tests/views/preferences/test_export.py index d9810e7e98..26934300d7 100644 --- a/bookwyrm/tests/views/preferences/test_export.py +++ b/bookwyrm/tests/views/preferences/test_export.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch from django.http import HttpResponse diff --git a/bookwyrm/tests/views/preferences/test_export_user.py b/bookwyrm/tests/views/preferences/test_export_user.py index 01d86cba91..61df0eaaa5 100644 --- a/bookwyrm/tests/views/preferences/test_export_user.py +++ b/bookwyrm/tests/views/preferences/test_export_user.py @@ -1,4 +1,5 @@ -""" test for user export app functionality """ +"""test for user export app functionality""" + from unittest.mock import patch from django.http import HttpResponse diff --git a/bookwyrm/tests/views/preferences/test_move.py b/bookwyrm/tests/views/preferences/test_move.py index 2595d48997..733f7dd217 100644 --- a/bookwyrm/tests/views/preferences/test_move.py +++ b/bookwyrm/tests/views/preferences/test_move.py @@ -1,4 +1,5 @@ -""" test move functionality """ +"""test move functionality""" + import json from unittest.mock import patch import pathlib diff --git a/bookwyrm/tests/views/preferences/test_security.py b/bookwyrm/tests/views/preferences/test_security.py index 3699090e9f..c35bca0604 100644 --- a/bookwyrm/tests/views/preferences/test_security.py +++ b/bookwyrm/tests/views/preferences/test_security.py @@ -1,4 +1,5 @@ -""" test for app two factor auth functionality """ +"""test for app two factor auth functionality""" + from importlib import import_module from unittest.mock import patch import time diff --git a/bookwyrm/tests/views/shelf/test_shelf.py b/bookwyrm/tests/views/shelf/test_shelf.py index 72c4fe9a26..896ffeed2e 100644 --- a/bookwyrm/tests/views/shelf/test_shelf.py +++ b/bookwyrm/tests/views/shelf/test_shelf.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch from django.contrib.auth.models import AnonymousUser diff --git a/bookwyrm/tests/views/shelf/test_shelf_actions.py b/bookwyrm/tests/views/shelf/test_shelf_actions.py index 73155b61a6..b78da18885 100644 --- a/bookwyrm/tests/views/shelf/test_shelf_actions.py +++ b/bookwyrm/tests/views/shelf/test_shelf_actions.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + import json from unittest.mock import patch diff --git a/bookwyrm/tests/views/test_annual_summary.py b/bookwyrm/tests/views/test_annual_summary.py index ff86cfa8da..5a705ff980 100644 --- a/bookwyrm/tests/views/test_annual_summary.py +++ b/bookwyrm/tests/views/test_annual_summary.py @@ -1,4 +1,5 @@ """testing the annual summary page""" + import datetime from unittest.mock import patch diff --git a/bookwyrm/tests/views/test_author.py b/bookwyrm/tests/views/test_author.py index 0d023f0adb..f43a75f937 100644 --- a/bookwyrm/tests/views/test_author.py +++ b/bookwyrm/tests/views/test_author.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch from django.contrib.auth.models import AnonymousUser, Group, Permission diff --git a/bookwyrm/tests/views/test_directory.py b/bookwyrm/tests/views/test_directory.py index 96dcd36924..7d8120081a 100644 --- a/bookwyrm/tests/views/test_directory.py +++ b/bookwyrm/tests/views/test_directory.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch from django.contrib.auth.models import AnonymousUser diff --git a/bookwyrm/tests/views/test_discover.py b/bookwyrm/tests/views/test_discover.py index f93913df29..849d002db8 100644 --- a/bookwyrm/tests/views/test_discover.py +++ b/bookwyrm/tests/views/test_discover.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch from django.contrib.auth.models import AnonymousUser from django.test import TestCase diff --git a/bookwyrm/tests/views/test_feed.py b/bookwyrm/tests/views/test_feed.py index 28a8e1bd30..1ad7beddd8 100644 --- a/bookwyrm/tests/views/test_feed.py +++ b/bookwyrm/tests/views/test_feed.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch import pathlib diff --git a/bookwyrm/tests/views/test_follow.py b/bookwyrm/tests/views/test_follow.py index 1074de1182..71c63a7c0c 100644 --- a/bookwyrm/tests/views/test_follow.py +++ b/bookwyrm/tests/views/test_follow.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + import json from unittest.mock import patch diff --git a/bookwyrm/tests/views/test_get_started.py b/bookwyrm/tests/views/test_get_started.py index d84435df78..5f9b35201c 100644 --- a/bookwyrm/tests/views/test_get_started.py +++ b/bookwyrm/tests/views/test_get_started.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch from django.template.response import TemplateResponse from django.test import TestCase diff --git a/bookwyrm/tests/views/test_goal.py b/bookwyrm/tests/views/test_goal.py index a7309e4aa3..c086e1eaed 100644 --- a/bookwyrm/tests/views/test_goal.py +++ b/bookwyrm/tests/views/test_goal.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch from django.contrib.auth.models import AnonymousUser diff --git a/bookwyrm/tests/views/test_group.py b/bookwyrm/tests/views/test_group.py index 5b8a2d5aa0..c444072d3f 100644 --- a/bookwyrm/tests/views/test_group.py +++ b/bookwyrm/tests/views/test_group.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch from django.contrib.auth.models import AnonymousUser @@ -11,6 +12,7 @@ from bookwyrm import models, views from bookwyrm.tests.validate_html import validate_html + # pylint: disable=too-many-public-methods @patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") class GroupViews(TestCase): diff --git a/bookwyrm/tests/views/test_hashtag.py b/bookwyrm/tests/views/test_hashtag.py index ebf3662f83..cd085ffbaf 100644 --- a/bookwyrm/tests/views/test_hashtag.py +++ b/bookwyrm/tests/views/test_hashtag.py @@ -1,4 +1,5 @@ -""" tests for hashtag view """ +"""tests for hashtag view""" + from unittest.mock import patch from django.contrib.auth.models import AnonymousUser diff --git a/bookwyrm/tests/views/test_helpers.py b/bookwyrm/tests/views/test_helpers.py index 64241d2b4b..112fd1af54 100644 --- a/bookwyrm/tests/views/test_helpers.py +++ b/bookwyrm/tests/views/test_helpers.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + import json from unittest.mock import patch import pathlib diff --git a/bookwyrm/tests/views/test_interaction.py b/bookwyrm/tests/views/test_interaction.py index d1533c4515..ead7a37167 100644 --- a/bookwyrm/tests/views/test_interaction.py +++ b/bookwyrm/tests/views/test_interaction.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + import json from unittest.mock import patch from django.test import TestCase diff --git a/bookwyrm/tests/views/test_isbn.py b/bookwyrm/tests/views/test_isbn.py index 517090212d..86dda3c9ad 100644 --- a/bookwyrm/tests/views/test_isbn.py +++ b/bookwyrm/tests/views/test_isbn.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + import json from unittest.mock import patch diff --git a/bookwyrm/tests/views/test_notifications.py b/bookwyrm/tests/views/test_notifications.py index fe80a1dfef..b73229ea69 100644 --- a/bookwyrm/tests/views/test_notifications.py +++ b/bookwyrm/tests/views/test_notifications.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch from django.template.response import TemplateResponse from django.test import TestCase diff --git a/bookwyrm/tests/views/test_outbox.py b/bookwyrm/tests/views/test_outbox.py index 370f818008..30e0ea2e6c 100644 --- a/bookwyrm/tests/views/test_outbox.py +++ b/bookwyrm/tests/views/test_outbox.py @@ -1,4 +1,5 @@ -""" sending out activities """ +"""sending out activities""" + from unittest.mock import patch import json diff --git a/bookwyrm/tests/views/test_reading.py b/bookwyrm/tests/views/test_reading.py index d8172b7fb0..61e082c06c 100644 --- a/bookwyrm/tests/views/test_reading.py +++ b/bookwyrm/tests/views/test_reading.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch import dateutil from django.test import TestCase diff --git a/bookwyrm/tests/views/test_readthrough.py b/bookwyrm/tests/views/test_readthrough.py index e85d4e6a4f..c3bc0a1d66 100644 --- a/bookwyrm/tests/views/test_readthrough.py +++ b/bookwyrm/tests/views/test_readthrough.py @@ -1,4 +1,5 @@ -""" tests updating reading progress """ +"""tests updating reading progress""" + from datetime import datetime, timezone from unittest.mock import patch from django.test import TestCase, Client diff --git a/bookwyrm/tests/views/test_report.py b/bookwyrm/tests/views/test_report.py index 4f545aa1ea..1807aa51a2 100644 --- a/bookwyrm/tests/views/test_report.py +++ b/bookwyrm/tests/views/test_report.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch from django.test import TestCase diff --git a/bookwyrm/tests/views/test_rss_feed.py b/bookwyrm/tests/views/test_rss_feed.py index 658f3671d8..d827a04982 100644 --- a/bookwyrm/tests/views/test_rss_feed.py +++ b/bookwyrm/tests/views/test_rss_feed.py @@ -1,4 +1,5 @@ -""" testing import """ +"""testing import""" + from unittest.mock import patch from django.test import RequestFactory, TestCase @@ -134,9 +135,10 @@ def test_rss_quotation_only(self, *_): def test_rss_shelf(self, *_): """load the rss feed of a shelf""" - with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" - ), patch("bookwyrm.activitystreams.add_book_statuses_task.delay"): + with ( + patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"), + patch("bookwyrm.activitystreams.add_book_statuses_task.delay"), + ): # make the shelf shelf = models.Shelf.objects.create( name="Test Shelf", identifier="test-shelf", user=self.local_user diff --git a/bookwyrm/tests/views/test_search.py b/bookwyrm/tests/views/test_search.py index 8a10018209..40a0407cd9 100644 --- a/bookwyrm/tests/views/test_search.py +++ b/bookwyrm/tests/views/test_search.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + import json from unittest.mock import patch diff --git a/bookwyrm/tests/views/test_setup.py b/bookwyrm/tests/views/test_setup.py index a34497a5bf..759c057c26 100644 --- a/bookwyrm/tests/views/test_setup.py +++ b/bookwyrm/tests/views/test_setup.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch from django.contrib.sessions.middleware import SessionMiddleware diff --git a/bookwyrm/tests/views/test_status.py b/bookwyrm/tests/views/test_status.py index 5d31ad4bcb..2689fa4ce0 100644 --- a/bookwyrm/tests/views/test_status.py +++ b/bookwyrm/tests/views/test_status.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + import json from unittest.mock import patch import dateutil diff --git a/bookwyrm/tests/views/test_updates.py b/bookwyrm/tests/views/test_updates.py index f35daf8c63..85c6597b8d 100644 --- a/bookwyrm/tests/views/test_updates.py +++ b/bookwyrm/tests/views/test_updates.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + import json from unittest.mock import patch @@ -55,11 +56,14 @@ def test_get_unread_status_string(self): request = self.factory.get("") request.user = self.local_user - with patch( - "bookwyrm.activitystreams.ActivityStream.get_unread_count" - ) as mock_count, patch( - "bookwyrm.activitystreams.ActivityStream.get_unread_count_by_status_type" - ) as mock_count_by_status: + with ( + patch( + "bookwyrm.activitystreams.ActivityStream.get_unread_count" + ) as mock_count, + patch( + "bookwyrm.activitystreams.ActivityStream.get_unread_count_by_status_type" + ) as mock_count_by_status, + ): mock_count.return_value = 3 mock_count_by_status.return_value = {"review": 5} result = views.get_unread_status_string(request, "home") @@ -74,11 +78,14 @@ def test_get_unread_status_string_with_filters(self): request = self.factory.get("") request.user = self.local_user - with patch( - "bookwyrm.activitystreams.ActivityStream.get_unread_count" - ) as mock_count, patch( - "bookwyrm.activitystreams.ActivityStream.get_unread_count_by_status_type" - ) as mock_count_by_status: + with ( + patch( + "bookwyrm.activitystreams.ActivityStream.get_unread_count" + ) as mock_count, + patch( + "bookwyrm.activitystreams.ActivityStream.get_unread_count_by_status_type" + ) as mock_count_by_status, + ): mock_count.return_value = 3 mock_count_by_status.return_value = { "generated_note": 1, diff --git a/bookwyrm/tests/views/test_user.py b/bookwyrm/tests/views/test_user.py index 187e232133..c069d78f98 100644 --- a/bookwyrm/tests/views/test_user.py +++ b/bookwyrm/tests/views/test_user.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch import datetime diff --git a/bookwyrm/tests/views/test_wellknown.py b/bookwyrm/tests/views/test_wellknown.py index 14309a87ad..cd4829725f 100644 --- a/bookwyrm/tests/views/test_wellknown.py +++ b/bookwyrm/tests/views/test_wellknown.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + import json from unittest.mock import patch diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py index 58fd357bed..7357d88b2d 100644 --- a/bookwyrm/urls.py +++ b/bookwyrm/urls.py @@ -1,4 +1,5 @@ -""" url routing for the app and api """ +"""url routing for the app and api""" + from django.conf.urls.static import static from django.contrib import admin from django.contrib.staticfiles.urls import staticfiles_urlpatterns diff --git a/bookwyrm/utils/__init__.py b/bookwyrm/utils/__init__.py index f15f59aaf4..b4a8fe9a12 100644 --- a/bookwyrm/utils/__init__.py +++ b/bookwyrm/utils/__init__.py @@ -1,2 +1,3 @@ -""" useful regex """ +"""useful regex""" + from .regex import USERNAME diff --git a/bookwyrm/utils/cache.py b/bookwyrm/utils/cache.py index 5e896e6218..8ef75d4675 100644 --- a/bookwyrm/utils/cache.py +++ b/bookwyrm/utils/cache.py @@ -1,4 +1,5 @@ -""" Custom handler for caching """ +"""Custom handler for caching""" + from typing import Any, Callable, Tuple, Union from django.core.cache import cache @@ -8,7 +9,7 @@ def get_or_set( cache_key: str, function: Callable[..., Any], *args: Tuple[Any, ...], - timeout: Union[float, None] = None + timeout: Union[float, None] = None, ) -> Any: """Django's built-in get_or_set isn't cutting it""" value = cache.get(cache_key) diff --git a/bookwyrm/utils/db.py b/bookwyrm/utils/db.py index 7024d9e478..21fd163431 100644 --- a/bookwyrm/utils/db.py +++ b/bookwyrm/utils/db.py @@ -1,4 +1,4 @@ -""" Database utilities """ +"""Database utilities""" from typing import Optional, Iterable, Set, cast import sqlparse # type: ignore[import-untyped] diff --git a/bookwyrm/utils/images.py b/bookwyrm/utils/images.py index 88aed8aaec..19110bcff9 100644 --- a/bookwyrm/utils/images.py +++ b/bookwyrm/utils/images.py @@ -1,4 +1,4 @@ -""" Image utilities """ +"""Image utilities""" import logging from io import BytesIO diff --git a/bookwyrm/utils/isni.py b/bookwyrm/utils/isni.py index 0d0a868877..8cb96ce849 100644 --- a/bookwyrm/utils/isni.py +++ b/bookwyrm/utils/isni.py @@ -1,4 +1,5 @@ """ISNI author checking utilities""" + import xml.etree.ElementTree as ET from typing import Union, Optional @@ -109,7 +110,6 @@ def find_authors_by_name( # build list of possible authors possible_authors = [] for element in root.iter("responseRecord"): - # TODO: we don't seem to do anything with the # personal_name variable - is this code block needed? personal_name = element.find(".//forename/..") @@ -123,7 +123,6 @@ def find_authors_by_name( continue if bool(description): - titles = [] # prefer title records from LoC+ coop, Australia, Ireland, or Singapore # in that order diff --git a/bookwyrm/utils/log.py b/bookwyrm/utils/log.py index 7a4a2f8989..a18a26bac4 100644 --- a/bookwyrm/utils/log.py +++ b/bookwyrm/utils/log.py @@ -1,4 +1,5 @@ -""" Logging utilities """ +"""Logging utilities""" + import logging diff --git a/bookwyrm/utils/regex.py b/bookwyrm/utils/regex.py index 72e837d68b..bc6bda41c1 100644 --- a/bookwyrm/utils/regex.py +++ b/bookwyrm/utils/regex.py @@ -1,4 +1,4 @@ -""" defining regexes for regularly used concepts """ +"""defining regexes for regularly used concepts""" DOMAIN = r"[\w_\-\.]+\.[a-z\-]{2,}" LOCALNAME = r"@?[a-zA-Z_\-\.0-9]+" diff --git a/bookwyrm/utils/sanitizer.py b/bookwyrm/utils/sanitizer.py index 1467ee3e1b..d5ac0daa6f 100644 --- a/bookwyrm/utils/sanitizer.py +++ b/bookwyrm/utils/sanitizer.py @@ -1,4 +1,5 @@ """Clean user-provided text""" + import bleach diff --git a/bookwyrm/utils/tar.py b/bookwyrm/utils/tar.py index 70fdc38f11..842570cfb2 100644 --- a/bookwyrm/utils/tar.py +++ b/bookwyrm/utils/tar.py @@ -1,4 +1,5 @@ """manage tar files for user exports""" + import io import os import tarfile diff --git a/bookwyrm/utils/validate.py b/bookwyrm/utils/validate.py index 962d51a4ea..4ebd4891a4 100644 --- a/bookwyrm/utils/validate.py +++ b/bookwyrm/utils/validate.py @@ -1,4 +1,5 @@ """Validations""" + from typing import Optional from bookwyrm.settings import BASE_URL diff --git a/bookwyrm/views/__init__.py b/bookwyrm/views/__init__.py index d89cfd48fe..cb560cfa1a 100644 --- a/bookwyrm/views/__init__.py +++ b/bookwyrm/views/__init__.py @@ -1,4 +1,5 @@ -""" make sure all our nice views are available """ +"""make sure all our nice views are available""" + # site admin from .admin.announcements import Announcements, Announcement from .admin.announcements import EditAnnouncement, delete_announcement diff --git a/bookwyrm/views/admin/announcements.py b/bookwyrm/views/admin/announcements.py index c5a7c80ff8..807ae87127 100644 --- a/bookwyrm/views/admin/announcements.py +++ b/bookwyrm/views/admin/announcements.py @@ -1,4 +1,5 @@ -""" make announcements """ +"""make announcements""" + from django.contrib.auth.decorators import login_required, permission_required from django.core.paginator import Paginator from django.shortcuts import get_object_or_404, redirect diff --git a/bookwyrm/views/admin/automod.py b/bookwyrm/views/admin/automod.py index 58818ad9bf..c774900482 100644 --- a/bookwyrm/views/admin/automod.py +++ b/bookwyrm/views/admin/automod.py @@ -1,4 +1,5 @@ -""" moderation via flagged posts and users """ +"""moderation via flagged posts and users""" + from django.contrib.auth.decorators import login_required, permission_required from django.db import transaction from django.shortcuts import get_object_or_404, redirect diff --git a/bookwyrm/views/admin/celery_status.py b/bookwyrm/views/admin/celery_status.py index 5d5f079906..83179e2e9d 100644 --- a/bookwyrm/views/admin/celery_status.py +++ b/bookwyrm/views/admin/celery_status.py @@ -1,4 +1,5 @@ -""" celery status """ +"""celery status""" + import json from django.contrib.auth.decorators import login_required, permission_required @@ -31,6 +32,7 @@ r = redis.from_url(settings.REDIS_BROKER_URL) + # pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") @method_decorator( diff --git a/bookwyrm/views/admin/connectors.py b/bookwyrm/views/admin/connectors.py index 5704c91344..ce73fdf22a 100644 --- a/bookwyrm/views/admin/connectors.py +++ b/bookwyrm/views/admin/connectors.py @@ -1,4 +1,5 @@ -""" manage book data sources """ +"""manage book data sources""" + from django.contrib.auth.decorators import login_required, permission_required from django.shortcuts import get_object_or_404, redirect from django.template.response import TemplateResponse diff --git a/bookwyrm/views/admin/dashboard.py b/bookwyrm/views/admin/dashboard.py index 15bb214912..de98333c0a 100644 --- a/bookwyrm/views/admin/dashboard.py +++ b/bookwyrm/views/admin/dashboard.py @@ -1,4 +1,5 @@ -""" instance overview """ +"""instance overview""" + from datetime import timedelta import re @@ -44,9 +45,9 @@ def get(self, request): ) or not re.match(regex.DOMAIN, settings.EMAIL_SENDER_DOMAIN) data["email_config_error"] = email_config_error - data[ - "email_sender" - ] = f"{settings.EMAIL_SENDER_NAME}@{settings.EMAIL_SENDER_DOMAIN}" + data["email_sender"] = ( + f"{settings.EMAIL_SENDER_NAME}@{settings.EMAIL_SENDER_DOMAIN}" + ) site = models.SiteSettings.get() # pylint: disable=protected-access @@ -201,7 +202,7 @@ def get_chart(self, start, end, interval): chart = {k: [] for k in self.queries.keys()} chart["labels"] = [] while interval_start <= end: - for (name, query) in self.queries.items(): + for name, query in self.queries.items(): chart[name].append(query(self.queryset, interval_start, interval_end)) chart["labels"].append(interval_start.strftime("%b %d")) diff --git a/bookwyrm/views/admin/email_blocklist.py b/bookwyrm/views/admin/email_blocklist.py index c31fa7366a..d69bc6ff2a 100644 --- a/bookwyrm/views/admin/email_blocklist.py +++ b/bookwyrm/views/admin/email_blocklist.py @@ -1,4 +1,5 @@ -""" Manage email blocklist""" +"""Manage email blocklist""" + from django.contrib.auth.decorators import login_required, permission_required from django.shortcuts import get_object_or_404, redirect from django.template.response import TemplateResponse @@ -7,6 +8,7 @@ from bookwyrm import forms, models + # pylint: disable=no-self-use @method_decorator(login_required, name="dispatch") @method_decorator( diff --git a/bookwyrm/views/admin/email_config.py b/bookwyrm/views/admin/email_config.py index 03e85f8b01..454f4f4d99 100644 --- a/bookwyrm/views/admin/email_config.py +++ b/bookwyrm/views/admin/email_config.py @@ -1,4 +1,5 @@ -""" is your email running? """ +"""is your email running?""" + from django.contrib.auth.decorators import login_required, permission_required from django.template.response import TemplateResponse from django.utils.decorators import method_decorator @@ -7,6 +8,7 @@ from bookwyrm import emailing from bookwyrm import settings + # pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") @method_decorator( diff --git a/bookwyrm/views/admin/federation.py b/bookwyrm/views/admin/federation.py index 13666705a2..69e72fb863 100644 --- a/bookwyrm/views/admin/federation.py +++ b/bookwyrm/views/admin/federation.py @@ -1,4 +1,5 @@ -""" manage federated servers """ +"""manage federated servers""" + import json from django.contrib.auth.decorators import login_required, permission_required from django.core.paginator import Paginator @@ -41,7 +42,7 @@ def get(self, request, status="federated"): "application_type", "server_name", ] - if not sort in sort_fields + [f"-{f}" for f in sort_fields]: + if sort not in sort_fields + [f"-{f}" for f in sort_fields]: sort = "-created_date" servers = servers.order_by(sort, "-created_date") diff --git a/bookwyrm/views/admin/federation_settings.py b/bookwyrm/views/admin/federation_settings.py index 6230dd3ec7..b4814e3d56 100644 --- a/bookwyrm/views/admin/federation_settings.py +++ b/bookwyrm/views/admin/federation_settings.py @@ -1,4 +1,5 @@ -""" big picture settings about how the instance shares data """ +"""big picture settings about how the instance shares data""" + from django.contrib.auth.decorators import login_required, permission_required from django.template.response import TemplateResponse from django.utils.decorators import method_decorator diff --git a/bookwyrm/views/admin/files_maintenance.py b/bookwyrm/views/admin/files_maintenance.py index 620ca4a6db..bfe1d61956 100644 --- a/bookwyrm/views/admin/files_maintenance.py +++ b/bookwyrm/views/admin/files_maintenance.py @@ -1,4 +1,5 @@ -""" clean up export files and find book covers """ +"""clean up export files and find book covers""" + import json from django.contrib.auth.decorators import login_required, permission_required @@ -12,6 +13,7 @@ from bookwyrm import forms, models + # pylint: disable=no-self-use @method_decorator(login_required, name="dispatch") @method_decorator( diff --git a/bookwyrm/views/admin/imports.py b/bookwyrm/views/admin/imports.py index 882ec3ea45..a52e4a552b 100644 --- a/bookwyrm/views/admin/imports.py +++ b/bookwyrm/views/admin/imports.py @@ -1,4 +1,5 @@ -""" manage imports """ +"""manage imports""" + from django.contrib.auth.decorators import login_required, permission_required from django.core.paginator import Paginator from django.shortcuts import get_object_or_404, redirect diff --git a/bookwyrm/views/admin/invite.py b/bookwyrm/views/admin/invite.py index 7e0b8e81be..10807b7693 100644 --- a/bookwyrm/views/admin/invite.py +++ b/bookwyrm/views/admin/invite.py @@ -1,4 +1,5 @@ -""" invites when registration is closed """ +"""invites when registration is closed""" + from functools import reduce import operator from urllib.parse import urlencode @@ -104,7 +105,7 @@ def get(self, request): "answer", ] # pylint: disable=consider-using-f-string - if not sort in sort_fields + ["-{:s}".format(f) for f in sort_fields]: + if sort not in sort_fields + ["-{:s}".format(f) for f in sort_fields]: sort = "-created_date" requests = models.InviteRequest.objects.filter(ignored=ignored).order_by(sort) diff --git a/bookwyrm/views/admin/ip_blocklist.py b/bookwyrm/views/admin/ip_blocklist.py index a81bc738a4..62cb5783f8 100644 --- a/bookwyrm/views/admin/ip_blocklist.py +++ b/bookwyrm/views/admin/ip_blocklist.py @@ -1,4 +1,5 @@ -""" Manage IP blocklist """ +"""Manage IP blocklist""" + from django.contrib.auth.decorators import login_required, permission_required from django.shortcuts import get_object_or_404, redirect from django.template.response import TemplateResponse @@ -7,6 +8,7 @@ from bookwyrm import forms, models + # pylint: disable=no-self-use @method_decorator(login_required, name="dispatch") @method_decorator( diff --git a/bookwyrm/views/admin/link_domains.py b/bookwyrm/views/admin/link_domains.py index e87465ed40..f0708c3587 100644 --- a/bookwyrm/views/admin/link_domains.py +++ b/bookwyrm/views/admin/link_domains.py @@ -1,4 +1,5 @@ -""" Manage link domains""" +"""Manage link domains""" + from django.contrib.auth.decorators import login_required, permission_required from django.shortcuts import get_object_or_404, redirect from django.template.response import TemplateResponse @@ -10,6 +11,7 @@ from bookwyrm.models.report import APPROVE_DOMAIN, BLOCK_DOMAIN from bookwyrm.views.helpers import redirect_to_referer + # pylint: disable=no-self-use @method_decorator(login_required, name="dispatch") @method_decorator( diff --git a/bookwyrm/views/admin/reports.py b/bookwyrm/views/admin/reports.py index 65332ad770..f9caaf517e 100644 --- a/bookwyrm/views/admin/reports.py +++ b/bookwyrm/views/admin/reports.py @@ -1,4 +1,5 @@ -""" moderation via flagged posts and users """ +"""moderation via flagged posts and users""" + from django.contrib.auth.decorators import login_required, permission_required from django.core.paginator import Paginator from django.core.exceptions import PermissionDenied diff --git a/bookwyrm/views/admin/schedule.py b/bookwyrm/views/admin/schedule.py index c654dca9aa..5a181e8520 100644 --- a/bookwyrm/views/admin/schedule.py +++ b/bookwyrm/views/admin/schedule.py @@ -1,4 +1,5 @@ -""" Scheduled celery tasks """ +"""Scheduled celery tasks""" + from django.contrib.auth.decorators import login_required, permission_required from django.shortcuts import redirect from django.template.response import TemplateResponse diff --git a/bookwyrm/views/admin/site.py b/bookwyrm/views/admin/site.py index 3dfda91e4b..69f0bba972 100644 --- a/bookwyrm/views/admin/site.py +++ b/bookwyrm/views/admin/site.py @@ -1,4 +1,5 @@ -""" manage site settings """ +"""manage site settings""" + from django.contrib.auth.decorators import login_required, permission_required from django.template.response import TemplateResponse from django.utils.decorators import method_decorator diff --git a/bookwyrm/views/admin/themes.py b/bookwyrm/views/admin/themes.py index 284a908336..f2c25d820f 100644 --- a/bookwyrm/views/admin/themes.py +++ b/bookwyrm/views/admin/themes.py @@ -1,4 +1,5 @@ -""" manage themes """ +"""manage themes""" + from django.contrib.auth.decorators import login_required, permission_required from django.shortcuts import get_object_or_404, redirect from django.template.response import TemplateResponse diff --git a/bookwyrm/views/admin/user_admin.py b/bookwyrm/views/admin/user_admin.py index eae2c67f6e..759f6ed55e 100644 --- a/bookwyrm/views/admin/user_admin.py +++ b/bookwyrm/views/admin/user_admin.py @@ -1,4 +1,5 @@ -""" manage user """ +"""manage user""" + from django.contrib.auth.decorators import login_required, permission_required from django.contrib.auth.models import Group from django.core.paginator import Paginator diff --git a/bookwyrm/views/annual_summary.py b/bookwyrm/views/annual_summary.py index 21ac53992d..68c929f4c8 100644 --- a/bookwyrm/views/annual_summary.py +++ b/bookwyrm/views/annual_summary.py @@ -1,4 +1,5 @@ """end-of-year read books stats""" + from datetime import date from uuid import uuid4 diff --git a/bookwyrm/views/author.py b/bookwyrm/views/author.py index 5ab9ff9f40..76e6981837 100644 --- a/bookwyrm/views/author.py +++ b/bookwyrm/views/author.py @@ -1,4 +1,4 @@ -""" the good people stuff! the authors! """ +"""the good people stuff! the authors!""" from django.contrib.auth.decorators import login_required, permission_required from django.core.paginator import Paginator diff --git a/bookwyrm/views/books/books.py b/bookwyrm/views/books/books.py index 4acebb2ac5..ced7807c56 100644 --- a/bookwyrm/views/books/books.py +++ b/bookwyrm/views/books/books.py @@ -1,4 +1,4 @@ -""" the good stuff! the books! """ +"""the good stuff! the books!""" from django.contrib.auth.decorators import login_required, permission_required from django.core.paginator import Paginator @@ -83,7 +83,9 @@ def get(self, request, book_id, **kwargs): queryset = queryset.select_related("user").order_by("-published_date") paginated = Paginator(queryset, PAGE_LENGTH) - lists = models.List.privacy_filter(request.user,).filter( + lists = models.List.privacy_filter( + request.user, + ).filter( listitem__approved=True, listitem__book__in=book.parent_work.editions.all(), ) diff --git a/bookwyrm/views/books/edit_book.py b/bookwyrm/views/books/edit_book.py index e0b5f73c86..188bdb2bbd 100644 --- a/bookwyrm/views/books/edit_book.py +++ b/bookwyrm/views/books/edit_book.py @@ -1,4 +1,4 @@ -""" the good stuff! the books! """ +"""the good stuff! the books!""" from re import sub, findall @@ -123,7 +123,7 @@ def post(self, request): # check if this is an edition of an existing work author_text = ", ".join(data.get("add_author", [])) data["book_matches"] = book_search.search( - f'{form.cleaned_data.get("title")} {author_text}', + f"{form.cleaned_data.get('title')} {author_text}", min_confidence=0.1, )[:5] diff --git a/bookwyrm/views/books/editions.py b/bookwyrm/views/books/editions.py index 5afe38dc42..78d29bde89 100644 --- a/bookwyrm/views/books/editions.py +++ b/bookwyrm/views/books/editions.py @@ -1,4 +1,4 @@ -""" the good stuff! the books! """ +"""the good stuff! the books!""" from functools import reduce import operator diff --git a/bookwyrm/views/books/links.py b/bookwyrm/views/books/links.py index 4793c60193..b69d4baa57 100644 --- a/bookwyrm/views/books/links.py +++ b/bookwyrm/views/books/links.py @@ -1,4 +1,4 @@ -""" the good stuff! the books! """ +"""the good stuff! the books!""" from django.contrib.auth.decorators import login_required, permission_required from django.db import transaction diff --git a/bookwyrm/views/books/series.py b/bookwyrm/views/books/series.py index 5e4ec05cad..f945c91993 100644 --- a/bookwyrm/views/books/series.py +++ b/bookwyrm/views/books/series.py @@ -1,4 +1,4 @@ -""" books belonging to the same series """ +"""books belonging to the same series""" from sys import float_info from django.views import View diff --git a/bookwyrm/views/directory.py b/bookwyrm/views/directory.py index 7b2ee78b51..505f12900e 100644 --- a/bookwyrm/views/directory.py +++ b/bookwyrm/views/directory.py @@ -1,4 +1,5 @@ -""" who all's here? """ +"""who all's here?""" + from django.contrib.auth.decorators import login_required from django.core.paginator import Paginator from django.shortcuts import redirect @@ -8,6 +9,7 @@ from bookwyrm import suggested_users + # pylint: disable=no-self-use @method_decorator(login_required, name="dispatch") class Directory(View): diff --git a/bookwyrm/views/discover.py b/bookwyrm/views/discover.py index 2ae4a93032..78d40f6042 100644 --- a/bookwyrm/views/discover.py +++ b/bookwyrm/views/discover.py @@ -1,4 +1,5 @@ -""" What's up locally """ +"""What's up locally""" + from django.contrib.auth.decorators import login_required from django.core.paginator import Paginator from django.db.models import Q diff --git a/bookwyrm/views/feed.py b/bookwyrm/views/feed.py index 65b4756899..4822fe9512 100644 --- a/bookwyrm/views/feed.py +++ b/bookwyrm/views/feed.py @@ -1,4 +1,5 @@ -""" non-interactive pages """ +"""non-interactive pages""" + from datetime import date from django.contrib.auth.decorators import login_required from django.core.paginator import Paginator diff --git a/bookwyrm/views/follow.py b/bookwyrm/views/follow.py index 5a0bb28ab3..3649116cbd 100644 --- a/bookwyrm/views/follow.py +++ b/bookwyrm/views/follow.py @@ -1,4 +1,5 @@ -""" views for actions you can take in the application """ +"""views for actions you can take in the application""" + import urllib.parse import re @@ -150,7 +151,6 @@ def ostatus_follow_request(request): # don't do these checks for AnonymousUser before they sign in if request.user.is_authenticated: - # you have blocked them so you probably don't want to follow if hasattr(request.user, "blocks") and user in request.user.blocks.all(): error = "is_blocked" diff --git a/bookwyrm/views/get_started.py b/bookwyrm/views/get_started.py index 9a28dfbcaf..4ced55567c 100644 --- a/bookwyrm/views/get_started.py +++ b/bookwyrm/views/get_started.py @@ -1,4 +1,4 @@ -""" Helping new users figure out the lay of the land """ +"""Helping new users figure out the lay of the land""" import re diff --git a/bookwyrm/views/goal.py b/bookwyrm/views/goal.py index b5fd5bdc21..da2fc88c27 100644 --- a/bookwyrm/views/goal.py +++ b/bookwyrm/views/goal.py @@ -1,4 +1,5 @@ -""" non-interactive pages """ +"""non-interactive pages""" + from django.contrib.auth.decorators import login_required from django.http import HttpResponseNotFound from django.shortcuts import redirect diff --git a/bookwyrm/views/group.py b/bookwyrm/views/group.py index 6d651a3922..94700ab8ff 100644 --- a/bookwyrm/views/group.py +++ b/bookwyrm/views/group.py @@ -1,4 +1,5 @@ """group views""" + from django.apps import apps from django.contrib.auth.decorators import login_required from django.db import IntegrityError, transaction diff --git a/bookwyrm/views/hashtag.py b/bookwyrm/views/hashtag.py index ec7b34f899..211e031597 100644 --- a/bookwyrm/views/hashtag.py +++ b/bookwyrm/views/hashtag.py @@ -1,4 +1,5 @@ -""" listing statuses for a given hashtag """ +"""listing statuses for a given hashtag""" + from django.core.paginator import Paginator from django.db.models import Q from django.views import View diff --git a/bookwyrm/views/helpers.py b/bookwyrm/views/helpers.py index aa8c254299..e639a8793e 100644 --- a/bookwyrm/views/helpers.py +++ b/bookwyrm/views/helpers.py @@ -1,4 +1,4 @@ -""" helper functions used in various views """ +"""helper functions used in various views""" import re from datetime import datetime, timedelta @@ -84,7 +84,6 @@ def handle_remote_webfinger(query, unknown_only=False, refresh=False): return None try: - if refresh: # Always fetch the remote info - don't even bother checking the DB raise models.User.DoesNotExist("remote_only is set to True") diff --git a/bookwyrm/views/imports/import_data.py b/bookwyrm/views/imports/import_data.py index 63270260d1..c144dd0550 100644 --- a/bookwyrm/views/imports/import_data.py +++ b/bookwyrm/views/imports/import_data.py @@ -1,4 +1,5 @@ -""" import books from another app """ +"""import books from another app""" + from io import TextIOWrapper import datetime from typing import Optional @@ -29,6 +30,7 @@ from bookwyrm.settings import PAGE_LENGTH from bookwyrm.utils.cache import get_or_set + # pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") class Import(View): diff --git a/bookwyrm/views/imports/import_status.py b/bookwyrm/views/imports/import_status.py index 0201a17741..815af17475 100644 --- a/bookwyrm/views/imports/import_status.py +++ b/bookwyrm/views/imports/import_status.py @@ -1,4 +1,5 @@ -""" import books from another app """ +"""import books from another app""" + from django.contrib.auth.decorators import login_required from django.core.exceptions import PermissionDenied from django.core.paginator import Paginator @@ -14,6 +15,7 @@ from bookwyrm.models.import_job import import_item_task from bookwyrm.settings import PAGE_LENGTH + # pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") class ImportStatus(View): diff --git a/bookwyrm/views/imports/manually_review.py b/bookwyrm/views/imports/manually_review.py index afbc900600..21d236f83e 100644 --- a/bookwyrm/views/imports/manually_review.py +++ b/bookwyrm/views/imports/manually_review.py @@ -1,4 +1,5 @@ -""" verify books we're unsure about """ +"""verify books we're unsure about""" + from django.contrib.auth.decorators import login_required from django.core.exceptions import PermissionDenied from django.core.paginator import Paginator @@ -12,6 +13,7 @@ from bookwyrm.models.import_job import import_item_task from bookwyrm.settings import PAGE_LENGTH + # pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") class ImportManualReview(View): diff --git a/bookwyrm/views/imports/troubleshoot.py b/bookwyrm/views/imports/troubleshoot.py index bb7f5f842a..fcacacc131 100644 --- a/bookwyrm/views/imports/troubleshoot.py +++ b/bookwyrm/views/imports/troubleshoot.py @@ -1,4 +1,5 @@ -""" import books from another app """ +"""import books from another app""" + from django.contrib.auth.decorators import login_required from django.core.exceptions import PermissionDenied from django.core.paginator import Paginator @@ -12,6 +13,7 @@ from bookwyrm.importers import Importer from bookwyrm.settings import PAGE_LENGTH + # pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") class ImportTroubleshoot(View): diff --git a/bookwyrm/views/imports/user_troubleshoot.py b/bookwyrm/views/imports/user_troubleshoot.py index bf2fed7e5c..19b4c9766c 100644 --- a/bookwyrm/views/imports/user_troubleshoot.py +++ b/bookwyrm/views/imports/user_troubleshoot.py @@ -1,4 +1,5 @@ -""" import books from another app """ +"""import books from another app""" + from django.contrib.auth.decorators import login_required from django.core.exceptions import PermissionDenied from django.core.paginator import Paginator @@ -13,6 +14,7 @@ from bookwyrm.views import user_import_available from bookwyrm.settings import PAGE_LENGTH + # pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") class UserImportTroubleshoot(View): diff --git a/bookwyrm/views/inbox.py b/bookwyrm/views/inbox.py index d21c5ca0c1..995d6c34c3 100644 --- a/bookwyrm/views/inbox.py +++ b/bookwyrm/views/inbox.py @@ -1,4 +1,5 @@ -""" incoming activities """ +"""incoming activities""" + import json import re import logging @@ -54,9 +55,9 @@ def post(self, request, username=None): return HttpResponseForbidden() if ( - not "object" in activity_json - or not "type" in activity_json - or not activity_json["type"] in activitypub.activity_objects + "object" not in activity_json + or "type" not in activity_json + or activity_json["type"] not in activitypub.activity_objects ): raise Http404() diff --git a/bookwyrm/views/interaction.py b/bookwyrm/views/interaction.py index 35441a2cf2..5d81063333 100644 --- a/bookwyrm/views/interaction.py +++ b/bookwyrm/views/interaction.py @@ -1,4 +1,5 @@ -""" boosts and favs """ +"""boosts and favs""" + from django.contrib.auth.decorators import login_required from django.core.cache import cache from django.db import IntegrityError diff --git a/bookwyrm/views/isbn.py b/bookwyrm/views/isbn.py index 3359f68d96..48ad67e4b2 100644 --- a/bookwyrm/views/isbn.py +++ b/bookwyrm/views/isbn.py @@ -1,4 +1,5 @@ -""" isbn search view """ +"""isbn search view""" + from django.core.paginator import Paginator from django.http import JsonResponse from django.template.response import TemplateResponse @@ -9,6 +10,7 @@ from bookwyrm.settings import PAGE_LENGTH from .helpers import is_api_request + # pylint: disable= no-self-use class Isbn(View): """search a book by isbn""" diff --git a/bookwyrm/views/landing/about.py b/bookwyrm/views/landing/about.py index 1beecf2426..0e80882f94 100644 --- a/bookwyrm/views/landing/about.py +++ b/bookwyrm/views/landing/about.py @@ -1,4 +1,5 @@ -""" non-interactive pages """ +"""non-interactive pages""" + from dateutil.relativedelta import relativedelta from django.http import Http404 from django.template.response import TemplateResponse diff --git a/bookwyrm/views/landing/landing.py b/bookwyrm/views/landing/landing.py index ca2b7ccc3f..4247c38af1 100644 --- a/bookwyrm/views/landing/landing.py +++ b/bookwyrm/views/landing/landing.py @@ -1,4 +1,5 @@ -""" non-interactive pages """ +"""non-interactive pages""" + from django.shortcuts import redirect from django.template.response import TemplateResponse from django.views import View diff --git a/bookwyrm/views/landing/login.py b/bookwyrm/views/landing/login.py index 959622e9f5..ba178611da 100644 --- a/bookwyrm/views/landing/login.py +++ b/bookwyrm/views/landing/login.py @@ -1,4 +1,5 @@ -""" class views for login/register views """ +"""class views for login/register views""" + import time from django.contrib.auth import authenticate, login, logout diff --git a/bookwyrm/views/landing/password.py b/bookwyrm/views/landing/password.py index 15d89a11b6..678e4dcd89 100644 --- a/bookwyrm/views/landing/password.py +++ b/bookwyrm/views/landing/password.py @@ -1,4 +1,5 @@ -""" class views for password management """ +"""class views for password management""" + from django.contrib.auth import login from django.core.exceptions import PermissionDenied, ObjectDoesNotExist from django.http import HttpResponseBadRequest diff --git a/bookwyrm/views/landing/register.py b/bookwyrm/views/landing/register.py index 5debd03cdc..a3df812f2d 100644 --- a/bookwyrm/views/landing/register.py +++ b/bookwyrm/views/landing/register.py @@ -1,4 +1,5 @@ -""" class views for login/register views """ +"""class views for login/register views""" + import zoneinfo from django.contrib.auth import login from django.core.exceptions import PermissionDenied diff --git a/bookwyrm/views/list/curate.py b/bookwyrm/views/list/curate.py index cf41636bae..cc0c552ea4 100644 --- a/bookwyrm/views/list/curate.py +++ b/bookwyrm/views/list/curate.py @@ -1,4 +1,5 @@ -""" book list views""" +"""book list views""" + from django.contrib.auth.decorators import login_required from django.db.models import Max from django.shortcuts import get_object_or_404, redirect diff --git a/bookwyrm/views/list/embed.py b/bookwyrm/views/list/embed.py index a62c9c1bac..e300168a03 100644 --- a/bookwyrm/views/list/embed.py +++ b/bookwyrm/views/list/embed.py @@ -1,4 +1,5 @@ -""" book list views""" +"""book list views""" + from django.core.paginator import Paginator from django.db.models import Avg, DecimalField from django.db.models.functions import Coalesce diff --git a/bookwyrm/views/list/list.py b/bookwyrm/views/list/list.py index 54b449207f..0af89cf55f 100644 --- a/bookwyrm/views/list/list.py +++ b/bookwyrm/views/list/list.py @@ -1,4 +1,5 @@ -""" book list views""" +"""book list views""" + from typing import Optional from django.contrib.auth.decorators import login_required @@ -216,10 +217,13 @@ def add_book(request): else: # add the book at the latest order of approved books, before pending books order_max = ( - book_list.listitem_set.filter(approved=True).aggregate(Max("order"))[ - "order__max" - ] - ) or 0 + ( + book_list.listitem_set.filter(approved=True).aggregate(Max("order"))[ + "order__max" + ] + ) + or 0 + ) increment_order_in_reverse(book_list.id, order_max + 1) item.order = order_max + 1 item.save() diff --git a/bookwyrm/views/list/list_item.py b/bookwyrm/views/list/list_item.py index 691df4da34..1de0df8351 100644 --- a/bookwyrm/views/list/list_item.py +++ b/bookwyrm/views/list/list_item.py @@ -1,4 +1,5 @@ -""" book list views""" +"""book list views""" + from django.contrib.auth.decorators import login_required from django.shortcuts import get_object_or_404, redirect from django.utils.decorators import method_decorator diff --git a/bookwyrm/views/list/lists.py b/bookwyrm/views/list/lists.py index 8990943889..5a2e7184e8 100644 --- a/bookwyrm/views/list/lists.py +++ b/bookwyrm/views/list/lists.py @@ -1,4 +1,5 @@ -""" book list views""" +"""book list views""" + from django.contrib.auth.decorators import login_required from django.core.paginator import Paginator from django.shortcuts import redirect @@ -14,6 +15,7 @@ logger = logging.getLogger(__name__) + # pylint: disable=no-self-use class Lists(View): """book list page""" diff --git a/bookwyrm/views/notifications.py b/bookwyrm/views/notifications.py index e4549ba983..d186cf3a6c 100644 --- a/bookwyrm/views/notifications.py +++ b/bookwyrm/views/notifications.py @@ -1,4 +1,5 @@ -""" non-interactive pages """ +"""non-interactive pages""" + from django.contrib.auth.decorators import login_required from django.template.response import TemplateResponse from django.utils.decorators import method_decorator diff --git a/bookwyrm/views/outbox.py b/bookwyrm/views/outbox.py index 4bc2d2b98e..8d619f5f17 100644 --- a/bookwyrm/views/outbox.py +++ b/bookwyrm/views/outbox.py @@ -1,4 +1,5 @@ -""" the good stuff! the books! """ +"""the good stuff! the books!""" + from django.http import JsonResponse from django.shortcuts import get_object_or_404 from django.views import View @@ -22,7 +23,7 @@ def get(self, request, username): user.to_outbox( **request.GET, filter_type=filter_type, - pure=not is_bookwyrm_request(request) + pure=not is_bookwyrm_request(request), ), encoder=activitypub.ActivityEncoder, ) diff --git a/bookwyrm/views/preferences/block.py b/bookwyrm/views/preferences/block.py index 2ccd3c0656..1bbaca1ff9 100644 --- a/bookwyrm/views/preferences/block.py +++ b/bookwyrm/views/preferences/block.py @@ -1,4 +1,5 @@ -""" views for actions you can take in the application """ +"""views for actions you can take in the application""" + from django.contrib.auth.decorators import login_required from django.shortcuts import get_object_or_404, redirect from django.template.response import TemplateResponse @@ -8,6 +9,7 @@ from bookwyrm import models + # pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") class Block(View): diff --git a/bookwyrm/views/preferences/change_password.py b/bookwyrm/views/preferences/change_password.py index d660355604..7544b9f646 100644 --- a/bookwyrm/views/preferences/change_password.py +++ b/bookwyrm/views/preferences/change_password.py @@ -1,4 +1,5 @@ -""" class views for password management """ +"""class views for password management""" + from django.contrib.auth import login from django.contrib.auth.decorators import login_required from django.template.response import TemplateResponse diff --git a/bookwyrm/views/preferences/delete_user.py b/bookwyrm/views/preferences/delete_user.py index 415b9babcf..2350e47ab0 100644 --- a/bookwyrm/views/preferences/delete_user.py +++ b/bookwyrm/views/preferences/delete_user.py @@ -1,4 +1,5 @@ -""" edit your own account """ +"""edit your own account""" + import time from django.contrib.auth import login, logout diff --git a/bookwyrm/views/preferences/edit_user.py b/bookwyrm/views/preferences/edit_user.py index 00bcd70aaa..307ef30d4c 100644 --- a/bookwyrm/views/preferences/edit_user.py +++ b/bookwyrm/views/preferences/edit_user.py @@ -1,4 +1,5 @@ -""" edit your own account """ +"""edit your own account""" + from io import BytesIO from uuid import uuid4 from PIL import Image diff --git a/bookwyrm/views/preferences/export.py b/bookwyrm/views/preferences/export.py index e13d488d46..a585ac273d 100644 --- a/bookwyrm/views/preferences/export.py +++ b/bookwyrm/views/preferences/export.py @@ -1,4 +1,5 @@ -""" Let users export their book data """ +"""Let users export their book data""" + from datetime import timedelta import csv import datetime @@ -23,6 +24,7 @@ from bookwyrm.models.bookwyrm_export_job import BookwyrmExportJob from bookwyrm.utils.cache import get_or_set + # pylint: disable=no-self-use,too-many-locals @method_decorator(login_required, name="dispatch") class Export(View): diff --git a/bookwyrm/views/preferences/move_user.py b/bookwyrm/views/preferences/move_user.py index 848628c889..3089c3e173 100644 --- a/bookwyrm/views/preferences/move_user.py +++ b/bookwyrm/views/preferences/move_user.py @@ -1,4 +1,4 @@ -""" move your account somewhere else """ +"""move your account somewhere else""" from django.core.exceptions import PermissionDenied from django.contrib.auth.decorators import login_required diff --git a/bookwyrm/views/preferences/security.py b/bookwyrm/views/preferences/security.py index 639cc3a3f6..34a72dbc0d 100644 --- a/bookwyrm/views/preferences/security.py +++ b/bookwyrm/views/preferences/security.py @@ -1,4 +1,5 @@ -""" class views for 2FA management """ +"""class views for 2FA management""" + from datetime import datetime, timedelta from importlib import import_module import pyotp @@ -23,6 +24,7 @@ SessionStore = import_module(settings.SESSION_ENGINE).SessionStore + # pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") class UserSecurity(View): diff --git a/bookwyrm/views/reading.py b/bookwyrm/views/reading.py index e39ad10675..b7dc85fa58 100644 --- a/bookwyrm/views/reading.py +++ b/bookwyrm/views/reading.py @@ -1,4 +1,4 @@ -""" the good stuff! the books! """ +"""the good stuff! the books!""" import logging from django.contrib.auth.decorators import login_required diff --git a/bookwyrm/views/relationships.py b/bookwyrm/views/relationships.py index 7164c25309..02c6a1f731 100644 --- a/bookwyrm/views/relationships.py +++ b/bookwyrm/views/relationships.py @@ -1,4 +1,5 @@ -""" Following and followers lists """ +"""Following and followers lists""" + from django.core.exceptions import PermissionDenied from django.core.paginator import Paginator from django.db.models import Q, Count diff --git a/bookwyrm/views/report.py b/bookwyrm/views/report.py index 121b7a232e..abfbe5a73b 100644 --- a/bookwyrm/views/report.py +++ b/bookwyrm/views/report.py @@ -1,4 +1,5 @@ -""" moderation via flagged posts and users """ +"""moderation via flagged posts and users""" + from django.contrib.auth.decorators import login_required from django.shortcuts import get_object_or_404, redirect from django.template.response import TemplateResponse diff --git a/bookwyrm/views/rss_feed.py b/bookwyrm/views/rss_feed.py index 2a80cb9fba..588ce8dc7f 100644 --- a/bookwyrm/views/rss_feed.py +++ b/bookwyrm/views/rss_feed.py @@ -1,4 +1,4 @@ -""" serialize user's posts in rss feed """ +"""serialize user's posts in rss feed""" from django.contrib.syndication.views import Feed from django.template.loader import get_template @@ -8,6 +8,7 @@ from .helpers import get_user_from_username + # pylint: disable=no-self-use class RssFeed(Feed): """serialize user's posts in rss feed""" @@ -195,9 +196,7 @@ def item_title(self, item): template = get_template("rss/title.html") return template.render({"user": authors, "item_title": item.title}).strip() - def get_object( - self, request, shelf_identifier, username - ): # pylint: disable=arguments-differ + def get_object(self, request, shelf_identifier, username): # pylint: disable=arguments-differ """the shelf that gets serialized""" user = get_user_from_username(request.user, username) # always get privacy, don't support rss over anything private diff --git a/bookwyrm/views/search.py b/bookwyrm/views/search.py index 498196c5b9..8324c2a62a 100644 --- a/bookwyrm/views/search.py +++ b/bookwyrm/views/search.py @@ -1,4 +1,4 @@ -""" search views""" +"""search views""" import re @@ -48,7 +48,7 @@ def get(self, request): "user": user_search, "list": list_search, } - if not search_type in endpoints: + if search_type not in endpoints: search_type = "book" return endpoints[search_type](request) diff --git a/bookwyrm/views/server_error.py b/bookwyrm/views/server_error.py index 658974dd1a..3bfd752a57 100644 --- a/bookwyrm/views/server_error.py +++ b/bookwyrm/views/server_error.py @@ -1,4 +1,5 @@ """custom 500 handler to enable context processors""" + from django.template.response import TemplateResponse diff --git a/bookwyrm/views/setup.py b/bookwyrm/views/setup.py index 8d67f35c67..b74b05f5ca 100644 --- a/bookwyrm/views/setup.py +++ b/bookwyrm/views/setup.py @@ -1,4 +1,5 @@ -""" Installation wizard 🧙 """ +"""Installation wizard 🧙""" + import re from django.contrib.auth import login diff --git a/bookwyrm/views/shelf/shelf.py b/bookwyrm/views/shelf/shelf.py index ad6a83a8f3..02b5426161 100644 --- a/bookwyrm/views/shelf/shelf.py +++ b/bookwyrm/views/shelf/shelf.py @@ -1,4 +1,5 @@ -""" shelf views """ +"""shelf views""" + from collections import namedtuple from django.db.models import OuterRef, Subquery, F, Max diff --git a/bookwyrm/views/shelf/shelf_actions.py b/bookwyrm/views/shelf/shelf_actions.py index d68ea42198..8a00a6b9a3 100644 --- a/bookwyrm/views/shelf/shelf_actions.py +++ b/bookwyrm/views/shelf/shelf_actions.py @@ -1,4 +1,4 @@ -""" shelf views """ +"""shelf views""" from django.db import IntegrityError, transaction from django.contrib.auth.decorators import login_required diff --git a/bookwyrm/views/status.py b/bookwyrm/views/status.py index 99401431ba..22083e5252 100644 --- a/bookwyrm/views/status.py +++ b/bookwyrm/views/status.py @@ -1,4 +1,4 @@ -""" what are we here for if not for posting """ +"""what are we here for if not for posting""" import re import logging diff --git a/bookwyrm/views/updates.py b/bookwyrm/views/updates.py index 82e8576480..5a38d251ca 100644 --- a/bookwyrm/views/updates.py +++ b/bookwyrm/views/updates.py @@ -1,4 +1,5 @@ -""" endpoints for getting updates about activity """ +"""endpoints for getting updates about activity""" + from django.contrib.auth.decorators import login_required from django.http import Http404, JsonResponse from django.utils.translation import ngettext diff --git a/bookwyrm/views/user.py b/bookwyrm/views/user.py index 0c383983cc..4441e8bb5d 100644 --- a/bookwyrm/views/user.py +++ b/bookwyrm/views/user.py @@ -1,4 +1,5 @@ -""" The user profile """ +"""The user profile""" + from django.contrib.auth.decorators import login_required from django.core.paginator import Paginator from django.db.models import Q diff --git a/bookwyrm/views/wellknown.py b/bookwyrm/views/wellknown.py index 531ab3486b..ef5db9f423 100644 --- a/bookwyrm/views/wellknown.py +++ b/bookwyrm/views/wellknown.py @@ -1,4 +1,4 @@ -""" responds to various requests to /.well-know """ +"""responds to various requests to /.well-know""" from dateutil.relativedelta import relativedelta from django.http import HttpResponseNotFound diff --git a/bw-dev b/bw-dev index f34d210589..1e39a1f011 100755 --- a/bw-dev +++ b/bw-dev @@ -191,14 +191,25 @@ case "$CMD" in prod_error clean ;; - black) + ruff) prod_error - $DOCKER_COMPOSE run --rm dev-tools black celerywyrm bookwyrm + $DOCKER_COMPOSE run --rm dev-tools ruff format celerywyrm bookwyrm + runweb ruff check bookwyrm/ ;; - pylint) + ruff-format) prod_error - # pylint depends on having the app dependencies in place, so we run it in the web container - runweb pylint bookwyrm/ + $DOCKER_COMPOSE run --rm dev-tools ruff format celerywyrm bookwyrm + ;; + ruff-check) + prod_error + # ruff check depends on having the app dependencies in place, so we run it in the web container + runweb ruff check bookwyrm/ + ;; + ruff-fix) + prod_error + # Auto-fix ruff issues that can be fixed automatically + # ruff check depends on having the app dependencies in place, so we run it in the web container + runweb ruff check --fix bookwyrm/ ;; prettier) prod_error @@ -215,8 +226,8 @@ case "$CMD" in ;; formatters) prod_error - runweb pylint bookwyrm/ - $DOCKER_COMPOSE run --rm dev-tools black celerywyrm bookwyrm + runweb ruff check bookwyrm/ + $DOCKER_COMPOSE run --rm dev-tools ruff format celerywyrm bookwyrm $DOCKER_COMPOSE run --rm dev-tools prettier --write bookwyrm/static/js/*.js $DOCKER_COMPOSE run --rm dev-tools eslint bookwyrm/static --ext .js $DOCKER_COMPOSE run --rm dev-tools stylelint --fix bookwyrm/static/css \ @@ -337,7 +348,10 @@ case "$CMD" in echo " update_locales" echo " build" echo " clean" - echo " black" + echo " ruff (format and check)" + echo " ruff-format (format code only)" + echo " ruff-check (check code only)" + echo " ruff-fix (auto-fix ruff issues)" echo " prettier" echo " eslint" echo " stylelint" diff --git a/celerywyrm/__init__.py b/celerywyrm/__init__.py index fe0c87ff12..126841352f 100644 --- a/celerywyrm/__init__.py +++ b/celerywyrm/__init__.py @@ -1,4 +1,5 @@ -""" we need this file to initialize celery """ +"""we need this file to initialize celery""" + from __future__ import absolute_import, unicode_literals # This will make sure the app is always imported when diff --git a/celerywyrm/celery.py b/celerywyrm/celery.py index 8e45db9086..a90a38fa96 100644 --- a/celerywyrm/celery.py +++ b/celerywyrm/celery.py @@ -1,4 +1,5 @@ -""" configures celery for task management """ +"""configures celery for task management""" + from __future__ import absolute_import, unicode_literals import os diff --git a/celerywyrm/settings.py b/celerywyrm/settings.py index 3ca9b27486..3b05fa45eb 100644 --- a/celerywyrm/settings.py +++ b/celerywyrm/settings.py @@ -1,4 +1,5 @@ -""" bookwyrm settings and configuration """ +"""bookwyrm settings and configuration""" + # pylint: disable=wildcard-import # pylint: disable=unused-wildcard-import from bookwyrm.settings import * diff --git a/celerywyrm/urls.py b/celerywyrm/urls.py index 394c0ef0d5..3b4a1f10e1 100644 --- a/celerywyrm/urls.py +++ b/celerywyrm/urls.py @@ -13,6 +13,7 @@ 1. Import the include() function: from django.urls import include, path 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) """ + from django.contrib import admin from django.conf.urls.static import static from django.urls import path diff --git a/complete_bwdev.fish b/complete_bwdev.fish index f700dee1b5..47698a86af 100644 --- a/complete_bwdev.fish +++ b/complete_bwdev.fish @@ -21,7 +21,10 @@ compilemessages \ update_locales \ build \ clean \ -black \ +ruff \ +ruff-format \ +ruff-check \ +ruff-fix \ prettier \ eslint \ stylelint \ @@ -64,7 +67,10 @@ __bw_complete "$commands" "compilemessages" "compile .po local __bw_complete "$commands" "update_locales" "run makemessages and compilemessages for the en_US and additional locales" __bw_complete "$commands" "build" "build the containers" __bw_complete "$commands" "clean" "bring the cluster down and remove all containers" -__bw_complete "$commands" "black" "run Python code formatting tool" +__bw_complete "$commands" "ruff" "run ruff (format and check Python code)" +__bw_complete "$commands" "ruff-format" "run ruff format (format Python code only)" +__bw_complete "$commands" "ruff-check" "run ruff check (lint Python code only)" +__bw_complete "$commands" "ruff-fix" "run ruff check --fix (auto-fix ruff issues)" __bw_complete "$commands" "prettier" "run JavaScript code formatting tool" __bw_complete "$commands" "eslint" "run JavaScript linting tool" __bw_complete "$commands" "stylelint" "run SCSS linting tool" diff --git a/complete_bwdev.sh b/complete_bwdev.sh index c3f705ffc4..f15c122fa3 100644 --- a/complete_bwdev.sh +++ b/complete_bwdev.sh @@ -18,7 +18,10 @@ compilemessages update_locales build clean -black +ruff +ruff-format +ruff-check +ruff-fix prettier eslint stylelint diff --git a/complete_bwdev.zsh b/complete_bwdev.zsh index 72e9654aca..a8112df000 100644 --- a/complete_bwdev.zsh +++ b/complete_bwdev.zsh @@ -20,7 +20,10 @@ compilemessages update_locales build clean -black +ruff +ruff-format +ruff-check +ruff-fix prettier eslint stylelint diff --git a/dev-tools/requirements.txt b/dev-tools/requirements.txt index 3bb771f5a0..29a810a983 100644 --- a/dev-tools/requirements.txt +++ b/dev-tools/requirements.txt @@ -1 +1 @@ -black==22.* +ruff>=0.1.0 diff --git a/pyproject.toml b/pyproject.toml index 292ca8c41e..962bd6e8c0 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,2 +1,48 @@ -[tool.black] -required-version = "22" +[tool.ruff] +exclude = [ + "migrations", +] + +line-length = 88 + +target-version = "py311" + +# Only select essential rules to minimize code changes +# E = pycodestyle errors (syntax errors, indentation issues) +# W = pycodestyle warnings (whitespace, etc.) +# F = pyflakes (unused imports, undefined names - critical errors only) +lint.select = [ + "E", # pycodestyle errors + "W", # pycodestyle warnings + "F", # pyflakes (critical errors only) +] + +# Ignore rules that would require code changes +lint.ignore = [ + "E501", # line too long (handled by formatter) + "E722", # bare except (too opinionated) + "E731", # lambda assignment (was disabled in pylint) +# "W503", # line break before binary operator (conflicts with formatter) + "F401", # unused imports (can be noisy, disable to minimize changes) + "F403", # star import (unable to detect undefined names from star imports) + "F841", # unused variable (can be noisy) +] + +# Per-file ignores for files with star imports +# Star imports make it impossible to detect undefined names +[tool.ruff.lint.per-file-ignores] +"bookwyrm/views/__init__.py" = ["F821"] # undefined name (due to star import from .wellknown) + +[tool.ruff.format] +# Use double quotes for strings (black-compatible) +quote-style = "double" +# Use spaces for indentation (black-compatible) +indent-style = "space" +# Respect magic trailing comma (black-compatible) +skip-magic-trailing-comma = false +# Line ending style +line-ending = "auto" +# Docstring code format - preserve existing style +docstring-code-format = false +# Docstring code line length - use same as line-length +docstring-code-line-length = "dynamic" diff --git a/requirements.txt b/requirements.txt index 1fe88baf6b..f6dc70f766 100644 --- a/requirements.txt +++ b/requirements.txt @@ -47,11 +47,10 @@ setuptools>=65.5.1 tornado>=6.3.3 # Dev -black==22.* +ruff>=0.1.0 celery-types==0.22.0 django-stubs[compatible-mypy]==4.2.7 mypy==1.7.1 -pylint==3.2.6 pytest==8.1.1 pytest-cov==5.0.0 pytest-django==4.8.0 From e860520256341271496e6860491e0d6d88d8f7ea Mon Sep 17 00:00:00 2001 From: kasiarog Date: Tue, 2 Dec 2025 14:14:21 +0100 Subject: [PATCH 192/962] remove pylint ignores & correct ruff commands --- bookwyrm/activitypub/base_activity.py | 8 +----- bookwyrm/activitypub/book.py | 4 --- bookwyrm/activitypub/note.py | 5 +--- bookwyrm/activitypub/ordered_collection.py | 2 -- bookwyrm/activitypub/person.py | 2 -- bookwyrm/activitystreams.py | 13 ++------- bookwyrm/apps.py | 3 +- bookwyrm/book_search.py | 2 -- bookwyrm/connectors/abstract_connector.py | 8 +++--- bookwyrm/connectors/connector_manager.py | 1 - bookwyrm/connectors/inventaire.py | 2 +- bookwyrm/forms/admin.py | 2 -- bookwyrm/forms/author.py | 1 - bookwyrm/forms/books.py | 1 - bookwyrm/forms/custom_form.py | 1 - bookwyrm/forms/edit_user.py | 1 - bookwyrm/forms/forms.py | 1 - bookwyrm/forms/groups.py | 1 - bookwyrm/forms/landing.py | 1 - bookwyrm/forms/links.py | 1 - bookwyrm/forms/lists.py | 1 - bookwyrm/forms/status.py | 1 - bookwyrm/forms/user_admin.py | 1 - bookwyrm/importers/bookwyrm_import.py | 1 - bookwyrm/importers/importer.py | 5 +--- bookwyrm/lists_stream.py | 13 ++------- .../commands/add_finna_connector.py | 2 -- bookwyrm/management/commands/admin_code.py | 1 - .../management/commands/compile_themes.py | 1 - .../commands/deduplicate_book_data.py | 1 - .../commands/erase_deleted_user_data.py | 5 ++-- bookwyrm/management/commands/erase_streams.py | 1 - .../management/commands/fix_isbn10_entries.py | 1 - .../commands/generate_preview_images.py | 4 --- bookwyrm/management/commands/initdb.py | 3 -- .../commands/populate_lists_streams.py | 1 - .../management/commands/populate_streams.py | 1 - .../commands/populate_suggestions.py | 1 - .../management/commands/remove_editions.py | 1 - .../remove_remote_user_preview_images.py | 2 -- .../management/commands/repair_editions.py | 1 - .../commands/revoke_preview_image_tasks.py | 1 - .../commands/show_duplicate_authors.py | 1 - bookwyrm/management/merge_command.py | 1 - bookwyrm/middleware/file_too_big.py | 2 +- bookwyrm/models/activitypub_mixin.py | 4 +-- bookwyrm/models/author.py | 2 -- bookwyrm/models/base_model.py | 1 - bookwyrm/models/book.py | 7 +---- bookwyrm/models/bookwyrm_export_job.py | 4 +-- bookwyrm/models/bookwyrm_import_job.py | 11 ++++---- bookwyrm/models/favorite.py | 1 - bookwyrm/models/fields.py | 15 +++------- bookwyrm/models/group.py | 2 +- bookwyrm/models/housekeeping.py | 4 +-- bookwyrm/models/import_job.py | 5 +--- bookwyrm/models/job.py | 10 +++---- bookwyrm/models/notification.py | 14 ---------- bookwyrm/models/relationship.py | 2 +- bookwyrm/models/site.py | 4 --- bookwyrm/models/status.py | 7 ++--- bookwyrm/models/user.py | 6 ++-- bookwyrm/preview_images.py | 4 +-- bookwyrm/redis_store.py | 3 +- bookwyrm/settings.py | 2 -- bookwyrm/suggested_users.py | 13 +++------ bookwyrm/templatetags/utilities.py | 1 - bookwyrm/tests/__init__.py | 2 +- bookwyrm/tests/activitypub/__init__.py | 3 +- .../tests/activitypub/test_base_activity.py | 4 +-- bookwyrm/tests/activitypub/test_person.py | 1 - bookwyrm/tests/activitystreams/__init__.py | 3 +- bookwyrm/tests/connectors/__init__.py | 3 +- .../connectors/test_openlibrary_connector.py | 1 - bookwyrm/tests/importers/__init__.py | 3 +- .../tests/importers/test_bookwyrm_import.py | 2 +- .../tests/importers/test_calibre_import.py | 2 +- .../tests/importers/test_goodreads_import.py | 2 +- bookwyrm/tests/importers/test_importer.py | 2 +- .../importers/test_librarything_import.py | 2 +- .../importers/test_openlibrary_import.py | 2 +- .../tests/importers/test_openreads_import.py | 1 - .../tests/importers/test_storygraph_import.py | 2 +- bookwyrm/tests/lists_stream/__init__.py | 3 +- bookwyrm/tests/management/__init__.py | 3 +- bookwyrm/tests/models/__init__.py | 3 +- .../tests/models/test_activitypub_mixin.py | 5 ++-- bookwyrm/tests/models/test_base_model.py | 1 - bookwyrm/tests/models/test_book_model.py | 1 - .../tests/models/test_bookwyrm_export_job.py | 2 +- .../tests/models/test_bookwyrm_import_job.py | 6 ++-- bookwyrm/tests/models/test_fields.py | 2 -- bookwyrm/tests/models/test_status_model.py | 3 -- bookwyrm/tests/models/test_user_model.py | 2 -- bookwyrm/tests/templatetags/__init__.py | 3 +- bookwyrm/tests/test_book_search.py | 1 - bookwyrm/tests/test_partial_date.py | 4 --- bookwyrm/tests/test_preview_images.py | 2 -- bookwyrm/tests/test_signing.py | 2 +- bookwyrm/tests/views/__init__.py | 3 +- bookwyrm/tests/views/admin/__init__.py | 3 +- bookwyrm/tests/views/books/__init__.py | 3 +- bookwyrm/tests/views/books/test_edit_book.py | 2 +- bookwyrm/tests/views/imports/__init__.py | 3 +- bookwyrm/tests/views/inbox/__init__.py | 3 +- bookwyrm/tests/views/inbox/test_inbox.py | 1 - bookwyrm/tests/views/landing/__init__.py | 3 +- bookwyrm/tests/views/landing/test_register.py | 1 - bookwyrm/tests/views/lists/__init__.py | 3 +- bookwyrm/tests/views/lists/test_list.py | 1 - bookwyrm/tests/views/preferences/__init__.py | 3 +- .../tests/views/preferences/test_export.py | 2 +- bookwyrm/tests/views/shelf/__init__.py | 3 +- bookwyrm/tests/views/test_group.py | 1 - bookwyrm/tests/views/test_helpers.py | 3 +- bookwyrm/tests/views/test_status.py | 1 - bookwyrm/thumbnail_generation.py | 6 ++-- bookwyrm/urls.py | 5 ++-- bookwyrm/utils/images.py | 2 +- bookwyrm/utils/partial_date.py | 2 -- bookwyrm/views/admin/announcements.py | 3 +- bookwyrm/views/admin/automod.py | 4 --- bookwyrm/views/admin/celery_status.py | 8 ++---- bookwyrm/views/admin/connectors.py | 4 --- bookwyrm/views/admin/dashboard.py | 3 +- bookwyrm/views/admin/email_blocklist.py | 2 -- bookwyrm/views/admin/email_config.py | 3 +- bookwyrm/views/admin/federation.py | 4 --- bookwyrm/views/admin/federation_settings.py | 1 - bookwyrm/views/admin/files_maintenance.py | 3 -- bookwyrm/views/admin/imports.py | 8 +----- bookwyrm/views/admin/invite.py | 5 ++-- bookwyrm/views/admin/ip_blocklist.py | 2 -- bookwyrm/views/admin/link_domains.py | 1 - bookwyrm/views/admin/reports.py | 1 - bookwyrm/views/admin/schedule.py | 2 -- bookwyrm/views/admin/site.py | 1 - bookwyrm/views/admin/themes.py | 5 +--- bookwyrm/views/admin/user_admin.py | 5 +--- bookwyrm/views/annual_summary.py | 3 +- bookwyrm/views/author.py | 3 -- bookwyrm/views/books/books.py | 1 - bookwyrm/views/books/edit_book.py | 4 --- bookwyrm/views/books/editions.py | 1 - bookwyrm/views/books/links.py | 2 -- bookwyrm/views/books/series.py | 1 - bookwyrm/views/directory.py | 1 - bookwyrm/views/discover.py | 1 - bookwyrm/views/feed.py | 2 -- bookwyrm/views/get_started.py | 1 - bookwyrm/views/goal.py | 1 - bookwyrm/views/group.py | 4 --- bookwyrm/views/hashtag.py | 2 -- bookwyrm/views/helpers.py | 2 -- bookwyrm/views/imports/import_data.py | 4 +-- bookwyrm/views/imports/import_status.py | 2 -- bookwyrm/views/imports/manually_review.py | 3 -- bookwyrm/views/imports/troubleshoot.py | 1 - bookwyrm/views/imports/user_troubleshoot.py | 1 - bookwyrm/views/inbox.py | 1 - bookwyrm/views/interaction.py | 1 - bookwyrm/views/isbn.py | 1 - bookwyrm/views/landing/landing.py | 1 - bookwyrm/views/landing/login.py | 2 -- bookwyrm/views/landing/password.py | 1 - bookwyrm/views/landing/register.py | 3 +- bookwyrm/views/list/curate.py | 1 - bookwyrm/views/list/embed.py | 1 - bookwyrm/views/list/list.py | 1 - bookwyrm/views/list/list_item.py | 1 - bookwyrm/views/list/lists.py | 2 -- bookwyrm/views/notifications.py | 1 - bookwyrm/views/outbox.py | 1 - bookwyrm/views/permission_denied.py | 2 +- bookwyrm/views/preferences/block.py | 1 - bookwyrm/views/preferences/change_password.py | 1 - bookwyrm/views/preferences/delete_user.py | 1 - bookwyrm/views/preferences/edit_user.py | 1 - bookwyrm/views/preferences/export.py | 6 +--- bookwyrm/views/preferences/move_user.py | 2 -- bookwyrm/views/preferences/security.py | 3 -- bookwyrm/views/reading.py | 2 -- bookwyrm/views/relationships.py | 1 - bookwyrm/views/report.py | 1 - bookwyrm/views/rss_feed.py | 11 ++++---- bookwyrm/views/search.py | 1 - bookwyrm/views/setup.py | 2 -- bookwyrm/views/shelf/shelf.py | 2 -- bookwyrm/views/status.py | 7 ++--- bookwyrm/views/user.py | 2 -- bw-dev | 11 +++----- celerywyrm/celery.py | 2 +- celerywyrm/settings.py | 4 +-- pyproject.toml | 28 ++++--------------- 194 files changed, 128 insertions(+), 453 deletions(-) diff --git a/bookwyrm/activitypub/base_activity.py b/bookwyrm/activitypub/base_activity.py index 5560fafb78..77018ec52b 100644 --- a/bookwyrm/activitypub/base_activity.py +++ b/bookwyrm/activitypub/base_activity.py @@ -21,7 +21,7 @@ logger = logging.getLogger(__name__) -# pylint: disable=invalid-name + TBookWyrmModel = TypeVar("TBookWyrmModel", bound=base_model.BookWyrmModel) @@ -37,7 +37,6 @@ def default(self, o): @dataclass -# pylint: disable=invalid-name class Signature: """public key block""" @@ -112,7 +111,6 @@ def __init__( value = field.default setattr(self, field.name, value) - # pylint: disable=too-many-locals,too-many-branches,too-many-arguments def to_model( self, model: Optional[type[TBookWyrmModel]] = None, @@ -318,7 +316,6 @@ def get_model_from_type(activity_type): return model[0] -# pylint: disable=too-many-arguments @overload def resolve_remote_id( remote_id: str, @@ -330,7 +327,6 @@ def resolve_remote_id( ) -> TBookWyrmModel: ... -# pylint: disable=too-many-arguments @overload def resolve_remote_id( remote_id: str, @@ -342,7 +338,6 @@ def resolve_remote_id( ) -> base_model.BookWyrmModel: ... -# pylint: disable=too-many-arguments def resolve_remote_id( remote_id: str, model: Optional[Union[str, type[base_model.BookWyrmModel]]] = None, @@ -434,7 +429,6 @@ def get_activitypub_data(url): resp = requests.get( url, headers={ - # pylint: disable=line-too-long "Accept": 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"', "Date": now, "Signature": make_signature("get", sender, url, now), diff --git a/bookwyrm/activitypub/book.py b/bookwyrm/activitypub/book.py index dd1bb22dfe..26f580b591 100644 --- a/bookwyrm/activitypub/book.py +++ b/bookwyrm/activitypub/book.py @@ -7,7 +7,6 @@ from .image import Document -# pylint: disable=invalid-name @dataclass(init=False) class BookData(ActivityObject): """shared fields for all book data and authors""" @@ -26,7 +25,6 @@ class BookData(ActivityObject): lastEditedBy: Optional[str] = None -# pylint: disable=invalid-name @dataclass(init=False) class Book(BookData): """serializes an edition or work, abstract""" @@ -51,7 +49,6 @@ class Book(BookData): type: str = "Book" -# pylint: disable=invalid-name @dataclass(init=False) class Edition(Book): """Edition instance of a book object""" @@ -78,7 +75,6 @@ class Work(Book): type: str = "Work" -# pylint: disable=invalid-name @dataclass(init=False) class Author(BookData): """author of a book""" diff --git a/bookwyrm/activitypub/note.py b/bookwyrm/activitypub/note.py index 9139889d25..ec7ebf4acd 100644 --- a/bookwyrm/activitypub/note.py +++ b/bookwyrm/activitypub/note.py @@ -17,13 +17,12 @@ class Tombstone(ActivityObject): type: str = "Tombstone" - def to_model(self, *args, **kwargs): # pylint: disable=unused-argument + def to_model(self, *args, **kwargs): """this should never really get serialized, just searched for""" model = apps.get_model("bookwyrm.Status") return model.find_existing_by_remote_id(self.id) -# pylint: disable=invalid-name @dataclass(init=False) class Note(ActivityObject): """Note activity""" @@ -42,7 +41,6 @@ class Note(ActivityObject): updated: str = None type: str = "Note" - # pylint: disable=too-many-arguments def to_model( self, model=None, @@ -100,7 +98,6 @@ class GeneratedNote(Note): type: str = "GeneratedNote" -# pylint: disable=invalid-name @dataclass(init=False) class Comment(Note): """like a note but with a book""" diff --git a/bookwyrm/activitypub/ordered_collection.py b/bookwyrm/activitypub/ordered_collection.py index 65e386a6a2..c955aa35ea 100644 --- a/bookwyrm/activitypub/ordered_collection.py +++ b/bookwyrm/activitypub/ordered_collection.py @@ -6,7 +6,6 @@ from .base_activity import ActivityObject -# pylint: disable=invalid-name @dataclass(init=False) class OrderedCollection(ActivityObject): """structure of an ordered collection activity""" @@ -43,7 +42,6 @@ class BookList(OrderedCollectionPrivate): type: str = "BookList" -# pylint: disable=invalid-name @dataclass(init=False) class OrderedCollectionPage(ActivityObject): """structure of an ordered collection activity""" diff --git a/bookwyrm/activitypub/person.py b/bookwyrm/activitypub/person.py index 1f978f3c32..e661a009d7 100644 --- a/bookwyrm/activitypub/person.py +++ b/bookwyrm/activitypub/person.py @@ -7,7 +7,6 @@ from .image import Image -# pylint: disable=invalid-name @dataclass(init=False) class PublicKey(ActivityObject): """public key block""" @@ -22,7 +21,6 @@ def serialize(self, **kwargs): return super().serialize(omit=omit) -# pylint: disable=invalid-name @dataclass(init=False) class Person(ActivityObject): """actor activitypub json""" diff --git a/bookwyrm/activitystreams.py b/bookwyrm/activitystreams.py index ef02c8ca23..599a41a32d 100644 --- a/bookwyrm/activitystreams.py +++ b/bookwyrm/activitystreams.py @@ -107,7 +107,7 @@ def populate_streams(self, user): self.populate_store(self.stream_id(user.id)) @tracer.start_as_current_span("ActivityStream._get_audience") - def _get_audience(self, status): # pylint: disable=no-self-use + def _get_audience(self, status): """given a status, what users should see it, excluding the author""" trace.get_current_span().set_attribute("status_type", status.status_type) trace.get_current_span().set_attribute("status_privacy", status.privacy) @@ -163,7 +163,7 @@ def get_stores_for_users(self, user_ids): """convert a list of user ids into redis store ids""" return [self.stream_id(user_id) for user_id in user_ids] - def get_statuses_for_user(self, user): # pylint: disable=no-self-use + def get_statuses_for_user(self, user): """given a user, what statuses should they see on this stream""" return models.Status.privacy_filter( user, @@ -315,7 +315,6 @@ def remove_book_statuses(self, user, book): @receiver(signals.post_save) -# pylint: disable=unused-argument def add_status_on_create(sender, instance, created, *args, **kwargs): """add newly created statuses to activity feeds""" # we're only interested in new statuses @@ -366,7 +365,6 @@ def add_status_on_create_command(sender, instance, created): @receiver(signals.post_delete, sender=models.Boost) -# pylint: disable=unused-argument def remove_boost_on_delete(sender, instance, *args, **kwargs): """boosts are deleted""" # remove the boost @@ -376,7 +374,6 @@ def remove_boost_on_delete(sender, instance, *args, **kwargs): @receiver(signals.post_save, sender=models.UserFollows) -# pylint: disable=unused-argument def add_statuses_on_follow(sender, instance, created, *args, **kwargs): """add a newly followed user's statuses to feeds""" if not created or not instance.user_subject.local: @@ -387,7 +384,6 @@ def add_statuses_on_follow(sender, instance, created, *args, **kwargs): @receiver(signals.post_delete, sender=models.UserFollows) -# pylint: disable=unused-argument def remove_statuses_on_unfollow(sender, instance, *args, **kwargs): """remove statuses from a feed on unfollow""" if not instance.user_subject.local: @@ -398,7 +394,6 @@ def remove_statuses_on_unfollow(sender, instance, *args, **kwargs): @receiver(signals.post_save, sender=models.UserBlocks) -# pylint: disable=unused-argument def remove_statuses_on_block(sender, instance, *args, **kwargs): """remove statuses from all feeds on block""" # blocks apply ot all feeds @@ -415,7 +410,6 @@ def remove_statuses_on_block(sender, instance, *args, **kwargs): @receiver(signals.post_delete, sender=models.UserBlocks) -# pylint: disable=unused-argument def add_statuses_on_unblock(sender, instance, *args, **kwargs): """add statuses back to all feeds on unblock""" # make sure there isn't a block in the other direction @@ -445,7 +439,6 @@ def add_statuses_on_unblock(sender, instance, *args, **kwargs): @receiver(signals.post_save, sender=models.User) -# pylint: disable=unused-argument def populate_streams_on_account_create(sender, instance, created, *args, **kwargs): """build a user's feeds when they join""" if not created or not instance.local: @@ -462,7 +455,6 @@ def populate_streams_on_account_create_command(instance_id): @receiver(signals.pre_save, sender=models.ShelfBook) -# pylint: disable=unused-argument def add_statuses_on_shelve(sender, instance, *args, **kwargs): """update books stream when user shelves a book""" if not instance.user.local: @@ -478,7 +470,6 @@ def add_statuses_on_shelve(sender, instance, *args, **kwargs): @receiver(signals.post_delete, sender=models.ShelfBook) -# pylint: disable=unused-argument def remove_statuses_on_unshelve(sender, instance, *args, **kwargs): """update books stream when user unshelves a book""" if not instance.user.local: diff --git a/bookwyrm/apps.py b/bookwyrm/apps.py index d5384bb7b5..7667220b51 100644 --- a/bookwyrm/apps.py +++ b/bookwyrm/apps.py @@ -23,7 +23,7 @@ def download_file(url, destination): logger.error("Failed to download file %s: %s", url, err) except OSError as err: logger.error("Couldn't open font file %s for writing: %s", destination, err) - except Exception as err: # pylint:disable=broad-except + except Exception as err: logger.error("Unknown error in file download: %s", err) @@ -36,7 +36,6 @@ class BookwyrmConfig(AppConfig): def ready(self): """set up OTLP and preview image files, if desired""" if settings.OTEL_EXPORTER_OTLP_ENDPOINT or settings.OTEL_EXPORTER_CONSOLE: - # pylint: disable=import-outside-toplevel from bookwyrm.telemetry import open_telemetry open_telemetry.instrumentDjango() diff --git a/bookwyrm/book_search.py b/bookwyrm/book_search.py index 8a472127e3..7d15b33302 100644 --- a/bookwyrm/book_search.py +++ b/bookwyrm/book_search.py @@ -114,7 +114,6 @@ def search_identifiers( # Oh did you think the 'S' in ISBN stood for 'standard'? normalized_isbn = query.strip().upper().rjust(10, "0") query = normalized_isbn - # pylint: disable=W0212 or_filters = [ {f.name: query} for f in models.Edition._meta.get_fields() @@ -178,7 +177,6 @@ class SearchResult: confidence: float = 1.0 def __repr__(self): - # pylint: disable=consider-using-f-string return "".format( self.key, self.title, self.author, self.confidence ) diff --git a/bookwyrm/connectors/abstract_connector.py b/bookwyrm/connectors/abstract_connector.py index 6e71eb39db..1d53e5747f 100644 --- a/bookwyrm/connectors/abstract_connector.py +++ b/bookwyrm/connectors/abstract_connector.py @@ -79,7 +79,7 @@ async def get_results( query: str, ) -> Optional[ConnectorResults]: """try this specific connector""" - # pylint: disable=line-too-long + headers = { "Accept": ( 'application/json, application/activity+json, application/ld+json; profile="https://www.w3.org/ns/activitystreams"; charset=utf-8' @@ -189,7 +189,7 @@ def get_or_create_book(self, remote_id: str) -> Optional[models.Book]: load_more_data.delay(self.connector.id, work.id) return edition - def get_book_data(self, remote_id: str) -> JsonDict: # pylint: disable=no-self-use + def get_book_data(self, remote_id: str) -> JsonDict: """this allows connectors to override the default behavior""" return get_data(remote_id, is_activitypub=False) @@ -324,7 +324,7 @@ def get_data( resp = requests.get( url, params=params, - headers={ # pylint: disable=line-too-long + headers={ "Accept": ( 'application/json, application/activity+json, application/ld+json; profile="https://www.w3.org/ns/activitystreams"; charset=utf-8' ), @@ -406,7 +406,7 @@ def get_value(self, data: JsonDict) -> Optional[Any]: return None try: return self.formatter(value) - except: # pylint: disable=bare-except + except: return None diff --git a/bookwyrm/connectors/connector_manager.py b/bookwyrm/connectors/connector_manager.py index a24dc8b357..df4397b5eb 100644 --- a/bookwyrm/connectors/connector_manager.py +++ b/bookwyrm/connectors/connector_manager.py @@ -178,7 +178,6 @@ def load_connector( @receiver(signals.post_save, sender="bookwyrm.FederatedServer") -# pylint: disable=unused-argument def create_connector( sender: Any, instance: models.FederatedServer, diff --git a/bookwyrm/connectors/inventaire.py b/bookwyrm/connectors/inventaire.py index 1cacd44bf6..bba22df031 100644 --- a/bookwyrm/connectors/inventaire.py +++ b/bookwyrm/connectors/inventaire.py @@ -130,7 +130,7 @@ def is_work_data(self, data: JsonDict) -> bool: def load_edition_data(self, work_uri: str) -> JsonDict: """get a list of editions for a work""" - # pylint: disable=line-too-long + url = f"{self.books_url}?action=reverse-claims&property=wdt:P629&value={work_uri}&sort=true" return get_data(url, is_activitypub=False) diff --git a/bookwyrm/forms/admin.py b/bookwyrm/forms/admin.py index 2bae65a030..77aca86a6f 100644 --- a/bookwyrm/forms/admin.py +++ b/bookwyrm/forms/admin.py @@ -13,7 +13,6 @@ from .custom_form import CustomForm, StyledForm -# pylint: disable=missing-class-docstring class ExpiryWidget(widgets.Select): def value_from_datadict(self, data, files, name): """human-readable expiration time buckets""" @@ -208,7 +207,6 @@ class Meta: "period": forms.Select(attrs={"aria-describedby": "desc_period"}), } - # pylint: disable=arguments-differ def save(self, request, *args, **kwargs): """This is an outside model so the perms check works differently""" if not request.user.has_perm("bookwyrm.moderate_user"): diff --git a/bookwyrm/forms/author.py b/bookwyrm/forms/author.py index 2364b488b2..8ec25374db 100644 --- a/bookwyrm/forms/author.py +++ b/bookwyrm/forms/author.py @@ -6,7 +6,6 @@ from .custom_form import CustomForm -# pylint: disable=missing-class-docstring class AuthorForm(CustomForm): class Meta: model = models.Author diff --git a/bookwyrm/forms/books.py b/bookwyrm/forms/books.py index e2206d9e7b..cfb3056fd2 100644 --- a/bookwyrm/forms/books.py +++ b/bookwyrm/forms/books.py @@ -10,7 +10,6 @@ from .widgets import ArrayWidget, SelectDateWidget, Select -# pylint: disable=missing-class-docstring class CoverForm(CustomForm): class Meta: model = models.Book diff --git a/bookwyrm/forms/custom_form.py b/bookwyrm/forms/custom_form.py index 98a77aa93d..fcbe5dd9b6 100644 --- a/bookwyrm/forms/custom_form.py +++ b/bookwyrm/forms/custom_form.py @@ -30,7 +30,6 @@ def __init__(self, *args, **kwargs): class CustomForm(StyledForm): """Check permissions on save""" - # pylint: disable=arguments-differ def save(self, request, *args, **kwargs): """Save and check perms""" self.instance.raise_not_editable(request.user) diff --git a/bookwyrm/forms/edit_user.py b/bookwyrm/forms/edit_user.py index 1fe794045f..72ec6f2dac 100644 --- a/bookwyrm/forms/edit_user.py +++ b/bookwyrm/forms/edit_user.py @@ -10,7 +10,6 @@ from .custom_form import CustomForm -# pylint: disable=missing-class-docstring class EditUserForm(CustomForm): class Meta: model = models.User diff --git a/bookwyrm/forms/forms.py b/bookwyrm/forms/forms.py index 52d327a22f..e1e182cb06 100644 --- a/bookwyrm/forms/forms.py +++ b/bookwyrm/forms/forms.py @@ -11,7 +11,6 @@ from .custom_form import CustomForm -# pylint: disable=missing-class-docstring class FeedStatusTypesForm(CustomForm): class Meta: model = models.User diff --git a/bookwyrm/forms/groups.py b/bookwyrm/forms/groups.py index 3138d3f7a2..8d3efdc844 100644 --- a/bookwyrm/forms/groups.py +++ b/bookwyrm/forms/groups.py @@ -4,7 +4,6 @@ from .custom_form import CustomForm -# pylint: disable=missing-class-docstring class GroupForm(CustomForm): class Meta: model = models.Group diff --git a/bookwyrm/forms/landing.py b/bookwyrm/forms/landing.py index c14b1d4722..b2158ba6e2 100644 --- a/bookwyrm/forms/landing.py +++ b/bookwyrm/forms/landing.py @@ -13,7 +13,6 @@ from .custom_form import CustomForm -# pylint: disable=missing-class-docstring class LoginForm(CustomForm): class Meta: model = models.User diff --git a/bookwyrm/forms/links.py b/bookwyrm/forms/links.py index eda5b675c1..4f4bcef67d 100644 --- a/bookwyrm/forms/links.py +++ b/bookwyrm/forms/links.py @@ -8,7 +8,6 @@ from .custom_form import CustomForm -# pylint: disable=missing-class-docstring class LinkDomainForm(CustomForm): class Meta: model = models.LinkDomain diff --git a/bookwyrm/forms/lists.py b/bookwyrm/forms/lists.py index 5a5392ca70..6c2a38c816 100644 --- a/bookwyrm/forms/lists.py +++ b/bookwyrm/forms/lists.py @@ -8,7 +8,6 @@ from .custom_form import CustomForm -# pylint: disable=missing-class-docstring class ListForm(CustomForm): class Meta: model = models.List diff --git a/bookwyrm/forms/status.py b/bookwyrm/forms/status.py index f026780746..cee5c96728 100644 --- a/bookwyrm/forms/status.py +++ b/bookwyrm/forms/status.py @@ -4,7 +4,6 @@ from .custom_form import CustomForm -# pylint: disable=missing-class-docstring class RatingForm(CustomForm): class Meta: model = models.ReviewRating diff --git a/bookwyrm/forms/user_admin.py b/bookwyrm/forms/user_admin.py index 1efd366a40..f46bd41bfa 100644 --- a/bookwyrm/forms/user_admin.py +++ b/bookwyrm/forms/user_admin.py @@ -4,7 +4,6 @@ from .custom_form import CustomForm -# pylint: disable=missing-class-docstring class UserGroupForm(CustomForm): class Meta: model = models.User diff --git a/bookwyrm/importers/bookwyrm_import.py b/bookwyrm/importers/bookwyrm_import.py index a1cdec811d..031db4d220 100644 --- a/bookwyrm/importers/bookwyrm_import.py +++ b/bookwyrm/importers/bookwyrm_import.py @@ -12,7 +12,6 @@ class BookwyrmImporter: 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: diff --git a/bookwyrm/importers/importer.py b/bookwyrm/importers/importer.py index 926fa4a726..116d9a5fc0 100644 --- a/bookwyrm/importers/importer.py +++ b/bookwyrm/importers/importer.py @@ -46,7 +46,6 @@ class Importer: "reading": ["currently-reading", "reading", "currently reading"], } - # pylint: disable=too-many-arguments def create_job( self, user: User, @@ -132,14 +131,12 @@ def get_shelf(self, normalized_row: dict[str, Optional[str]]) -> Optional[str]: ] return shelf[0] if shelf else normalized_row.get("shelf") or None - # pylint: disable=no-self-use def normalize_row( self, entry: dict[str, str], mappings: dict[str, Optional[str]] ) -> dict[str, Optional[str]]: """use the dataclass to create the formatted row of data""" return {k: entry.get(v) if v else None for k, v in mappings.items()} - # pylint: disable=no-self-use def get_import_limit(self, user: User) -> tuple[int, int]: """check if import limit is set and return how many imports are left""" site_settings = SiteSettings.get() @@ -153,7 +150,7 @@ def get_import_limit(self, user: User) -> tuple[int, int]: import_jobs = ImportJob.objects.filter( user=user, created_date__gte=time_range ) - # pylint: disable=consider-using-generator + imported_books = sum([job.successful_item_count for job in import_jobs]) allowed_imports = import_size_limit - imported_books return enforce_limit, allowed_imports diff --git a/bookwyrm/lists_stream.py b/bookwyrm/lists_stream.py index 1030b3834d..07b3ee7001 100644 --- a/bookwyrm/lists_stream.py +++ b/bookwyrm/lists_stream.py @@ -12,7 +12,7 @@ class ListsStream(RedisStore): """all the lists you can see""" - def stream_id(self, user): # pylint: disable=no-self-use + def stream_id(self, user): """the redis key for this user's instance of this stream""" if isinstance(user, int): # allows the function to take an int or an obj @@ -59,7 +59,7 @@ def populate_lists(self, user): """go from zero to a timeline""" self.populate_store(self.stream_id(user)) - def get_audience(self, book_list): # pylint: disable=no-self-use + def get_audience(self, book_list): """given a list, what users should see it""" # everybody who could plausibly see this list audience = models.User.objects.filter( @@ -101,7 +101,7 @@ def get_stores_for_object(self, obj): """the stores that an object belongs in""" return [self.stream_id(u) for u in self.get_audience(obj)] - def get_lists_for_user(self, user): # pylint: disable=no-self-use + def get_lists_for_user(self, user): """given a user, what lists should they see on this stream""" return models.List.privacy_filter( user, @@ -114,7 +114,6 @@ def get_objects_for_store(self, store): @receiver(signals.post_save, sender=models.List) -# pylint: disable=unused-argument def add_list_on_create(sender, instance, created, *args, update_fields=None, **kwargs): """add newly created lists streams""" if created: @@ -132,7 +131,6 @@ def add_list_on_create(sender, instance, created, *args, update_fields=None, **k @receiver(signals.post_delete, sender=models.List) -# pylint: disable=unused-argument def remove_list_on_delete(sender, instance, *args, **kwargs): """remove deleted lists to streams""" remove_list_task.delay(instance.id) @@ -144,7 +142,6 @@ def add_list_on_create_command(instance_id): @receiver(signals.post_save, sender=models.UserFollows) -# pylint: disable=unused-argument def add_lists_on_follow(sender, instance, created, *args, **kwargs): """add a newly followed user's lists to feeds""" if not created or not instance.user_subject.local: @@ -153,7 +150,6 @@ def add_lists_on_follow(sender, instance, created, *args, **kwargs): @receiver(signals.post_delete, sender=models.UserFollows) -# pylint: disable=unused-argument def remove_lists_on_unfollow(sender, instance, *args, **kwargs): """remove lists from a feed on unfollow""" if not instance.user_subject.local: @@ -165,7 +161,6 @@ def remove_lists_on_unfollow(sender, instance, *args, **kwargs): @receiver(signals.post_save, sender=models.UserBlocks) -# pylint: disable=unused-argument def remove_lists_on_block(sender, instance, *args, **kwargs): """remove lists from all feeds on block""" # blocks apply ot all feeds @@ -178,7 +173,6 @@ def remove_lists_on_block(sender, instance, *args, **kwargs): @receiver(signals.post_delete, sender=models.UserBlocks) -# pylint: disable=unused-argument def add_lists_on_unblock(sender, instance, *args, **kwargs): """add lists back to all feeds on unblock""" # make sure there isn't a block in the other direction @@ -204,7 +198,6 @@ def add_lists_on_unblock(sender, instance, *args, **kwargs): @receiver(signals.post_save, sender=models.User) -# pylint: disable=unused-argument def populate_lists_on_account_create(sender, instance, created, *args, **kwargs): """build a user's feeds when they join""" if not created or not instance.local: diff --git a/bookwyrm/management/commands/add_finna_connector.py b/bookwyrm/management/commands/add_finna_connector.py index 94250d8d06..6f77f05a28 100644 --- a/bookwyrm/management/commands/add_finna_connector.py +++ b/bookwyrm/management/commands/add_finna_connector.py @@ -33,8 +33,6 @@ def remove_finna_connector(): print("Finna connector deactivated") -# pylint: disable=no-self-use -# pylint: disable=unused-argument class Command(BaseCommand): """command-line options""" diff --git a/bookwyrm/management/commands/admin_code.py b/bookwyrm/management/commands/admin_code.py index 90da08f28a..d153bfe601 100644 --- a/bookwyrm/management/commands/admin_code.py +++ b/bookwyrm/management/commands/admin_code.py @@ -15,7 +15,6 @@ class Command(BaseCommand): help = "Gets admin code for configuring BookWyrm" - # pylint: disable=unused-argument def handle(self, *args, **options): """execute init""" self.stdout.write("*******************************************") diff --git a/bookwyrm/management/commands/compile_themes.py b/bookwyrm/management/commands/compile_themes.py index c120f977e2..692e62f609 100644 --- a/bookwyrm/management/commands/compile_themes.py +++ b/bookwyrm/management/commands/compile_themes.py @@ -19,7 +19,6 @@ class Command(BaseCommand): help = "SCSS compile all BookWyrm themes" - # pylint: disable=unused-argument def handle(self, *args, **options): """compile""" themes_dir = os.path.join( diff --git a/bookwyrm/management/commands/deduplicate_book_data.py b/bookwyrm/management/commands/deduplicate_book_data.py index 2637079ccf..8c978b9b71 100644 --- a/bookwyrm/management/commands/deduplicate_book_data.py +++ b/bookwyrm/management/commands/deduplicate_book_data.py @@ -50,7 +50,6 @@ def add_arguments(self, parser): help="don't actually merge, only print what would happen", ) - # pylint: disable=no-self-use,unused-argument def handle(self, *args, **options): """run deduplications""" dedupe_model(models.Edition, dry_run=options["dry_run"]) diff --git a/bookwyrm/management/commands/erase_deleted_user_data.py b/bookwyrm/management/commands/erase_deleted_user_data.py index d907327d22..33b018c7c7 100644 --- a/bookwyrm/management/commands/erase_deleted_user_data.py +++ b/bookwyrm/management/commands/erase_deleted_user_data.py @@ -6,20 +6,19 @@ 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 + def add_arguments(self, parser): 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 + def handle(self, *args, **options): # Check for anything fishy bad_state = models.User.objects.filter(is_deleted=True, is_active=True) if bad_state.exists(): diff --git a/bookwyrm/management/commands/erase_streams.py b/bookwyrm/management/commands/erase_streams.py index 4c2964e673..f2f7dd468f 100644 --- a/bookwyrm/management/commands/erase_streams.py +++ b/bookwyrm/management/commands/erase_streams.py @@ -18,7 +18,6 @@ class Command(BaseCommand): help = "Delete all the user streams" - # pylint: disable=no-self-use,unused-argument def handle(self, *args, **options): """flush all, baby""" erase_streams() diff --git a/bookwyrm/management/commands/fix_isbn10_entries.py b/bookwyrm/management/commands/fix_isbn10_entries.py index dea0ed97c2..4b2b25fa7a 100644 --- a/bookwyrm/management/commands/fix_isbn10_entries.py +++ b/bookwyrm/management/commands/fix_isbn10_entries.py @@ -23,7 +23,6 @@ class Command(BaseCommand): help = "Find and fix isbn-10 entries that have incorrect checksum" - # pylint: disable=no-self-use,unused-argument def handle(self, *args, **options): """run fix""" find_long_isbn10_editions() diff --git a/bookwyrm/management/commands/generate_preview_images.py b/bookwyrm/management/commands/generate_preview_images.py index 6adf265354..2f1ce60cf2 100644 --- a/bookwyrm/management/commands/generate_preview_images.py +++ b/bookwyrm/management/commands/generate_preview_images.py @@ -5,13 +5,11 @@ from bookwyrm import models, preview_images -# pylint: disable=line-too-long class Command(BaseCommand): """Creates previews for existing objects""" help = "Generate preview images" - # pylint: disable=no-self-use def add_arguments(self, parser): """options for how the command is run""" parser.add_argument( @@ -21,7 +19,6 @@ def add_arguments(self, parser): help="Generates images for ALL types: site, users and books. Can use a lot of computing power.", ) - # pylint: disable=no-self-use,unused-argument def handle(self, *args, **options): """generate preview images""" self.stdout.write( @@ -41,7 +38,6 @@ def handle(self, *args, **options): preview_images.generate_site_preview_image_task.delay() self.stdout.write(" OK 🖼") - # pylint: disable=consider-using-f-string if options["all"]: # Users users = models.User.objects.filter( diff --git a/bookwyrm/management/commands/initdb.py b/bookwyrm/management/commands/initdb.py index 9192f0173f..5c9d8a2c54 100644 --- a/bookwyrm/management/commands/initdb.py +++ b/bookwyrm/management/commands/initdb.py @@ -90,7 +90,6 @@ def init_connectors(): priority=2, ) - # pylint: disable=line-too-long models.Connector.objects.get_or_create( identifier="inventaire.io", name="Inventaire", @@ -145,8 +144,6 @@ def init_link_domains(): ) -# pylint: disable=no-self-use -# pylint: disable=unused-argument class Command(BaseCommand): """command-line options""" diff --git a/bookwyrm/management/commands/populate_lists_streams.py b/bookwyrm/management/commands/populate_lists_streams.py index 313502e5c3..ec4b9c687e 100644 --- a/bookwyrm/management/commands/populate_lists_streams.py +++ b/bookwyrm/management/commands/populate_lists_streams.py @@ -23,7 +23,6 @@ class Command(BaseCommand): help = "Populate list streams for all users" - # pylint: disable=no-self-use,unused-argument def handle(self, *args, **options): """run feed builder""" populate_lists_streams() diff --git a/bookwyrm/management/commands/populate_streams.py b/bookwyrm/management/commands/populate_streams.py index 2aa769699a..8ff2ef36e4 100644 --- a/bookwyrm/management/commands/populate_streams.py +++ b/bookwyrm/management/commands/populate_streams.py @@ -33,7 +33,6 @@ def add_arguments(self, parser): help="Specifies which time of stream to populate", ) - # pylint: disable=no-self-use,unused-argument def handle(self, *args, **options): """run feed builder""" stream = options.get("stream") diff --git a/bookwyrm/management/commands/populate_suggestions.py b/bookwyrm/management/commands/populate_suggestions.py index fd195d4ac8..ac35df5bc9 100644 --- a/bookwyrm/management/commands/populate_suggestions.py +++ b/bookwyrm/management/commands/populate_suggestions.py @@ -21,7 +21,6 @@ class Command(BaseCommand): help = "Populate suggested users for all users" - # pylint: disable=no-self-use,unused-argument def handle(self, *args, **options): """run builder""" populate_suggestions() diff --git a/bookwyrm/management/commands/remove_editions.py b/bookwyrm/management/commands/remove_editions.py index f07d075ac4..a67161f7a8 100644 --- a/bookwyrm/management/commands/remove_editions.py +++ b/bookwyrm/management/commands/remove_editions.py @@ -38,7 +38,6 @@ class Command(BaseCommand): help = "merges duplicate book data" - # pylint: disable=no-self-use,unused-argument def handle(self, *args, **options): """run deduplications""" remove_editions() diff --git a/bookwyrm/management/commands/remove_remote_user_preview_images.py b/bookwyrm/management/commands/remove_remote_user_preview_images.py index d7d816e6d6..95e57f7127 100644 --- a/bookwyrm/management/commands/remove_remote_user_preview_images.py +++ b/bookwyrm/management/commands/remove_remote_user_preview_images.py @@ -6,13 +6,11 @@ from bookwyrm import models, preview_images -# pylint: disable=line-too-long class Command(BaseCommand): """Remove preview images for remote users""" help = "Remove preview images for remote users" - # pylint: disable=no-self-use,unused-argument def handle(self, *args, **options): """generate preview images""" self.stdout.write( diff --git a/bookwyrm/management/commands/repair_editions.py b/bookwyrm/management/commands/repair_editions.py index 56ffd93591..c8d9c10594 100644 --- a/bookwyrm/management/commands/repair_editions.py +++ b/bookwyrm/management/commands/repair_editions.py @@ -9,7 +9,6 @@ class Command(BaseCommand): help = "Repairs an edition that is in a broken state" - # pylint: disable=unused-argument def handle(self, *args, **options): """Find and repair broken editions""" # Find broken editions diff --git a/bookwyrm/management/commands/revoke_preview_image_tasks.py b/bookwyrm/management/commands/revoke_preview_image_tasks.py index 311811017c..d2a596f9c6 100644 --- a/bookwyrm/management/commands/revoke_preview_image_tasks.py +++ b/bookwyrm/management/commands/revoke_preview_image_tasks.py @@ -8,7 +8,6 @@ class Command(BaseCommand): """Find and revoke image tasks""" - # pylint: disable=unused-argument def handle(self, *args, **options): """revoke nonessential low priority tasks""" types = [ diff --git a/bookwyrm/management/commands/show_duplicate_authors.py b/bookwyrm/management/commands/show_duplicate_authors.py index 34e5da2b0e..95f7d632b2 100644 --- a/bookwyrm/management/commands/show_duplicate_authors.py +++ b/bookwyrm/management/commands/show_duplicate_authors.py @@ -41,7 +41,6 @@ class Command(BaseCommand): help = "show authors with same name but different id" - # pylint: disable=no-self-use,unused-argument def handle(self, *args, **options): """run deduplications""" find_duplicate_author_names() diff --git a/bookwyrm/management/merge_command.py b/bookwyrm/management/merge_command.py index 66e60814ae..cd170c8056 100644 --- a/bookwyrm/management/merge_command.py +++ b/bookwyrm/management/merge_command.py @@ -14,7 +14,6 @@ def add_arguments(self, parser): help="don't actually merge, only print what would happen", ) - # pylint: disable=no-self-use,unused-argument def handle(self, *args, **options): """merge the two objects""" model = self.MODEL diff --git a/bookwyrm/middleware/file_too_big.py b/bookwyrm/middleware/file_too_big.py index 0949821cfb..f87e9425a8 100644 --- a/bookwyrm/middleware/file_too_big.py +++ b/bookwyrm/middleware/file_too_big.py @@ -18,7 +18,7 @@ def __call__(self, request): """If RequestDataTooBig is thrown, render the 413 error page""" try: - body = request.body # pylint: disable=unused-variable + body = request.body except RequestDataTooBig: rendered = render(request, "413.html") diff --git a/bookwyrm/models/activitypub_mixin.py b/bookwyrm/models/activitypub_mixin.py index 1e8ab6c4b8..d94780112d 100644 --- a/bookwyrm/models/activitypub_mixin.py +++ b/bookwyrm/models/activitypub_mixin.py @@ -68,7 +68,6 @@ def __init__(self, *args, **kwargs): ) if hasattr(self, "property_fields"): self.activity_fields += [ - # pylint: disable=cell-var-from-loop PropertyField(lambda a, o: set_activity_from_property_field(a, o, f)) for f in self.property_fields ] @@ -212,7 +211,7 @@ def to_activity_dataclass(self): activity = generate_activity(self) return self.activity_serializer(**activity) - def to_activity(self, **kwargs): # pylint: disable=unused-argument + def to_activity(self, **kwargs): """convert from a model to a json activity""" return self.to_activity_dataclass().serialize() @@ -608,7 +607,6 @@ async def sign_and_send( logger.exception(err) -# pylint: disable=unused-argument def to_ordered_collection_page( queryset, remote_id, id_only=False, page=1, pure=False, **kwargs ): diff --git a/bookwyrm/models/author.py b/bookwyrm/models/author.py index 29e2954f92..54f7f0e0bd 100644 --- a/bookwyrm/models/author.py +++ b/bookwyrm/models/author.py @@ -75,8 +75,6 @@ def get_remote_id(self): class Meta: """sets up indexes and triggers""" - # pylint: disable=line-too-long - indexes = (GinIndex(fields=["search_vector"]),) triggers = [ pgtrigger.Trigger( diff --git a/bookwyrm/models/base_model.py b/bookwyrm/models/base_model.py index 837c18ecb9..67e91acc1f 100644 --- a/bookwyrm/models/base_model.py +++ b/bookwyrm/models/base_model.py @@ -186,7 +186,6 @@ def direct_filter(cls, queryset, viewer): @receiver(models.signals.post_save) -# pylint: disable=unused-argument def set_remote_id(sender, instance, created, *args, **kwargs): """set the remote_id after save (when the id is available)""" if not created or not hasattr(instance, "get_remote_id"): diff --git a/bookwyrm/models/book.py b/bookwyrm/models/book.py index a16b0a7f40..bdcbb9d6fd 100644 --- a/bookwyrm/models/book.py +++ b/bookwyrm/models/book.py @@ -119,7 +119,6 @@ def save( super().save(*args, update_fields=update_fields, **kwargs) - # pylint: disable=arguments-differ def broadcast(self, activity, sender, software="bookwyrm", **kwargs): """only send book data updates to other bookwyrm instances""" super().broadcast(activity, sender, software=software, **kwargs) @@ -148,7 +147,7 @@ def merge_into(self, canonical: Self, dry_run=False) -> Dict[str, Any]: # the linking table anyway. If we update it through that model # instead then we won’t lose the extra fields in the linking # table. - # pylint: disable=protected-access + related_field_obj = related_model._meta.get_field(related_field) if isinstance(related_field_obj, ManyToManyField): through = related_field_obj.remote_field.through @@ -374,7 +373,6 @@ def guess_sort_title(self, user=None): return re.sub(f"^{' |^'.join(articles)} ", "", str(self.title).lower()) def __repr__(self): - # pylint: disable=consider-using-f-string return "<{} key={!r} title={!r}>".format( self.__class__, self.openlibrary_key, @@ -384,8 +382,6 @@ def __repr__(self): class Meta: """set up indexes and triggers""" - # pylint: disable=line-too-long - indexes = (GinIndex(fields=["search_vector"]),) triggers = [ pgtrigger.Trigger( @@ -768,7 +764,6 @@ def normalize_isbn(isbn): return re.sub(r"[^0-9X]", "", isbn) -# pylint: disable=unused-argument @receiver(models.signals.post_save, sender=Edition) def preview_image(instance, *args, **kwargs): """create preview image on book create""" diff --git a/bookwyrm/models/bookwyrm_export_job.py b/bookwyrm/models/bookwyrm_export_job.py index 25eea2b862..2d6289712d 100644 --- a/bookwyrm/models/bookwyrm_export_job.py +++ b/bookwyrm/models/bookwyrm_export_job.py @@ -74,7 +74,7 @@ def create_export_json_task(**kwargs): # trigger task to create tar file create_archive_task.delay(job_id=job.id) - except Exception as err: # pylint: disable=broad-except + except Exception as err: logger.exception( "create_export_json_task for job %s failed with error: %s", job.id, err ) @@ -163,7 +163,7 @@ def create_archive_task(**kwargs): job.complete_job() - except Exception as err: # pylint: disable=broad-except + except Exception as err: logger.exception( "create_archive_task for job %s failed with error: %s", job.id, err ) diff --git a/bookwyrm/models/bookwyrm_import_job.py b/bookwyrm/models/bookwyrm_import_job.py index 9e545e025b..3c0c9d868d 100644 --- a/bookwyrm/models/bookwyrm_import_job.py +++ b/bookwyrm/models/bookwyrm_import_job.py @@ -232,7 +232,6 @@ def on_success(self, retval, task_id, args, kwargs): subtask.complete_job() -# pylint: disable=too-many-branches @app.task(queue=IMPORTS, base=ImportUserTask) def start_import_task(**kwargs): """trigger the child import tasks for each user data @@ -305,7 +304,7 @@ def start_import_task(**kwargs): archive_file.close() - except Exception as err: # pylint: disable=broad-except + except Exception as err: logger.error( "User Import Job %s Failed with error: %s", job.id, err, exc_info=True ) @@ -348,7 +347,7 @@ def create_book_from_json(book_data): @app.task(queue=IMPORTS, base=UserImportSubTask) -def import_book_task(**kwargs): # pylint: disable=too-many-branches +def import_book_task(**kwargs): """Take work and edition data, find or create the edition and work in the database""" @@ -389,7 +388,7 @@ def import_book_task(**kwargs): # pylint: disable=too-many-branches if "include_lists" in required: upsert_lists(task.parent_job.user, book.id, book_data.get("lists")) - except Exception as err: # pylint: disable=broad-except + except Exception as err: logger.error( "Book Import Task %s for Job %s Failed with error: %s", task.id, job.id, err ) @@ -492,7 +491,7 @@ def upsert_status_task(**kwargs): task.save(update_fields=["fail_reason"]) task.set_status("failed") - except Exception as err: # pylint: disable=broad-except + except Exception as err: logger.error("User Status Import Task %s Failed with error: %s", task.id, err) task.fail_reason = _("Unknown error importing book status") task.save(update_fields=["fail_reason"]) @@ -723,7 +722,7 @@ def import_user_relationship_task(**kwargs): task.save(update_fields=["fail_reason"]) task.set_status("failed") - except Exception as err: # pylint: disable=broad-except + except Exception as err: logger.error( "User Import Relationship Task %s Failed with error: %s", task.id, err ) diff --git a/bookwyrm/models/favorite.py b/bookwyrm/models/favorite.py index 5df23bac9a..10a766201f 100644 --- a/bookwyrm/models/favorite.py +++ b/bookwyrm/models/favorite.py @@ -21,7 +21,6 @@ class Favorite(ActivityMixin, BookWyrmModel): activity_serializer = activitypub.Like - # pylint: disable=unused-argument @classmethod def ignore_activity(cls, activity, allow_external_connections=True): """don't bother with incoming favs of unknown statuses""" diff --git a/bookwyrm/models/fields.py b/bookwyrm/models/fields.py index 317293cb40..ecc1976db6 100644 --- a/bookwyrm/models/fields.py +++ b/bookwyrm/models/fields.py @@ -130,7 +130,6 @@ def field_to_activity(self, value): return {self.activitypub_wrapper: value} return value - # pylint: disable=unused-argument def field_from_activity(self, value, allow_external_connections=True, trigger=None): """formatter to convert activitypub into a model value""" if value and hasattr(self, "activitypub_wrapper"): @@ -294,7 +293,7 @@ def set_activity_from_field(self, activity, instance): activity["cc"] = [] -class ForeignKey( # pylint: disable=abstract-method +class ForeignKey( ActivitypubRelatedFieldMixin, models.ForeignKey, ): @@ -306,9 +305,7 @@ def field_to_activity(self, value): return value.remote_id -class OneToOneField( # pylint: disable=abstract-method - ActivitypubRelatedFieldMixin, models.OneToOneField -): +class OneToOneField(ActivitypubRelatedFieldMixin, models.OneToOneField): """activitypub-aware foreign key field""" def field_to_activity(self, value): @@ -317,9 +314,7 @@ def field_to_activity(self, value): return value.to_activity() -class ManyToManyField( # pylint: disable=abstract-method - ActivitypubFieldMixin, models.ManyToManyField -): +class ManyToManyField(ActivitypubFieldMixin, models.ManyToManyField): """activitypub-aware many to many field""" def __init__(self, *args, link_only=False, **kwargs): @@ -370,7 +365,7 @@ def field_from_activity(self, value, allow_external_connections=True, trigger=No return items -class TagField(ManyToManyField): # pylint: disable=abstract-method +class TagField(ManyToManyField): """special case of many to many that uses Tags""" def __init__(self, *args, **kwargs): @@ -463,7 +458,6 @@ def __init__(self, *args, alt_field=None, **kwargs): self.alt_field = alt_field super().__init__(*args, **kwargs) - # pylint: disable=arguments-renamed,too-many-arguments def set_field_from_activity( self, instance, data, save=True, overwrite=True, allow_external_connections=True ): @@ -579,7 +573,6 @@ 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, trigger=None): - # pylint: disable=no-else-return try: return from_partial_isoformat(value) except ValueError: diff --git a/bookwyrm/models/group.py b/bookwyrm/models/group.py index 9314cf569f..f0ccc42808 100644 --- a/bookwyrm/models/group.py +++ b/bookwyrm/models/group.py @@ -143,7 +143,7 @@ def save(self, *args, **kwargs): @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) diff --git a/bookwyrm/models/housekeeping.py b/bookwyrm/models/housekeeping.py index f9525dee05..815b946243 100644 --- a/bookwyrm/models/housekeeping.py +++ b/bookwyrm/models/housekeeping.py @@ -67,7 +67,6 @@ def start_job(self): class CleanUpExportsTask(ParentTask): """Task to delete expired user export files""" - # pylint: disable=too-many-arguments, unused-argument, no-self-use def after_return(self, status, retval, task_id, args, kwargs, einfo): """Handler called after the task returns""" @@ -155,7 +154,6 @@ def on_success(self, retval, task_id, args, kwargs): job.found_covers.add(edition) - # pylint: disable=too-many-arguments, unused-argument, no-self-use def after_return(self, status, retval, task_id, args, kwargs, einfo): """Handler called after the task returns""" @@ -184,7 +182,7 @@ def get_cover_from_identifiers(edition): """for a given edition, can we find a book cover from the fedi?""" # idk there is probably a more pythonic way of doing this - # pylint: disable=protected-access + fields = [ f.name for f in models.Edition._meta.get_fields() diff --git a/bookwyrm/models/import_job.py b/bookwyrm/models/import_job.py index 2b0ed9edb6..982e9bb1e8 100644 --- a/bookwyrm/models/import_job.py +++ b/bookwyrm/models/import_job.py @@ -336,11 +336,9 @@ def reads(self): return [] def __repr__(self): - # pylint: disable=consider-using-f-string return "<{!r} Item {!r}>".format(self.index, self.normalized_data.get("title")) def __str__(self): - # pylint: disable=consider-using-f-string return "{} by {}".format( self.normalized_data.get("title"), self.normalized_data.get("authors") ) @@ -391,7 +389,7 @@ def import_item_task(item_id): item.update_job() -def handle_imported_book(item): # pylint: disable=too-many-branches +def handle_imported_book(item): """process a csv and then post about it""" job = item.job if job.complete: @@ -455,7 +453,6 @@ def handle_imported_book(item): # pylint: disable=too-many-branches item.date_reviewed or item.date_read or item.date_added or timezone.now() ) if item.review: - # pylint: disable=consider-using-f-string review_title = "Review of {!r} on {!r}".format( item.book.title, job.source, diff --git a/bookwyrm/models/job.py b/bookwyrm/models/job.py index 1c7c2e6f09..9147473068 100644 --- a/bookwyrm/models/job.py +++ b/bookwyrm/models/job.py @@ -122,7 +122,7 @@ def notify_child_job_complete(self): if not self.complete and self.has_completed: self.complete_job() - def __terminate_job(self): # pylint: disable=unused-private-member + def __terminate_job(self): """Tell workers to ignore and not execute this task & pending child tasks. Extend. """ @@ -186,7 +186,7 @@ class ParentTask(app.Task): Usage e.g. @app.task(base=ParentTask) """ - def before_start(self, task_id, args, kwargs): # pylint: disable=no-self-use, unused-argument + def before_start(self, task_id, args, kwargs): """Handler called before the task starts. Override. Prepare ParentJob before the task starts. @@ -211,7 +211,7 @@ def before_start(self, task_id, args, kwargs): # pylint: disable=no-self-use, u if kwargs.get("no_children"): job.set_status(ChildJob.Status.ACTIVE) - def on_success(self, retval, task_id, args, kwargs): # pylint: disable=no-self-use, unused-argument + def on_success(self, retval, task_id, args, kwargs): """Run by the worker if the task executes successfully. Override. Update ParentJob on Task complete. @@ -244,7 +244,7 @@ class SubTask(app.Task): Usage e.g. @app.task(base=SubTask) """ - def before_start(self, task_id, args, kwargs): # pylint: disable=no-self-use, unused-argument + def before_start(self, task_id, args, kwargs): """Handler called before the task starts. Override. Prepare ChildJob before the task starts. @@ -266,7 +266,7 @@ def before_start(self, task_id, args, kwargs): # pylint: disable=no-self-use, u 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 + def on_success(self, retval, task_id, args, kwargs): """Run by the worker if the task executes successfully. Override. Notify ChildJob of task completion. diff --git a/bookwyrm/models/notification.py b/bookwyrm/models/notification.py index fefc8dd807..aa9d81efc9 100644 --- a/bookwyrm/models/notification.py +++ b/bookwyrm/models/notification.py @@ -131,7 +131,6 @@ def unnotify(cls, user, related_user, **kwargs): @receiver(models.signals.post_save, sender=Favorite) -# pylint: disable=unused-argument def notify_on_fav(sender, instance, *args, **kwargs): """someone liked your content, you ARE loved""" Notification.notify( @@ -143,7 +142,6 @@ def notify_on_fav(sender, instance, *args, **kwargs): @receiver(models.signals.post_delete, sender=Favorite) -# pylint: disable=unused-argument def notify_on_unfav(sender, instance, *args, **kwargs): """oops, didn't like that after all""" if not instance.status.user.local: @@ -158,7 +156,6 @@ def notify_on_unfav(sender, instance, *args, **kwargs): @receiver(models.signals.post_save) @transaction.atomic -# pylint: disable=unused-argument def notify_user_on_mention(sender, instance, *args, **kwargs): """creating and deleting statuses with @ mentions and replies""" if not issubclass(sender, Status): @@ -195,7 +192,6 @@ def notify_user_on_mention(sender, instance, *args, **kwargs): @receiver(models.signals.post_save, sender=Boost) -# pylint: disable=unused-argument def notify_user_on_boost(sender, instance, *args, **kwargs): """boosting a status""" if ( @@ -213,7 +209,6 @@ def notify_user_on_boost(sender, instance, *args, **kwargs): @receiver(models.signals.post_delete, sender=Boost) -# pylint: disable=unused-argument def notify_user_on_unboost(sender, instance, *args, **kwargs): """unboosting a status""" Notification.unnotify( @@ -225,7 +220,6 @@ def notify_user_on_unboost(sender, instance, *args, **kwargs): @receiver(models.signals.post_save, sender=ImportJob) -# pylint: disable=unused-argument def notify_user_on_import_complete( sender, instance, *args, update_fields=None, **kwargs ): @@ -241,7 +235,6 @@ def notify_user_on_import_complete( @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 ): @@ -255,7 +248,6 @@ def notify_user_on_user_import_complete( @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 ): @@ -272,7 +264,6 @@ def notify_user_on_user_export_complete( @receiver(models.signals.post_save, sender=Report) @transaction.atomic -# pylint: disable=unused-argument def notify_admins_on_report(sender, instance, created, *args, **kwargs): """something is up, make sure the admins know""" if not created: @@ -291,7 +282,6 @@ def notify_admins_on_report(sender, instance, created, *args, **kwargs): @receiver(models.signals.post_save, sender=LinkDomain) @transaction.atomic -# pylint: disable=unused-argument def notify_admins_on_link_domain(sender, instance, created, *args, **kwargs): """a new link domain needs to be verified""" if not created: @@ -310,7 +300,6 @@ def notify_admins_on_link_domain(sender, instance, created, *args, **kwargs): @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: @@ -327,7 +316,6 @@ def notify_admins_on_invite_request(sender, instance, created, *args, **kwargs): @receiver(models.signals.post_save, sender=GroupMemberInvitation) -# pylint: disable=unused-argument def notify_user_on_group_invite(sender, instance, *args, **kwargs): """Cool kids club here we come""" Notification.notify( @@ -340,7 +328,6 @@ def notify_user_on_group_invite(sender, instance, *args, **kwargs): @receiver(models.signals.post_save, sender=ListItem) @transaction.atomic -# pylint: disable=unused-argument def notify_user_on_list_item_add(sender, instance, created, *args, **kwargs): """Someone added to your list""" if not created: @@ -360,7 +347,6 @@ def notify_user_on_list_item_add(sender, instance, created, *args, **kwargs): @receiver(models.signals.post_save, sender=UserFollowRequest) @transaction.atomic -# pylint: disable=unused-argument def notify_user_on_follow(sender, instance, created, *args, **kwargs): """Someone added to your list""" if not created or not instance.user_object.local: diff --git a/bookwyrm/models/relationship.py b/bookwyrm/models/relationship.py index 5117bef084..d8bbe3b049 100644 --- a/bookwyrm/models/relationship.py +++ b/bookwyrm/models/relationship.py @@ -81,7 +81,7 @@ class UserFollows(ActivityMixin, UserRelationship): status = "follows" - def to_activity(self): # pylint: disable=arguments-differ + def to_activity(self): """overrides default to manually set serializer""" return activitypub.Follow(**generate_activity(self)) diff --git a/bookwyrm/models/site.py b/bookwyrm/models/site.py index efe8fd1009..160b296c62 100644 --- a/bookwyrm/models/site.py +++ b/bookwyrm/models/site.py @@ -32,7 +32,6 @@ class Meta: abstract = True - # pylint: disable=no-self-use def raise_not_editable(self, viewer: User) -> None: """Check if the user has the right permissions""" if viewer.has_perm("bookwyrm.edit_instance_settings"): @@ -175,7 +174,6 @@ class Theme(SiteModel): loads = models.BooleanField(null=True, blank=True) def __str__(self) -> str: - # pylint: disable=invalid-str-returned return self.name @@ -190,7 +188,6 @@ class SiteInvite(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) invitees = models.ManyToManyField(User, related_name="invitees") - # pylint: disable=no-self-use def raise_not_editable(self, viewer: User) -> None: """Admins only""" if viewer.has_perm("bookwyrm.create_invites"): @@ -256,7 +253,6 @@ def link(self) -> str: return f"{BASE_URL}/password-reset/{self.code}" -# pylint: disable=unused-argument @receiver(models.signals.post_save, sender=SiteSettings) def preview_image(instance: SiteSettings, *args, **kwargs) -> None: """Update image preview for the default site image""" diff --git a/bookwyrm/models/status.py b/bookwyrm/models/status.py index ed04b2ee80..8ed01ce9f9 100644 --- a/bookwyrm/models/status.py +++ b/bookwyrm/models/status.py @@ -109,7 +109,7 @@ def delete(self, *args, **kwargs): # clear user content self.content = None if hasattr(self, "quotation"): - self.quotation = None # pylint: disable=attribute-defined-outside-init + self.quotation = None self.deleted_date = timezone.now() self.save(*args, **kwargs) @@ -126,7 +126,7 @@ def recipients(self): return list(mentions) @classmethod - def ignore_activity(cls, activity, allow_external_connections=True): # pylint: disable=too-many-return-statements + def ignore_activity(cls, activity, allow_external_connections=True): """keep notes if they are replies to existing statuses""" if activity.type == "Announce": boosted = activitypub.resolve_remote_id( @@ -252,7 +252,7 @@ def to_activity_dataclass(self, pure=False): activity.attachment = covers return activity - def to_activity(self, pure=False): # pylint: disable=arguments-differ + def to_activity(self, pure=False): """json serialized activitypub class""" return self.to_activity_dataclass(pure=pure).serialize() @@ -531,7 +531,6 @@ def __init__(self, *args, **kwargs): self.deserialize_reverse_fields = [] -# pylint: disable=unused-argument @receiver(models.signals.post_save) def preview_image(instance, sender, *args, **kwargs): """Updates book previews if the rating has changed""" diff --git a/bookwyrm/models/user.py b/bookwyrm/models/user.py index bc363909a0..4694376090 100644 --- a/bookwyrm/models/user.py +++ b/bookwyrm/models/user.py @@ -49,7 +49,6 @@ def get_feed_filter_choices(): return [f[0] for f in FeedFilterChoices] -# pylint: disable=too-many-public-methods class User(OrderedCollectionPageMixin, AbstractUser): """a user who wants to read books""" @@ -227,7 +226,7 @@ def following_link(self): @property def alt_text(self): """alt text with username""" - # pylint: disable=consider-using-f-string + return "avatar for {:s}".format(self.localname or self.username) @property @@ -479,7 +478,7 @@ def reactivate(self): @property def local_path(self): """this model doesn't inherit bookwyrm model, so here we are""" - # pylint: disable=consider-using-f-string + return "/user/{:s}".format(self.localname or self.username) def create_shelves(self): @@ -650,7 +649,6 @@ def get_remote_reviews(outbox): activitypub.Review(**activity).to_model() -# pylint: disable=unused-argument @receiver(models.signals.post_save, sender=User) def preview_image(instance, *args, **kwargs): """create preview images when user is updated""" diff --git a/bookwyrm/preview_images.py b/bookwyrm/preview_images.py index ed0a1d5196..58730fcfee 100644 --- a/bookwyrm/preview_images.py +++ b/bookwyrm/preview_images.py @@ -280,8 +280,6 @@ def generate_default_inner_img(): return default_cover -# pylint: disable=too-many-locals -# pylint: disable=too-many-statements def generate_preview_image( texts=None, picture=None, rating=None, show_instance_layer=True ): @@ -296,7 +294,7 @@ def generate_preview_image( ) color_thief = ColorThief(picture) dominant_color = color_thief.get_color(quality=1) - except: # pylint: disable=bare-except + except: inner_img_layer = generate_default_inner_img() dominant_color = ImageColor.getrgb(DEFAULT_COVER_COLOR) diff --git a/bookwyrm/redis_store.py b/bookwyrm/redis_store.py index f7520152cf..4d2262a408 100644 --- a/bookwyrm/redis_store.py +++ b/bookwyrm/redis_store.py @@ -33,7 +33,6 @@ def add_object_to_stores(self, obj, stores, execute=True): # and go! return pipeline.execute() - # pylint: disable=no-self-use def remove_object_from_stores(self, obj, stores): """remove an object from all stores""" # if the stores are provided, the object can just be an id @@ -62,7 +61,7 @@ def bulk_remove_objects_from_store(self, objs, store): pipeline.zrem(store, -1, obj.id) pipeline.execute() - def get_store(self, store, **kwargs): # pylint: disable=no-self-use + def get_store(self, store, **kwargs): """load the values in a store""" return r.zrevrange(store, 0, -1, **kwargs) diff --git a/bookwyrm/settings.py b/bookwyrm/settings.py index c170ec4f8f..a7a3982c6c 100644 --- a/bookwyrm/settings.py +++ b/bookwyrm/settings.py @@ -11,8 +11,6 @@ from django.core.exceptions import ImproperlyConfigured -# pylint: disable=line-too-long - env = Env() env.read_env() DOMAIN = env("DOMAIN") diff --git a/bookwyrm/suggested_users.py b/bookwyrm/suggested_users.py index 7efadcb6c1..41a71b038a 100644 --- a/bookwyrm/suggested_users.py +++ b/bookwyrm/suggested_users.py @@ -27,13 +27,13 @@ def get_rank(self, obj): """get computed rank""" return obj.mutuals # + (1.0 - (1.0 / (obj.shared_books + 1))) - def store_id(self, user): # pylint: disable=no-self-use + def store_id(self, user): """the key used to store this user's recs""" if isinstance(user, int): return f"{user}-suggestions" return f"{user.id}-suggestions" - def get_counts_from_rank(self, rank): # pylint: disable=no-self-use + def get_counts_from_rank(self, rank): """calculate mutuals count and shared books count from rank""" return { "mutuals": math.floor(rank), @@ -56,7 +56,7 @@ def get_stores_for_object(self, obj): """the stores that an object belongs in""" return [self.store_id(u) for u in self.get_users_for_object(obj)] - def get_users_for_object(self, obj): # pylint: disable=no-self-use + def get_users_for_object(self, obj): """given a user, who might want to follow them""" return models.User.objects.filter(local=True, is_active=True).exclude( Q(id=obj.id) | Q(followers=obj) | Q(id__in=obj.blocks.all()) | Q(blocks=obj) @@ -148,7 +148,6 @@ def get_annotated_users(viewer, *args, **kwargs): @receiver(signals.post_save, sender=models.UserFollows) -# pylint: disable=unused-argument def update_suggestions_on_follow(sender, instance, created, *args, **kwargs): """remove a follow from the recs and update the ranks""" if not created or not instance.user_object.discoverable: @@ -160,7 +159,6 @@ def update_suggestions_on_follow(sender, instance, created, *args, **kwargs): @receiver(signals.post_save, sender=models.UserFollowRequest) -# pylint: disable=unused-argument def update_suggestions_on_follow_request(sender, instance, created, *args, **kwargs): """remove a follow from the recs and update the ranks""" if not created or not instance.user_object.discoverable: @@ -171,7 +169,6 @@ def update_suggestions_on_follow_request(sender, instance, created, *args, **kwa @receiver(signals.post_save, sender=models.UserBlocks) -# pylint: disable=unused-argument def update_suggestions_on_block(sender, instance, *args, **kwargs): """remove blocked users from recs""" if instance.user_subject.local and instance.user_object.discoverable: @@ -181,7 +178,6 @@ def update_suggestions_on_block(sender, instance, *args, **kwargs): @receiver(signals.post_delete, sender=models.UserFollows) -# pylint: disable=unused-argument def update_suggestions_on_unfollow(sender, instance, **kwargs): """update rankings, but don't re-suggest because it was probably intentional""" if instance.user_object.discoverable: @@ -190,7 +186,7 @@ def update_suggestions_on_unfollow(sender, instance, **kwargs): # @receiver(signals.post_save, sender=models.ShelfBook) # @receiver(signals.post_delete, sender=models.ShelfBook) -# # pylint: disable=unused-argument +# # def update_rank_on_shelving(sender, instance, *args, **kwargs): # """when a user shelves or unshelves a book, re-compute their rank""" # # if it's a local user, re-calculate who is rec'ed to them @@ -203,7 +199,6 @@ def update_suggestions_on_unfollow(sender, instance, **kwargs): @receiver(signals.post_save, sender=models.User) -# pylint: disable=unused-argument def update_user(sender, instance, created, update_fields=None, **kwargs): """an updated user, neat""" # a new user is found, create suggestions for them diff --git a/bookwyrm/templatetags/utilities.py b/bookwyrm/templatetags/utilities.py index 67d3e746c0..31ebc84fb0 100644 --- a/bookwyrm/templatetags/utilities.py +++ b/bookwyrm/templatetags/utilities.py @@ -100,7 +100,6 @@ def get_isni_bio(existing, author): return "" -# pylint: disable=unused-argument @register.filter(name="get_isni", needs_autoescape=True) def get_isni(existing, author, autoescape=True): """Returns the isni ID if an existing author has an ISNI listing""" diff --git a/bookwyrm/tests/__init__.py b/bookwyrm/tests/__init__.py index 998288ed5d..ead4300ca8 100644 --- a/bookwyrm/tests/__init__.py +++ b/bookwyrm/tests/__init__.py @@ -1,3 +1,3 @@ """import ALL the tests""" -from . import * # pylint: disable=import-self +from . import * diff --git a/bookwyrm/tests/activitypub/__init__.py b/bookwyrm/tests/activitypub/__init__.py index b1753c3a09..b6e690fd59 100644 --- a/bookwyrm/tests/activitypub/__init__.py +++ b/bookwyrm/tests/activitypub/__init__.py @@ -1,2 +1 @@ -# pylint: disable=missing-module-docstring -from . import * # pylint: disable=import-self +from . import * diff --git a/bookwyrm/tests/activitypub/test_base_activity.py b/bookwyrm/tests/activitypub/test_base_activity.py index 7b79c6a206..ed236f0400 100644 --- a/bookwyrm/tests/activitypub/test_base_activity.py +++ b/bookwyrm/tests/activitypub/test_base_activity.py @@ -207,7 +207,7 @@ def test_to_model_image(self, *_): self.assertIsNone(self.user.avatar.name) with self.assertRaises(ValueError): - self.user.avatar.file # pylint: disable=pointless-statement + self.user.avatar.file # this would trigger a broadcast because it's a local user with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): @@ -342,7 +342,7 @@ def test_do_not_raise_error_on_410(self, *_): self.assertEqual( logger.output, [ - "WARNING:bookwyrm.activitypub.base_activity:request for object dropped because it is gone (410) - remote_id: https://example.com/user/mouse" # pylint: disable=line-too-long + "WARNING:bookwyrm.activitypub.base_activity:request for object dropped because it is gone (410) - remote_id: https://example.com/user/mouse" ], ) diff --git a/bookwyrm/tests/activitypub/test_person.py b/bookwyrm/tests/activitypub/test_person.py index 2722aaefdc..dbe59bf0b9 100644 --- a/bookwyrm/tests/activitypub/test_person.py +++ b/bookwyrm/tests/activitypub/test_person.py @@ -1,4 +1,3 @@ -# pylint: disable=missing-module-docstring, missing-class-docstring, missing-function-docstring import json import pathlib from unittest.mock import patch diff --git a/bookwyrm/tests/activitystreams/__init__.py b/bookwyrm/tests/activitystreams/__init__.py index b1753c3a09..b6e690fd59 100644 --- a/bookwyrm/tests/activitystreams/__init__.py +++ b/bookwyrm/tests/activitystreams/__init__.py @@ -1,2 +1 @@ -# pylint: disable=missing-module-docstring -from . import * # pylint: disable=import-self +from . import * diff --git a/bookwyrm/tests/connectors/__init__.py b/bookwyrm/tests/connectors/__init__.py index b1753c3a09..b6e690fd59 100644 --- a/bookwyrm/tests/connectors/__init__.py +++ b/bookwyrm/tests/connectors/__init__.py @@ -1,2 +1 @@ -# pylint: disable=missing-module-docstring -from . import * # pylint: disable=import-self +from . import * diff --git a/bookwyrm/tests/connectors/test_openlibrary_connector.py b/bookwyrm/tests/connectors/test_openlibrary_connector.py index 380ae2c82b..19df39599d 100644 --- a/bookwyrm/tests/connectors/test_openlibrary_connector.py +++ b/bookwyrm/tests/connectors/test_openlibrary_connector.py @@ -17,7 +17,6 @@ from bookwyrm.connectors.connector_manager import ConnectorException -# pylint: disable=too-many-public-methods class Openlibrary(TestCase): """test loading data from openlibrary.org""" diff --git a/bookwyrm/tests/importers/__init__.py b/bookwyrm/tests/importers/__init__.py index b1753c3a09..b6e690fd59 100644 --- a/bookwyrm/tests/importers/__init__.py +++ b/bookwyrm/tests/importers/__init__.py @@ -1,2 +1 @@ -# pylint: disable=missing-module-docstring -from . import * # pylint: disable=import-self +from . import * diff --git a/bookwyrm/tests/importers/test_bookwyrm_import.py b/bookwyrm/tests/importers/test_bookwyrm_import.py index 5fca685f6d..f90acd74ac 100644 --- a/bookwyrm/tests/importers/test_bookwyrm_import.py +++ b/bookwyrm/tests/importers/test_bookwyrm_import.py @@ -26,7 +26,7 @@ def setUp(self): """use a test csv""" self.importer = BookwyrmBooksImporter() datafile = pathlib.Path(__file__).parent.joinpath("../data/bookwyrm.csv") - # pylint: disable-next=consider-using-with + self.csv = open(datafile, "r", encoding=self.importer.encoding) def tearDown(self): diff --git a/bookwyrm/tests/importers/test_calibre_import.py b/bookwyrm/tests/importers/test_calibre_import.py index 1a1f1875e5..5cdddd7b58 100644 --- a/bookwyrm/tests/importers/test_calibre_import.py +++ b/bookwyrm/tests/importers/test_calibre_import.py @@ -20,7 +20,7 @@ def setUp(self): """use a test csv""" self.importer = CalibreImporter() datafile = pathlib.Path(__file__).parent.joinpath("../data/calibre.csv") - # pylint: disable-next=consider-using-with + self.csv = open(datafile, "r", encoding=self.importer.encoding) def tearDown(self): diff --git a/bookwyrm/tests/importers/test_goodreads_import.py b/bookwyrm/tests/importers/test_goodreads_import.py index 615719ff43..91788848a7 100644 --- a/bookwyrm/tests/importers/test_goodreads_import.py +++ b/bookwyrm/tests/importers/test_goodreads_import.py @@ -26,7 +26,7 @@ def setUp(self): """use a test csv""" self.importer = GoodreadsImporter() datafile = pathlib.Path(__file__).parent.joinpath("../data/goodreads.csv") - # pylint: disable-next=consider-using-with + self.csv = open(datafile, "r", encoding=self.importer.encoding) def tearDown(self): diff --git a/bookwyrm/tests/importers/test_importer.py b/bookwyrm/tests/importers/test_importer.py index a051d5c082..4e3386b99b 100644 --- a/bookwyrm/tests/importers/test_importer.py +++ b/bookwyrm/tests/importers/test_importer.py @@ -30,7 +30,7 @@ def setUp(self): """use a test csv""" self.importer = Importer() datafile = pathlib.Path(__file__).parent.joinpath("../data/generic.csv") - # pylint: disable-next=consider-using-with + self.csv = open(datafile, "r", encoding=self.importer.encoding) def tearDown(self): diff --git a/bookwyrm/tests/importers/test_librarything_import.py b/bookwyrm/tests/importers/test_librarything_import.py index 6ce41a5d78..d564801c90 100644 --- a/bookwyrm/tests/importers/test_librarything_import.py +++ b/bookwyrm/tests/importers/test_librarything_import.py @@ -28,7 +28,7 @@ def setUp(self): datafile = pathlib.Path(__file__).parent.joinpath("../data/librarything.tsv") # Librarything generates latin encoded exports... - # pylint: disable-next=consider-using-with + self.csv = open(datafile, "r", encoding=self.importer.encoding) def tearDown(self): diff --git a/bookwyrm/tests/importers/test_openlibrary_import.py b/bookwyrm/tests/importers/test_openlibrary_import.py index cbb2310fb1..7408a2e166 100644 --- a/bookwyrm/tests/importers/test_openlibrary_import.py +++ b/bookwyrm/tests/importers/test_openlibrary_import.py @@ -26,7 +26,7 @@ def setUp(self): """use a test csv""" self.importer = OpenLibraryImporter() datafile = pathlib.Path(__file__).parent.joinpath("../data/openlibrary.csv") - # pylint: disable-next=consider-using-with + self.csv = open(datafile, "r", encoding=self.importer.encoding) def tearDown(self): diff --git a/bookwyrm/tests/importers/test_openreads_import.py b/bookwyrm/tests/importers/test_openreads_import.py index affba3078f..729bbd44d0 100644 --- a/bookwyrm/tests/importers/test_openreads_import.py +++ b/bookwyrm/tests/importers/test_openreads_import.py @@ -29,7 +29,6 @@ def setUp(self): "../data/openreads-csv-example.csv" ) - # pylint: disable-next=consider-using-with self.csv = open(datafile, "r", encoding=self.importer.encoding) def tearDown(self): diff --git a/bookwyrm/tests/importers/test_storygraph_import.py b/bookwyrm/tests/importers/test_storygraph_import.py index 4ba4be2533..10fc6b7dd9 100644 --- a/bookwyrm/tests/importers/test_storygraph_import.py +++ b/bookwyrm/tests/importers/test_storygraph_import.py @@ -26,7 +26,7 @@ def setUp(self): """use a test csv""" self.importer = StorygraphImporter() datafile = pathlib.Path(__file__).parent.joinpath("../data/storygraph.csv") - # pylint: disable-next=consider-using-with + self.csv = open(datafile, "r", encoding=self.importer.encoding) def tearDown(self): diff --git a/bookwyrm/tests/lists_stream/__init__.py b/bookwyrm/tests/lists_stream/__init__.py index b1753c3a09..b6e690fd59 100644 --- a/bookwyrm/tests/lists_stream/__init__.py +++ b/bookwyrm/tests/lists_stream/__init__.py @@ -1,2 +1 @@ -# pylint: disable=missing-module-docstring -from . import * # pylint: disable=import-self +from . import * diff --git a/bookwyrm/tests/management/__init__.py b/bookwyrm/tests/management/__init__.py index b1753c3a09..b6e690fd59 100644 --- a/bookwyrm/tests/management/__init__.py +++ b/bookwyrm/tests/management/__init__.py @@ -1,2 +1 @@ -# pylint: disable=missing-module-docstring -from . import * # pylint: disable=import-self +from . import * diff --git a/bookwyrm/tests/models/__init__.py b/bookwyrm/tests/models/__init__.py index b1753c3a09..b6e690fd59 100644 --- a/bookwyrm/tests/models/__init__.py +++ b/bookwyrm/tests/models/__init__.py @@ -1,2 +1 @@ -# pylint: disable=missing-module-docstring -from . import * # pylint: disable=import-self +from . import * diff --git a/bookwyrm/tests/models/test_activitypub_mixin.py b/bookwyrm/tests/models/test_activitypub_mixin.py index 1562cb51fb..3a257ca744 100644 --- a/bookwyrm/tests/models/test_activitypub_mixin.py +++ b/bookwyrm/tests/models/test_activitypub_mixin.py @@ -21,7 +21,6 @@ from bookwyrm.settings import PAGE_LENGTH -# pylint: disable=too-many-public-methods @patch("bookwyrm.activitystreams.add_status_task.delay") @patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") class ActivitypubMixins(TestCase): @@ -288,11 +287,11 @@ def save(self, *args, **kwargs): with patch("django.db.models.Model.save"): super().save(*args, **kwargs) - def broadcast(self, activity, sender, **kwargs): # pylint: disable=arguments-differ + def broadcast(self, activity, sender, **kwargs): """do something""" raise Success() - def to_create_activity(self, user): # pylint: disable=arguments-differ + def to_create_activity(self, user): return {} with self.assertRaises(Success): diff --git a/bookwyrm/tests/models/test_base_model.py b/bookwyrm/tests/models/test_base_model.py index 62e1b9b5ae..cec4e9aa3c 100644 --- a/bookwyrm/tests/models/test_base_model.py +++ b/bookwyrm/tests/models/test_base_model.py @@ -9,7 +9,6 @@ from bookwyrm.settings import BASE_URL -# pylint: disable=attribute-defined-outside-init class BaseModel(TestCase): """functionality shared across models""" diff --git a/bookwyrm/tests/models/test_book_model.py b/bookwyrm/tests/models/test_book_model.py index ebf01de2e2..852fb22819 100644 --- a/bookwyrm/tests/models/test_book_model.py +++ b/bookwyrm/tests/models/test_book_model.py @@ -212,7 +212,6 @@ def test_thumbnail_fields(self): self.assertIsNotNone(book.cover_bw_book_xxlarge_webp.url) self.assertIsNotNone(book.cover_bw_book_xxlarge_jpg.url) - # pylint: disable=unused-variable def test_populate_sort_title(self): """The sort title should remove the initial article on save""" books = [] diff --git a/bookwyrm/tests/models/test_bookwyrm_export_job.py b/bookwyrm/tests/models/test_bookwyrm_export_job.py index 5c9d756149..52970b5a84 100644 --- a/bookwyrm/tests/models/test_bookwyrm_export_job.py +++ b/bookwyrm/tests/models/test_bookwyrm_export_job.py @@ -17,7 +17,7 @@ class BookwyrmExportJob(TestCase): """testing user export functions""" @classmethod - def setUpTestData(self): # pylint: disable=bad-classmethod-argument + def setUpTestData(self): """lots of stuff to set up for a user export""" with ( patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), diff --git a/bookwyrm/tests/models/test_bookwyrm_import_job.py b/bookwyrm/tests/models/test_bookwyrm_import_job.py index 5c5853a1f3..3fd7894e22 100644 --- a/bookwyrm/tests/models/test_bookwyrm_import_job.py +++ b/bookwyrm/tests/models/test_bookwyrm_import_job.py @@ -15,11 +15,11 @@ from bookwyrm.models import bookwyrm_import_job -class BookwyrmImport(TestCase): # pylint: disable=too-many-public-methods +class BookwyrmImport(TestCase): """testing user import functions""" @classmethod - def setUpTestData(self): # pylint: disable=bad-classmethod-argument + def setUpTestData(self): """setting stuff up""" with ( patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), @@ -764,7 +764,7 @@ def test_is_alias(self): def test_status_already_exists(self): """test status checking""" - string = '{"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"}' # pylint: disable=line-too-long + string = '{"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"}' status = json.loads(string) parsed = activitypub.parse(status) diff --git a/bookwyrm/tests/models/test_fields.py b/bookwyrm/tests/models/test_fields.py index d0ab4868e8..af6b008389 100644 --- a/bookwyrm/tests/models/test_fields.py +++ b/bookwyrm/tests/models/test_fields.py @@ -26,7 +26,6 @@ from bookwyrm.settings import PROTOCOL, NETLOC -# pylint: disable=too-many-public-methods @patch("bookwyrm.suggested_users.rerank_suggestions_task.delay") @patch("bookwyrm.activitystreams.populate_stream_task.delay") @patch("bookwyrm.lists_stream.populate_lists_task.delay") @@ -164,7 +163,6 @@ def test_privacy_field_set_field_from_activity(self, *_): class TestActivity(ActivityObject): """real simple mock""" - # pylint: disable=invalid-name to: List[str] cc: List[str] id: str = "http://hi.com" diff --git a/bookwyrm/tests/models/test_status_model.py b/bookwyrm/tests/models/test_status_model.py index 2dd40d513b..78fec9bb0f 100644 --- a/bookwyrm/tests/models/test_status_model.py +++ b/bookwyrm/tests/models/test_status_model.py @@ -14,8 +14,6 @@ from bookwyrm import activitypub, models, settings -# pylint: disable=too-many-public-methods -# pylint: disable=line-too-long @patch("bookwyrm.models.Status.broadcast") @patch("bookwyrm.activitystreams.add_status_task.delay") @patch("bookwyrm.activitystreams.remove_status_task.delay") @@ -478,7 +476,6 @@ def test_boost(self, *_): self.assertEqual(activity["type"], "Announce") self.assertEqual(activity, boost.to_activity(pure=True)) - # pylint: disable=unused-argument def test_create_broadcast(self, one, two, broadcast_mock, *_): """should send out two versions of a status on create""" models.Comment.objects.create( diff --git a/bookwyrm/tests/models/test_user_model.py b/bookwyrm/tests/models/test_user_model.py index e80c88d501..26508735f0 100644 --- a/bookwyrm/tests/models/test_user_model.py +++ b/bookwyrm/tests/models/test_user_model.py @@ -13,8 +13,6 @@ from bookwyrm.settings import DOMAIN, BASE_URL -# pylint: disable=missing-class-docstring -# pylint: disable=missing-function-docstring class User(TestCase): @classmethod def setUpTestData(cls): diff --git a/bookwyrm/tests/templatetags/__init__.py b/bookwyrm/tests/templatetags/__init__.py index b1753c3a09..b6e690fd59 100644 --- a/bookwyrm/tests/templatetags/__init__.py +++ b/bookwyrm/tests/templatetags/__init__.py @@ -1,2 +1 @@ -# pylint: disable=missing-module-docstring -from . import * # pylint: disable=import-self +from . import * diff --git a/bookwyrm/tests/test_book_search.py b/bookwyrm/tests/test_book_search.py index 9a74051046..e64ac2711a 100644 --- a/bookwyrm/tests/test_book_search.py +++ b/bookwyrm/tests/test_book_search.py @@ -283,7 +283,6 @@ def test_search_vector_fields(self): book.refresh_from_db() self.assertEqual( book.search_vector, - # pylint: disable-next=line-too-long "'cool':5B 'goodby':3A 'long':2A 'name':9 'rays':7C 'seri':8 'the':6C 'wow':4B", ) diff --git a/bookwyrm/tests/test_partial_date.py b/bookwyrm/tests/test_partial_date.py index 740a502590..8c99814cfa 100644 --- a/bookwyrm/tests/test_partial_date.py +++ b/bookwyrm/tests/test_partial_date.py @@ -13,8 +13,6 @@ 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) @@ -105,8 +103,6 @@ def test_partial_isoformat_no_time_allowed(self): 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() diff --git a/bookwyrm/tests/test_preview_images.py b/bookwyrm/tests/test_preview_images.py index 32894ba9f5..9a150ac6d8 100644 --- a/bookwyrm/tests/test_preview_images.py +++ b/bookwyrm/tests/test_preview_images.py @@ -20,8 +20,6 @@ ) -# pylint: disable=unused-argument -# pylint: disable=missing-function-docstring class PreviewImages(TestCase): """every response to a get request, html or json""" diff --git a/bookwyrm/tests/test_signing.py b/bookwyrm/tests/test_signing.py index 3d92d842c1..82461ff6b5 100644 --- a/bookwyrm/tests/test_signing.py +++ b/bookwyrm/tests/test_signing.py @@ -82,7 +82,7 @@ def send(self, signature, now, data, digest): }, ) - def send_test_request( # pylint: disable=too-many-arguments + def send_test_request( self, sender, signer=None, send_data=None, digest=None, date=None ): """sends a follow request to the "rat" user""" diff --git a/bookwyrm/tests/views/__init__.py b/bookwyrm/tests/views/__init__.py index b1753c3a09..b6e690fd59 100644 --- a/bookwyrm/tests/views/__init__.py +++ b/bookwyrm/tests/views/__init__.py @@ -1,2 +1 @@ -# pylint: disable=missing-module-docstring -from . import * # pylint: disable=import-self +from . import * diff --git a/bookwyrm/tests/views/admin/__init__.py b/bookwyrm/tests/views/admin/__init__.py index b1753c3a09..b6e690fd59 100644 --- a/bookwyrm/tests/views/admin/__init__.py +++ b/bookwyrm/tests/views/admin/__init__.py @@ -1,2 +1 @@ -# pylint: disable=missing-module-docstring -from . import * # pylint: disable=import-self +from . import * diff --git a/bookwyrm/tests/views/books/__init__.py b/bookwyrm/tests/views/books/__init__.py index b1753c3a09..b6e690fd59 100644 --- a/bookwyrm/tests/views/books/__init__.py +++ b/bookwyrm/tests/views/books/__init__.py @@ -1,2 +1 @@ -# pylint: disable=missing-module-docstring -from . import * # pylint: disable=import-self +from . import * diff --git a/bookwyrm/tests/views/books/test_edit_book.py b/bookwyrm/tests/views/books/test_edit_book.py index 5d6e0eac1a..6827841363 100644 --- a/bookwyrm/tests/views/books/test_edit_book.py +++ b/bookwyrm/tests/views/books/test_edit_book.py @@ -54,7 +54,7 @@ def setUpTestData(cls): def setUp(self): """individual test setup""" self.factory = RequestFactory() - # pylint: disable=line-too-long + self.authors_body = "1.10000000084510024" 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" diff --git a/bookwyrm/tests/views/imports/__init__.py b/bookwyrm/tests/views/imports/__init__.py index b1753c3a09..b6e690fd59 100644 --- a/bookwyrm/tests/views/imports/__init__.py +++ b/bookwyrm/tests/views/imports/__init__.py @@ -1,2 +1 @@ -# pylint: disable=missing-module-docstring -from . import * # pylint: disable=import-self +from . import * diff --git a/bookwyrm/tests/views/inbox/__init__.py b/bookwyrm/tests/views/inbox/__init__.py index b1753c3a09..b6e690fd59 100644 --- a/bookwyrm/tests/views/inbox/__init__.py +++ b/bookwyrm/tests/views/inbox/__init__.py @@ -1,2 +1 @@ -# pylint: disable=missing-module-docstring -from . import * # pylint: disable=import-self +from . import * diff --git a/bookwyrm/tests/views/inbox/test_inbox.py b/bookwyrm/tests/views/inbox/test_inbox.py index c2356d929b..d6571dbaa8 100644 --- a/bookwyrm/tests/views/inbox/test_inbox.py +++ b/bookwyrm/tests/views/inbox/test_inbox.py @@ -134,7 +134,6 @@ def test_is_blocked_user_agent(self): request = self.factory.post( "", headers={ - # pylint: disable-next=line-too-long "user-agent": "http.rb/4.4.1 (Mastodon/3.3.0; +https://mastodon.social/)", }, ) diff --git a/bookwyrm/tests/views/landing/__init__.py b/bookwyrm/tests/views/landing/__init__.py index b1753c3a09..b6e690fd59 100644 --- a/bookwyrm/tests/views/landing/__init__.py +++ b/bookwyrm/tests/views/landing/__init__.py @@ -1,2 +1 @@ -# pylint: disable=missing-module-docstring -from . import * # pylint: disable=import-self +from . import * diff --git a/bookwyrm/tests/views/landing/test_register.py b/bookwyrm/tests/views/landing/test_register.py index 34ed699927..b2e5f43afc 100644 --- a/bookwyrm/tests/views/landing/test_register.py +++ b/bookwyrm/tests/views/landing/test_register.py @@ -14,7 +14,6 @@ from bookwyrm.tests.validate_html import validate_html -# pylint: disable=too-many-public-methods @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/views/lists/__init__.py b/bookwyrm/tests/views/lists/__init__.py index b1753c3a09..b6e690fd59 100644 --- a/bookwyrm/tests/views/lists/__init__.py +++ b/bookwyrm/tests/views/lists/__init__.py @@ -1,2 +1 @@ -# pylint: disable=missing-module-docstring -from . import * # pylint: disable=import-self +from . import * diff --git a/bookwyrm/tests/views/lists/test_list.py b/bookwyrm/tests/views/lists/test_list.py index c4a04937b2..43f8b9c7ba 100644 --- a/bookwyrm/tests/views/lists/test_list.py +++ b/bookwyrm/tests/views/lists/test_list.py @@ -14,7 +14,6 @@ from bookwyrm.tests.validate_html import validate_html -# pylint: disable=too-many-public-methods class ListViews(TestCase): """list view""" diff --git a/bookwyrm/tests/views/preferences/__init__.py b/bookwyrm/tests/views/preferences/__init__.py index b1753c3a09..b6e690fd59 100644 --- a/bookwyrm/tests/views/preferences/__init__.py +++ b/bookwyrm/tests/views/preferences/__init__.py @@ -1,2 +1 @@ -# pylint: disable=missing-module-docstring -from . import * # pylint: disable=import-self +from . import * diff --git a/bookwyrm/tests/views/preferences/test_export.py b/bookwyrm/tests/views/preferences/test_export.py index 26934300d7..733a0b5560 100644 --- a/bookwyrm/tests/views/preferences/test_export.py +++ b/bookwyrm/tests/views/preferences/test_export.py @@ -66,7 +66,7 @@ def test_export_file(self, *_): export = views.Export.as_view()(request) self.assertIsInstance(export, HttpResponse) self.assertEqual(export.status_code, 200) - # pylint: disable=line-too-long + self.assertEqual( export.content, b"title,author_text,remote_id,openlibrary_key,finna_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" diff --git a/bookwyrm/tests/views/shelf/__init__.py b/bookwyrm/tests/views/shelf/__init__.py index b1753c3a09..b6e690fd59 100644 --- a/bookwyrm/tests/views/shelf/__init__.py +++ b/bookwyrm/tests/views/shelf/__init__.py @@ -1,2 +1 @@ -# pylint: disable=missing-module-docstring -from . import * # pylint: disable=import-self +from . import * diff --git a/bookwyrm/tests/views/test_group.py b/bookwyrm/tests/views/test_group.py index c444072d3f..7eaa6555b5 100644 --- a/bookwyrm/tests/views/test_group.py +++ b/bookwyrm/tests/views/test_group.py @@ -13,7 +13,6 @@ from bookwyrm.tests.validate_html import validate_html -# pylint: disable=too-many-public-methods @patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") class GroupViews(TestCase): """view group and edit details""" diff --git a/bookwyrm/tests/views/test_helpers.py b/bookwyrm/tests/views/test_helpers.py index 112fd1af54..d8cbc657f8 100644 --- a/bookwyrm/tests/views/test_helpers.py +++ b/bookwyrm/tests/views/test_helpers.py @@ -16,7 +16,7 @@ @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): # pylint: disable=too-many-public-methods +class ViewsHelpers(TestCase): """viewing and creating statuses""" @classmethod @@ -115,7 +115,6 @@ def test_is_bookwyrm_request(self, *_): "", {"q": "Test Book"}, headers={ - # pylint: disable-next=line-too-long "user-agent": "http.rb/4.4.1 (Mastodon/3.3.0; +https://mastodon.social/)", }, ) diff --git a/bookwyrm/tests/views/test_status.py b/bookwyrm/tests/views/test_status.py index 2689fa4ce0..8a3f2c0373 100644 --- a/bookwyrm/tests/views/test_status.py +++ b/bookwyrm/tests/views/test_status.py @@ -75,7 +75,6 @@ def test_create_status_saves(self, *_): @patch("bookwyrm.lists_stream.populate_lists_task.delay") @patch("bookwyrm.activitystreams.remove_status_task.delay") @patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") -# pylint: disable=too-many-public-methods class StatusViews(TestCase): """viewing and creating statuses""" diff --git a/bookwyrm/thumbnail_generation.py b/bookwyrm/thumbnail_generation.py index 64f7ebefbb..c74cd6399b 100644 --- a/bookwyrm/thumbnail_generation.py +++ b/bookwyrm/thumbnail_generation.py @@ -7,14 +7,14 @@ class Strategy: but also on demand, for old images (JustInTime). """ - def on_source_saved(self, file): # pylint: disable=no-self-use + def on_source_saved(self, file): """What happens on source saved""" file.generate() - def on_existence_required(self, file): # pylint: disable=no-self-use + def on_existence_required(self, file): """What happens on existence required""" file.generate() - def on_content_required(self, file): # pylint: disable=no-self-use + def on_content_required(self, file): """What happens on content required""" file.generate() diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py index 7357d88b2d..0eab4821a4 100644 --- a/bookwyrm/urls.py +++ b/bookwyrm/urls.py @@ -330,7 +330,6 @@ views.LinkDomain.as_view(), name="settings-link-domain", ), - # pylint: disable=line-too-long re_path( r"^setting/link-domains/(?P(pending|approved|blocked))/(?P\d+)/?$", views.LinkDomain.as_view(), @@ -964,8 +963,8 @@ # Serves /static when DEBUG is true. 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/images.py b/bookwyrm/utils/images.py index 19110bcff9..3a4173757a 100644 --- a/bookwyrm/utils/images.py +++ b/bookwyrm/utils/images.py @@ -53,7 +53,7 @@ def set_cover_from_url(url: str) -> None | list[Any]: """load cover image from a url""" try: image_content, extension = get_image(url) - except: # pylint: disable=bare-except + except: return None if not image_content or not extension: return None diff --git a/bookwyrm/utils/partial_date.py b/bookwyrm/utils/partial_date.py index 03d1e64387..a4894b5120 100644 --- a/bookwyrm/utils/partial_date.py +++ b/bookwyrm/utils/partial_date.py @@ -13,7 +13,6 @@ from django.forms.widgets import SelectDateWidget from django.utils import timezone -# pylint: disable=no-else-return __all__ = [ "PartialDate", @@ -230,7 +229,6 @@ def formfield(self, **kwargs): # type: ignore[no-untyped-def] kwargs.setdefault("form_class", PartialDateFormField) return super().formfield(**kwargs) - # pylint: disable-next=arguments-renamed,line-too-long def contribute_to_class(self, model, our_name_in_model, **kwargs): # type: ignore[no-untyped-def] # Define precision field. descriptor = self.descriptor_class(self) diff --git a/bookwyrm/views/admin/announcements.py b/bookwyrm/views/admin/announcements.py index 807ae87127..7c88250a46 100644 --- a/bookwyrm/views/admin/announcements.py +++ b/bookwyrm/views/admin/announcements.py @@ -12,7 +12,6 @@ from bookwyrm.settings import PAGE_LENGTH -# pylint: disable=no-self-use @method_decorator(login_required, name="dispatch") @method_decorator( permission_required("bookwyrm.edit_instance_settings", raise_exception=True), @@ -33,7 +32,7 @@ def get(self, request): "end_date", "active", ] - # pylint: disable=consider-using-f-string + if sort in sort_fields + ["-{:s}".format(f) for f in sort_fields]: announcements = announcements.order_by(sort) data = { diff --git a/bookwyrm/views/admin/automod.py b/bookwyrm/views/admin/automod.py index c774900482..7441905a11 100644 --- a/bookwyrm/views/admin/automod.py +++ b/bookwyrm/views/admin/automod.py @@ -21,7 +21,6 @@ permission_required("bookwyrm.moderate_post", raise_exception=True), name="dispatch", ) -# pylint: disable=no-self-use class AutoMod(View): """Manage automated flagging""" @@ -67,7 +66,6 @@ def schedule_automod_task(request): @require_POST @permission_required("bookwyrm.moderate_user", raise_exception=True) @permission_required("bookwyrm.moderate_post", raise_exception=True) -# pylint: disable=unused-argument def unschedule_automod_task(request, task_id): """unscheduler""" get_object_or_404(PeriodicTask, id=task_id).delete() @@ -77,7 +75,6 @@ def unschedule_automod_task(request, task_id): @require_POST @permission_required("bookwyrm.moderate_user", raise_exception=True) @permission_required("bookwyrm.moderate_post", raise_exception=True) -# pylint: disable=unused-argument def automod_delete(request, rule_id): """Remove a rule""" get_object_or_404(models.AutoMod, id=rule_id).delete() @@ -87,7 +84,6 @@ def automod_delete(request, rule_id): @require_POST @permission_required("bookwyrm.moderate_user", raise_exception=True) @permission_required("bookwyrm.moderate_post", raise_exception=True) -# pylint: disable=unused-argument def run_automod(request): """run scan""" models.automod_task.delay() diff --git a/bookwyrm/views/admin/celery_status.py b/bookwyrm/views/admin/celery_status.py index 83179e2e9d..dfaa361005 100644 --- a/bookwyrm/views/admin/celery_status.py +++ b/bookwyrm/views/admin/celery_status.py @@ -33,7 +33,6 @@ r = redis.from_url(settings.REDIS_BROKER_URL) -# pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") @method_decorator( permission_required("bookwyrm.edit_instance_settings", raise_exception=True), @@ -49,7 +48,7 @@ def get(self, request): inspect = celery.control.inspect() stats = inspect.stats() active_tasks = inspect.active() - # pylint: disable=broad-except + except Exception as err: stats = active_tasks = None errors.append(err) @@ -71,7 +70,7 @@ def get(self, request): BROADCAST: r.llen(BROADCAST), MISC: r.llen(MISC), } - # pylint: disable=broad-except + except Exception as err: queues = None errors.append(err) @@ -143,14 +142,13 @@ def __init__(self, *args, **kwargs): @require_GET -# pylint: disable=unused-argument def celery_ping(request): """Just tells you if Celery is on or not""" try: ping = celery.control.inspect().ping() if ping: return HttpResponse() - # pylint: disable=broad-except + except Exception: pass diff --git a/bookwyrm/views/admin/connectors.py b/bookwyrm/views/admin/connectors.py index ce73fdf22a..a732c7399b 100644 --- a/bookwyrm/views/admin/connectors.py +++ b/bookwyrm/views/admin/connectors.py @@ -19,7 +19,6 @@ class ConnectorSettings(View): """show connector settings page""" - # pylint: disable=no-self-use def get(self, request): """list of connectors""" @@ -65,7 +64,6 @@ def get(self, request): return TemplateResponse(request, "settings/connectors/connectors.html", data) -# pylint: disable=unused-argument def deactivate_connector(request, connector_id): """we don't want to use this connector""" @@ -74,7 +72,6 @@ def deactivate_connector(request, connector_id): return redirect("/settings/connectors/") -# pylint: disable=unused-argument def activate_connector(request, connector_id: int): """oops changed our mind""" @@ -92,7 +89,6 @@ def set_connector_priority(request, connector_id: int): return redirect("/settings/connectors/") -# pylint: disable=unused-argument def update_connector(request, connector_id: int): """update connector info such as API endpoints""" diff --git a/bookwyrm/views/admin/dashboard.py b/bookwyrm/views/admin/dashboard.py index de98333c0a..2ad72f1f46 100644 --- a/bookwyrm/views/admin/dashboard.py +++ b/bookwyrm/views/admin/dashboard.py @@ -22,7 +22,6 @@ from bookwyrm.utils import regex -# pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") @method_decorator( permission_required("bookwyrm.moderate_user", raise_exception=True), @@ -50,7 +49,7 @@ def get(self, request): ) site = models.SiteSettings.get() - # pylint: disable=protected-access + data["missing_conduct"] = ( not site.code_of_conduct or site.code_of_conduct diff --git a/bookwyrm/views/admin/email_blocklist.py b/bookwyrm/views/admin/email_blocklist.py index d69bc6ff2a..3ffa79b616 100644 --- a/bookwyrm/views/admin/email_blocklist.py +++ b/bookwyrm/views/admin/email_blocklist.py @@ -9,7 +9,6 @@ from bookwyrm import forms, models -# pylint: disable=no-self-use @method_decorator(login_required, name="dispatch") @method_decorator( permission_required("bookwyrm.moderate_user", raise_exception=True), @@ -49,7 +48,6 @@ def post(self, request, domain_id=None): request, "settings/email_blocklist/email_blocklist.html", data ) - # pylint: disable=unused-argument def delete(self, request, domain_id): """remove a domain block""" domain = get_object_or_404(models.EmailBlocklist, id=domain_id) diff --git a/bookwyrm/views/admin/email_config.py b/bookwyrm/views/admin/email_config.py index 454f4f4d99..70ccffb54f 100644 --- a/bookwyrm/views/admin/email_config.py +++ b/bookwyrm/views/admin/email_config.py @@ -9,7 +9,6 @@ from bookwyrm import settings -# pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") @method_decorator( permission_required("bookwyrm.edit_instance_settings", raise_exception=True), @@ -30,7 +29,7 @@ def post(self, request): try: emailing.test_email(request.user) data["success"] = True - except Exception as err: # pylint: disable=broad-except + except Exception as err: data["error"] = err return TemplateResponse(request, "settings/email_config.html", data) diff --git a/bookwyrm/views/admin/federation.py b/bookwyrm/views/admin/federation.py index 69e72fb863..dea79099bf 100644 --- a/bookwyrm/views/admin/federation.py +++ b/bookwyrm/views/admin/federation.py @@ -15,7 +15,6 @@ from bookwyrm.models.user import get_or_create_remote_server -# pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") @method_decorator( permission_required("bookwyrm.control_federation", raise_exception=True), @@ -164,7 +163,6 @@ def post(self, request, server): @login_required @require_POST @permission_required("bookwyrm.control_federation", raise_exception=True) -# pylint: disable=unused-argument def block_server(request, server): """block a server""" server = get_object_or_404(models.FederatedServer, id=server) @@ -175,7 +173,6 @@ def block_server(request, server): @login_required @require_POST @permission_required("bookwyrm.control_federation", raise_exception=True) -# pylint: disable=unused-argument def unblock_server(request, server): """unblock a server""" server = get_object_or_404(models.FederatedServer, id=server) @@ -186,7 +183,6 @@ def unblock_server(request, server): @login_required @require_POST @permission_required("bookwyrm.control_federation", raise_exception=True) -# pylint: disable=unused-argument def refresh_server(request, server): """unblock a server""" server = get_object_or_404(models.FederatedServer, id=server) diff --git a/bookwyrm/views/admin/federation_settings.py b/bookwyrm/views/admin/federation_settings.py index b4814e3d56..03bd83a320 100644 --- a/bookwyrm/views/admin/federation_settings.py +++ b/bookwyrm/views/admin/federation_settings.py @@ -8,7 +8,6 @@ from bookwyrm import forms, models -# pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") @method_decorator( permission_required("bookwyrm.control_federation", raise_exception=True), diff --git a/bookwyrm/views/admin/files_maintenance.py b/bookwyrm/views/admin/files_maintenance.py index bfe1d61956..9f3438f7de 100644 --- a/bookwyrm/views/admin/files_maintenance.py +++ b/bookwyrm/views/admin/files_maintenance.py @@ -14,7 +14,6 @@ from bookwyrm import forms, models -# pylint: disable=no-self-use @method_decorator(login_required, name="dispatch") @method_decorator( permission_required("bookwyrm.edit_instance_settings", raise_exception=True), @@ -51,7 +50,6 @@ def schedule_export_delete_task(request): return redirect("settings-files") -# pylint: disable=unused-argument @require_POST @permission_required("bookwyrm.edit_instance_settings", raise_exception=True) def unschedule_file_maintenance_task(request, task_id): @@ -68,7 +66,6 @@ def run_export_deletions(request): return redirect("settings-files") -# pylint: disable=unused-argument @require_POST @permission_required("bookwyrm.edit_instance_settings", raise_exception=True) def cancel_export_delete_job(request, job_id): diff --git a/bookwyrm/views/admin/imports.py b/bookwyrm/views/admin/imports.py index a52e4a552b..4d9f293097 100644 --- a/bookwyrm/views/admin/imports.py +++ b/bookwyrm/views/admin/imports.py @@ -13,7 +13,6 @@ from bookwyrm.settings import PAGE_LENGTH, USE_AZURE -# pylint: disable=no-self-use @method_decorator(login_required, name="dispatch") @method_decorator( permission_required("bookwyrm.moderate_user", raise_exception=True), @@ -34,7 +33,7 @@ def get(self, request, status="active"): imports = models.ImportJob.objects.filter(complete=complete).order_by( "created_date" ) - # pylint: disable=consider-using-f-string + if sort in sort_fields + ["-{:s}".format(f) for f in sort_fields]: imports = imports.order_by(sort) @@ -73,7 +72,6 @@ def post(self, request, import_id): @require_POST @permission_required("bookwyrm.edit_instance_settings", raise_exception=True) -# pylint: disable=unused-argument def disable_imports(request): """When you just need people to please stop starting imports""" site = models.SiteSettings.get() @@ -84,7 +82,6 @@ def disable_imports(request): @require_POST @permission_required("bookwyrm.edit_instance_settings", raise_exception=True) -# pylint: disable=unused-argument def enable_imports(request): """When you just need people to please stop starting imports""" site = models.SiteSettings.get() @@ -109,7 +106,6 @@ def set_import_size_limit(request): @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) @@ -129,7 +125,6 @@ def set_user_import_limit(request): @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.get() @@ -140,7 +135,6 @@ def enable_user_exports(request): @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.get() diff --git a/bookwyrm/views/admin/invite.py b/bookwyrm/views/admin/invite.py index 10807b7693..0681a948fc 100644 --- a/bookwyrm/views/admin/invite.py +++ b/bookwyrm/views/admin/invite.py @@ -19,7 +19,6 @@ from bookwyrm.settings import PAGE_LENGTH -# pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") @method_decorator( permission_required("bookwyrm.create_invites", raise_exception=True), @@ -104,7 +103,7 @@ def get(self, request): "invite__invitees__created_date", "answer", ] - # pylint: disable=consider-using-f-string + if sort not in sort_fields + ["-{:s}".format(f) for f in sort_fields]: sort = "-created_date" @@ -159,7 +158,7 @@ def post(self, request): ) invite_request.save() emailing.invite_email(invite_request) - # pylint: disable=consider-using-f-string + return redirect( "{:s}?{:s}".format( reverse("settings-invite-requests"), urlencode(request.GET.dict()) diff --git a/bookwyrm/views/admin/ip_blocklist.py b/bookwyrm/views/admin/ip_blocklist.py index 62cb5783f8..2a5494cf51 100644 --- a/bookwyrm/views/admin/ip_blocklist.py +++ b/bookwyrm/views/admin/ip_blocklist.py @@ -9,7 +9,6 @@ from bookwyrm import forms, models -# pylint: disable=no-self-use @method_decorator(login_required, name="dispatch") @method_decorator( permission_required("bookwyrm.moderate_user", raise_exception=True), @@ -49,7 +48,6 @@ def post(self, request, block_id=None): request, "settings/ip_blocklist/ip_blocklist.html", data ) - # pylint: disable=unused-argument def delete(self, request, domain_id): """remove a domain block""" domain = get_object_or_404(models.IPBlocklist, id=domain_id) diff --git a/bookwyrm/views/admin/link_domains.py b/bookwyrm/views/admin/link_domains.py index f0708c3587..d2fc7735e8 100644 --- a/bookwyrm/views/admin/link_domains.py +++ b/bookwyrm/views/admin/link_domains.py @@ -12,7 +12,6 @@ from bookwyrm.views.helpers import redirect_to_referer -# pylint: disable=no-self-use @method_decorator(login_required, name="dispatch") @method_decorator( permission_required("bookwyrm.moderate_user", raise_exception=True), diff --git a/bookwyrm/views/admin/reports.py b/bookwyrm/views/admin/reports.py index f9caaf517e..541c0e7938 100644 --- a/bookwyrm/views/admin/reports.py +++ b/bookwyrm/views/admin/reports.py @@ -14,7 +14,6 @@ from bookwyrm.settings import PAGE_LENGTH -# pylint: disable=no-self-use @method_decorator(login_required, name="dispatch") @method_decorator( permission_required("bookwyrm.moderate_user", raise_exception=True), diff --git a/bookwyrm/views/admin/schedule.py b/bookwyrm/views/admin/schedule.py index 5a181e8520..45893ced7d 100644 --- a/bookwyrm/views/admin/schedule.py +++ b/bookwyrm/views/admin/schedule.py @@ -13,7 +13,6 @@ permission_required("bookwyrm.edit_instance_settings", raise_exception=True), name="dispatch", ) -# pylint: disable=no-self-use class ScheduledTasks(View): """Manage automated flagging""" @@ -24,7 +23,6 @@ def get(self, request): data["schedules"] = IntervalSchedule.objects.all() return TemplateResponse(request, "settings/schedules.html", data) - # pylint: disable=unused-argument def post(self, request, task_id): """un-schedule a task""" task = PeriodicTask.objects.get(id=task_id) diff --git a/bookwyrm/views/admin/site.py b/bookwyrm/views/admin/site.py index 69f0bba972..75dc5bf69f 100644 --- a/bookwyrm/views/admin/site.py +++ b/bookwyrm/views/admin/site.py @@ -8,7 +8,6 @@ from bookwyrm import forms, models -# pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") @method_decorator( permission_required("bookwyrm.edit_instance_settings", raise_exception=True), diff --git a/bookwyrm/views/admin/themes.py b/bookwyrm/views/admin/themes.py index f2c25d820f..0285888621 100644 --- a/bookwyrm/views/admin/themes.py +++ b/bookwyrm/views/admin/themes.py @@ -12,7 +12,6 @@ from bookwyrm import forms, models -# pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") @method_decorator( permission_required("bookwyrm.system_administration", raise_exception=True), @@ -51,7 +50,6 @@ def get_view_data(): @require_POST @permission_required("bookwyrm.system_administration", raise_exception=True) -# pylint: disable=unused-argument def delete_theme(request, theme_id): """Remove a theme""" get_object_or_404(models.Theme, id=theme_id).delete() @@ -60,7 +58,6 @@ def delete_theme(request, theme_id): @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) @@ -68,7 +65,7 @@ def test_theme(request, theme_id): try: sass_processor(theme.path) theme.loads = True - except Exception: # pylint: disable=broad-except + except Exception: theme.loads = False theme.save() diff --git a/bookwyrm/views/admin/user_admin.py b/bookwyrm/views/admin/user_admin.py index 759f6ed55e..bd24a89df7 100644 --- a/bookwyrm/views/admin/user_admin.py +++ b/bookwyrm/views/admin/user_admin.py @@ -13,7 +13,6 @@ from bookwyrm.settings import PAGE_LENGTH -# pylint: disable=no-self-use @method_decorator(login_required, name="dispatch") @method_decorator( permission_required("bookwyrm.moderate_user", raise_exception=True), @@ -53,7 +52,7 @@ def get(self, request, status="local"): "federated_server__server_name", "is_active", ] - # pylint: disable=consider-using-f-string + if sort in sort_fields + ["-{:s}".format(f) for f in sort_fields]: users = users.order_by(sort) @@ -79,7 +78,6 @@ def get(self, request, status="local"): class UserAdmin(View): """moderate an individual user""" - # pylint: disable=unused-argument def get(self, request, user_id, report_id=None): """user view""" user = get_object_or_404(models.User, id=user_id) @@ -113,7 +111,6 @@ def post(self, request, user_id, report_id=None): class ActivateUserAdmin(View): """activate a user manually""" - # pylint: disable=unused-argument def post(self, request, user_id): """activate user""" user = get_object_or_404(models.User, id=user_id) diff --git a/bookwyrm/views/annual_summary.py b/bookwyrm/views/annual_summary.py index 68c929f4c8..6885e67033 100644 --- a/bookwyrm/views/annual_summary.py +++ b/bookwyrm/views/annual_summary.py @@ -21,11 +21,10 @@ LAST_DAY = 15 -# pylint: disable= no-self-use class AnnualSummary(View): """display a summary of the year for the current user""" - def get(self, request, username, year): # pylint: disable=too-many-locals + def get(self, request, username, year): """get response""" user = get_user_from_username(request.user, username) diff --git a/bookwyrm/views/author.py b/bookwyrm/views/author.py index 76e6981837..60f8ad1dc3 100644 --- a/bookwyrm/views/author.py +++ b/bookwyrm/views/author.py @@ -20,11 +20,9 @@ ) -# pylint: disable= no-self-use class Author(View): """this person wrote a book""" - # pylint: disable=unused-argument @vary_on_headers("Accept") def get(self, request, author_id, slug=None): """landing page for an author""" @@ -83,7 +81,6 @@ def post(self, request, author_id): @login_required @require_POST @permission_required("bookwyrm.edit_book", raise_exception=True) -# pylint: disable=unused-argument def update_author_from_remote(request, author_id, connector_identifier): """load the remote data for this author""" connector = connector_manager.load_connector( diff --git a/bookwyrm/views/books/books.py b/bookwyrm/views/books/books.py index ced7807c56..8b5cb042db 100644 --- a/bookwyrm/views/books/books.py +++ b/bookwyrm/views/books/books.py @@ -22,7 +22,6 @@ ) -# pylint: disable=no-self-use class Book(View): """a book! this is the stuff""" diff --git a/bookwyrm/views/books/edit_book.py b/bookwyrm/views/books/edit_book.py index 188bdb2bbd..b4e332f553 100644 --- a/bookwyrm/views/books/edit_book.py +++ b/bookwyrm/views/books/edit_book.py @@ -24,7 +24,6 @@ from bookwyrm.views.helpers import get_edition, get_mergeable_object_or_404 -# pylint: disable=no-self-use @method_decorator(login_required, name="dispatch") @method_decorator( permission_required("bookwyrm.edit_book", raise_exception=True), name="dispatch" @@ -205,7 +204,6 @@ def add_authors(request, data): if sub(r"\D", "", str(i.isni)) == sub(r"\D", "", str(a.isni)) ] - # pylint: disable=cell-var-from-loop matches = list(filter(lambda x: x not in exists, isni_authors)) # combine existing and isni authors matches.extend(author_matches) @@ -242,8 +240,6 @@ def create_book_from_data(request): class ConfirmEditBook(View): """confirm edits to a book""" - # pylint: disable=too-many-locals - # pylint: disable=too-many-branches def post(self, request, book_id=None): """edit a book cool""" # returns None if no match is found diff --git a/bookwyrm/views/books/editions.py b/bookwyrm/views/books/editions.py index 78d29bde89..085b4b2700 100644 --- a/bookwyrm/views/books/editions.py +++ b/bookwyrm/views/books/editions.py @@ -20,7 +20,6 @@ from bookwyrm.views.helpers import is_api_request, get_mergeable_object_or_404 -# pylint: disable=no-self-use class Editions(View): """list of editions""" diff --git a/bookwyrm/views/books/links.py b/bookwyrm/views/books/links.py index b69d4baa57..777f0556f3 100644 --- a/bookwyrm/views/books/links.py +++ b/bookwyrm/views/books/links.py @@ -12,7 +12,6 @@ from bookwyrm.views.helpers import get_mergeable_object_or_404 -# pylint: disable=no-self-use @method_decorator(login_required, name="dispatch") @method_decorator( permission_required("bookwyrm.edit_book", raise_exception=True), name="dispatch" @@ -60,7 +59,6 @@ def get_annotated_links(book, form=None): @require_POST @login_required -# pylint: disable=unused-argument def delete_link(request, book_id, link_id): """delete link""" link = get_object_or_404(models.FileLink, id=link_id, book=book_id) diff --git a/bookwyrm/views/books/series.py b/bookwyrm/views/books/series.py index f945c91993..f1e1894084 100644 --- a/bookwyrm/views/books/series.py +++ b/bookwyrm/views/books/series.py @@ -17,7 +17,6 @@ def sort_by_series(book): return float_info.max -# pylint: disable=no-self-use class BookSeriesBy(View): """book series by author""" diff --git a/bookwyrm/views/directory.py b/bookwyrm/views/directory.py index 505f12900e..9ca93d7b7a 100644 --- a/bookwyrm/views/directory.py +++ b/bookwyrm/views/directory.py @@ -10,7 +10,6 @@ from bookwyrm import suggested_users -# pylint: disable=no-self-use @method_decorator(login_required, name="dispatch") class Directory(View): """display of known bookwyrm users""" diff --git a/bookwyrm/views/discover.py b/bookwyrm/views/discover.py index 78d40f6042..d780f7d429 100644 --- a/bookwyrm/views/discover.py +++ b/bookwyrm/views/discover.py @@ -10,7 +10,6 @@ from bookwyrm import activitystreams -# pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") class Discover(View): """preview of recently reviewed books""" diff --git a/bookwyrm/views/feed.py b/bookwyrm/views/feed.py index 4822fe9512..2faa9586eb 100644 --- a/bookwyrm/views/feed.py +++ b/bookwyrm/views/feed.py @@ -22,7 +22,6 @@ from .annual_summary import get_annual_summary_year -# pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") class Feed(View): """activity stream""" @@ -131,7 +130,6 @@ def get(self, request, username=None): class Status(View): """get posting""" - # pylint: disable=unused-argument @vary_on_headers("Accept") def get(self, request, username, status_id, slug=None): """display a particular status (and replies, etc)""" diff --git a/bookwyrm/views/get_started.py b/bookwyrm/views/get_started.py index 4ced55567c..c9a84913e4 100644 --- a/bookwyrm/views/get_started.py +++ b/bookwyrm/views/get_started.py @@ -18,7 +18,6 @@ from .preferences.edit_user import save_user_form -# pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") class GetStartedProfile(View): """tell us about yourself""" diff --git a/bookwyrm/views/goal.py b/bookwyrm/views/goal.py index da2fc88c27..9cdc3ea86c 100644 --- a/bookwyrm/views/goal.py +++ b/bookwyrm/views/goal.py @@ -15,7 +15,6 @@ from .helpers import get_user_from_username -# pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") class Goal(View): """track books for the year""" diff --git a/bookwyrm/views/group.py b/bookwyrm/views/group.py index 94700ab8ff..776efea49f 100644 --- a/bookwyrm/views/group.py +++ b/bookwyrm/views/group.py @@ -19,11 +19,9 @@ from .helpers import get_user_from_username, maybe_redirect_local_path -# pylint: disable=no-self-use class Group(View): """group page""" - # pylint: disable=unused-argument def get(self, request, group_id, slug=None): """display a group""" @@ -87,7 +85,6 @@ def post(self, request, group_id): class UserGroups(View): """a user's groups page""" - # pylint: disable=unused-argument def get(self, request, username, slug=None): """display a group""" user = get_user_from_username(request.user, username) @@ -108,7 +105,6 @@ def get(self, request, username, slug=None): return TemplateResponse(request, "user/groups.html", data) @method_decorator(login_required, name="dispatch") - # pylint: disable=unused-argument def post(self, request, username): """create a user group""" form = forms.GroupForm(request.POST) diff --git a/bookwyrm/views/hashtag.py b/bookwyrm/views/hashtag.py index 211e031597..b45b8f2efb 100644 --- a/bookwyrm/views/hashtag.py +++ b/bookwyrm/views/hashtag.py @@ -11,11 +11,9 @@ from bookwyrm.views.helpers import maybe_redirect_local_path -# pylint: disable= no-self-use class Hashtag(View): """listing statuses for a given hashtag""" - # pylint: disable=unused-argument def get(self, request, hashtag_id, slug=None): """show hashtag with related statuses""" hashtag = get_object_or_404(models.Hashtag, id=hashtag_id) diff --git a/bookwyrm/views/helpers.py b/bookwyrm/views/helpers.py index e639a8793e..63edfde536 100644 --- a/bookwyrm/views/helpers.py +++ b/bookwyrm/views/helpers.py @@ -20,7 +20,6 @@ from bookwyrm.utils.validate import validate_url_domain -# pylint: disable=unnecessary-pass class WebFingerError(Exception): """empty error class for problems finding user information with webfinger""" @@ -249,7 +248,6 @@ def redirect_to_referer(request, *args, **kwargs): return redirect(*args or "/", **kwargs) -# pylint: disable=redefined-builtin def get_mergeable_object_or_404(klass, id): """variant of get_object_or_404 that also redirects if id has been merged into another object""" diff --git a/bookwyrm/views/imports/import_data.py b/bookwyrm/views/imports/import_data.py index c144dd0550..c3bcb64ebc 100644 --- a/bookwyrm/views/imports/import_data.py +++ b/bookwyrm/views/imports/import_data.py @@ -31,7 +31,6 @@ from bookwyrm.utils.cache import get_or_set -# pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") class Import(View): """import view""" @@ -65,7 +64,7 @@ def get(self, request, invalid=False): import_jobs = models.ImportJob.objects.filter( user=request.user, created_date__gte=time_range ) - # pylint: disable=consider-using-generator + imported_books = sum([job.successful_item_count for job in import_jobs]) data["import_size_limit"] = site_settings.import_size_limit data["import_limit_reset"] = site_settings.import_limit_reset @@ -144,7 +143,6 @@ def get_average_import_time() -> float: return None -# pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") class UserImport(View): """import user view""" diff --git a/bookwyrm/views/imports/import_status.py b/bookwyrm/views/imports/import_status.py index 815af17475..f0784624dc 100644 --- a/bookwyrm/views/imports/import_status.py +++ b/bookwyrm/views/imports/import_status.py @@ -16,7 +16,6 @@ from bookwyrm.settings import PAGE_LENGTH -# pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") class ImportStatus(View): """status of an existing import""" @@ -87,7 +86,6 @@ def stop_import(request, job_id): return redirect("import-status", job_id) -# pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") class UserImportStatus(View): """status of an existing import""" diff --git a/bookwyrm/views/imports/manually_review.py b/bookwyrm/views/imports/manually_review.py index 21d236f83e..c9202e9e0d 100644 --- a/bookwyrm/views/imports/manually_review.py +++ b/bookwyrm/views/imports/manually_review.py @@ -14,7 +14,6 @@ from bookwyrm.settings import PAGE_LENGTH -# pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") class ImportManualReview(View): """problems items in an existing import""" @@ -45,7 +44,6 @@ def get(self, request, job_id): @login_required @require_POST -# pylint: disable=unused-argument def approve_import_item(request, job_id, item_id): """we guessed right""" item = get_object_or_404( @@ -63,7 +61,6 @@ def approve_import_item(request, job_id, item_id): @login_required @require_POST -# pylint: disable=unused-argument def delete_import_item(request, job_id, item_id): """we guessed right""" item = get_object_or_404( diff --git a/bookwyrm/views/imports/troubleshoot.py b/bookwyrm/views/imports/troubleshoot.py index fcacacc131..86afcf6fa2 100644 --- a/bookwyrm/views/imports/troubleshoot.py +++ b/bookwyrm/views/imports/troubleshoot.py @@ -14,7 +14,6 @@ from bookwyrm.settings import PAGE_LENGTH -# pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") class ImportTroubleshoot(View): """problems items in an existing import""" diff --git a/bookwyrm/views/imports/user_troubleshoot.py b/bookwyrm/views/imports/user_troubleshoot.py index 19b4c9766c..5d6cfe06f1 100644 --- a/bookwyrm/views/imports/user_troubleshoot.py +++ b/bookwyrm/views/imports/user_troubleshoot.py @@ -15,7 +15,6 @@ from bookwyrm.settings import PAGE_LENGTH -# pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") class UserImportTroubleshoot(View): """failed items in an existing user import""" diff --git a/bookwyrm/views/inbox.py b/bookwyrm/views/inbox.py index 995d6c34c3..e5e74e1126 100644 --- a/bookwyrm/views/inbox.py +++ b/bookwyrm/views/inbox.py @@ -28,7 +28,6 @@ class UserIsGoneError(Exception): @method_decorator(csrf_exempt, name="dispatch") @method_decorator(require_federation, name="dispatch") -# pylint: disable=no-self-use class Inbox(View): """requests sent by outside servers""" diff --git a/bookwyrm/views/interaction.py b/bookwyrm/views/interaction.py index 5d81063333..22f64fba04 100644 --- a/bookwyrm/views/interaction.py +++ b/bookwyrm/views/interaction.py @@ -12,7 +12,6 @@ from .helpers import is_api_request -# pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") class Favorite(View): """like a status""" diff --git a/bookwyrm/views/isbn.py b/bookwyrm/views/isbn.py index 48ad67e4b2..39fbfa0457 100644 --- a/bookwyrm/views/isbn.py +++ b/bookwyrm/views/isbn.py @@ -11,7 +11,6 @@ from .helpers import is_api_request -# pylint: disable= no-self-use class Isbn(View): """search a book by isbn""" diff --git a/bookwyrm/views/landing/landing.py b/bookwyrm/views/landing/landing.py index 4247c38af1..083f28d14a 100644 --- a/bookwyrm/views/landing/landing.py +++ b/bookwyrm/views/landing/landing.py @@ -8,7 +8,6 @@ from bookwyrm.views.feed import Feed -# pylint: disable= no-self-use class Home(View): """landing page or home feed depending on auth""" diff --git a/bookwyrm/views/landing/login.py b/bookwyrm/views/landing/login.py index ba178611da..2b21ec0f71 100644 --- a/bookwyrm/views/landing/login.py +++ b/bookwyrm/views/landing/login.py @@ -15,7 +15,6 @@ from bookwyrm.views.helpers import set_language -# pylint: disable=no-self-use class Login(View): """authenticate an existing user""" @@ -31,7 +30,6 @@ def get(self, request, confirmed=None): } return TemplateResponse(request, "landing/login.html", data) - # pylint: disable=too-many-return-statements @sensitive_variables("password") @method_decorator(sensitive_post_parameters("password")) def post(self, request): diff --git a/bookwyrm/views/landing/password.py b/bookwyrm/views/landing/password.py index 678e4dcd89..94694e695d 100644 --- a/bookwyrm/views/landing/password.py +++ b/bookwyrm/views/landing/password.py @@ -12,7 +12,6 @@ from bookwyrm.emailing import password_reset_email -# pylint: disable= no-self-use class PasswordResetRequest(View): """forgot password flow""" diff --git a/bookwyrm/views/landing/register.py b/bookwyrm/views/landing/register.py index a3df812f2d..357600e2e1 100644 --- a/bookwyrm/views/landing/register.py +++ b/bookwyrm/views/landing/register.py @@ -13,11 +13,10 @@ from bookwyrm.settings import DOMAIN -# pylint: disable=no-self-use class Register(View): """register a user""" - def get(self, request): # pylint: disable=unused-argument + def get(self, request): """whether or not you're logged in, just go to the home view""" return redirect("/") diff --git a/bookwyrm/views/list/curate.py b/bookwyrm/views/list/curate.py index cc0c552ea4..8cc3dcf110 100644 --- a/bookwyrm/views/list/curate.py +++ b/bookwyrm/views/list/curate.py @@ -12,7 +12,6 @@ from bookwyrm.views.list.list import normalize_book_list_ordering -# pylint: disable=no-self-use @method_decorator(login_required, name="dispatch") class Curate(View): """approve or discard list suggestions""" diff --git a/bookwyrm/views/list/embed.py b/bookwyrm/views/list/embed.py index e300168a03..928444fc6f 100644 --- a/bookwyrm/views/list/embed.py +++ b/bookwyrm/views/list/embed.py @@ -13,7 +13,6 @@ from bookwyrm.settings import PAGE_LENGTH -# pylint: disable=no-self-use class EmbedList(View): """embedded book list page""" diff --git a/bookwyrm/views/list/list.py b/bookwyrm/views/list/list.py index 0af89cf55f..10c2e763df 100644 --- a/bookwyrm/views/list/list.py +++ b/bookwyrm/views/list/list.py @@ -27,7 +27,6 @@ ) -# pylint: disable=no-self-use class List(View): """book list page""" diff --git a/bookwyrm/views/list/list_item.py b/bookwyrm/views/list/list_item.py index 1de0df8351..29b6bb7ec1 100644 --- a/bookwyrm/views/list/list_item.py +++ b/bookwyrm/views/list/list_item.py @@ -9,7 +9,6 @@ from bookwyrm.views.status import to_markdown -# pylint: disable=no-self-use @method_decorator(login_required, name="dispatch") class ListItem(View): """book list page""" diff --git a/bookwyrm/views/list/lists.py b/bookwyrm/views/list/lists.py index 5a2e7184e8..64598435b4 100644 --- a/bookwyrm/views/list/lists.py +++ b/bookwyrm/views/list/lists.py @@ -16,7 +16,6 @@ logger = logging.getLogger(__name__) -# pylint: disable=no-self-use class Lists(View): """book list page""" @@ -35,7 +34,6 @@ def get(self, request): return TemplateResponse(request, "lists/lists.html", data) @method_decorator(login_required, name="dispatch") - # pylint: disable=unused-argument def post(self, request): """create a book_list""" form = forms.ListForm(request.POST) diff --git a/bookwyrm/views/notifications.py b/bookwyrm/views/notifications.py index d186cf3a6c..c8811c5c68 100644 --- a/bookwyrm/views/notifications.py +++ b/bookwyrm/views/notifications.py @@ -7,7 +7,6 @@ from django.views import View -# pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") class Notifications(View): """notifications view""" diff --git a/bookwyrm/views/outbox.py b/bookwyrm/views/outbox.py index 8d619f5f17..77366eb069 100644 --- a/bookwyrm/views/outbox.py +++ b/bookwyrm/views/outbox.py @@ -8,7 +8,6 @@ from .helpers import is_bookwyrm_request -# pylint: disable= no-self-use class Outbox(View): """outbox""" diff --git a/bookwyrm/views/permission_denied.py b/bookwyrm/views/permission_denied.py index 9e62b09335..e4cd7023c2 100644 --- a/bookwyrm/views/permission_denied.py +++ b/bookwyrm/views/permission_denied.py @@ -6,7 +6,7 @@ from .helpers import is_api_request -def permission_denied(request, exception): # pylint: disable=unused-argument +def permission_denied(request, exception): """permission denied page""" if request.method == "POST" or is_api_request(request): diff --git a/bookwyrm/views/preferences/block.py b/bookwyrm/views/preferences/block.py index 1bbaca1ff9..beb12fa985 100644 --- a/bookwyrm/views/preferences/block.py +++ b/bookwyrm/views/preferences/block.py @@ -10,7 +10,6 @@ from bookwyrm import models -# pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") class Block(View): """blocking users""" diff --git a/bookwyrm/views/preferences/change_password.py b/bookwyrm/views/preferences/change_password.py index 7544b9f646..1530a060d9 100644 --- a/bookwyrm/views/preferences/change_password.py +++ b/bookwyrm/views/preferences/change_password.py @@ -10,7 +10,6 @@ from bookwyrm import forms -# pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") class ChangePassword(View): """change password as logged in user""" diff --git a/bookwyrm/views/preferences/delete_user.py b/bookwyrm/views/preferences/delete_user.py index 2350e47ab0..28559e840c 100644 --- a/bookwyrm/views/preferences/delete_user.py +++ b/bookwyrm/views/preferences/delete_user.py @@ -12,7 +12,6 @@ from bookwyrm import forms, models -# pylint: disable=no-self-use @method_decorator(login_required, name="dispatch") class DeleteUser(View): """delete user view""" diff --git a/bookwyrm/views/preferences/edit_user.py b/bookwyrm/views/preferences/edit_user.py index 307ef30d4c..58785b04e8 100644 --- a/bookwyrm/views/preferences/edit_user.py +++ b/bookwyrm/views/preferences/edit_user.py @@ -15,7 +15,6 @@ from bookwyrm.views.helpers import set_language -# pylint: disable=no-self-use @method_decorator(login_required, name="dispatch") class EditUser(View): """edit user view""" diff --git a/bookwyrm/views/preferences/export.py b/bookwyrm/views/preferences/export.py index a585ac273d..b940a9adc2 100644 --- a/bookwyrm/views/preferences/export.py +++ b/bookwyrm/views/preferences/export.py @@ -25,7 +25,6 @@ from bookwyrm.utils.cache import get_or_set -# pylint: disable=no-self-use,too-many-locals @method_decorator(login_required, name="dispatch") class Export(View): """Let users export data""" @@ -56,7 +55,7 @@ def post(self, request): deduplication_fields = [ f.name - for f in models.Edition._meta.get_fields() # pylint: disable=protected-access + for f in models.Edition._meta.get_fields() if getattr(f, "deduplication_field", False) ] fields = ( @@ -148,7 +147,6 @@ def post(self, request): ) -# pylint: disable=no-self-use @method_decorator(login_required, name="dispatch") class ExportUser(View): """ @@ -187,7 +185,6 @@ def get(self, request): try: export["size"] = job.export_data.size export["url"] = reverse("prefs-export-file", args=[job.task_id]) - # pylint: disable=broad-exception-caught except ( FileNotFoundError, Exception, @@ -262,7 +259,6 @@ def get(self, request, archive_id): export.export_data, content_type="application/gzip", headers={ - # pylint: disable=line-too-long "Content-Disposition": 'attachment; filename="bookwyrm-account-export.tar.gz"' }, ) diff --git a/bookwyrm/views/preferences/move_user.py b/bookwyrm/views/preferences/move_user.py index 3089c3e173..4419ad7c14 100644 --- a/bookwyrm/views/preferences/move_user.py +++ b/bookwyrm/views/preferences/move_user.py @@ -12,7 +12,6 @@ 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""" @@ -53,7 +52,6 @@ def post(self, request): 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""" diff --git a/bookwyrm/views/preferences/security.py b/bookwyrm/views/preferences/security.py index 34a72dbc0d..32e8628ff3 100644 --- a/bookwyrm/views/preferences/security.py +++ b/bookwyrm/views/preferences/security.py @@ -25,7 +25,6 @@ SessionStore = import_module(settings.SESSION_ENGINE).SessionStore -# pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") class UserSecurity(View): """change security settings as logged in user""" @@ -47,7 +46,6 @@ def get(self, request): @login_required @require_POST -# pylint: disable= unused-argument def logout_session(request, session_key: str = None): """log out session""" @@ -63,7 +61,6 @@ def logout_session(request, session_key: str = None): return redirect("/preferences/security") -# pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") class Edit2FA(View): """change 2FA settings as logged in user""" diff --git a/bookwyrm/views/reading.py b/bookwyrm/views/reading.py index b7dc85fa58..418bc8db37 100644 --- a/bookwyrm/views/reading.py +++ b/bookwyrm/views/reading.py @@ -21,7 +21,6 @@ logger = logging.getLogger(__name__) -# pylint: disable=no-self-use @method_decorator(login_required, name="dispatch") class ReadingStatus(View): """consider reading a book""" @@ -165,7 +164,6 @@ def post(self, request): @transaction.atomic -# pylint: disable=too-many-arguments def update_readthrough_on_shelve( user, annotated_book, status, start_date=None, finish_date=None, stopped_date=None ): diff --git a/bookwyrm/views/relationships.py b/bookwyrm/views/relationships.py index 02c6a1f731..19a807e188 100644 --- a/bookwyrm/views/relationships.py +++ b/bookwyrm/views/relationships.py @@ -12,7 +12,6 @@ from .helpers import get_user_from_username, is_api_request -# pylint: disable=no-self-use class Relationships(View): """list of followers/following view""" diff --git a/bookwyrm/views/report.py b/bookwyrm/views/report.py index abfbe5a73b..b100ccf45e 100644 --- a/bookwyrm/views/report.py +++ b/bookwyrm/views/report.py @@ -9,7 +9,6 @@ from bookwyrm import emailing, forms, models -# pylint: disable=no-self-use @method_decorator(login_required, name="dispatch") class Report(View): """Make reports""" diff --git a/bookwyrm/views/rss_feed.py b/bookwyrm/views/rss_feed.py index 588ce8dc7f..244da9cb1d 100644 --- a/bookwyrm/views/rss_feed.py +++ b/bookwyrm/views/rss_feed.py @@ -9,7 +9,6 @@ from .helpers import get_user_from_username -# pylint: disable=no-self-use class RssFeed(Feed): """serialize user's posts in rss feed""" @@ -24,7 +23,7 @@ def item_title(self, item): template = get_template("rss/title.html") return template.render({"user": item.user, "item_title": title}).strip() - def get_object(self, request, username): # pylint: disable=arguments-differ + def get_object(self, request, username): """the user who's posts get serialized""" return get_user_from_username(request.user, username) @@ -69,7 +68,7 @@ def item_title(self, item): template = get_template("rss/title.html") return template.render({"user": item.user, "item_title": title}).strip() - def get_object(self, request, username): # pylint: disable=arguments-differ + def get_object(self, request, username): """the user who's posts get serialized""" return get_user_from_username(request.user, username) @@ -111,7 +110,7 @@ def item_title(self, item): template = get_template("rss/title.html") return template.render({"user": item.user, "item_title": title}).strip() - def get_object(self, request, username): # pylint: disable=arguments-differ + def get_object(self, request, username): """the user who's posts get serialized""" return get_user_from_username(request.user, username) @@ -153,7 +152,7 @@ def item_title(self, item): template = get_template("rss/title.html") return template.render({"user": item.user, "item_title": title}).strip() - def get_object(self, request, username): # pylint: disable=arguments-differ + def get_object(self, request, username): """the user who's posts get serialized""" return get_user_from_username(request.user, username) @@ -196,7 +195,7 @@ def item_title(self, item): template = get_template("rss/title.html") return template.render({"user": authors, "item_title": item.title}).strip() - def get_object(self, request, shelf_identifier, username): # pylint: disable=arguments-differ + def get_object(self, request, shelf_identifier, username): """the shelf that gets serialized""" user = get_user_from_username(request.user, username) # always get privacy, don't support rss over anything private diff --git a/bookwyrm/views/search.py b/bookwyrm/views/search.py index 8324c2a62a..0c8fbf160e 100644 --- a/bookwyrm/views/search.py +++ b/bookwyrm/views/search.py @@ -23,7 +23,6 @@ from .helpers import handle_remote_webfinger -# pylint: disable= no-self-use class Search(View): """search users or books""" diff --git a/bookwyrm/views/setup.py b/bookwyrm/views/setup.py index b74b05f5ca..5075fa3c02 100644 --- a/bookwyrm/views/setup.py +++ b/bookwyrm/views/setup.py @@ -16,7 +16,6 @@ from bookwyrm.utils import regex -# pylint: disable= no-self-use class InstanceConfig(View): """make sure the instance looks correct before adding any data""" @@ -36,7 +35,6 @@ def get(self, request): ) warnings["localhost"] = settings.DOMAIN == "localhost" - # pylint: disable=line-too-long data = { "warnings": warnings, "info": { diff --git a/bookwyrm/views/shelf/shelf.py b/bookwyrm/views/shelf/shelf.py index 02b5426161..ec9c3c2c78 100644 --- a/bookwyrm/views/shelf/shelf.py +++ b/bookwyrm/views/shelf/shelf.py @@ -20,11 +20,9 @@ from bookwyrm.book_search import search -# pylint: disable=no-self-use class Shelf(View): """shelf page""" - # pylint: disable=R0914 @vary_on_headers("Accept") def get(self, request, username, shelf_identifier=None): """display a shelf""" diff --git a/bookwyrm/views/status.py b/bookwyrm/views/status.py index 22083e5252..2f698f04e0 100644 --- a/bookwyrm/views/status.py +++ b/bookwyrm/views/status.py @@ -27,7 +27,6 @@ logger = logging.getLogger(__name__) -# pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") class EditStatus(View): """the view for *posting*""" @@ -47,18 +46,16 @@ def get(self, request, status_id): return TemplateResponse(request, "compose.html", data) -# pylint: disable= no-self-use @method_decorator(login_required, name="dispatch") class CreateStatus(View): """the view for *posting*""" - def get(self, request, status_type): # pylint: disable=unused-argument + def get(self, request, status_type): """compose view (...not used?)""" book = get_mergeable_object_or_404(models.Edition, id=request.GET.get("book")) data = {"book": book} return TemplateResponse(request, "compose.html", data) - # pylint: disable=too-many-branches @transaction.atomic def post(self, request, status_type, existing_status_id=None): """create status of whatever type""" @@ -187,7 +184,7 @@ def post(self, request, status_id, report_id=None): @login_required @require_POST -def update_progress(request, book_id): # pylint: disable=unused-argument +def update_progress(request, book_id): """Either it's just a progress update, or it's a comment with a progress update""" if request.POST.get("post-status"): return CreateStatus.as_view()(request, "comment") diff --git a/bookwyrm/views/user.py b/bookwyrm/views/user.py index 4441e8bb5d..675e9ac981 100644 --- a/bookwyrm/views/user.py +++ b/bookwyrm/views/user.py @@ -17,7 +17,6 @@ from .helpers import get_user_from_username, is_api_request -# pylint: disable=no-self-use class User(View): """user profile page""" @@ -165,7 +164,6 @@ def hide_suggestions(request): return redirect("/") -# pylint: disable=unused-argument def user_redirect(request, username): """redirect to a user's feed""" return redirect("user-feed", username=username) diff --git a/bw-dev b/bw-dev index 1e39a1f011..2ad07c27c3 100755 --- a/bw-dev +++ b/bw-dev @@ -194,7 +194,7 @@ case "$CMD" in ruff) prod_error $DOCKER_COMPOSE run --rm dev-tools ruff format celerywyrm bookwyrm - runweb ruff check bookwyrm/ + $DOCKER_COMPOSE run --rm dev-tools ruff check celerywyrm bookwyrm ;; ruff-format) prod_error @@ -202,14 +202,11 @@ case "$CMD" in ;; ruff-check) prod_error - # ruff check depends on having the app dependencies in place, so we run it in the web container - runweb ruff check bookwyrm/ + $DOCKER_COMPOSE run --rm dev-tools ruff check celerywyrm bookwyrm ;; ruff-fix) prod_error - # Auto-fix ruff issues that can be fixed automatically - # ruff check depends on having the app dependencies in place, so we run it in the web container - runweb ruff check --fix bookwyrm/ + $DOCKER_COMPOSE run --rm dev-tools ruff check --fix celerywyrm bookwyrm ;; prettier) prod_error @@ -226,8 +223,8 @@ case "$CMD" in ;; formatters) prod_error - runweb ruff check bookwyrm/ $DOCKER_COMPOSE run --rm dev-tools ruff format celerywyrm bookwyrm + $DOCKER_COMPOSE run --rm dev-tools ruff check --fix celerywyrm bookwyrm $DOCKER_COMPOSE run --rm dev-tools prettier --write bookwyrm/static/js/*.js $DOCKER_COMPOSE run --rm dev-tools eslint bookwyrm/static --ext .js $DOCKER_COMPOSE run --rm dev-tools stylelint --fix bookwyrm/static/css \ diff --git a/celerywyrm/celery.py b/celerywyrm/celery.py index a90a38fa96..d0dcd5c213 100644 --- a/celerywyrm/celery.py +++ b/celerywyrm/celery.py @@ -4,7 +4,7 @@ import os from celery import Celery -from . import settings # pylint: disable=unused-import +from . import settings # set the default Django settings module for the 'celery' program. diff --git a/celerywyrm/settings.py b/celerywyrm/settings.py index 3b05fa45eb..bf67678df7 100644 --- a/celerywyrm/settings.py +++ b/celerywyrm/settings.py @@ -1,12 +1,10 @@ """bookwyrm settings and configuration""" -# pylint: disable=wildcard-import -# pylint: disable=unused-wildcard-import from bookwyrm.settings import * QUERY_TIMEOUT = env.int("CELERY_QUERY_TIMEOUT", env.int("QUERY_TIMEOUT", 30)) -# pylint: disable=line-too-long + REDIS_BROKER_PASSWORD = requests.compat.quote(env("REDIS_BROKER_PASSWORD", "")) REDIS_BROKER_HOST = env("REDIS_BROKER_HOST", "redis_broker") REDIS_BROKER_PORT = env.int("REDIS_BROKER_PORT", 6379) diff --git a/pyproject.toml b/pyproject.toml index 962bd6e8c0..1109e1d7b2 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,42 +7,26 @@ line-length = 88 target-version = "py311" -# Only select essential rules to minimize code changes -# E = pycodestyle errors (syntax errors, indentation issues) -# W = pycodestyle warnings (whitespace, etc.) -# F = pyflakes (unused imports, undefined names - critical errors only) lint.select = [ "E", # pycodestyle errors "W", # pycodestyle warnings "F", # pyflakes (critical errors only) ] -# Ignore rules that would require code changes lint.ignore = [ - "E501", # line too long (handled by formatter) - "E722", # bare except (too opinionated) - "E731", # lambda assignment (was disabled in pylint) -# "W503", # line break before binary operator (conflicts with formatter) - "F401", # unused imports (can be noisy, disable to minimize changes) + "E501", # line too long + "E722", # bare except + "E731", # lambda assignment + "F401", # unused imports "F403", # star import (unable to detect undefined names from star imports) - "F841", # unused variable (can be noisy) + "F405", # `env` may be undefined, or defined from star imports + "F841", # unused variable ] -# Per-file ignores for files with star imports -# Star imports make it impossible to detect undefined names -[tool.ruff.lint.per-file-ignores] -"bookwyrm/views/__init__.py" = ["F821"] # undefined name (due to star import from .wellknown) - [tool.ruff.format] -# Use double quotes for strings (black-compatible) quote-style = "double" -# Use spaces for indentation (black-compatible) indent-style = "space" -# Respect magic trailing comma (black-compatible) skip-magic-trailing-comma = false -# Line ending style line-ending = "auto" -# Docstring code format - preserve existing style docstring-code-format = false -# Docstring code line length - use same as line-length docstring-code-line-length = "dynamic" From ec475bb8abc83e7341190378b25473193b56c08f Mon Sep 17 00:00:00 2001 From: kasiarog Date: Tue, 2 Dec 2025 14:22:16 +0100 Subject: [PATCH 193/962] delete .pylintrc file --- .pylintrc | 21 --------------------- 1 file changed, 21 deletions(-) delete mode 100644 .pylintrc diff --git a/.pylintrc b/.pylintrc deleted file mode 100644 index e89f7d5363..0000000000 --- a/.pylintrc +++ /dev/null @@ -1,21 +0,0 @@ -[MAIN] -ignore=migrations -load-plugins=pylint.extensions.no_self_use - -[MESSAGES CONTROL] -disable = - cyclic-import, - duplicate-code, - fixme, - no-member, - raise-missing-from, - too-few-public-methods, - too-many-ancestors, - too-many-instance-attributes, - unnecessary-lambda-assignment, - unsubscriptable-object, -enable = - useless-suppression - -[FORMAT] -max-line-length=88 From 0a6c57efe1926f76fa924113c91eb1e53a85a2e5 Mon Sep 17 00:00:00 2001 From: kasiarog Date: Tue, 2 Dec 2025 22:47:38 +0100 Subject: [PATCH 194/962] update ruff version --- dev-tools/requirements.txt | 2 +- requirements.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dev-tools/requirements.txt b/dev-tools/requirements.txt index 29a810a983..f18e656ddb 100644 --- a/dev-tools/requirements.txt +++ b/dev-tools/requirements.txt @@ -1 +1 @@ -ruff>=0.1.0 +ruff>=0.14.7 diff --git a/requirements.txt b/requirements.txt index f6dc70f766..46c8304d5d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -47,7 +47,7 @@ setuptools>=65.5.1 tornado>=6.3.3 # Dev -ruff>=0.1.0 +ruff>=0.14.7 celery-types==0.22.0 django-stubs[compatible-mypy]==4.2.7 mypy==1.7.1 From f347a079128555ed705fc0f9ba738c3eded0c3dc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 14:22:39 +0000 Subject: [PATCH 195/962] Bump django from 5.2.8 to 5.2.9 Bumps [django](https://github.com/django/django) from 5.2.8 to 5.2.9. - [Commits](https://github.com/django/django/compare/5.2.8...5.2.9) --- updated-dependencies: - dependency-name: django dependency-version: 5.2.9 dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 1fe88baf6b..0419ac103c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,7 +4,7 @@ boto3==1.34.74 bw-file-resubmit==0.6.0rc2 celery==5.3.6 colorthief==0.2.1 -Django==5.2.8 +Django==5.2.9 django-celery-beat==2.8.1 django-compressor==4.4 django-csp==3.8 From f859e3fc3bf0ea1d62607432e4540595f9314bd2 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Fri, 5 Dec 2025 12:11:59 -0800 Subject: [PATCH 196/962] New translations django.po (Lithuanian) --- locale/lt_LT/LC_MESSAGES/django.po | 48 +++++++++++++++--------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/locale/lt_LT/LC_MESSAGES/django.po b/locale/lt_LT/LC_MESSAGES/django.po index da75671ef4..e49bd5100e 100644 --- a/locale/lt_LT/LC_MESSAGES/django.po +++ b/locale/lt_LT/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-11-16 19:21+0000\n" -"PO-Revision-Date: 2025-11-23 21:11\n" +"PO-Revision-Date: 2025-12-05 20:11\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Lithuanian\n" "Language: lt\n" @@ -4715,7 +4715,7 @@ msgstr "Naujojoje savo „BookWyrm“ paskyroje galėsite pasirinkti norimus imp #: bookwyrm/templates/preferences/export-user.html:45 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 "Jeigu norite migruoti įrašus (komentarus, apžvalgas ar citatas), turite arba prudėti naująją paskyrą kaip šios pseudonimą, arba perkelti šią paskyrą į naująją prieš importuodami naudotojo duomenis." +msgstr "Jeigu norite migruoti įrašus (komentarus, apžvalgas ar citatas), turite arba pridėti naująją paskyrą kaip šios pseudonimą, arba perkelti šią paskyrą į naująją prieš importuodami naudotojo duomenis." #: bookwyrm/templates/preferences/export-user.html:50 msgid "New user exports are currently disabled." @@ -4821,27 +4821,27 @@ msgstr "Migruoti paskyrą į kitą 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 "" +msgstr "Perkeliant paskyrą, apie tai bus pranešta jūsų sekėjams; jie bus nukreipti sekti naujosios paskyros." #: 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 "" +msgstr "Paskyra %(user)s bus pažymėta kaip perkelta; ji nebebus randama ir ja nebegalėsite pasinaudoti, nebent atšauktumėte perkėlimą." #: 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 "" +msgstr "Nepamirškite prieš pradėdami perkėlimą nurodyti šios paskyros kaip naujosios paskyros pseudonimo." #: 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 "" +msgstr "Įveskite perkeliamos paskyros naudotojo vardą, pvz., naudotojas@example.com:" #: bookwyrm/templates/preferences/security.html:4 #: bookwyrm/templates/preferences/security.html:7 msgid "Account Security" -msgstr "" +msgstr "Paskyros sauga" #: bookwyrm/templates/preferences/security.html:13 msgid "Two Factor Authentication" @@ -4906,55 +4906,55 @@ msgstr "Sutvarkyti 2FA" #: bookwyrm/templates/preferences/security.html:111 msgid "Sessions" -msgstr "" +msgstr "Sesijos" #: bookwyrm/templates/preferences/security.html:114 msgid "Some legacy sessions may not be displayed." -msgstr "" +msgstr "Kai kurios senos sesijos gali būti nerodomos." #: bookwyrm/templates/preferences/security.html:119 msgid "You are logged in to the following sessions:" -msgstr "" +msgstr "Jūsų paskyra prijungta šiose sesijose:" #: bookwyrm/templates/preferences/security.html:126 msgid "Date first logged in" -msgstr "" +msgstr "Pirmojo prisijungimo data" #: bookwyrm/templates/preferences/security.html:127 msgid "IP address" -msgstr "" +msgstr "IP adresas" #: bookwyrm/templates/preferences/security.html:127 msgid "IP" -msgstr "" +msgstr "IP" #: bookwyrm/templates/preferences/security.html:128 msgid "Operating System" -msgstr "" +msgstr "Operacinė sistema" #: bookwyrm/templates/preferences/security.html:128 msgid "OS" -msgstr "" +msgstr "OS" #: bookwyrm/templates/preferences/security.html:129 msgid "Web Browser" -msgstr "" +msgstr "Interneto naršyklė" #: bookwyrm/templates/preferences/security.html:129 msgid "Browser" -msgstr "" +msgstr "Naršyklė" #: bookwyrm/templates/preferences/security.html:143 msgid "You" -msgstr "" +msgstr "Jūs" #: bookwyrm/templates/preferences/security.html:147 msgid "Log Out" -msgstr "" +msgstr "Atsijungti" #: bookwyrm/templates/preferences/security.html:161 msgid "Currently your logged-in sessions are unable to be displayed." -msgstr "" +msgstr "Šiuo metu jūsų sesijų parodyti nepavyksta." #: bookwyrm/templates/reading_progress/finish.html:5 #, python-format @@ -5383,19 +5383,19 @@ msgstr "Eilės" #: bookwyrm/templates/settings/celery.html:26 msgid "Streams" -msgstr "" +msgstr "Srautai" #: bookwyrm/templates/settings/celery.html:32 msgid "Broadcast" -msgstr "" +msgstr "Transliacija" #: bookwyrm/templates/settings/celery.html:38 msgid "Inbox" -msgstr "" +msgstr "Gautieji" #: bookwyrm/templates/settings/celery.html:51 msgid "Import triggered" -msgstr "" +msgstr "Importas suplanuotas" #: bookwyrm/templates/settings/celery.html:57 #: bookwyrm/templates/settings/layout.html:104 From 61709d1673273e1506e8691a606bdd3027aa4d19 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Fri, 5 Dec 2025 13:24:22 -0800 Subject: [PATCH 197/962] New translations django.po (Lithuanian) --- locale/lt_LT/LC_MESSAGES/django.po | 158 ++++++++++++++--------------- 1 file changed, 79 insertions(+), 79 deletions(-) diff --git a/locale/lt_LT/LC_MESSAGES/django.po b/locale/lt_LT/LC_MESSAGES/django.po index e49bd5100e..17bd14aaeb 100644 --- a/locale/lt_LT/LC_MESSAGES/django.po +++ b/locale/lt_LT/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-11-16 19:21+0000\n" -"PO-Revision-Date: 2025-12-05 20:11\n" +"PO-Revision-Date: 2025-12-05 21:24\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Lithuanian\n" "Language: lt\n" @@ -5400,7 +5400,7 @@ msgstr "Importas suplanuotas" #: bookwyrm/templates/settings/celery.html:57 #: bookwyrm/templates/settings/layout.html:104 msgid "Connectors" -msgstr "" +msgstr "Integracijos" #: bookwyrm/templates/settings/celery.html:64 #: bookwyrm/templates/settings/site.html:91 @@ -5409,7 +5409,7 @@ msgstr "Paveikslėliai" #: bookwyrm/templates/settings/celery.html:70 msgid "Suggested Users" -msgstr "" +msgstr "Siūlomi nariai" #: bookwyrm/templates/settings/celery.html:83 #: bookwyrm/templates/settings/invites/manage_invite_requests.html:43 @@ -5419,7 +5419,7 @@ msgstr "El. paštas" #: bookwyrm/templates/settings/celery.html:89 msgid "Misc" -msgstr "" +msgstr "Kita" #: bookwyrm/templates/settings/celery.html:96 msgid "Low priority" @@ -5493,11 +5493,11 @@ msgstr "Klaidos" #: bookwyrm/templates/settings/connectors/available.html:15 msgid "Finna.fi is a search service that collects material from hundreds of Finnish organisations under one roof." -msgstr "" +msgstr "„Finna.fi“ yra ieškos tarnyba, po vienu stogu kaupianti medžiagą iš šimtų Suomijoje veikiančių organizacijų." #: bookwyrm/templates/settings/connectors/available.html:28 msgid "Create new connector" -msgstr "" +msgstr "Kurti naują integarciją" #: bookwyrm/templates/settings/connectors/connector.html:35 #: bookwyrm/templates/settings/connectors/update.html:33 @@ -5508,29 +5508,29 @@ msgstr "Išjungimo priežastis:" #: bookwyrm/templates/settings/connectors/connector.html:50 #: bookwyrm/templates/settings/connectors/update.html:47 msgid "Deactivate" -msgstr "" +msgstr "Išjungti" #: bookwyrm/templates/settings/connectors/connector.html:61 #: bookwyrm/templates/settings/connectors/update.html:58 msgid "Activate" -msgstr "" +msgstr "Įjungti" #: bookwyrm/templates/settings/connectors/connectors.html:4 #: bookwyrm/templates/settings/connectors/connectors.html:6 msgid "Connector Settings" -msgstr "" +msgstr "Integracijos nustatymai" #: bookwyrm/templates/settings/connectors/connectors.html:11 msgid "Connectors are sources of data about books and authors." -msgstr "" +msgstr "Integracijos padeda gauti duomenis apie knygas ir autorius iš įvairių šaltinių." #: bookwyrm/templates/settings/connectors/connectors.html:12 msgid "The priority determines the order in which search results appear. The highest priority is 1. The default priority is 2." -msgstr "" +msgstr "Prioritetas nusprendžia radinių rodymo tvarką. Aukščiausias prioritetas yra 1, numatytasis – 2." #: bookwyrm/templates/settings/connectors/connectors.html:14 msgid "Connector settings only determine whether a connector will be used to deliver search results. To manage more interactions with other federated servers, including domain blocks, see" -msgstr "" +msgstr "Integracijos nustatymuose galima tik pasirinkti, ar konkreti integracija bus naudojama ieškos rezultatams teikti. Daugiau nustatymų, susijusių su komunikacija tarp federuojamų serverių, įskaitant blokuojamus domenus, rasite" #: bookwyrm/templates/settings/connectors/connectors.html:14 #: bookwyrm/templates/settings/federation/edit_instance.html:12 @@ -5544,12 +5544,12 @@ msgstr "Susijungę serveriai" #: bookwyrm/templates/settings/connectors/update.html:66 msgid "should be updated. Check recent release notes for more information." -msgstr "" +msgstr "derėtų atnaujinti. Išsamesnės informacijos ieškokite paskiausių laidų apžvalgose." #: bookwyrm/templates/settings/connectors/update.html:76 #: bookwyrm/templates/snippets/create_status/post_options_block.html:19 msgid "Update" -msgstr "" +msgstr "Naujinti" #: bookwyrm/templates/settings/dashboard/dashboard.html:6 #: bookwyrm/templates/settings/dashboard/dashboard.html:8 @@ -5610,11 +5610,11 @@ msgstr "Būsenos publikuotos" #: bookwyrm/templates/settings/dashboard/warnings/check_for_updates.html:12 msgid "Would you like to automatically check for new BookWyrm releases? (recommended)" -msgstr "" +msgstr "Ar norėtumėte automatiškai ieškoti išleistų „BookWyrm“ naujinimų? (rekomenduojama)" #: bookwyrm/templates/settings/dashboard/warnings/check_for_updates.html:20 msgid "Schedule checks" -msgstr "" +msgstr "Suplanuoti patikras" #: bookwyrm/templates/settings/dashboard/warnings/domain_review.html:9 #, python-format @@ -5895,15 +5895,15 @@ msgstr "Serverių nerasta" #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" -msgstr "" +msgstr "Failų priežiūra" #: bookwyrm/templates/settings/files.html:17 msgid "Schedule file deletion" -msgstr "" +msgstr "Suplanuoti failų šalinimą" #: bookwyrm/templates/settings/files.html:21 msgid "This job deletes uploaded user export and import files that have reached the expiry age." -msgstr "" +msgstr "Ši procedūra pašalina nebegaliojančius eksporto ir importo failus." #: bookwyrm/templates/settings/files.html:102 msgid "Export file expiration" @@ -5933,43 +5933,43 @@ msgstr "Užbaigta" #: bookwyrm/templates/settings/files.html:206 msgid "Find book covers from connectors" -msgstr "" +msgstr "Ieškoti knygų viršelių per integracijas" #: bookwyrm/templates/settings/files.html:209 msgid "These jobs find cover images where they are missing or have incorrect filepaths." -msgstr "" +msgstr "Šios procedūros ieško viršelių atvaizdų, kai jie nenurodyti arba nurodyti klaidingai." #: bookwyrm/templates/settings/files.html:212 msgid "Find missing covers" -msgstr "" +msgstr "Ieškoti trūkstamų viršelių" #: bookwyrm/templates/settings/files.html:215 msgid "Schedule a regular scan to find cover images for editions without them. This can be resource intensive so the recommended schedule is no less than every seven days." -msgstr "" +msgstr "Suplanuokite periodinę leidimų be viršelių nuotraukų paiešką. Ši procedūra gali būti reikli ištekliams, todėl rekomenduojama ją vykdyti ne dažniau nei kartą per savaitę." #: bookwyrm/templates/settings/files.html:296 msgid "Fix broken book cover filepaths" -msgstr "" +msgstr "Taisyti sugadintus knygų viršelių failų kelius" #: bookwyrm/templates/settings/files.html:299 msgid "If you have lost your cover image files (e.g. due to server migration failure) the scheduled job above will not replace them. Run this job instead to attempt to find covers for books where the current cover filepath does not resolve to a file." -msgstr "" +msgstr "Jei praradote savo knygų viršelių failus (pavyzdžiui, dėl nepavykusios serverio migracijos), aukščiau nurodyta planinė procedūra jų neatitaisys. Jei norite ieškoti viršelių knygoms, kurių viršelių failų vardai rodo į nepasiekiamus failus, suplanuokite šią procedūrą." #: bookwyrm/templates/settings/files.html:306 msgid "This job cannot be scheduled to run regularly" -msgstr "" +msgstr "Šios procedūros neleidžiama planuoti kaip periodinės" #: bookwyrm/templates/settings/files.html:320 msgid "Editions checked" -msgstr "" +msgstr "Leidimų patikrinta" #: bookwyrm/templates/settings/files.html:321 msgid "Covers fixed" -msgstr "" +msgstr "Viršelių pataisyta" #: bookwyrm/templates/settings/files.html:371 msgid "Successfully updated expiry time" -msgstr "" +msgstr "Galiojimas sėkmingai pratęstas" #: bookwyrm/templates/settings/imports/complete_import_modal.html:4 #: bookwyrm/templates/settings/imports/complete_user_import_modal.html:4 @@ -5978,7 +5978,7 @@ msgstr "Sustabdyti importavimą?" #: 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 "" +msgstr "Šiuo veiksmu bus negrįžtamai nutrauktas neužbaigtas naudotojo importas" #: bookwyrm/templates/settings/imports/imports.html:19 msgid "Disable starting new imports" @@ -5994,7 +5994,7 @@ msgstr "Kai importavimas išjungtas - naujų pradėti negalima, bet seni importa #: bookwyrm/templates/settings/imports/imports.html:32 msgid "This setting prevents both book imports and user imports." -msgstr "" +msgstr "Ši parinktis suteikia galimybę uždrausti knygų ir naudotojų importą." #: bookwyrm/templates/settings/imports/imports.html:37 msgid "Disable imports" @@ -6039,55 +6039,55 @@ msgstr "Nustatyti limitą" #: bookwyrm/templates/settings/imports/imports.html:98 msgid "Disable starting new user exports" -msgstr "" +msgstr "Neleisti pradėti naujų naudotojų importo" #: bookwyrm/templates/settings/imports/imports.html:109 msgid "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." -msgstr "" +msgstr "Ši pasinktis turėtų būti naudojama tik tuomet, jei su eksportu iškilo rimtų problemų ir jį reikia laikinai pristabdyti, kol jas išspręsite." #: bookwyrm/templates/settings/imports/imports.html:110 msgid "While exports are disabled, users will not be allowed to start new user exports, but existing exports will not be affected." -msgstr "" +msgstr "Kol eksportas neleidžiamas, naudotojai negalės pradėti naujo paskyrų eksporto, tačiau jau pradėtų procesų tai nepaveiks." #: bookwyrm/templates/settings/imports/imports.html:115 msgid "Disable user exports" -msgstr "" +msgstr "Neleisti naudotojų eksporto" #: bookwyrm/templates/settings/imports/imports.html:123 msgid "Limit how often users can import and export" -msgstr "" +msgstr "Riboti naudotojų leidžiamų importo ir eksporto procesų dažnį" #: bookwyrm/templates/settings/imports/imports.html:134 msgid "Some users might try to run user imports or exports very frequently, which you want to limit." -msgstr "" +msgstr "Kai kurie naudotojai gali per dažnai norėti vykdyti importą ar eksportą. Čia galite tai apriboti." #: bookwyrm/templates/settings/imports/imports.html:138 msgid "Limit how often users can import and export user data" -msgstr "" +msgstr "Riboti naudotojų leidžiamų importo ir eksporto procesų dažnį" #: bookwyrm/templates/settings/imports/imports.html:140 msgid "hours" -msgstr "" +msgstr "val." #: bookwyrm/templates/settings/imports/imports.html:144 msgid "Change limit" -msgstr "" +msgstr "Keisti ribą" #: bookwyrm/templates/settings/imports/imports.html:159 msgid "Users are currently unable to start new user exports. This is the default setting." -msgstr "" +msgstr "Šiuo metu naudotojams neleidžiama pradėti naujų eksportų. Tai – numatytoji parinkties reikšmė." #: bookwyrm/templates/settings/imports/imports.html:161 msgid "It is not currently possible to provide user exports when using Azure storage." -msgstr "" +msgstr "Šiuo metu nėra galimybės naudotojams leisti duomenų eksportą, kai naudojamasi „Azure“ saugykla." #: bookwyrm/templates/settings/imports/imports.html:167 msgid "Enable user exports" -msgstr "" +msgstr "Leisti naudotojų eksportą" #: bookwyrm/templates/settings/imports/imports.html:174 msgid "Book Imports" -msgstr "" +msgstr "Knygų importas" #: bookwyrm/templates/settings/imports/imports.html:198 #: bookwyrm/templates/settings/imports/imports.html:288 @@ -6269,7 +6269,7 @@ msgstr "Tvarkyti naudotojus" #: bookwyrm/templates/settings/users/force_password_reset.html:7 #: bookwyrm/templates/settings/users/force_password_reset.html:11 msgid "Force Password Reset" -msgstr "" +msgstr "Priverstinai atkurti slaptažodį" #: bookwyrm/templates/settings/layout.html:59 msgid "Moderation" @@ -6283,7 +6283,7 @@ msgstr "Pranešimai" #: bookwyrm/templates/settings/layout.html:67 msgid "Auto-Moderation Rules" -msgstr "" +msgstr "Automatinio moderavimo taisyklės" #: bookwyrm/templates/settings/layout.html:79 #: bookwyrm/templates/settings/link_domains/link_domains.html:5 @@ -6297,11 +6297,11 @@ msgstr "Sistema" #: bookwyrm/templates/settings/layout.html:96 msgid "Scheduled Tasks" -msgstr "" +msgstr "Planinės užduotys" #: bookwyrm/templates/settings/layout.html:108 msgid "Files Maintenance" -msgstr "" +msgstr "Failų priežiūra" #: bookwyrm/templates/settings/layout.html:113 msgid "Instance Settings" @@ -6444,22 +6444,22 @@ msgstr "Raportuotos nuorodos" #: bookwyrm/templates/settings/reports/report.html:66 msgid "Moderation Activity" -msgstr "" +msgstr "Moderavimo veikla" #: bookwyrm/templates/settings/reports/report.html:73 #, python-format msgid "%(user)s opened this report" -msgstr "" +msgstr "%(user)s atidarė šį pranešimą" #: bookwyrm/templates/settings/reports/report.html:86 #, python-format msgid "%(user)s commented on this report:" -msgstr "" +msgstr "%(user)s parašė komentarą po šiuo pranešimu:" #: bookwyrm/templates/settings/reports/report.html:90 #, python-format msgid "%(user)s took an action on this report:" -msgstr "" +msgstr "%(user)s atliko veiksmą, remdamasi(s) šiuo pranešimu:" #: bookwyrm/templates/settings/reports/report_header.html:6 #, python-format @@ -6483,7 +6483,7 @@ msgstr "Pranešimas #%(report_id)s: naudotojas @%(username)s" #: bookwyrm/templates/settings/reports/report_links_table.html:19 msgid "Approve domain" -msgstr "" +msgstr "Patvirtinti domeną" #: bookwyrm/templates/settings/reports/report_links_table.html:26 msgid "Block domain" @@ -6531,24 +6531,24 @@ msgstr "Pranešimų nerasta." #: bookwyrm/templates/settings/schedules.html:7 #: bookwyrm/templates/settings/schedules.html:11 msgid "Scheduled tasks" -msgstr "" +msgstr "Planinės užduotys" #: bookwyrm/templates/settings/schedules.html:17 #: bookwyrm/templates/settings/schedules.html:101 msgid "Tasks" -msgstr "" +msgstr "Užduotys" #: bookwyrm/templates/settings/schedules.html:22 msgid "Name" -msgstr "" +msgstr "Pavadinimas" #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" -msgstr "" +msgstr "„Celery“ užduotis" #: bookwyrm/templates/settings/schedules.html:28 msgid "Date changed" -msgstr "" +msgstr "Keitimo data" #: bookwyrm/templates/settings/schedules.html:31 msgid "Last run at" @@ -6775,7 +6775,7 @@ msgstr "" #: bookwyrm/templates/settings/users/force_password_reset.html:53 msgid "Are you sure you want to force password reset for these users:" -msgstr "" +msgstr "Ar tikrai norite nurodyti šiems naudotojams atkurti slaptažodžius:" #: bookwyrm/templates/settings/users/user_admin.html:9 #, python-format @@ -6810,7 +6810,7 @@ msgstr "Nenustatytas" #: bookwyrm/templates/settings/users/user_info.html:20 msgid "This account is the instance actor for signing HTTP requests." -msgstr "" +msgstr "Šią paskyrą serveris naudoja HTTP užklausoms pasirašyti." #: bookwyrm/templates/settings/users/user_info.html:24 msgid "View user profile" @@ -6878,15 +6878,15 @@ msgstr "Nario veiksmai" #: bookwyrm/templates/settings/users/user_moderation_actions.html:15 msgid "This is the instance admin actor" -msgstr "" +msgstr "Tai – serverio administratoriaus paskyra" #: 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 "" +msgstr "Šios paskyros neturėtumėte šalinti ar atjungti, nes ji yra būtina tinkamam šio serverio veikimui. Ši paskyra naudojama GET užklausoms pasirašyti, bendraujant su kitais „ActivityPub“ serveriais." #: 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 "" +msgstr "Ši paskyra neatrandama įprastiems naudotojams ir neturi profilio puslapio." #: bookwyrm/templates/settings/users/user_moderation_actions.html:35 msgid "Activate user" @@ -6954,7 +6954,7 @@ msgstr "Atrodo, kad jūsų domenas nesukonfigūruotas. Į jį neturėtų įeiti #: bookwyrm/templates/setup/config.html:42 msgid "You are running BookWyrm with localhost. This should never be used in a production environment." -msgstr "" +msgstr "Jūs naudojatės „BookWyrm“ per localhost. Tokia konfigūracija niekada neturėtų būti naudojama produkcinėje aplinkoje." #: bookwyrm/templates/setup/config.html:52 bookwyrm/templates/user_menu.html:44 msgid "Settings" @@ -6966,7 +6966,7 @@ msgstr "Serverio informacija:" #: bookwyrm/templates/setup/config.html:62 msgid "Instance base URL:" -msgstr "" +msgstr "Serverio bazinis URL adresas:" #: bookwyrm/templates/setup/config.html:75 msgid "Using S3:" @@ -7075,7 +7075,7 @@ msgstr "Iki" #: bookwyrm/templates/shelf/shelf.html:221 #, python-format msgid "We couldn't find any books that matched %(shelves_filter_query)s" -msgstr "" +msgstr "Nepavyko rasti jokių knygų, aititinkančių paiešką „%(shelves_filter_query)s“" #: bookwyrm/templates/shelf/shelf.html:225 msgid "This shelf is empty." @@ -7083,11 +7083,11 @@ msgstr "Ši lentyna tuščia." #: bookwyrm/templates/shelf/shelves_filter_field.html:6 msgid "Filter by keyword" -msgstr "" +msgstr "Filtruoti pagal raktinį žodį" #: bookwyrm/templates/shelf/shelves_filter_field.html:7 msgid "Enter text here" -msgstr "" +msgstr "Įveskite tekstą čia" #: bookwyrm/templates/snippets/add_to_group_button.html:16 msgid "Invite" @@ -7291,7 +7291,7 @@ msgstr "Paremkite %(site_name)s per GitHub." -msgstr "„BookWyrm“ šaltinio kodas yra laisvai prieinamas. Galite prisidėti arba pranešti apie klaidas per GitHub." +msgstr "„BookWyrm“ pirminiai tekstai yra laisvai prieinami. Prisidėti prie šios platformos vystymo arba pranešti apie klaidas galite per „GitHub“." #: bookwyrm/templates/snippets/form_rate_stars.html:20 #: bookwyrm/templates/snippets/stars.html:38 @@ -7397,12 +7397,12 @@ msgstr "%(username)s perskaitė %(read_count)s iš %(goal_c #: bookwyrm/templates/snippets/move_user_buttons.html:10 msgid "Follow at new account" -msgstr "" +msgstr "Sekti naująją paskyrą" #: bookwyrm/templates/snippets/moved_user_notice.html:7 #, python-format msgid "%(user)s has moved to %(moved_to_name)s" -msgstr "" +msgstr "%(user)s perkėlė paskyrą į %(moved_to_name)s" #: bookwyrm/templates/snippets/page_text.html:8 #, python-format @@ -7547,7 +7547,7 @@ msgstr "Baigti skaityti" #: bookwyrm/templates/snippets/stars.html:13 msgid "Show rating" -msgstr "" +msgstr "Rodyti įvertinimą" #: bookwyrm/templates/snippets/status/content_status.html:69 msgid "Show status" @@ -7712,7 +7712,7 @@ msgstr "Rodyti mažiau" #: bookwyrm/templates/snippets/user_active_tag.html:5 msgid "Moved" -msgstr "" +msgstr "Perkelta" #: bookwyrm/templates/snippets/user_active_tag.html:12 msgid "Deleted" @@ -7880,10 +7880,10 @@ msgstr "Įrašų dar nėra" #, python-format msgid "%(display_count)s follower" msgid_plural "%(display_count)s followers" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" -msgstr[3] "" +msgstr[0] "%(display_count)s sekėjas" +msgstr[1] "%(display_count)s sekėjai" +msgstr[2] "%(display_count)s sekėjų" +msgstr[3] "%(display_count)s sekėjų" #: bookwyrm/templates/user/user_preview.html:31 #, python-format @@ -7910,7 +7910,7 @@ msgstr "Žiūrėti paskyrą ir dar daugiau" #: bookwyrm/templates/widgets/clearable_file_input_with_warning.html:28 #, python-format msgid "File exceeds maximum size: %(max_size)sMB" -msgstr "" +msgstr "Failo dydis viršija leistiną: %(max_size)s MB" #: bookwyrm/templatetags/list_page_tags.py:14 #, python-format @@ -7933,7 +7933,7 @@ msgstr "%(title)s: %(subtitle)s" #: bookwyrm/templatetags/utilities.py:133 msgid "a new user account" -msgstr "" +msgstr "nauja naudotojo paskyra" #: bookwyrm/views/updates.py:45 #, python-format From 313e1e721c18453179b9fa99d77f998d61e0b04d Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Fri, 5 Dec 2025 14:37:29 -0800 Subject: [PATCH 198/962] New translations django.po (Lithuanian) --- locale/lt_LT/LC_MESSAGES/django.po | 68 +++++++++++++++--------------- 1 file changed, 34 insertions(+), 34 deletions(-) diff --git a/locale/lt_LT/LC_MESSAGES/django.po b/locale/lt_LT/LC_MESSAGES/django.po index 17bd14aaeb..08697c6e64 100644 --- a/locale/lt_LT/LC_MESSAGES/django.po +++ b/locale/lt_LT/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-11-16 19:21+0000\n" -"PO-Revision-Date: 2025-12-05 21:24\n" +"PO-Revision-Date: 2025-12-05 22:37\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Lithuanian\n" "Language: lt\n" @@ -6327,7 +6327,7 @@ msgstr "Registracija" #: bookwyrm/templates/settings/themes.html:4 #: bookwyrm/templates/settings/themes.html:6 msgid "Themes" -msgstr "Temos" +msgstr "Grafiniai apvalkalai" #: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:5 #, python-format @@ -6552,36 +6552,36 @@ msgstr "Keitimo data" #: bookwyrm/templates/settings/schedules.html:31 msgid "Last run at" -msgstr "" +msgstr "Paskutinio vykdymo data" #: bookwyrm/templates/settings/schedules.html:34 #: bookwyrm/templates/settings/schedules.html:98 msgid "Schedule" -msgstr "" +msgstr "Tvarkaraštis" #: bookwyrm/templates/settings/schedules.html:37 msgid "Schedule ID" -msgstr "" +msgstr "Tvarkaraščio ID" #: bookwyrm/templates/settings/schedules.html:40 msgid "Enabled" -msgstr "" +msgstr "Įjungta" #: bookwyrm/templates/settings/schedules.html:73 msgid "Un-schedule" -msgstr "" +msgstr "Išjungti tvarkaraštį" #: bookwyrm/templates/settings/schedules.html:81 msgid "No scheduled tasks" -msgstr "" +msgstr "Planinių užduočių nėra" #: bookwyrm/templates/settings/schedules.html:90 msgid "Schedules" -msgstr "" +msgstr "Tvarkaraščiai" #: bookwyrm/templates/settings/schedules.html:119 msgid "No schedules found" -msgstr "" +msgstr "Tvarkaraščių nerasta" #: bookwyrm/templates/settings/site.html:10 #: bookwyrm/templates/settings/site.html:43 @@ -6663,27 +6663,27 @@ msgstr "Papildoma informacija:" #: bookwyrm/templates/settings/themes.html:10 msgid "Set instance default theme" -msgstr "Nustatyti numatytąją serverio temą" +msgstr "Nustatyti numatytąjį serverio grafinį apvalkalą" #: bookwyrm/templates/settings/themes.html:19 msgid "One of your themes appears to be broken. Selecting this theme will make the application unusable." -msgstr "" +msgstr "Panašu, kad vienas jūsų grafinių apvalkalų yra sugadintas. Pasirinkus šį apvalkalą, sistema taps nenaudotina." #: bookwyrm/templates/settings/themes.html:28 msgid "Successfully added theme" -msgstr "Tema pridėta sėkmingai" +msgstr "Grafinis apvalkalas pridėtas sėkmingai" #: bookwyrm/templates/settings/themes.html:35 msgid "How to add a theme" -msgstr "Kaip pridėti temą" +msgstr "Kaip pridėti grafinį apvalkalą" #: 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." +msgstr "Nukopijuokite grafinio apvalkalo failą į serverio katalogą bookwyrm/static/css/themes." #: 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." +msgstr "Įvykdykite ./bw-dev compile_themes ir ./bw-dev collectstatic komandas." #: bookwyrm/templates/settings/themes.html:44 msgid "Add the file name using the form below to make it available in the application interface." @@ -6692,24 +6692,24 @@ msgstr "Pridėkite failo pavadinimą, naudodamiesi žemiau esančia forma, kad j #: bookwyrm/templates/settings/themes.html:51 #: bookwyrm/templates/settings/themes.html:91 msgid "Add theme" -msgstr "Pridėti temą" +msgstr "Pridėti grafinį apvalkalą" #: bookwyrm/templates/settings/themes.html:57 msgid "Unable to save theme" -msgstr "Nepavyko išsaugoti temos" +msgstr "Nepavyko įrašyti grafinio apvalkalo" #: bookwyrm/templates/settings/themes.html:72 #: bookwyrm/templates/settings/themes.html:102 msgid "Theme name" -msgstr "Temos pavadinimas" +msgstr "Grafinio apvalkalo pavadinimas" #: bookwyrm/templates/settings/themes.html:82 msgid "Theme filename" -msgstr "Temos failo vardas" +msgstr "Grafinio apvalkalo failo vardas" #: bookwyrm/templates/settings/themes.html:97 msgid "Available Themes" -msgstr "Galimos temos" +msgstr "Galimi grafiniai apvalkalai" #: bookwyrm/templates/settings/themes.html:105 msgid "File" @@ -6717,19 +6717,19 @@ msgstr "Failas" #: bookwyrm/templates/settings/themes.html:123 msgid "Remove theme" -msgstr "Pašalinti temą" +msgstr "Pašalinti grafinį apvalkalą" #: bookwyrm/templates/settings/themes.html:134 msgid "Test theme" -msgstr "" +msgstr "Išbandyti grafinį apvalkalą" #: bookwyrm/templates/settings/themes.html:143 msgid "Broken theme" -msgstr "" +msgstr "Sugadintas grafinis apvalkalas" #: bookwyrm/templates/settings/themes.html:152 msgid "Loaded successfully" -msgstr "" +msgstr "Įkeltas sėkmingai" #: bookwyrm/templates/settings/users/delete_user_form.html:5 #: bookwyrm/templates/settings/users/user_moderation_actions.html:52 @@ -6739,39 +6739,39 @@ msgstr "Visam laikui pašalinti naudotoją" #: 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." -msgstr "" +msgstr "Ar tikrai norite negrįžtamai pašalinti paskyrą %(username)s?" #: bookwyrm/templates/settings/users/delete_user_form.html:18 msgid "I understand that this is a permanent action:" -msgstr "" +msgstr "Aš suprantu, kad šis veiksmas negrįžtamas:" #: bookwyrm/templates/settings/users/force_password_reset.html:17 msgid "All users in the selected category will be logged out and required to set a new password to log back in." -msgstr "" +msgstr "Visi naudotojai šioje kategorijoje bus atjungti nuo sistemos ir priversti pasikeisti slaptažodį prieš iš naujo prisijungdami." #: bookwyrm/templates/settings/users/force_password_reset.html:18 msgid "If your account is in the group, you will be logged out out after submitting." -msgstr "" +msgstr "Jei jūsų paskyra yra šioje grupėje, jūsų sesija taipogi bus nutraukta." #: bookwyrm/templates/settings/users/force_password_reset.html:22 msgid "Users given password resets:" -msgstr "" +msgstr "Naudotojai, kuriems bus atkurti slaptažodžiai:" #: bookwyrm/templates/settings/users/force_password_reset.html:35 msgid "All users" -msgstr "" +msgstr "Visi naudotojai" #: bookwyrm/templates/settings/users/force_password_reset.html:39 msgid "users" -msgstr "" +msgstr "naudotojai" #: bookwyrm/templates/settings/users/force_password_reset.html:43 msgid "Force password reset" -msgstr "" +msgstr "Priverstinai atkurti slaptažodį" #: bookwyrm/templates/settings/users/force_password_reset.html:48 msgid "Number of users that will be effected:" -msgstr "" +msgstr "Paveiksimų naudotojų skaičius:" #: bookwyrm/templates/settings/users/force_password_reset.html:53 msgid "Are you sure you want to force password reset for these users:" From cac6469eb358747c08dfbce5f73e29c8b2973a7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20C=C3=A1mara?= Date: Sun, 7 Dec 2025 10:48:16 +0000 Subject: [PATCH 199/962] Set pages as deduplication_field --- bookwyrm/models/book.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/models/book.py b/bookwyrm/models/book.py index 5f71221ea8..8e05af06cc 100644 --- a/bookwyrm/models/book.py +++ b/bookwyrm/models/book.py @@ -583,7 +583,7 @@ class Edition(Book): oclc_number = fields.CharField( max_length=255, blank=True, null=True, deduplication_field=True ) - pages = fields.IntegerField(blank=True, null=True) + pages = fields.IntegerField(blank=True, null=True, deduplication_field=True) physical_format = fields.CharField( max_length=255, choices=FormatChoices, null=True, blank=True ) From 33261ecc18e8fe139215705774dac1ddca4b6507 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20C=C3=A1mara?= Date: Sun, 7 Dec 2025 20:13:05 +0000 Subject: [PATCH 200/962] Attempt to fix testing errors --- bookwyrm/tests/views/preferences/test_export.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/bookwyrm/tests/views/preferences/test_export.py b/bookwyrm/tests/views/preferences/test_export.py index d9810e7e98..6b7eec3bc4 100644 --- a/bookwyrm/tests/views/preferences/test_export.py +++ b/bookwyrm/tests/views/preferences/test_export.py @@ -38,6 +38,7 @@ def setUpTestData(cls): remote_id="https://example.com/book/1", parent_work=cls.work, isbn_13="9781234567890", + pages=123, bnf_id="beep", ) @@ -68,7 +69,7 @@ def test_export_file(self, *_): # pylint: disable=line-too-long self.assertEqual( export.content, - b"title,author_text,remote_id,openlibrary_key,finna_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" + b"title,author_text,remote_id,openlibrary_key,finna_key,inventaire_id,librarything_key,goodreads_key,bnf_id,viaf,wikidata,asin,aasin,isfdb,isbn_10,isbn_13,oclc_number,pages,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), ) From 542ab52cce27a02674fd5741dcbb8381db683125 Mon Sep 17 00:00:00 2001 From: kasiarog Date: Mon, 8 Dec 2025 12:46:53 +0100 Subject: [PATCH 201/962] added [tool.ruff.lint] table --- pyproject.toml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 1109e1d7b2..8c31124dbc 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,13 +7,14 @@ line-length = 88 target-version = "py311" -lint.select = [ +[tool.ruff.lint] +select = [ "E", # pycodestyle errors "W", # pycodestyle warnings "F", # pyflakes (critical errors only) ] -lint.ignore = [ +ignore = [ "E501", # line too long "E722", # bare except "E731", # lambda assignment From 13f3190c14a1d97714ffe13681e11c13d703ce49 Mon Sep 17 00:00:00 2001 From: Hugh Rundle Date: Tue, 9 Dec 2025 18:48:41 +1100 Subject: [PATCH 202/962] fix mock in test_existings_authors_aliases_add_author_helper The mock/patch in `test_existings_authors_aliases_add_author_helper`, which is probably also slowing down our test suite and potentially causing unexpected failures when the ISNI endpoint doesn't resolve at the time the tests are run. See https://docs.python.org/3/library/unittest.mock.html#where-to-patch --- bookwyrm/tests/views/books/test_edit_book.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/tests/views/books/test_edit_book.py b/bookwyrm/tests/views/books/test_edit_book.py index 0ef6bf4bdb..502b6f2219 100644 --- a/bookwyrm/tests/views/books/test_edit_book.py +++ b/bookwyrm/tests/views/books/test_edit_book.py @@ -426,7 +426,7 @@ def test_existings_authors_aliases_add_author_helper(self): request = self.factory.post("", form.data) request.user = self.local_user - with patch("bookwyrm.utils.isni.find_authors_by_name") as mock: + with patch("bookwyrm.views.books.edit_book.find_authors_by_name") as mock: mock.return_value = [] result = add_authors(request, form.data) From fd6ba916eb7c8387e13331d3c314a345319b3872 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20C=C3=A1mara?= Date: Tue, 9 Dec 2025 13:46:28 +0000 Subject: [PATCH 203/962] Export pages and update tests --- bookwyrm/models/book.py | 2 +- bookwyrm/tests/views/preferences/test_export.py | 2 +- bookwyrm/views/preferences/export.py | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/bookwyrm/models/book.py b/bookwyrm/models/book.py index 8e05af06cc..5f71221ea8 100644 --- a/bookwyrm/models/book.py +++ b/bookwyrm/models/book.py @@ -583,7 +583,7 @@ class Edition(Book): oclc_number = fields.CharField( max_length=255, blank=True, null=True, deduplication_field=True ) - pages = fields.IntegerField(blank=True, null=True, deduplication_field=True) + pages = fields.IntegerField(blank=True, null=True) physical_format = fields.CharField( max_length=255, choices=FormatChoices, null=True, blank=True ) diff --git a/bookwyrm/tests/views/preferences/test_export.py b/bookwyrm/tests/views/preferences/test_export.py index 6b7eec3bc4..934515037c 100644 --- a/bookwyrm/tests/views/preferences/test_export.py +++ b/bookwyrm/tests/views/preferences/test_export.py @@ -70,6 +70,6 @@ def test_export_file(self, *_): self.assertEqual( export.content, b"title,author_text,remote_id,openlibrary_key,finna_key,inventaire_id,librarything_key,goodreads_key,bnf_id,viaf,wikidata,asin,aasin,isfdb,isbn_10,isbn_13,oclc_number,pages,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" + + b"Test Book,,%b,,,,,,beep,,,,,,123456789X,9781234567890,,123,,,,,,,,,to-read,To Read,%b\r\n" % (self.book.remote_id.encode("utf-8"), book_date), ) diff --git a/bookwyrm/views/preferences/export.py b/bookwyrm/views/preferences/export.py index e13d488d46..1b7aa55284 100644 --- a/bookwyrm/views/preferences/export.py +++ b/bookwyrm/views/preferences/export.py @@ -61,6 +61,7 @@ def post(self, request): ["title", "author_text"] + deduplication_fields + [ + "pages", "start_date", "finish_date", "stopped_date", From f666bceebf67f11e30e033c29e147dc5e5deac29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carlos=20C=C3=A1mara?= Date: Tue, 9 Dec 2025 13:56:22 +0000 Subject: [PATCH 204/962] Delete trailing whitespace --- bookwyrm/views/preferences/export.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/views/preferences/export.py b/bookwyrm/views/preferences/export.py index 1b7aa55284..04a94fbbd2 100644 --- a/bookwyrm/views/preferences/export.py +++ b/bookwyrm/views/preferences/export.py @@ -61,7 +61,7 @@ def post(self, request): ["title", "author_text"] + deduplication_fields + [ - "pages", + "pages", "start_date", "finish_date", "stopped_date", From 0a955e5e7cfe3d5a6794765587f85f0fbdaf589f Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Wed, 10 Dec 2025 05:43:13 -0800 Subject: [PATCH 205/962] New translations django.po (Galician) --- locale/gl_ES/LC_MESSAGES/django.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/gl_ES/LC_MESSAGES/django.po b/locale/gl_ES/LC_MESSAGES/django.po index 1d7fb0f4cb..91fbd0aeb7 100644 --- a/locale/gl_ES/LC_MESSAGES/django.po +++ b/locale/gl_ES/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-11-16 19:21+0000\n" -"PO-Revision-Date: 2025-11-17 12:36\n" +"PO-Revision-Date: 2025-12-10 13:43\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Galician\n" "Language: gl\n" @@ -1728,7 +1728,7 @@ msgstr "Idioma %(languages)s" #: bookwyrm/templates/book/publisher_info.html:63 #, python-format msgid "Published %(date)s by %(publisher)s." -msgstr "Publicado en %(date)s por %(publisher)s." +msgstr "Data de publicación %(date)s, por %(publisher)s." #: bookwyrm/templates/book/publisher_info.html:65 #, python-format From 81e902f24ccc59f6662dd40931d388fbc9e219ae Mon Sep 17 00:00:00 2001 From: Ilkka Ollakka Date: Sat, 13 Dec 2025 15:55:59 +0200 Subject: [PATCH 206/962] docker-compose: use healthchecks and service_healthy dependencies --- docker-compose.yml | 50 +++++++++++++++++++++++++++++++++++++--------- 1 file changed, 41 insertions(+), 9 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 76c371d4ac..5f37b1f7f6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,7 +6,8 @@ services: - "${PORT:-80}:80" - "${PORT:-443:443}" depends_on: - - web + web: + condition: service_healthy networks: - main environment: @@ -38,7 +39,7 @@ services: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"] interval: 10s retries: 5 - start_period: 30s + start_period: 5s timeout: 10s volumes: - pgdata:/var/lib/postgresql/data @@ -53,12 +54,16 @@ services: - static_volume:/app/static - media_volume:/app/images - exports_volume:/app/exports + healthcheck: + test: ["CMD-SHELL", "curl -f http://localhost:8000"] + interval: 10s + timeout: 10s + start_period: 3s + retries: 6 depends_on: db: condition: service_healthy restart: true - celery_worker: - condition: service_started redis_activity: condition: service_started networks: @@ -89,14 +94,24 @@ services: networks: - main command: celery -A celerywyrm worker -l info -Q high_priority,medium_priority,low_priority,streams,images,suggested_users,email,connectors,lists,inbox,imports,import_triggered,broadcast,misc + healthcheck: + test: celery -A celerywyrm status + interval: 10s + timeout: 10s + start_period: 2s + retries: 6 volumes: - .:/app - static_volume:/app/static - media_volume:/app/images - exports_volume:/app/exports depends_on: - - db - - redis_broker + web: + condition: service_healthy + db: + condition: service_healthy + redis_broker: + condition: service_started restart: on-failure celery_beat: env_file: .env @@ -104,17 +119,30 @@ services: networks: - main command: celery -A celerywyrm beat -l INFO --scheduler django_celery_beat.schedulers:DatabaseScheduler + healthcheck: + test: celery -A celerywyrm status + interval: 10s + timeout: 10s + retries: 6 + start_period: 2s volumes: - .:/app - static_volume:/app/static - media_volume:/app/images - exports_volume:/app/exports depends_on: - - celery_worker + celery_worker: + condition: service_healthy restart: on-failure flower: build: . command: celery -A celerywyrm flower --basic_auth=${FLOWER_USER}:${FLOWER_PASSWORD} --url_prefix=flower + healthcheck: + test: celery -A celerywyrm status + interval: 10s + timeout: 10s + retries: 6 + start_period: 2s env_file: .env volumes: - .:/app @@ -122,8 +150,12 @@ services: networks: - main depends_on: - - db - - redis_broker + db: + condition: service_healthy + redis_broker: + condition: service_started + web: + condition: service_healthy restart: on-failure dev-tools: build: dev-tools From 3ade95dff1392aab473523c6e1208bca0dd19264 Mon Sep 17 00:00:00 2001 From: Ilkka Ollakka Date: Sat, 13 Dec 2025 16:06:04 +0200 Subject: [PATCH 207/962] dev-tools: use node image as source instead of apt --- dev-tools/Dockerfile | 11 +++++------ dev-tools/nodejs.pref | 4 ---- dev-tools/nodejs.sources | 34 ---------------------------------- 3 files changed, 5 insertions(+), 44 deletions(-) delete mode 100644 dev-tools/nodejs.pref delete mode 100644 dev-tools/nodejs.sources diff --git a/dev-tools/Dockerfile b/dev-tools/Dockerfile index 563467f09e..adb0f84784 100644 --- a/dev-tools/Dockerfile +++ b/dev-tools/Dockerfile @@ -4,15 +4,14 @@ WORKDIR /app/dev-tools ENV PATH="/app/dev-tools/node_modules/.bin:$PATH" ENV PYTHONUNBUFFERED=1 ENV NPM_CONFIG_UPDATE_NOTIFIER=false -ENV PIP_ROOT_USER_ACTION=ignore PIP_DISABLE_PIP_VERSION_CHECK=1 +ENV PIP_ROOT_USER_ACTION=ignore +ENV PIP_DISABLE_PIP_VERSION_CHECK=1 -COPY nodejs.pref /etc/apt/preferences.d/ -COPY nodejs.sources /etc/apt/sources.list.d/ +COPY --from=node:18-slim /usr/local/bin /usr/local/bin +COPY --from=node:18-slim /usr/local/lib/node_modules /usr/local/lib/node_modules COPY package.json requirements.txt .stylelintrc.js .stylelintignore /app/dev-tools/ -RUN apt-get update && \ - apt-get install -y nodejs && \ - pip install -r requirements.txt && \ +RUN pip install --no-cache-dir -r requirements.txt && \ npm install . WORKDIR /app diff --git a/dev-tools/nodejs.pref b/dev-tools/nodejs.pref deleted file mode 100644 index 69e01c2c55..0000000000 --- a/dev-tools/nodejs.pref +++ /dev/null @@ -1,4 +0,0 @@ -Package: nodejs -Pin: origin deb.nodesource.com -Pin-Priority: 995 -Explanation: prefer upstream packaging over Debian's diff --git a/dev-tools/nodejs.sources b/dev-tools/nodejs.sources deleted file mode 100644 index 1e0c3ba404..0000000000 --- a/dev-tools/nodejs.sources +++ /dev/null @@ -1,34 +0,0 @@ -Types: deb -URIs: https://deb.nodesource.com/node_18.x -Suites: nodistro -Components: main -Signed-By: - -----BEGIN PGP PUBLIC KEY BLOCK----- - . - mQENBFdDN1ABCADaNd/I3j3tn40deQNgz7hB2NvT+syXe6k4ZmdiEcOfBvFrkS8B - hNS67t93etHsxEy7E0qwsZH32bKazMqe9zDwoa3aVImryjh6SHC9lMtW27JPHFeM - Srkt9YmH1WMwWcRO6eSY9B3PpazquhnvbammLuUojXRIxkDroy6Fw4UKmUNSRr32 - 9Ej87jRoR1B2/57Kfp2Y4+vFGGzSvh3AFQpBHq51qsNHALU6+8PjLfIt+5TPvaWR - TB+kAZnQZkaIQM2nr1n3oj6ak2RATY/+kjLizgFWzgEfbCrbsyq68UoY5FPBnu4Z - E3iDZpaIqwKr0seUC7iA1xM5eHi5kty1oB7HABEBAAG0Ik5Tb2xpZCA8bnNvbGlk - LWdwZ0Bub2Rlc291cmNlLmNvbT6JATgEEwECACIFAldDN1ACGwMGCwkIBwMCBhUI - AgkKCwQWAgMBAh4BAheAAAoJEC9ZtfmbG+C0y7wH/i4xnab36dtrYW7RZwL8i6Sc - NjMx4j9+U1kr/F6YtqWd+JwCbBdar5zRghxPcYEq/qf7MbgAYcs1eSOuTOb7n7+o - xUwdH2iCtHhKh3Jr2mRw1ks7BbFZPB5KmkxHaEBfLT4d+I91ZuUdPXJ+0SXs9gzk - Dbz65Uhoz3W03aiF8HeL5JNARZFMbHHNVL05U1sTGTCOtu+1c/33f3TulQ/XZ3Y4 - hwGCpLe0Tv7g7Lp3iLMZMWYPEa0a7S4u8he5IEJQLd8bE8jltcQvrdr3Fm8kI2Jg - BJmUmX4PSfhuTCFaR/yeCt3UoW883bs9LfbTzIx9DJGpRIu8Y0IL3b4sj/GoZVq5 - AQ0EV0M3UAEIAKrTaC62ayzqOIPa7nS90BHHck4Z33a2tZF/uof38xNOiyWGhT8u - JeFoTTHn5SQq5Ftyu4K3K2fbbpuu/APQF05AaljzVkDGNMW4pSkgOasdysj831cu - ssrHX2RYS22wg80k6C/Hwmh5F45faEuNxsV+bPx7oPUrt5n6GMx84vEP3i1+FDBi - 0pt/B/QnDFBXki1BGvJ35f5NwDefK8VaInxXP3ZN/WIbtn5dqxppkV/YkO7GiJlp - Jlju9rf3kKUIQzKQWxFsbCAPIHoWv7rH9RSxgDithXtG6Yg5R1aeBbJaPNXL9wpJ - YBJbiMjkAFaz4B95FOqZm3r7oHugiCGsHX0AEQEAAYkBHwQYAQIACQUCV0M3UAIb - DAAKCRAvWbX5mxvgtE/OB/0VN88DR3Y3fuqy7lq/dthkn7Dqm9YXdorZl3L152eE - IF882aG8FE3qZdaLGjQO4oShAyNWmRfSGuoH0XERXAI9n0r8m4mDMxE6rtP7tHet - y/5M8x3CTyuMgx5GLDaEUvBusnTD+/v/fBMwRK/cZ9du5PSG4R50rtst+oYyC2ao - x4I2SgjtF/cY7bECsZDplzatN3gv34PkcdIg8SLHAVlL4N5tzumDeizRspcSyoy2 - K2+hwKU4C4+dekLLTg8rjnRROvplV2KtaEk6rxKtIRFDCoQng8wfJuIMrDNKvqZw - FRGt7cbvW5MCnuH8MhItOl9Uxp1wHp6gtav/h8Gp6MBa - =MARt - -----END PGP PUBLIC KEY BLOCK----- From 6e11d75980b8a00e1d40cb853ae7b46cdd877fed Mon Sep 17 00:00:00 2001 From: Hugh Rundle Date: Sun, 14 Dec 2025 19:44:02 +1100 Subject: [PATCH 208/962] fix series title search in ConfirmEditBook Q object query was wrong. Also fixed an except block I messed up when merging. --- bookwyrm/connectors/abstract_connector.py | 5 ++++- bookwyrm/connectors/bookwyrm_connector.py | 1 - bookwyrm/management/commands/upgrade_series.py | 2 -- bookwyrm/models/bookwyrm_export_job.py | 10 +++++----- bookwyrm/tests/activitypub/test_series.py | 1 + bookwyrm/tests/models/test_series.py | 2 +- bookwyrm/tests/views/books/test_series.py | 3 ++- bookwyrm/views/books/edit_book.py | 6 ++---- bookwyrm/views/books/series.py | 1 - 9 files changed, 15 insertions(+), 16 deletions(-) diff --git a/bookwyrm/connectors/abstract_connector.py b/bookwyrm/connectors/abstract_connector.py index f7e7eb5336..fcb4018884 100644 --- a/bookwyrm/connectors/abstract_connector.py +++ b/bookwyrm/connectors/abstract_connector.py @@ -175,7 +175,10 @@ def get_or_create_seriesbook_from_data( # pylint: disable=no-self-use edition.save() activitydata_to_seriesbook( - user=user, work=work, new=series, instance=instance # type: ignore + user=user, + work=work, + new=series, + instance=instance, # type: ignore ) @abstractmethod diff --git a/bookwyrm/connectors/bookwyrm_connector.py b/bookwyrm/connectors/bookwyrm_connector.py index 9930febf51..4df3f12719 100644 --- a/bookwyrm/connectors/bookwyrm_connector.py +++ b/bookwyrm/connectors/bookwyrm_connector.py @@ -16,7 +16,6 @@ def __init__(self, identifier: str): super().__init__(identifier) def get_or_create_book(self, remote_id: str) -> models.Edition: - edition = activitypub.resolve_remote_id(remote_id, model=models.Edition) if edition.series: diff --git a/bookwyrm/management/commands/upgrade_series.py b/bookwyrm/management/commands/upgrade_series.py index 102340915e..c75c1bcec0 100644 --- a/bookwyrm/management/commands/upgrade_series.py +++ b/bookwyrm/management/commands/upgrade_series.py @@ -18,7 +18,6 @@ def upgrade_series_data(): for book in ( Edition.objects.filter(parent_work__seriesbooks=None).exclude(series=None).all() ): - vector = SearchVector("name", weight="A") + SearchVector( "alternative_names", weight="B" ) @@ -30,7 +29,6 @@ def upgrade_series_data(): ) if possible_series.exists(): - books = Book.objects.filter(authors__in=Subquery(book.authors.values("pk"))) if same_author_sb := SeriesBook.objects.filter(book__in=books).filter( diff --git a/bookwyrm/models/bookwyrm_export_job.py b/bookwyrm/models/bookwyrm_export_job.py index 3227665f0b..e03bed5771 100644 --- a/bookwyrm/models/bookwyrm_export_job.py +++ b/bookwyrm/models/bookwyrm_export_job.py @@ -76,11 +76,11 @@ def create_export_json_task(**kwargs): # trigger task to create tar file create_archive_task.delay(job_id=job.id) - except Exception as err: - logger.exception( - "create_export_json_task for job %s failed with error: %s", job.id, err - ) - job.set_status("failed") + except Exception as err: + logger.exception( + "create_export_json_task for job %s failed with error: %s", job.id, err + ) + job.set_status("failed") def archive_file_location(file, directory="") -> str: diff --git a/bookwyrm/tests/activitypub/test_series.py b/bookwyrm/tests/activitypub/test_series.py index aad78a8cdd..92007316fe 100644 --- a/bookwyrm/tests/activitypub/test_series.py +++ b/bookwyrm/tests/activitypub/test_series.py @@ -1,4 +1,5 @@ """test author serializer""" + from unittest.mock import patch import responses diff --git a/bookwyrm/tests/models/test_series.py b/bookwyrm/tests/models/test_series.py index 8d811c7c0a..d9cb83c51e 100644 --- a/bookwyrm/tests/models/test_series.py +++ b/bookwyrm/tests/models/test_series.py @@ -1,4 +1,4 @@ -""" testing series models """ +"""testing series models""" from django.test import TestCase diff --git a/bookwyrm/tests/views/books/test_series.py b/bookwyrm/tests/views/books/test_series.py index d4a8b4d674..9d63fb92aa 100644 --- a/bookwyrm/tests/views/books/test_series.py +++ b/bookwyrm/tests/views/books/test_series.py @@ -1,4 +1,5 @@ -""" test for app action functionality """ +"""test for app action functionality""" + from unittest.mock import patch from django.contrib.auth.models import Group, Permission from django.contrib.contenttypes.models import ContentType diff --git a/bookwyrm/views/books/edit_book.py b/bookwyrm/views/books/edit_book.py index f76d9d5236..4f33bc7475 100644 --- a/bookwyrm/views/books/edit_book.py +++ b/bookwyrm/views/books/edit_book.py @@ -365,7 +365,6 @@ def post(self, request, book_id=None): if not models.SeriesBook.objects.filter( series=series, book=book.parent_work, user=user ).exists(): # don't create a dupe! - models.SeriesBook.objects.create( series=series, book=book.parent_work, @@ -376,10 +375,9 @@ def post(self, request, book_id=None): book = clear_series(book) else: - if maybe_series := models.Series.objects.filter( - Q(title=book__series) - | Q(alternative_titles__contains(book__series)) + Q(title=book.series) + | Q(alternative_titles__contains=book.series) ): # is there a SeriesBook already despite what the user claims? maybe_seriesbooks = models.SeriesBook.filter( diff --git a/bookwyrm/views/books/series.py b/bookwyrm/views/books/series.py index 65785ea364..181bf43d7e 100644 --- a/bookwyrm/views/books/series.py +++ b/bookwyrm/views/books/series.py @@ -64,7 +64,6 @@ def get(self, request, series_id=None): return TemplateResponse(request, "book/edit/edit_series.html", data) - def post(self, request, series_id): """submit the series edit form""" From 69993c83795a489ac86c272a7f21f98e9e3a9c50 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Tue, 16 Dec 2025 10:25:33 -0800 Subject: [PATCH 209/962] New translations django.po (Yiddish) --- locale/yi_DE/LC_MESSAGES/django.po | 7870 ++++++++++++++++++++++++++++ 1 file changed, 7870 insertions(+) create mode 100644 locale/yi_DE/LC_MESSAGES/django.po diff --git a/locale/yi_DE/LC_MESSAGES/django.po b/locale/yi_DE/LC_MESSAGES/django.po new file mode 100644 index 0000000000..9c51fa6558 --- /dev/null +++ b/locale/yi_DE/LC_MESSAGES/django.po @@ -0,0 +1,7870 @@ +msgid "" +msgstr "" +"Project-Id-Version: bookwyrm\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2025-11-16 19:21+0000\n" +"PO-Revision-Date: 2025-12-16 18:25\n" +"Last-Translator: Mouse Reeve \n" +"Language-Team: Yiddish\n" +"Language: yi\n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" +"X-Crowdin-Project: bookwyrm\n" +"X-Crowdin-Project-ID: 479239\n" +"X-Crowdin-Language: yi\n" +"X-Crowdin-File: /[bookwyrm-social.bookwyrm] main/locale/en_US/LC_MESSAGES/django.po\n" +"X-Crowdin-File-ID: 1553\n" + +#: bookwyrm/forms/admin.py:42 +msgid "One Day" +msgstr "" + +#: bookwyrm/forms/admin.py:43 +msgid "One Week" +msgstr "" + +#: bookwyrm/forms/admin.py:44 +msgid "One Month" +msgstr "" + +#: bookwyrm/forms/admin.py:45 +msgid "Does Not Expire" +msgstr "" + +#: bookwyrm/forms/admin.py:50 +msgid "Unlimited" +msgstr "" + +#: bookwyrm/forms/edit_user.py:99 bookwyrm/views/landing/password.py:117 +msgid "Incorrect password" +msgstr "" + +#: bookwyrm/forms/edit_user.py:106 bookwyrm/forms/landing.py:93 +msgid "Password does not match" +msgstr "" + +#: bookwyrm/forms/edit_user.py:129 +msgid "Incorrect Password" +msgstr "" + +#: bookwyrm/forms/forms.py:59 +msgid "Reading finish date cannot be before start date." +msgstr "" + +#: bookwyrm/forms/forms.py:64 +msgid "Reading stopped date cannot be before start date." +msgstr "" + +#: bookwyrm/forms/forms.py:72 +msgid "Reading stopped date cannot be in the future." +msgstr "" + +#: bookwyrm/forms/forms.py:79 +msgid "Reading finished date cannot be in the future." +msgstr "" + +#: bookwyrm/forms/landing.py:37 +msgid "Username or password are incorrect" +msgstr "" + +#: bookwyrm/forms/landing.py:56 +msgid "User with this username already exists" +msgstr "" + +#: bookwyrm/forms/landing.py:65 +msgid "A user with this email already exists." +msgstr "" + +#: bookwyrm/forms/landing.py:69 +msgid "This email address cannot be registered." +msgstr "" + +#: bookwyrm/forms/landing.py:114 +msgid "Password cannot be the same as your current password" +msgstr "" + +#: bookwyrm/forms/landing.py:145 bookwyrm/forms/landing.py:153 +msgid "Incorrect code" +msgstr "" + +#: bookwyrm/forms/links.py:36 +msgid "This domain is blocked. Please contact your administrator if you think this is an error." +msgstr "" + +#: bookwyrm/forms/links.py:51 +msgid "This link with file type has already been added for this book. If it is not visible, the domain is still pending." +msgstr "" + +#: bookwyrm/forms/lists.py:26 +msgid "List Order" +msgstr "" + +#: bookwyrm/forms/lists.py:27 +msgid "Book Title" +msgstr "" + +#: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 +#: bookwyrm/templates/shelf/shelf.html:196 +#: bookwyrm/templates/snippets/create_status/review.html:32 +msgid "Rating" +msgstr "" + +#: bookwyrm/forms/lists.py:30 bookwyrm/templates/lists/list.html:185 +msgid "Sort By" +msgstr "" + +#: bookwyrm/forms/lists.py:34 +msgid "Ascending" +msgstr "" + +#: bookwyrm/forms/lists.py:35 +msgid "Descending" +msgstr "" + +#: bookwyrm/models/announcement.py:11 +msgid "Primary" +msgstr "" + +#: bookwyrm/models/announcement.py:12 +msgid "Success" +msgstr "" + +#: bookwyrm/models/announcement.py:13 +#: bookwyrm/templates/settings/invites/manage_invites.html:47 +msgid "Link" +msgstr "" + +#: bookwyrm/models/announcement.py:14 +msgid "Warning" +msgstr "" + +#: bookwyrm/models/announcement.py:15 +msgid "Danger" +msgstr "" + +#: 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:49 +#: bookwyrm/models/job.py:18 bookwyrm/models/link.py:76 +#: bookwyrm/templates/import/import_status.html:214 +#: bookwyrm/templates/settings/link_domains/link_domains.html:19 +msgid "Pending" +msgstr "" + +#: bookwyrm/models/base_model.py:19 +msgid "Self deletion" +msgstr "" + +#: bookwyrm/models/base_model.py:20 +msgid "Self deactivation" +msgstr "" + +#: bookwyrm/models/base_model.py:21 +msgid "Moderator suspension" +msgstr "" + +#: bookwyrm/models/base_model.py:22 +msgid "Moderator deletion" +msgstr "" + +#: bookwyrm/models/base_model.py:23 +msgid "Domain block" +msgstr "" + +#: bookwyrm/models/book.py:473 +msgid "Audiobook" +msgstr "" + +#: bookwyrm/models/book.py:474 +msgid "eBook" +msgstr "" + +#: bookwyrm/models/book.py:475 +msgid "Graphic novel" +msgstr "" + +#: bookwyrm/models/book.py:476 +msgid "Hardcover" +msgstr "" + +#: bookwyrm/models/book.py:477 +msgid "Paperback" +msgstr "" + +#: bookwyrm/models/book.py:486 bookwyrm/models/book.py:493 +#: bookwyrm/models/book.py:499 bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:509 bookwyrm/models/book.py:527 +#: bookwyrm/models/book.py:533 bookwyrm/models/book.py:538 +#, python-format +msgid "%(value)s doesn't look like an ISBN" +msgstr "" + +#: bookwyrm/models/book.py:515 bookwyrm/models/book.py:555 +#, python-format +msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" +msgstr "" + +#: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:84 +#: bookwyrm/templates/settings/reports/report.html:115 +#: bookwyrm/templates/snippets/create_status.html:26 +msgid "Comment" +msgstr "" + +#: bookwyrm/models/bookwyrm_import_job.py:152 +#: 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/models/bookwyrm_import_job.py:153 +msgid "Quotation" +msgstr "" + +#: bookwyrm/models/bookwyrm_import_job.py:181 +#: bookwyrm/templates/snippets/follow_button.html:22 +msgid "Follow" +msgstr "" + +#: bookwyrm/models/bookwyrm_import_job.py:182 +#: 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/models/bookwyrm_import_job.py:398 +msgid "Unknown error importing book" +msgstr "" + +#: bookwyrm/models/bookwyrm_import_job.py:496 +msgid "unauthorized" +msgstr "" + +#: bookwyrm/models/bookwyrm_import_job.py:502 +msgid "Unknown error importing book status" +msgstr "" + +#: bookwyrm/models/bookwyrm_import_job.py:696 +#: bookwyrm/models/bookwyrm_import_job.py:722 +msgid "connection_error" +msgstr "" + +#: bookwyrm/models/bookwyrm_import_job.py:732 +msgid "invalid_relationship" +msgstr "" + +#: bookwyrm/models/bookwyrm_import_job.py:740 +msgid "Unkown error importing relationship" +msgstr "" + +#: bookwyrm/models/federated_server.py:11 +#: bookwyrm/templates/settings/federation/edit_instance.html:55 +#: bookwyrm/templates/settings/federation/instance_list.html:22 +msgid "Federated" +msgstr "" + +#: bookwyrm/models/federated_server.py:12 bookwyrm/models/link.py:75 +#: bookwyrm/templates/settings/federation/edit_instance.html:56 +#: bookwyrm/templates/settings/federation/instance.html:10 +#: bookwyrm/templates/settings/federation/instance_list.html:26 +#: bookwyrm/templates/settings/link_domains/link_domains.html:27 +msgid "Blocked" +msgstr "" + +#: bookwyrm/models/fields.py:35 +#, python-format +msgid "%(value)s is not a valid remote_id" +msgstr "" + +#: 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:201 bookwyrm/templates/layout.html:129 +#: bookwyrm/templates/ostatus/error.html:29 +msgid "username" +msgstr "" + +#: bookwyrm/models/fields.py:206 +msgid "A user with that username already exists." +msgstr "" + +#: bookwyrm/models/fields.py:225 +#: bookwyrm/templates/snippets/privacy-icons.html:3 +#: bookwyrm/templates/snippets/privacy-icons.html:4 +#: bookwyrm/templates/snippets/privacy_select.html:11 +#: bookwyrm/templates/snippets/privacy_select_no_followers.html:11 +msgid "Public" +msgstr "" + +#: bookwyrm/models/fields.py:226 +#: bookwyrm/templates/snippets/privacy-icons.html:7 +#: bookwyrm/templates/snippets/privacy-icons.html:8 +#: bookwyrm/templates/snippets/privacy_select.html:14 +#: bookwyrm/templates/snippets/privacy_select_no_followers.html:14 +msgid "Unlisted" +msgstr "" + +#: bookwyrm/models/fields.py:227 +#: bookwyrm/templates/snippets/privacy_select.html:17 +#: bookwyrm/templates/user/relationships/followers.html:6 +#: bookwyrm/templates/user/relationships/followers.html:11 +#: bookwyrm/templates/user/relationships/followers.html:21 +#: bookwyrm/templates/user/relationships/layout.html:11 +msgid "Followers" +msgstr "" + +#: bookwyrm/models/fields.py:228 +#: bookwyrm/templates/snippets/create_status/post_options_block.html:6 +#: bookwyrm/templates/snippets/privacy-icons.html:15 +#: bookwyrm/templates/snippets/privacy-icons.html:16 +#: bookwyrm/templates/snippets/privacy_select.html:20 +#: bookwyrm/templates/snippets/privacy_select_no_followers.html:17 +msgid "Private" +msgstr "" + +#: bookwyrm/models/housekeeping.py:116 +msgid "Missing" +msgstr "" + +#: bookwyrm/models/housekeeping.py:117 +msgid "Wrong Path" +msgstr "" + +#: bookwyrm/models/import_job.py:50 bookwyrm/models/job.py:19 +#: bookwyrm/templates/import/import.html:184 +#: bookwyrm/templates/import/import_user.html:225 +#: bookwyrm/templates/import/user_import_status.html:56 +#: bookwyrm/templates/preferences/export-user.html:146 +#: bookwyrm/templates/settings/files.html:162 +#: bookwyrm/templates/settings/files.html:344 +#: bookwyrm/templates/settings/imports/imports.html:180 +#: bookwyrm/templates/settings/imports/imports.html:270 +#: bookwyrm/templates/snippets/user_active_tag.html:8 +msgid "Active" +msgstr "" + +#: bookwyrm/models/import_job.py:51 bookwyrm/models/job.py:20 +#: bookwyrm/templates/import/import.html:182 +#: bookwyrm/templates/import/import_user.html:223 +#: bookwyrm/templates/import/user_import_status.html:54 +#: bookwyrm/templates/preferences/export-user.html:144 +#: bookwyrm/templates/settings/files.html:160 +#: bookwyrm/templates/settings/files.html:342 +msgid "Complete" +msgstr "" + +#: bookwyrm/models/import_job.py:52 bookwyrm/models/job.py:21 +msgid "Stopped" +msgstr "" + +#: bookwyrm/models/import_job.py:86 bookwyrm/models/import_job.py:94 +msgid "Import stopped" +msgstr "" + +#: bookwyrm/models/import_job.py:378 bookwyrm/models/import_job.py:403 +msgid "Error loading book" +msgstr "" + +#: bookwyrm/models/import_job.py:387 +msgid "Could not find a match for book" +msgstr "" + +#: bookwyrm/models/job.py:22 +#: bookwyrm/templates/import/user_import_status.html:69 +msgid "Failed" +msgstr "" + +#: bookwyrm/models/link.py:55 +msgid "Free" +msgstr "" + +#: bookwyrm/models/link.py:56 +msgid "Purchasable" +msgstr "" + +#: bookwyrm/models/link.py:57 +msgid "Available for loan" +msgstr "" + +#: bookwyrm/models/link.py:74 +#: bookwyrm/templates/settings/link_domains/link_domains.html:23 +msgid "Approved" +msgstr "" + +#: bookwyrm/models/report.py:85 +msgid "Resolved report" +msgstr "" + +#: bookwyrm/models/report.py:86 +msgid "Re-opened report" +msgstr "" + +#: bookwyrm/models/report.py:87 +msgid "Messaged reporter" +msgstr "" + +#: bookwyrm/models/report.py:88 +msgid "Messaged reported user" +msgstr "" + +#: bookwyrm/models/report.py:89 +msgid "Suspended user" +msgstr "" + +#: bookwyrm/models/report.py:90 +msgid "Un-suspended user" +msgstr "" + +#: bookwyrm/models/report.py:91 +msgid "Changed user permission level" +msgstr "" + +#: bookwyrm/models/report.py:92 +msgid "Deleted user account" +msgstr "" + +#: bookwyrm/models/report.py:93 +msgid "Blocked domain" +msgstr "" + +#: bookwyrm/models/report.py:94 +msgid "Approved domain" +msgstr "" + +#: bookwyrm/models/report.py:95 +msgid "Deleted item" +msgstr "" + +#: bookwyrm/models/session.py:42 +msgid "Unknown" +msgstr "" + +#: bookwyrm/models/status.py:192 +#, python-format +msgid "%(display_name)s's status" +msgstr "" + +#: bookwyrm/models/status.py:367 +#, python-format +msgid "%(display_name)s's comment on %(book_title)s" +msgstr "" + +#: bookwyrm/models/status.py:418 +#, python-format +msgid "%(display_name)s's quote from %(book_title)s" +msgstr "" + +#: bookwyrm/models/status.py:454 +#, python-format +msgid "%(display_name)s's review of %(book_title)s" +msgstr "" + +#: bookwyrm/models/status.py:486 +#, python-format +msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" +msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" +msgstr[0] "" +msgstr[1] "" + +#: bookwyrm/models/user.py:39 bookwyrm/templates/book/book.html:336 +msgid "Reviews" +msgstr "" + +#: bookwyrm/models/user.py:40 +msgid "Comments" +msgstr "" + +#: bookwyrm/models/user.py:41 bookwyrm/templates/import/import_user.html:154 +msgid "Quotations" +msgstr "" + +#: bookwyrm/models/user.py:42 +msgid "Everything else" +msgstr "" + +#: bookwyrm/settings.py:238 +msgid "Home Timeline" +msgstr "" + +#: bookwyrm/settings.py:238 +msgid "Home" +msgstr "" + +#: bookwyrm/settings.py:239 +msgid "Books Timeline" +msgstr "" + +#: bookwyrm/settings.py:239 +#: bookwyrm/templates/guided_tour/user_profile.html:101 +#: bookwyrm/templates/import/user_import_status.html:73 +#: bookwyrm/templates/search/layout.html:22 +#: bookwyrm/templates/search/layout.html:44 +#: bookwyrm/templates/user/layout.html:107 +msgid "Books" +msgstr "" + +#: bookwyrm/settings.py:316 +msgid "English" +msgstr "" + +#: bookwyrm/settings.py:317 +msgid "Català (Catalan)" +msgstr "" + +#: bookwyrm/settings.py:318 +msgid "Deutsch (German)" +msgstr "" + +#: bookwyrm/settings.py:319 +msgid "Esperanto (Esperanto)" +msgstr "" + +#: bookwyrm/settings.py:320 +msgid "Español (Spanish)" +msgstr "" + +#: bookwyrm/settings.py:321 +msgid "Euskara (Basque)" +msgstr "" + +#: bookwyrm/settings.py:322 +msgid "Galego (Galician)" +msgstr "" + +#: bookwyrm/settings.py:323 +msgid "Italiano (Italian)" +msgstr "" + +#: bookwyrm/settings.py:324 +msgid "한국어 (Korean)" +msgstr "" + +#: bookwyrm/settings.py:325 +msgid "Suomi (Finnish)" +msgstr "" + +#: bookwyrm/settings.py:326 +msgid "Français (French)" +msgstr "" + +#: bookwyrm/settings.py:327 +msgid "Lietuvių (Lithuanian)" +msgstr "" + +#: bookwyrm/settings.py:328 +msgid "Nederlands (Dutch)" +msgstr "" + +#: bookwyrm/settings.py:329 +msgid "Norsk (Norwegian)" +msgstr "" + +#: bookwyrm/settings.py:330 +msgid "Polski (Polish)" +msgstr "" + +#: bookwyrm/settings.py:331 +msgid "Português do Brasil (Brazilian Portuguese)" +msgstr "" + +#: bookwyrm/settings.py:332 +msgid "Português Europeu (European Portuguese)" +msgstr "" + +#: bookwyrm/settings.py:333 +msgid "Română (Romanian)" +msgstr "" + +#: bookwyrm/settings.py:334 +msgid "Svenska (Swedish)" +msgstr "" + +#: bookwyrm/settings.py:335 +msgid "Українська (Ukrainian)" +msgstr "" + +#: bookwyrm/settings.py:336 +msgid "简体中文 (Simplified Chinese)" +msgstr "" + +#: bookwyrm/settings.py:337 +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 "" + +#: 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 "You you can try using a smaller file, or ask your BookWyrm server administrator to increase the DATA_UPLOAD_MAX_MEMORY_SIZE setting." +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:22 +#: bookwyrm/templates/get_started/layout.html:22 +#, python-format +msgid "Welcome to %(site_name)s!" +msgstr "" + +#: bookwyrm/templates/about/about.html:26 +#, 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 "" + +#: bookwyrm/templates/about/about.html:47 +#, python-format +msgid "%(title)s is %(site_name)s's most beloved book, with an average rating of %(rating)s out of 5." +msgstr "" + +#: bookwyrm/templates/about/about.html:66 +#, python-format +msgid "More %(site_name)s users want to read %(title)s than any other book." +msgstr "" + +#: bookwyrm/templates/about/about.html:85 +#, python-format +msgid "%(title)s has the most divisive ratings of any book on %(site_name)s." +msgstr "" + +#: bookwyrm/templates/about/about.html:96 +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/templates/about/about.html:107 +msgid "Meet your admins" +msgstr "" + +#: bookwyrm/templates/about/about.html:110 +#, 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 "" + +#: bookwyrm/templates/about/about.html:124 +msgid "Moderator" +msgstr "" + +#: bookwyrm/templates/about/about.html:126 bookwyrm/templates/user_menu.html:62 +msgid "Admin" +msgstr "" + +#: bookwyrm/templates/about/about.html:142 +#: 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:68 +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 "" + +#: 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 "" + +#: bookwyrm/templates/annual_summary/layout.html:43 +#, python-format +msgid "%(year)s in the books" +msgstr "" + +#: bookwyrm/templates/annual_summary/layout.html:47 +#, python-format +msgid "%(display_name)s’s year of reading" +msgstr "" + +#: 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 "" + +#: 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] "" +msgstr[1] "" + +#: 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 "" + +#: 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] "" +msgstr[1] "" + +#: 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:73 +#: 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 "" + +#: 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] "" +msgstr[1] "" + +#: 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] "" +msgstr[1] "" + +#: 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 "" + +#: bookwyrm/templates/annual_summary/layout.html:270 +#, python-format +msgid "All the books %(display_name)s read in %(year)s" +msgstr "" + +#: 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 "View on Wikidata" +msgstr "" + +#: bookwyrm/templates/author/author.html:87 +msgid "Website" +msgstr "" + +#: bookwyrm/templates/author/author.html:95 +msgid "View ISNI record" +msgstr "" + +#: bookwyrm/templates/author/author.html:103 +#: bookwyrm/templates/book/book.html:183 +msgid "View on ISFDB" +msgstr "" + +#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/sync_modal.html:5 +#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/sync_modal.html:5 +msgid "Load data" +msgstr "" + +#: bookwyrm/templates/author/author.html:112 +#: bookwyrm/templates/book/book.html:154 +msgid "View on OpenLibrary" +msgstr "" + +#: bookwyrm/templates/author/author.html:127 +#: bookwyrm/templates/book/book.html:168 +msgid "View on Inventaire" +msgstr "" + +#: bookwyrm/templates/author/author.html:143 +msgid "View on LibraryThing" +msgstr "" + +#: bookwyrm/templates/author/author.html:151 +msgid "View on Goodreads" +msgstr "" + +#: bookwyrm/templates/author/author.html:166 +#, python-format +msgid "Books by %(name)s" +msgstr "" + +#: 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:91 +#: bookwyrm/templates/book/edit/edit_book_form.html:161 +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:58 +msgid "Wikidata:" +msgstr "" + +#: bookwyrm/templates/author/edit_author.html:62 +msgid "Website:" +msgstr "" + +#: bookwyrm/templates/author/edit_author.html:67 +msgid "Birth date:" +msgstr "" + +#: bookwyrm/templates/author/edit_author.html:74 +msgid "Death date:" +msgstr "" + +#: bookwyrm/templates/author/edit_author.html:81 +msgid "Author Identifiers" +msgstr "" + +#: bookwyrm/templates/author/edit_author.html:83 +msgid "Openlibrary key:" +msgstr "" + +#: bookwyrm/templates/author/edit_author.html:90 +#: bookwyrm/templates/book/edit/edit_book_form.html:336 +msgid "Inventaire ID:" +msgstr "" + +#: bookwyrm/templates/author/edit_author.html:97 +msgid "Librarything key:" +msgstr "" + +#: bookwyrm/templates/author/edit_author.html:104 +#: bookwyrm/templates/book/edit/edit_book_form.html:345 +msgid "Goodreads key:" +msgstr "" + +#: bookwyrm/templates/author/edit_author.html:111 +msgid "ISFDB:" +msgstr "" + +#: bookwyrm/templates/author/edit_author.html:118 +msgid "ISNI:" +msgstr "" + +#: bookwyrm/templates/author/edit_author.html:128 +#: bookwyrm/templates/book/book.html:249 +#: 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:146 +#: 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:129 +#: bookwyrm/templates/author/sync_modal.html:23 +#: bookwyrm/templates/book/book.html:250 +#: 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:26 +#: 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/files.html:193 +#: bookwyrm/templates/settings/files.html:354 +#: 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" +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 "" + +#: 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/force_password_reset.html:94 +#: bookwyrm/templates/landing/password_reset.html:52 +#: bookwyrm/templates/preferences/security.html:80 +#: bookwyrm/templates/settings/imports/complete_import_modal.html:19 +#: bookwyrm/templates/settings/imports/complete_user_import_modal.html:19 +#: bookwyrm/templates/settings/users/force_password_reset.html:55 +#: bookwyrm/templates/snippets/remove_from_group_button.html:17 +msgid "Confirm" +msgstr "" + +#: bookwyrm/templates/book/book.html:24 +msgid "Unable to connect to remote source." +msgstr "" + +#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +msgid "Edit Book" +msgstr "" + +#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +msgid "Click to add cover" +msgstr "" + +#: bookwyrm/templates/book/book.html:116 +msgid "Failed to load cover" +msgstr "" + +#: bookwyrm/templates/book/book.html:127 +msgid "Click to enlarge" +msgstr "" + +#: bookwyrm/templates/book/book.html:190 +msgid "View on Finna" +msgstr "" + +#: bookwyrm/templates/book/book.html:222 +#, python-format +msgid "(%(review_count)s review)" +msgid_plural "(%(review_count)s reviews)" +msgstr[0] "" +msgstr[1] "" + +#: bookwyrm/templates/book/book.html:238 +msgid "Add Description" +msgstr "" + +#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/edit/edit_book_form.html:55 +#: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 +msgid "Description:" +msgstr "" + +#: bookwyrm/templates/book/book.html:261 +#, python-format +msgid "%(count)s edition" +msgid_plural "%(count)s editions" +msgstr[0] "" +msgstr[1] "" + +#: bookwyrm/templates/book/book.html:275 +msgid "You have shelved this edition in:" +msgstr "" + +#: bookwyrm/templates/book/book.html:290 +#, python-format +msgid "A different edition of this book is on your %(shelf_name)s shelf." +msgstr "" + +#: bookwyrm/templates/book/book.html:301 +msgid "Your reading activity" +msgstr "" + +#: bookwyrm/templates/book/book.html:307 +#: bookwyrm/templates/guided_tour/book.html:56 +msgid "Add read dates" +msgstr "" + +#: bookwyrm/templates/book/book.html:315 +msgid "You don't have any reading activity for this book." +msgstr "" + +#: bookwyrm/templates/book/book.html:341 +msgid "Your reviews" +msgstr "" + +#: bookwyrm/templates/book/book.html:347 +msgid "Your comments" +msgstr "" + +#: bookwyrm/templates/book/book.html:353 +msgid "Your quotes" +msgstr "" + +#: bookwyrm/templates/book/book.html:389 +msgid "Subjects" +msgstr "" + +#: bookwyrm/templates/book/book.html:401 +msgid "Places" +msgstr "" + +#: bookwyrm/templates/book/book.html:412 +#: 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:27 +#: bookwyrm/templates/search/layout.html:55 +#: 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:424 +msgid "Add to list" +msgstr "" + +#: bookwyrm/templates/book/book.html:434 +#: 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 "" + +#: bookwyrm/templates/book/book_identifiers.html:12 +#: bookwyrm/templates/book/book_identifiers.html:13 +msgid "Copy ISBN" +msgstr "" + +#: bookwyrm/templates/book/book_identifiers.html:16 +msgid "Copied ISBN!" +msgstr "" + +#: bookwyrm/templates/book/book_identifiers.html:23 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/rss/edition.html:6 +msgid "OCLC Number:" +msgstr "" + +#: bookwyrm/templates/book/book_identifiers.html:30 +#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/rss/edition.html:7 +msgid "ASIN:" +msgstr "" + +#: bookwyrm/templates/book/book_identifiers.html:37 +#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/rss/edition.html:8 +msgid "Audible ASIN:" +msgstr "" + +#: bookwyrm/templates/book/book_identifiers.html:44 +#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/rss/edition.html:9 +msgid "ISFDB ID:" +msgstr "" + +#: bookwyrm/templates/book/book_identifiers.html:51 +#: bookwyrm/templates/rss/edition.html:10 +msgid "Goodreads:" +msgstr "" + +#: bookwyrm/templates/book/book_identifiers.html:58 +#: bookwyrm/templates/book/edit/edit_book_form.html:390 +msgid "Finna ID:" +msgstr "" + +#: 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:246 +msgid "Upload cover:" +msgstr "" + +#: bookwyrm/templates/book/cover_add_modal.html:23 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 +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 "" + +#: 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 "" + +#: bookwyrm/templates/book/edit/edit_book.html:89 +#, python-format +msgid "Author of %(book_title)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:93 +#, python-format +msgid "Author of %(alt_title)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:95 +msgid "Find more information at isni.org" +msgstr "" + +#: 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 "" + +#: 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:17 +#: 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:36 +msgid "Sort Title:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:46 +msgid "Subtitle:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:66 +msgid "Series:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:76 +msgid "Series number:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:87 +msgid "Languages:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:99 +msgid "Subjects:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:103 +msgid "Add subject" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:121 +msgid "Remove subject" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:144 +msgid "Add Another Subject" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:152 +msgid "Publication" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:157 +msgid "Publisher:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:169 +msgid "First published date:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:177 +msgid "Published date:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/import/user_import_status.html:155 +#: bookwyrm/templates/search/layout.html:23 +#: bookwyrm/templates/search/layout.html:47 +msgid "Authors" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#, python-format +msgid "Remove %(name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#, python-format +msgid "Author page for %(name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:210 +msgid "Add Authors:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:213 +#: bookwyrm/templates/book/edit/edit_book_form.html:216 +msgid "Add Author" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:214 +#: bookwyrm/templates/book/edit/edit_book_form.html:217 +msgid "Jane Doe" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:223 +msgid "Add Another Author" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/shelf/shelf.html:155 +msgid "Cover" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:265 +msgid "Physical Properties" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/editions/format_filter.html:6 +msgid "Format:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:282 +msgid "Format details:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:293 +msgid "Pages:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:304 +msgid "Book Identifiers" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/rss/edition.html:5 +msgid "ISBN 13:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:318 +msgid "ISBN 10:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:327 +msgid "Openlibrary ID:" +msgstr "" + +#: bookwyrm/templates/book/editions/editions.html:4 +#, python-format +msgid "Editions of %(book_title)s" +msgstr "" + +#: bookwyrm/templates/book/editions/editions.html:8 +#, python-format +msgid "Editions of %(work_title)s" +msgstr "" + +#: 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:101 +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 "" + +#: 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 "" + +#: bookwyrm/templates/book/file_links/edit_links.html:32 +#: bookwyrm/templates/settings/link_domains/link_table.html:6 +msgid "URL" +msgstr "" + +#: 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:149 +#: bookwyrm/templates/import/import_status.html:134 +#: bookwyrm/templates/import/import_user.html:192 +#: bookwyrm/templates/import/user_import_status.html:162 +#: bookwyrm/templates/import/user_troubleshoot.html:62 +#: bookwyrm/templates/preferences/export-user.html:113 +#: bookwyrm/templates/settings/announcements/announcements.html:37 +#: bookwyrm/templates/settings/files.html:137 +#: bookwyrm/templates/settings/files.html:319 +#: bookwyrm/templates/settings/imports/imports.html:304 +#: 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:223 +#: bookwyrm/templates/settings/imports/imports.html:302 +#: 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/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 "" + +#: bookwyrm/templates/book/file_links/verification_modal.html:27 +#: bookwyrm/templates/setup/config.html:134 +msgid "Continue" +msgstr "" + +#: bookwyrm/templates/book/publisher_info.html:23 +#, python-format +msgid "%(format)s, %(pages)s pages" +msgstr "" + +#: bookwyrm/templates/book/publisher_info.html:25 +#, python-format +msgid "%(pages)s pages" +msgstr "" + +#: bookwyrm/templates/book/publisher_info.html:38 +#, python-format +msgid "%(languages)s language" +msgstr "" + +#: 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/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 "" + +#: 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 "" + +#: bookwyrm/templates/compose.html:7 bookwyrm/templates/compose.html:21 +msgid "Edit review" +msgstr "" + +#: bookwyrm/templates/compose.html:9 bookwyrm/templates/compose.html:23 +msgid "Edit quote" +msgstr "" + +#: bookwyrm/templates/compose.html:11 bookwyrm/templates/compose.html:25 +msgid "Edit comment" +msgstr "" + +#: bookwyrm/templates/compose.html:13 bookwyrm/templates/compose.html:27 +msgid "Edit status" +msgstr "" + +#: bookwyrm/templates/confirm_email/confirm_email.html:4 +msgid "Confirm email" +msgstr "" + +#: bookwyrm/templates/confirm_email/confirm_email.html:7 +msgid "Confirm your email address" +msgstr "" + +#: 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:107 +#: 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/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:23 +#: bookwyrm/templates/ostatus/remote_follow.html:24 +#: bookwyrm/templates/ostatus/subscribe.html:41 +#: bookwyrm/templates/ostatus/subscribe.html:42 +#: bookwyrm/templates/ostatus/success.html:21 +#: bookwyrm/templates/ostatus/success.html:22 +#: 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] "" + +#: bookwyrm/templates/directory/user_card.html:47 +msgid "book on your shelves" +msgid_plural "books on your shelves" +msgstr[0] "" +msgstr[1] "" + +#: 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/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 "" + +#: bookwyrm/templates/discover/card-header.html:13 +#, python-format +msgid "%(username)s finished reading %(book_title)s" +msgstr "" + +#: bookwyrm/templates/discover/card-header.html:18 +#, python-format +msgid "%(username)s started reading %(book_title)s" +msgstr "" + +#: bookwyrm/templates/discover/card-header.html:23 +#, python-format +msgid "%(username)s rated %(book_title)s" +msgstr "" + +#: bookwyrm/templates/discover/card-header.html:27 +#, python-format +msgid "%(username)s reviewed %(book_title)s" +msgstr "" + +#: bookwyrm/templates/discover/card-header.html:31 +#, python-format +msgid "%(username)s commented on %(book_title)s" +msgstr "" + +#: bookwyrm/templates/discover/card-header.html:35 +#, python-format +msgid "%(username)s quoted %(book_title)s" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: bookwyrm/templates/email/confirm/html_content.html:11 +msgid "Confirm Email" +msgstr "" + +#: bookwyrm/templates/email/confirm/html_content.html:15 +#, python-format +msgid "Or enter the code \"%(confirmation_code)s\" at login." +msgstr "" + +#: bookwyrm/templates/email/confirm/subject.html:2 +msgid "Please confirm your email" +msgstr "" + +#: bookwyrm/templates/email/confirm/text_content.html:10 +#, python-format +msgid "Or enter the code \"%(confirmation_code)s\" at login." +msgstr "" + +#: 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/templates/email/html_layout.html:23 +msgid "Email preference" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: 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 "" + +#: bookwyrm/templates/email/invite/text_content.html:8 +#, python-format +msgid "Learn more about %(site_name)s:" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: 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 "" + +#: 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 "" + +#: bookwyrm/templates/email/password_reset/html_content.html:9 +#: bookwyrm/templates/landing/force_password_reset.html:9 +#: bookwyrm/templates/landing/force_password_reset.html:28 +#: 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 "" + +#: 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/landing/force_password_reset.html:18 +#: 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:40 +#: bookwyrm/templates/snippets/footer.html:12 +msgid "Contact site admin" +msgstr "" + +#: bookwyrm/templates/embed-layout.html:46 +msgid "Join BookWyrm" +msgstr "" + +#: bookwyrm/templates/feed/direct_messages.html:8 +#, python-format +msgid "Direct Messages with %(username)s" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: 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 "" + +#: bookwyrm/templates/feed/summary_card.html:26 +#, python-format +msgid "Discover your stats for %(year)s!" +msgstr "" + +#: bookwyrm/templates/get_started/book_preview.html:6 +#, python-format +msgid "Have you read %(book_title)s?" +msgstr "" + +#: 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:93 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:94 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:95 +#: 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:96 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 "" + +#: bookwyrm/templates/get_started/books.html:11 +#, python-format +msgid "You can add books when you start using %(site_name)s." +msgstr "" + +#: 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:33 +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 "" + +#: 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/templates/get_started/users.html:8 +msgid "You can follow users on other BookWyrm instances and federated services like Mastodon." +msgstr "" + +#: 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 "" + +#: 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 "" + +#: 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] "" +msgstr[1] "" + +#: 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] "" +msgstr[1] "" + +#: bookwyrm/templates/groups/suggested_users.html:43 +#, python-format +msgid "No potential members found for \"%(user_query)s\"" +msgstr "" + +#: 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/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/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/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 "" + +#: 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/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 "" + +#: 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/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 "" + +#: 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 "" + +#: 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/preferences/export-user.html:37 +#: 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/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/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 "" + +#: bookwyrm/templates/hashtag.html:25 +msgid "No activities for this hashtag yet!" +msgstr "" + +#: bookwyrm/templates/import/import.html:5 +#: bookwyrm/templates/import/import.html:6 +#: bookwyrm/templates/preferences/layout.html:43 +msgid "Import Book List" +msgstr "" + +#: bookwyrm/templates/import/import.html:12 +msgid "Not a valid CSV file" +msgstr "" + +#: 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 %(display_size)s books every %(import_limit_reset)s days." +msgstr[0] "" +msgstr[1] "" + +#: bookwyrm/templates/import/import.html:26 +#, python-format +msgid "You have %(display_left)s left." +msgstr "" + +#: bookwyrm/templates/import/import.html:33 +#: bookwyrm/templates/import/import_user.html:40 +#, python-format +msgid "On average, recent imports have taken %(hours)s hours." +msgstr "" + +#: bookwyrm/templates/import/import.html:37 +#: bookwyrm/templates/import/import_user.html:44 +#, python-format +msgid "On average, recent imports have taken %(minutes)s minutes." +msgstr "" + +#: bookwyrm/templates/import/import.html:52 +msgid "Data source:" +msgstr "" + +#: bookwyrm/templates/import/import.html:58 +msgid "Goodreads (CSV)" +msgstr "" + +#: bookwyrm/templates/import/import.html:61 +msgid "Storygraph (CSV)" +msgstr "" + +#: bookwyrm/templates/import/import.html:64 +msgid "LibraryThing (TSV)" +msgstr "" + +#: bookwyrm/templates/import/import.html:67 +msgid "OpenLibrary (CSV)" +msgstr "" + +#: bookwyrm/templates/import/import.html:70 +msgid "OpenReads (CSV)" +msgstr "" + +#: bookwyrm/templates/import/import.html:73 +msgid "Calibre (CSV)" +msgstr "" + +#: bookwyrm/templates/import/import.html:76 +msgid "BookWyrm (CSV)" +msgstr "" + +#: bookwyrm/templates/import/import.html:82 +msgid "You can download your Goodreads data from the Import/Export page of your Goodreads account." +msgstr "" + +#: bookwyrm/templates/import/import.html:91 +#: bookwyrm/templates/import/import_user.html:64 +msgid "Data file:" +msgstr "" + +#: bookwyrm/templates/import/import.html:99 +msgid "Include reviews" +msgstr "" + +#: bookwyrm/templates/import/import.html:104 +msgid "Create new shelves if they do not exist" +msgstr "" + +#: bookwyrm/templates/import/import.html:109 +msgid "Privacy setting for imported reviews and shelves:" +msgstr "" + +#: bookwyrm/templates/import/import.html:116 +#: bookwyrm/templates/import/import.html:118 +#: bookwyrm/templates/import/import_user.html:170 +#: bookwyrm/templates/import/import_user.html:172 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:78 +msgid "Import" +msgstr "" + +#: bookwyrm/templates/import/import.html:119 +#: bookwyrm/templates/import/import_user.html:173 +msgid "You've reached the import limit." +msgstr "" + +#: bookwyrm/templates/import/import.html:128 +#: bookwyrm/templates/import/import_user.html:27 +msgid "Imports are temporarily disabled; thank you for your patience." +msgstr "" + +#: bookwyrm/templates/import/import.html:135 +#: bookwyrm/templates/import/import_user.html:181 +msgid "Recent Imports" +msgstr "" + +#: bookwyrm/templates/import/import.html:140 +#: bookwyrm/templates/import/import_user.html:186 +#: bookwyrm/templates/settings/imports/imports.html:202 +#: bookwyrm/templates/settings/imports/imports.html:292 +msgid "Date Created" +msgstr "" + +#: bookwyrm/templates/import/import.html:143 +#: bookwyrm/templates/import/import_user.html:189 +msgid "Last Updated" +msgstr "" + +#: bookwyrm/templates/import/import.html:146 +#: bookwyrm/templates/settings/imports/imports.html:211 +msgid "Items" +msgstr "" + +#: bookwyrm/templates/import/import.html:155 +#: bookwyrm/templates/import/import_user.html:198 +#: bookwyrm/templates/preferences/export-user.html:122 +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:88 +msgid "Imports" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:39 +#: bookwyrm/templates/import/user_import_status.html:35 +msgid "Import started:" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:48 +#: bookwyrm/templates/import/user_import_status.html:99 +msgid "In progress" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:50 +#: bookwyrm/templates/import/user_import_status.html:101 +msgid "Refresh" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:72 +#: bookwyrm/templates/import/user_import_status.html:123 +#: bookwyrm/templates/settings/imports/imports.html:243 +#: bookwyrm/templates/settings/imports/imports.html:320 +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] "" +msgstr[1] "" + +#: 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 +#: bookwyrm/templates/import/user_import_status.html:129 +#, python-format +msgid "%(display_counter)s item failed to import." +msgid_plural "%(display_counter)s items failed to import." +msgstr[0] "" +msgstr[1] "" + +#: bookwyrm/templates/import/import_status.html:95 +#: bookwyrm/templates/import/user_import_status.html:135 +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/import/user_import_status.html:149 +#: bookwyrm/templates/shelf/shelf.html:156 +#: bookwyrm/templates/shelf/shelf.html:178 +msgid "Title" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:113 +#: bookwyrm/templates/import/user_import_status.html:152 +msgid "ISBN" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:117 +msgid "Openlibrary key" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:121 +#: bookwyrm/templates/shelf/shelf.html:157 +#: bookwyrm/templates/shelf/shelf.html:181 +msgid "Author" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:124 +msgid "Shelf" +msgstr "" + +#: bookwyrm/templates/import/import_status.html:131 +#: bookwyrm/templates/import/user_import_status.html:159 +#: bookwyrm/templates/import/user_troubleshoot.html:59 +#: 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 +#: bookwyrm/templates/import/user_import_status.html:68 +#: bookwyrm/templates/import/user_import_status.html:191 +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/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 %(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_time)s" +msgstr "" + +#: bookwyrm/templates/import/import_user.html:56 +msgid "Step 1:" +msgstr "" + +#: bookwyrm/templates/import/import_user.html:58 +msgid "Select an export file generated from another BookWyrm account. The file format should be .tar.gz." +msgstr "" + +#: bookwyrm/templates/import/import_user.html:73 +msgid "Step 2:" +msgstr "" + +#: bookwyrm/templates/import/import_user.html:75 +msgid "Deselect any checkboxes for data you do not wish to include in your import." +msgstr "" + +#: bookwyrm/templates/import/import_user.html:86 +#: bookwyrm/templates/preferences/export-user.html:21 +#: bookwyrm/templates/shelf/shelf.html:31 +#: bookwyrm/templates/user/relationships/followers.html:18 +#: bookwyrm/templates/user/relationships/following.html:18 +msgid "User profile" +msgstr "" + +#: bookwyrm/templates/import/import_user.html:89 +msgid "Overwrites display name, summary, and avatar" +msgstr "" + +#: bookwyrm/templates/import/import_user.html:95 +msgid "User settings" +msgstr "" + +#: bookwyrm/templates/import/import_user.html:98 +msgid "Overwrites:" +msgstr "" + +#: bookwyrm/templates/import/import_user.html:101 +msgid "Whether manual approval is required for other users to follow your account" +msgstr "" + +#: bookwyrm/templates/import/import_user.html:104 +msgid "Whether following/followers are shown on your profile" +msgstr "" + +#: bookwyrm/templates/import/import_user.html:107 +msgid "Whether your reading goal is shown on your profile" +msgstr "" + +#: bookwyrm/templates/import/import_user.html:110 +msgid "Whether you see user follow suggestions" +msgstr "" + +#: bookwyrm/templates/import/import_user.html:113 +msgid "Whether your account is suggested to others" +msgstr "" + +#: bookwyrm/templates/import/import_user.html:116 +msgid "Your timezone" +msgstr "" + +#: bookwyrm/templates/import/import_user.html:119 +msgid "Your default post privacy setting" +msgstr "" + +#: bookwyrm/templates/import/import_user.html:127 +msgid "Followers and following" +msgstr "" + +#: bookwyrm/templates/import/import_user.html:131 +msgid "User blocks" +msgstr "" + +#: bookwyrm/templates/import/import_user.html:138 +#: bookwyrm/templates/preferences/export-user.html:23 +msgid "Reading goals" +msgstr "" + +#: bookwyrm/templates/import/import_user.html:141 +msgid "Overwrites reading goals for all years listed in the import file" +msgstr "" + +#: bookwyrm/templates/import/import_user.html:145 +#: bookwyrm/templates/preferences/export-user.html:24 +msgid "Shelves" +msgstr "" + +#: bookwyrm/templates/import/import_user.html:148 +#: bookwyrm/templates/preferences/export-user.html:25 +msgid "Reading history" +msgstr "" + +#: bookwyrm/templates/import/import_user.html:151 +#: bookwyrm/templates/preferences/export-user.html:26 +msgid "Book reviews" +msgstr "" + +#: bookwyrm/templates/import/import_user.html:157 +msgid "Comments about books" +msgstr "" + +#: bookwyrm/templates/import/import_user.html:160 +msgid "Book lists" +msgstr "" + +#: bookwyrm/templates/import/import_user.html:163 +msgid "Saved lists" +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/import/user_troubleshoot.html:8 +#: bookwyrm/templates/settings/imports/imports.html:220 +msgid "Failed items" +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:12 +#: bookwyrm/templates/import/user_troubleshoot.html:13 +msgid "Troubleshooting" +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:20 +#: bookwyrm/templates/import/user_troubleshoot.html:23 +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 +#: bookwyrm/templates/import/user_troubleshoot.html:27 +msgid "A transient error or timeout caused the external data source to be unavailable." +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:25 +#: bookwyrm/templates/import/user_troubleshoot.html:28 +msgid "BookWyrm has been updated since this import with a bug fix" +msgstr "" + +#: bookwyrm/templates/import/troubleshoot.html:28 +#: bookwyrm/templates/import/user_troubleshoot.html:38 +msgid "Contact your admin or open an issue if you are seeing unexpected failed items." +msgstr "" + +#: bookwyrm/templates/import/user_import_status.html:6 +#: bookwyrm/templates/import/user_import_status.html:15 +#: bookwyrm/templates/import/user_import_status.html:26 +msgid "User Import Status" +msgstr "" + +#: bookwyrm/templates/import/user_import_status.html:13 +msgid "User Import Retry Status" +msgstr "" + +#: bookwyrm/templates/import/user_import_status.html:22 +#: bookwyrm/templates/settings/imports/imports.html:264 +msgid "User Imports" +msgstr "" + +#: bookwyrm/templates/import/user_import_status.html:70 +#: bookwyrm/templates/settings/dashboard/user_chart.html:11 +msgid "Total" +msgstr "" + +#: bookwyrm/templates/import/user_import_status.html:79 +#: bookwyrm/templates/preferences/export-user.html:27 +#: bookwyrm/templates/settings/dashboard/dashboard.html:27 +msgid "Statuses" +msgstr "" + +#: bookwyrm/templates/import/user_import_status.html:85 +msgid "Follows & Blocks" +msgstr "" + +#: bookwyrm/templates/import/user_import_status.html:144 +msgid "Imported books" +msgstr "" + +#: bookwyrm/templates/import/user_troubleshoot.html:5 +msgid "User Import Troubleshooting" +msgstr "" + +#: bookwyrm/templates/import/user_troubleshoot.html:26 +msgid "Your account was not set as an alias of the original user account" +msgstr "" + +#: bookwyrm/templates/import/user_troubleshoot.html:31 +msgid "Re-trying an import will not work in cases such as:" +msgstr "" + +#: bookwyrm/templates/import/user_troubleshoot.html:34 +msgid "A user, status, or BookWyrm server was deleted after your import file was created" +msgstr "" + +#: bookwyrm/templates/import/user_troubleshoot.html:35 +msgid "Importing statuses when your old account has been deleted" +msgstr "" + +#: bookwyrm/templates/import/user_troubleshoot.html:43 +#, python-format +msgid "Currently you are allowed to import or retry one user every %(hours)s hours." +msgstr "" + +#: bookwyrm/templates/import/user_troubleshoot.html:44 +#, python-format +msgid "You will be able to retry this import at %(next_time)s" +msgstr "" + +#: bookwyrm/templates/import/user_troubleshoot.html:65 +msgid "Relationship" +msgstr "" + +#: bookwyrm/templates/import/user_troubleshoot.html:68 +msgid "Reason" +msgstr "" + +#: bookwyrm/templates/landing/force_password_reset.html:30 +msgid "You must set a new password before logging in." +msgstr "" + +#: bookwyrm/templates/landing/force_password_reset.html:50 +#: bookwyrm/templates/preferences/change_password.html:22 +msgid "Current password:" +msgstr "" + +#: bookwyrm/templates/landing/force_password_reset.html:68 +#: bookwyrm/templates/preferences/change_password.html:28 +msgid "New password:" +msgstr "" + +#: bookwyrm/templates/landing/force_password_reset.html:85 +#: bookwyrm/templates/landing/password_reset.html:43 +#: bookwyrm/templates/preferences/change_password.html:33 +msgid "Confirm password:" +msgstr "" + +#: bookwyrm/templates/landing/invite.html:4 +#: bookwyrm/templates/landing/invite.html:8 +#: bookwyrm/templates/landing/login.html:50 +#: bookwyrm/templates/landing/reactivate.html:43 +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 "" + +#: 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 "" + +#: 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:38 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 "" + +#: bookwyrm/templates/landing/login.html:28 +#: bookwyrm/templates/landing/password_reset.html:26 +#: bookwyrm/templates/landing/reactivate.html:24 +#: bookwyrm/templates/layout.html:132 bookwyrm/templates/ostatus/error.html:32 +#: bookwyrm/templates/preferences/security.html:94 +#: bookwyrm/templates/snippets/register_form.html:45 +msgid "Password:" +msgstr "" + +#: bookwyrm/templates/landing/login.html:41 bookwyrm/templates/layout.html:139 +#: bookwyrm/templates/ostatus/error.html:34 +msgid "Forgot your password?" +msgstr "" + +#: bookwyrm/templates/landing/login.html:63 +#: bookwyrm/templates/landing/reactivate.html:56 +msgid "More about this site" +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 "" + +#: 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:34 +msgid "Reactivate account" +msgstr "" + +#: bookwyrm/templates/layout.html:13 +#, python-format +msgid "%(site_name)s search" +msgstr "" + +#: bookwyrm/templates/layout.html:39 +msgid "Search for a book, author, 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 "" + +#: bookwyrm/templates/lists/add_item_modal.html:12 +#, python-format +msgid "Suggest \"%(title)s\" for this list" +msgstr "" + +#: 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 "" + +#: bookwyrm/templates/lists/created_text.html:7 +#, python-format +msgid "Created and curated by %(username)s" +msgstr "" + +#: bookwyrm/templates/lists/created_text.html:9 +#, python-format +msgid "Created by %(username)s" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: bookwyrm/templates/lists/embed-list.html:20 +#, python-format +msgid "on %(site_name)s" +msgstr "" + +#: 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 "" + +#: bookwyrm/templates/lists/list.html:146 +msgid "List position" +msgstr "" + +#: bookwyrm/templates/lists/list.html:152 +#: bookwyrm/templates/settings/connectors/connector.html:28 +#: bookwyrm/templates/settings/connectors/update.html:27 +#: 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 "" + +#: 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 "" + +#: 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 "" + +#: 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 "" + +#: 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 "" + +#: 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 "" + +#: bookwyrm/templates/notifications/items/add.html:33 +#, python-format +msgid "%(related_user)s added %(book_title)s to your list \"%(list_name)s\"" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: 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 "" + +#: bookwyrm/templates/notifications/items/add.html:66 +#, python-format +msgid "%(related_user)s added a book to one of your lists" +msgstr "" + +#: 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] "" +msgstr[1] "" + +#: 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] "" +msgstr[1] "" + +#: bookwyrm/templates/notifications/items/boost.html:21 +#, python-format +msgid "%(related_user)s boosted your review of %(book_title)s" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: bookwyrm/templates/notifications/items/boost.html:44 +#, python-format +msgid "%(related_user)s boosted your comment on %(book_title)s" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: bookwyrm/templates/notifications/items/boost.html:67 +#, python-format +msgid "%(related_user)s boosted your quote from %(book_title)s" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: bookwyrm/templates/notifications/items/boost.html:90 +#, python-format +msgid "%(related_user)s boosted your status" +msgstr "" + +#: bookwyrm/templates/notifications/items/boost.html:96 +#, python-format +msgid "%(related_user)s and %(second_user)s boosted your status" +msgstr "" + +#: bookwyrm/templates/notifications/items/boost.html:105 +#, python-format +msgid "%(related_user)s and %(other_user_display_count)s others boosted your status" +msgstr "" + +#: bookwyrm/templates/notifications/items/fav.html:21 +#, python-format +msgid "%(related_user)s liked your review of %(book_title)s" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: bookwyrm/templates/notifications/items/fav.html:44 +#, python-format +msgid "%(related_user)s liked your comment on %(book_title)s" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: bookwyrm/templates/notifications/items/fav.html:67 +#, python-format +msgid "%(related_user)s liked your quote from %(book_title)s" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: bookwyrm/templates/notifications/items/fav.html:90 +#, python-format +msgid "%(related_user)s liked your status" +msgstr "" + +#: bookwyrm/templates/notifications/items/fav.html:96 +#, python-format +msgid "%(related_user)s and %(second_user)s liked your status" +msgstr "" + +#: bookwyrm/templates/notifications/items/fav.html:105 +#, python-format +msgid "%(related_user)s and %(other_user_display_count)s others liked your status" +msgstr "" + +#: bookwyrm/templates/notifications/items/follow.html:16 +#, python-format +msgid "%(related_user)s followed you" +msgstr "" + +#: bookwyrm/templates/notifications/items/follow.html:20 +#, python-format +msgid "%(related_user)s and %(second_user)s followed you" +msgstr "" + +#: bookwyrm/templates/notifications/items/follow.html:25 +#, python-format +msgid "%(related_user)s and %(other_user_display_count)s others followed you" +msgstr "" + +#: bookwyrm/templates/notifications/items/follow_request.html:15 +#, python-format +msgid "%(related_user)s sent you a follow request" +msgstr "" + +#: 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 "" + +#: 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\"" +msgstr "" + +#: bookwyrm/templates/notifications/items/leave.html:18 +#, python-format +msgid "%(related_user)s has left your group \"%(group_name)s\"" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: 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 review" +msgstr[0] "" +msgstr[1] "" + +#: bookwyrm/templates/notifications/items/mention.html:20 +#, python-format +msgid "%(related_user)s mentioned you in a review of %(book_title)s" +msgstr "" + +#: bookwyrm/templates/notifications/items/mention.html:26 +#, python-format +msgid "%(related_user)s mentioned you in a comment on %(book_title)s" +msgstr "" + +#: bookwyrm/templates/notifications/items/mention.html:32 +#, python-format +msgid "%(related_user)s mentioned you in a quote from %(book_title)s" +msgstr "" + +#: bookwyrm/templates/notifications/items/mention.html:38 +#, python-format +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\"" +msgstr "" + +#: bookwyrm/templates/notifications/items/remove.html:23 +#, python-format +msgid "You have been removed from the \"%(group_name)s\" group" +msgstr "" + +#: bookwyrm/templates/notifications/items/reply.html:21 +#, python-format +msgid "%(related_user)s replied to your review of %(book_title)s" +msgstr "" + +#: bookwyrm/templates/notifications/items/reply.html:27 +#, python-format +msgid "%(related_user)s replied to your comment on %(book_title)s" +msgstr "" + +#: bookwyrm/templates/notifications/items/reply.html:33 +#, python-format +msgid "%(related_user)s replied to your quote from %(book_title)s" +msgstr "" + +#: bookwyrm/templates/notifications/items/reply.html:39 +#, python-format +msgid "%(related_user)s replied to your status" +msgstr "" + +#: 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] "" + +#: 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/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 "" + +#: 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:7 +#, python-format +msgid "Follow %(username)s on the fediverse" +msgstr "" + +#: bookwyrm/templates/ostatus/remote_follow.html:35 +#, python-format +msgid "Follow %(username)s from another Fediverse account like BookWyrm, Mastodon, or Pleroma." +msgstr "" + +#: bookwyrm/templates/ostatus/remote_follow.html:42 +msgid "User handle to follow from:" +msgstr "" + +#: bookwyrm/templates/ostatus/remote_follow.html:44 +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:6 +#: bookwyrm/templates/ostatus/success.html:32 +#, python-format +msgid "You are now following %(display_name)s!" +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:62 +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/delete_user.html:4 +#: bookwyrm/templates/preferences/delete_user.html:7 +#: bookwyrm/templates/preferences/delete_user.html:41 +#: 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/delete_user.html:36 +msgid "I understand that my account cannot be recovered:" +msgstr "" + +#: bookwyrm/templates/preferences/disable-2fa.html:4 +#: bookwyrm/templates/preferences/disable-2fa.html:7 +#: bookwyrm/templates/preferences/security.html:39 +msgid "Disable 2FA" +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:85 +msgid "Display" +msgstr "" + +#: bookwyrm/templates/preferences/edit_user.html:14 +#: bookwyrm/templates/preferences/edit_user.html:118 +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 ratings" +msgstr "" + +#: bookwyrm/templates/preferences/edit_user.html:81 +msgid "Show suggested users" +msgstr "" + +#: bookwyrm/templates/preferences/edit_user.html:87 +msgid "Show this account in suggested users" +msgstr "" + +#: bookwyrm/templates/preferences/edit_user.html:91 +#, 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:95 +msgid "Preferred Timezone: " +msgstr "" + +#: bookwyrm/templates/preferences/edit_user.html:107 +msgid "Theme:" +msgstr "" + +#: bookwyrm/templates/preferences/edit_user.html:123 +msgid "Manually approve followers" +msgstr "" + +#: bookwyrm/templates/preferences/edit_user.html:129 +msgid "Hide followers and following on profile" +msgstr "" + +#: bookwyrm/templates/preferences/edit_user.html:134 +msgid "Default post privacy:" +msgstr "" + +#: bookwyrm/templates/preferences/edit_user.html:142 +#, 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-user.html:6 +#: bookwyrm/templates/preferences/export-user.html:9 +#: bookwyrm/templates/preferences/layout.html:55 +msgid "Export BookWyrm Account" +msgstr "" + +#: bookwyrm/templates/preferences/export-user.html:15 +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:19 +msgid "Your file will include:" +msgstr "" + +#: bookwyrm/templates/preferences/export-user.html:22 +msgid "Most user settings" +msgstr "" + +#: bookwyrm/templates/preferences/export-user.html:28 +msgid "Your own lists and saved lists" +msgstr "" + +#: bookwyrm/templates/preferences/export-user.html:29 +msgid "Which users you follow and block" +msgstr "" + +#: bookwyrm/templates/preferences/export-user.html:33 +msgid "Your file will not include:" +msgstr "" + +#: bookwyrm/templates/preferences/export-user.html:35 +msgid "Direct messages" +msgstr "" + +#: bookwyrm/templates/preferences/export-user.html:36 +msgid "Replies to your statuses" +msgstr "" + +#: bookwyrm/templates/preferences/export-user.html:38 +msgid "Favorites" +msgstr "" + +#: bookwyrm/templates/preferences/export-user.html:42 +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:45 +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:50 +msgid "New user exports are currently disabled." +msgstr "" + +#: bookwyrm/templates/preferences/export-user.html:54 +#, python-format +msgid "User exports settings can be changed from the Imports page in the Admin dashboard." +msgstr "" + +#: bookwyrm/templates/preferences/export-user.html:61 +#, python-format +msgid "You will be able to create a new export file at %(next_available)s" +msgstr "" + +#: bookwyrm/templates/preferences/export-user.html:72 +#, python-format +msgid "On average, recent exports have taken %(hours)s hours." +msgstr "" + +#: bookwyrm/templates/preferences/export-user.html:76 +#, python-format +msgid "On average, recent exports have taken %(minutes)s minutes." +msgstr "" + +#: bookwyrm/templates/preferences/export-user.html:88 +msgid "Create user export file" +msgstr "" + +#: bookwyrm/templates/preferences/export-user.html:95 +msgid "Recent Exports" +msgstr "" + +#: bookwyrm/templates/preferences/export-user.html:97 +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:100 +#, python-format +msgid "Export files will be deleted after %(expiry_hours)s hour." +msgid_plural "Export files will be deleted after %(expiry_hours)s hours." +msgstr[0] "" +msgstr[1] "" + +#: bookwyrm/templates/preferences/export-user.html:110 +#: bookwyrm/templates/preferences/security.html:126 +#: bookwyrm/templates/settings/files.html:136 +#: bookwyrm/templates/settings/files.html:318 +msgid "Date" +msgstr "" + +#: bookwyrm/templates/preferences/export-user.html:116 +msgid "Size" +msgstr "" + +#: bookwyrm/templates/preferences/export-user.html:160 +msgid "Download your export" +msgstr "" + +#: bookwyrm/templates/preferences/export-user.html:164 +msgid "Archive is no longer available" +msgstr "" + +#: bookwyrm/templates/preferences/export.html:4 +#: bookwyrm/templates/preferences/export.html:7 +#: bookwyrm/templates/preferences/layout.html:47 +msgid "Export Book List" +msgstr "" + +#: bookwyrm/templates/preferences/export.html:13 +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 +msgid "Download file" +msgstr "" + +#: bookwyrm/templates/preferences/layout.html:11 +msgid "Account" +msgstr "" + +#: bookwyrm/templates/preferences/layout.html:24 +msgid "Security Settings" +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: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/preferences/security.html:4 +#: bookwyrm/templates/preferences/security.html:7 +msgid "Account Security" +msgstr "" + +#: bookwyrm/templates/preferences/security.html:13 +msgid "Two Factor Authentication" +msgstr "" + +#: bookwyrm/templates/preferences/security.html:19 +msgid "Successfully updated 2FA settings" +msgstr "" + +#: bookwyrm/templates/preferences/security.html:27 +msgid "Write down or copy and paste these codes somewhere safe." +msgstr "" + +#: bookwyrm/templates/preferences/security.html:28 +msgid "You must use them in order, and they will not be displayed again." +msgstr "" + +#: bookwyrm/templates/preferences/security.html:38 +msgid "Two Factor Authentication is active on your account." +msgstr "" + +#: bookwyrm/templates/preferences/security.html:42 +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/security.html:43 +msgid "Generate backup codes" +msgstr "" + +#: bookwyrm/templates/preferences/security.html:48 +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/security.html:55 +msgid "Use setup key" +msgstr "" + +#: bookwyrm/templates/preferences/security.html:61 +msgid "Account name:" +msgstr "" + +#: bookwyrm/templates/preferences/security.html:68 +msgid "Code:" +msgstr "" + +#: bookwyrm/templates/preferences/security.html:76 +msgid "Enter the code from your app:" +msgstr "" + +#: bookwyrm/templates/preferences/security.html:86 +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/security.html:88 +msgid "Confirm your password to begin setting up 2FA." +msgstr "" + +#: bookwyrm/templates/preferences/security.html:98 +#: bookwyrm/templates/two_factor_auth/two_factor_prompt.html:37 +msgid "Set up 2FA" +msgstr "" + +#: bookwyrm/templates/preferences/security.html:111 +msgid "Sessions" +msgstr "" + +#: bookwyrm/templates/preferences/security.html:114 +msgid "Some legacy sessions may not be displayed." +msgstr "" + +#: bookwyrm/templates/preferences/security.html:119 +msgid "You are logged in to the following sessions:" +msgstr "" + +#: bookwyrm/templates/preferences/security.html:126 +msgid "Date first logged in" +msgstr "" + +#: bookwyrm/templates/preferences/security.html:127 +msgid "IP address" +msgstr "" + +#: bookwyrm/templates/preferences/security.html:127 +msgid "IP" +msgstr "" + +#: bookwyrm/templates/preferences/security.html:128 +msgid "Operating System" +msgstr "" + +#: bookwyrm/templates/preferences/security.html:128 +msgid "OS" +msgstr "" + +#: bookwyrm/templates/preferences/security.html:129 +msgid "Web Browser" +msgstr "" + +#: bookwyrm/templates/preferences/security.html:129 +msgid "Browser" +msgstr "" + +#: bookwyrm/templates/preferences/security.html:143 +msgid "You" +msgstr "" + +#: bookwyrm/templates/preferences/security.html:147 +msgid "Log Out" +msgstr "" + +#: bookwyrm/templates/preferences/security.html:161 +msgid "Currently your logged-in sessions are unable to be displayed." +msgstr "" + +#: bookwyrm/templates/reading_progress/finish.html:5 +#, python-format +msgid "Finish \"%(book_title)s\"" +msgstr "" + +#: bookwyrm/templates/reading_progress/start.html:5 +#, python-format +msgid "Start \"%(book_title)s\"" +msgstr "" + +#: bookwyrm/templates/reading_progress/stop.html:5 +#, python-format +msgid "Stop Reading \"%(book_title)s\"" +msgstr "" + +#: bookwyrm/templates/reading_progress/want.html:5 +#, python-format +msgid "Want to Read \"%(book_title)s\"" +msgstr "" + +#: 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 +#: bookwyrm/templates/settings/files.html:139 +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 "" + +#: 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 "" + +#: 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] "" + +#: 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:25 +#: bookwyrm/templates/search/layout.html:51 +#: 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:63 +#, python-format +msgid "No results found for \"%(query)s\"" +msgstr "" + +#: bookwyrm/templates/search/layout.html:65 +#, python-format +msgid "%(result_count)s result found" +msgid_plural "%(result_count)s results found" +msgstr[0] "" +msgstr[1] "" + +#: 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:117 +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:85 +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:91 +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 +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 +#: bookwyrm/templates/settings/files.html:28 +#: bookwyrm/templates/settings/files.html:221 +msgid "Schedule:" +msgstr "" + +#: bookwyrm/templates/settings/automod/rules.html:33 +#: bookwyrm/templates/settings/files.html:35 +#: bookwyrm/templates/settings/files.html:228 +msgid "Last run:" +msgstr "" + +#: bookwyrm/templates/settings/automod/rules.html:40 +#: bookwyrm/templates/settings/files.html:42 +#: bookwyrm/templates/settings/files.html:235 +msgid "Total run count:" +msgstr "" + +#: bookwyrm/templates/settings/automod/rules.html:47 +#: bookwyrm/templates/settings/files.html:49 +#: bookwyrm/templates/settings/files.html:242 +msgid "Enabled:" +msgstr "" + +#: bookwyrm/templates/settings/automod/rules.html:59 +#: bookwyrm/templates/settings/files.html:61 +#: bookwyrm/templates/settings/files.html:254 +msgid "Delete schedule" +msgstr "" + +#: bookwyrm/templates/settings/automod/rules.html:63 +#: bookwyrm/templates/settings/files.html:65 +#: bookwyrm/templates/settings/files.html:258 +#: bookwyrm/templates/settings/files.html:305 +msgid "Run now" +msgstr "" + +#: bookwyrm/templates/settings/automod/rules.html:64 +#: bookwyrm/templates/settings/files.html:66 +#: bookwyrm/templates/settings/files.html:259 +msgid "Last run date will not be updated" +msgstr "" + +#: bookwyrm/templates/settings/automod/rules.html:69 +#: bookwyrm/templates/settings/automod/rules.html:92 +#: bookwyrm/templates/settings/files.html:96 +#: bookwyrm/templates/settings/files.html:290 +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 +#: bookwyrm/templates/settings/layout.html:92 +msgid "Celery Status" +msgstr "" + +#: bookwyrm/templates/settings/celery.html:14 +msgid "You can set up monitoring to check if Celery is running by querying:" +msgstr "" + +#: 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 +#: bookwyrm/templates/settings/layout.html:104 +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 "" + +#: bookwyrm/templates/settings/celery.html:126 +msgid "Active Tasks" +msgstr "" + +#: bookwyrm/templates/settings/celery.html:131 +#: bookwyrm/templates/settings/imports/imports.html:195 +#: bookwyrm/templates/settings/imports/imports.html:285 +#: bookwyrm/templates/settings/schedules.html:95 +msgid "ID" +msgstr "" + +#: 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 +#: bookwyrm/templates/settings/connectors/connector.html:22 +#: bookwyrm/templates/settings/connectors/update.html:21 +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 "" + +#: 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 "" + +#: bookwyrm/templates/settings/celery.html:208 +msgid "Errors" +msgstr "" + +#: bookwyrm/templates/settings/connectors/available.html:15 +msgid "Finna.fi is a search service that collects material from hundreds of Finnish organisations under one roof." +msgstr "" + +#: bookwyrm/templates/settings/connectors/available.html:28 +msgid "Create new connector" +msgstr "" + +#: bookwyrm/templates/settings/connectors/connector.html:35 +#: bookwyrm/templates/settings/connectors/update.html:33 +#: bookwyrm/templates/settings/users/user_info.html:87 +msgid "Deactivation reason:" +msgstr "" + +#: bookwyrm/templates/settings/connectors/connector.html:50 +#: bookwyrm/templates/settings/connectors/update.html:47 +msgid "Deactivate" +msgstr "" + +#: bookwyrm/templates/settings/connectors/connector.html:61 +#: bookwyrm/templates/settings/connectors/update.html:58 +msgid "Activate" +msgstr "" + +#: bookwyrm/templates/settings/connectors/connectors.html:4 +#: bookwyrm/templates/settings/connectors/connectors.html:6 +msgid "Connector Settings" +msgstr "" + +#: bookwyrm/templates/settings/connectors/connectors.html:11 +msgid "Connectors are sources of data about books and authors." +msgstr "" + +#: bookwyrm/templates/settings/connectors/connectors.html:12 +msgid "The priority determines the order in which search results appear. The highest priority is 1. The default priority is 2." +msgstr "" + +#: bookwyrm/templates/settings/connectors/connectors.html:14 +msgid "Connector settings only determine whether a connector will be used to deliver search results. To manage more interactions with other federated servers, including domain blocks, see" +msgstr "" + +#: bookwyrm/templates/settings/connectors/connectors.html:14 +#: 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/connectors/update.html:66 +msgid "should be updated. Check recent release notes for more information." +msgstr "" + +#: bookwyrm/templates/settings/connectors/update.html:76 +#: bookwyrm/templates/snippets/create_status/post_options_block.html:19 +msgid "Update" +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:114 +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:33 +#: bookwyrm/templates/settings/dashboard/works_chart.html:11 +msgid "Works" +msgstr "" + +#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +msgid "Instance Activity" +msgstr "" + +#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +msgid "Interval:" +msgstr "" + +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +msgid "Days" +msgstr "" + +#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +msgid "Weeks" +msgstr "" + +#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +msgid "User signup activity" +msgstr "" + +#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +msgid "Status activity" +msgstr "" + +#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +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/warnings/check_for_updates.html:12 +msgid "Would you like to automatically check for new BookWyrm releases? (recommended)" +msgstr "" + +#: bookwyrm/templates/settings/dashboard/warnings/check_for_updates.html:20 +msgid "Schedule checks" +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] "" +msgstr[1] "" + +#: bookwyrm/templates/settings/dashboard/warnings/email_config.html:8 +#, python-format +msgid "Your outgoing email address, %(email_sender)s, may be misconfigured." +msgstr "" + +#: bookwyrm/templates/settings/dashboard/warnings/email_config.html:11 +msgid "Check the EMAIL_SENDER_NAME and EMAIL_SENDER_DOMAIN in your .env file." +msgstr "" + +#: 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] "" +msgstr[1] "" + +#: 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] "" +msgstr[1] "" + +#: 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 "" + +#: 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:71 +msgid "Email Blocklist" +msgstr "" + +#: 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] "" +msgstr[1] "" + +#: 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:100 +msgid "Email Configuration" +msgstr "" + +#: bookwyrm/templates/settings/email_config.html:16 +msgid "Error sending test email:" +msgstr "" + +#: bookwyrm/templates/settings/email_config.html:24 +msgid "Successfully sent test email." +msgstr "" + +#: bookwyrm/templates/settings/email_config.html:32 +#: bookwyrm/templates/setup/config.html:96 +msgid "Email sender:" +msgstr "" + +#: bookwyrm/templates/settings/email_config.html:39 +msgid "Email backend:" +msgstr "" + +#: 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 "" + +#: bookwyrm/templates/settings/email_config.html:74 +msgid "Use SSL:" +msgstr "" + +#: bookwyrm/templates/settings/email_config.html:83 +#, python-format +msgid "Send test email to %(email)s" +msgstr "" + +#: bookwyrm/templates/settings/email_config.html:90 +msgid "Send test email" +msgstr "" + +#: 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: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: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 "" + +#: 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/files.html:7 +#: bookwyrm/templates/settings/files.html:11 +msgid "Files maintenance" +msgstr "" + +#: bookwyrm/templates/settings/files.html:17 +msgid "Schedule file deletion" +msgstr "" + +#: bookwyrm/templates/settings/files.html:21 +msgid "This job deletes uploaded user export and import files that have reached the expiry age." +msgstr "" + +#: bookwyrm/templates/settings/files.html:102 +msgid "Export file expiration" +msgstr "" + +#: bookwyrm/templates/settings/files.html:109 +msgid "Maximum age of export files, in hours" +msgstr "" + +#: bookwyrm/templates/settings/files.html:122 +msgid "Files older than this will be deleted." +msgstr "" + +#: bookwyrm/templates/settings/files.html:125 +msgid "Set expiry hours" +msgstr "" + +#: bookwyrm/templates/settings/files.html:138 +msgid "Expired files" +msgstr "" + +#: bookwyrm/templates/settings/files.html:186 +#: bookwyrm/templates/settings/imports/imports.html:184 +#: bookwyrm/templates/settings/imports/imports.html:274 +msgid "Completed" +msgstr "" + +#: bookwyrm/templates/settings/files.html:206 +msgid "Find book covers from connectors" +msgstr "" + +#: bookwyrm/templates/settings/files.html:209 +msgid "These jobs find cover images where they are missing or have incorrect filepaths." +msgstr "" + +#: bookwyrm/templates/settings/files.html:212 +msgid "Find missing covers" +msgstr "" + +#: bookwyrm/templates/settings/files.html:215 +msgid "Schedule a regular scan to find cover images for editions without them. This can be resource intensive so the recommended schedule is no less than every seven days." +msgstr "" + +#: bookwyrm/templates/settings/files.html:296 +msgid "Fix broken book cover filepaths" +msgstr "" + +#: bookwyrm/templates/settings/files.html:299 +msgid "If you have lost your cover image files (e.g. due to server migration failure) the scheduled job above will not replace them. Run this job instead to attempt to find covers for books where the current cover filepath does not resolve to a file." +msgstr "" + +#: bookwyrm/templates/settings/files.html:306 +msgid "This job cannot be scheduled to run regularly" +msgstr "" + +#: bookwyrm/templates/settings/files.html:320 +msgid "Editions checked" +msgstr "" + +#: bookwyrm/templates/settings/files.html:321 +msgid "Covers fixed" +msgstr "" + +#: bookwyrm/templates/settings/files.html:371 +msgid "Successfully updated expiry time" +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 "" + +#: 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: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:51 +msgid "Users are currently unable to start new imports" +msgstr "" + +#: bookwyrm/templates/settings/imports/imports.html:56 +msgid "Enable imports" +msgstr "" + +#: bookwyrm/templates/settings/imports/imports.html:64 +msgid "Limit the amount of imports" +msgstr "" + +#: 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:76 +#: bookwyrm/templates/settings/imports/imports.html:135 +msgid "Set the value to 0 to not enforce any limit." +msgstr "" + +#: bookwyrm/templates/settings/imports/imports.html:79 +msgid "Set import limit to" +msgstr "" + +#: bookwyrm/templates/settings/imports/imports.html:81 +msgid "books every" +msgstr "" + +#: bookwyrm/templates/settings/imports/imports.html:83 +msgid "days." +msgstr "" + +#: bookwyrm/templates/settings/imports/imports.html:87 +msgid "Set limit" +msgstr "" + +#: bookwyrm/templates/settings/imports/imports.html:98 +msgid "Disable starting new user exports" +msgstr "" + +#: bookwyrm/templates/settings/imports/imports.html:109 +msgid "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." +msgstr "" + +#: bookwyrm/templates/settings/imports/imports.html:110 +msgid "While exports are disabled, users will not be allowed to start new user exports, but existing exports will not be affected." +msgstr "" + +#: bookwyrm/templates/settings/imports/imports.html:115 +msgid "Disable user exports" +msgstr "" + +#: bookwyrm/templates/settings/imports/imports.html:123 +msgid "Limit how often users can import and export" +msgstr "" + +#: bookwyrm/templates/settings/imports/imports.html:134 +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:138 +msgid "Limit how often users can import and export user data" +msgstr "" + +#: bookwyrm/templates/settings/imports/imports.html:140 +msgid "hours" +msgstr "" + +#: bookwyrm/templates/settings/imports/imports.html:144 +msgid "Change limit" +msgstr "" + +#: bookwyrm/templates/settings/imports/imports.html:159 +msgid "Users are currently unable to start new user exports. This is the default setting." +msgstr "" + +#: bookwyrm/templates/settings/imports/imports.html:161 +msgid "It is not currently possible to provide user exports when using Azure storage." +msgstr "" + +#: bookwyrm/templates/settings/imports/imports.html:167 +msgid "Enable user exports" +msgstr "" + +#: bookwyrm/templates/settings/imports/imports.html:174 +msgid "Book Imports" +msgstr "" + +#: bookwyrm/templates/settings/imports/imports.html:198 +#: bookwyrm/templates/settings/imports/imports.html:288 +msgid "User" +msgstr "" + +#: bookwyrm/templates/settings/imports/imports.html:207 +#: bookwyrm/templates/settings/imports/imports.html:297 +msgid "Date Updated" +msgstr "" + +#: bookwyrm/templates/settings/imports/imports.html:214 +msgid "Pending items" +msgstr "" + +#: bookwyrm/templates/settings/imports/imports.html:217 +msgid "Successful items" +msgstr "" + +#: bookwyrm/templates/settings/imports/imports.html:252 +#: bookwyrm/templates/settings/imports/imports.html:344 +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 "" + +#: 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 "" + +#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:18 +msgid "IP Address:" +msgstr "" + +#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:24 +msgid "You can block IP ranges using CIDR syntax." +msgstr "" + +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:5 +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:7 +#: bookwyrm/templates/settings/layout.html:75 +msgid "IP Address Blocklist" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: 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 +#: bookwyrm/templates/settings/users/force_password_reset.html:7 +#: bookwyrm/templates/settings/users/force_password_reset.html:11 +msgid "Force Password Reset" +msgstr "" + +#: bookwyrm/templates/settings/layout.html:59 +msgid "Moderation" +msgstr "" + +#: bookwyrm/templates/settings/layout.html:63 +#: bookwyrm/templates/settings/reports/reports.html:8 +#: bookwyrm/templates/settings/reports/reports.html:17 +msgid "Reports" +msgstr "" + +#: bookwyrm/templates/settings/layout.html:67 +msgid "Auto-Moderation Rules" +msgstr "" + +#: bookwyrm/templates/settings/layout.html:79 +#: 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:84 +msgid "System" +msgstr "" + +#: bookwyrm/templates/settings/layout.html:96 +msgid "Scheduled Tasks" +msgstr "" + +#: bookwyrm/templates/settings/layout.html:108 +msgid "Files Maintenance" +msgstr "" + +#: bookwyrm/templates/settings/layout.html:113 +msgid "Instance Settings" +msgstr "" + +#: bookwyrm/templates/settings/layout.html:121 +#: bookwyrm/templates/settings/site.html:4 +#: bookwyrm/templates/settings/site.html:6 +msgid "Site Settings" +msgstr "" + +#: bookwyrm/templates/settings/layout.html:127 +#: bookwyrm/templates/settings/layout.html:130 +#: 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:136 +#: 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 "" + +#: 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 "" + +#: 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 "" + +#: bookwyrm/templates/settings/reports/report.html:86 +#, python-format +msgid "%(user)s commented on this report:" +msgstr "" + +#: bookwyrm/templates/settings/reports/report.html:90 +#, python-format +msgid "%(user)s took an action on this report:" +msgstr "" + +#: bookwyrm/templates/settings/reports/report_header.html:6 +#, python-format +msgid "Report #%(report_id)s: Status posted by @%(username)s" +msgstr "" + +#: bookwyrm/templates/settings/reports/report_header.html:13 +#, python-format +msgid "Report #%(report_id)s: Link added by @%(username)s" +msgstr "" + +#: bookwyrm/templates/settings/reports/report_header.html:17 +#, python-format +msgid "Report #%(report_id)s: Link domain" +msgstr "" + +#: bookwyrm/templates/settings/reports/report_header.html:24 +#, python-format +msgid "Report #%(report_id)s: User @%(username)s" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: bookwyrm/templates/settings/reports/reports.html:14 +#, python-format +msgid "Reports: %(instance_name)s" +msgstr "" + +#: 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/schedules.html:7 +#: bookwyrm/templates/settings/schedules.html:11 +msgid "Scheduled tasks" +msgstr "" + +#: bookwyrm/templates/settings/schedules.html:17 +#: bookwyrm/templates/settings/schedules.html:101 +msgid "Tasks" +msgstr "" + +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "" + +#: bookwyrm/templates/settings/schedules.html:25 +msgid "Celery task" +msgstr "" + +#: bookwyrm/templates/settings/schedules.html:28 +msgid "Date changed" +msgstr "" + +#: bookwyrm/templates/settings/schedules.html:31 +msgid "Last run at" +msgstr "" + +#: bookwyrm/templates/settings/schedules.html:34 +#: bookwyrm/templates/settings/schedules.html:98 +msgid "Schedule" +msgstr "" + +#: bookwyrm/templates/settings/schedules.html:37 +msgid "Schedule ID" +msgstr "" + +#: bookwyrm/templates/settings/schedules.html:40 +msgid "Enabled" +msgstr "" + +#: bookwyrm/templates/settings/schedules.html:73 +msgid "Un-schedule" +msgstr "" + +#: bookwyrm/templates/settings/schedules.html:81 +msgid "No scheduled tasks" +msgstr "" + +#: bookwyrm/templates/settings/schedules.html:90 +msgid "Schedules" +msgstr "" + +#: bookwyrm/templates/settings/schedules.html:119 +msgid "No schedules 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 "" + +#: 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 "" + +#: 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 "" + +#: 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/templates/settings/themes.html:41 +msgid "Run ./bw-dev compile_themes and ./bw-dev collectstatic." +msgstr "" + +#: 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: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." +msgstr "" + +#: bookwyrm/templates/settings/users/delete_user_form.html:18 +msgid "I understand that this is a permanent action:" +msgstr "" + +#: bookwyrm/templates/settings/users/force_password_reset.html:17 +msgid "All users in the selected category will be logged out and required to set a new password to log back in." +msgstr "" + +#: bookwyrm/templates/settings/users/force_password_reset.html:18 +msgid "If your account is in the group, you will be logged out out after submitting." +msgstr "" + +#: bookwyrm/templates/settings/users/force_password_reset.html:22 +msgid "Users given password resets:" +msgstr "" + +#: bookwyrm/templates/settings/users/force_password_reset.html:35 +msgid "All users" +msgstr "" + +#: bookwyrm/templates/settings/users/force_password_reset.html:39 +msgid "users" +msgstr "" + +#: bookwyrm/templates/settings/users/force_password_reset.html:43 +msgid "Force password reset" +msgstr "" + +#: bookwyrm/templates/settings/users/force_password_reset.html:48 +msgid "Number of users that will be effected:" +msgstr "" + +#: bookwyrm/templates/settings/users/force_password_reset.html:53 +msgid "Are you sure you want to force password reset for these users:" +msgstr "" + +#: bookwyrm/templates/settings/users/user_admin.html:9 +#, python-format +msgid "Users: %(instance_name)s" +msgstr "" + +#: 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: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/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/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/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 with localhost. This should never be used in a production environment." +msgstr "" + +#: 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:62 +msgid "Instance base URL:" +msgstr "" + +#: bookwyrm/templates/setup/config.html:75 +msgid "Using S3:" +msgstr "" + +#: bookwyrm/templates/setup/config.html:89 +msgid "Default interface language:" +msgstr "" + +#: bookwyrm/templates/setup/config.html:103 +msgid "Enable preview images:" +msgstr "" + +#: bookwyrm/templates/setup/config.html:110 +msgid "Enable image thumbnails:" +msgstr "" + +#: bookwyrm/templates/setup/config.html:122 +msgid "Does everything look right?" +msgstr "" + +#: bookwyrm/templates/setup/config.html:125 +msgid "This is your last chance to set your domain and protocol." +msgstr "" + +#: bookwyrm/templates/setup/config.html:139 +msgid "You can change your instance settings in the .env file on your server." +msgstr "" + +#: bookwyrm/templates/setup/config.html:143 +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/templates/setup/layout.html:24 +msgid "Need help?" +msgstr "" + +#: bookwyrm/templates/shelf/create_shelf_form.html:5 +#: bookwyrm/templates/shelf/shelf.html:79 +msgid "Create shelf" +msgstr "" + +#: bookwyrm/templates/shelf/edit_shelf_form.html:5 +msgid "Edit Shelf" +msgstr "" + +#: bookwyrm/templates/shelf/shelf.html:46 +#: bookwyrm/templatetags/shelf_tags.py:13 bookwyrm/views/shelf/shelf.py:61 +msgid "All books" +msgstr "" + +#: bookwyrm/templates/shelf/shelf.html:71 +msgid "Import Books" +msgstr "" + +#: bookwyrm/templates/shelf/shelf.html:104 +#, python-format +msgid "%(formatted_count)s book" +msgid_plural "%(formatted_count)s books" +msgstr[0] "" +msgstr[1] "" + +#: bookwyrm/templates/shelf/shelf.html:110 +#, python-format +msgid "(showing %(start)s-%(end)s)" +msgstr "" + +#: bookwyrm/templates/shelf/shelf.html:124 +msgid "Edit shelf" +msgstr "" + +#: bookwyrm/templates/shelf/shelf.html:132 +msgid "Delete shelf" +msgstr "" + +#: bookwyrm/templates/shelf/shelf.html:160 +#: bookwyrm/templates/shelf/shelf.html:186 +msgid "Shelved" +msgstr "" + +#: bookwyrm/templates/shelf/shelf.html:161 +#: bookwyrm/templates/shelf/shelf.html:189 +msgid "Started" +msgstr "" + +#: bookwyrm/templates/shelf/shelf.html:162 +#: bookwyrm/templates/shelf/shelf.html:192 +msgid "Finished" +msgstr "" + +#: bookwyrm/templates/shelf/shelf.html:162 +#: bookwyrm/templates/shelf/shelf.html:192 +msgid "Until" +msgstr "" + +#: bookwyrm/templates/shelf/shelf.html:221 +#, python-format +msgid "We couldn't find any books that matched %(shelves_filter_query)s" +msgstr "" + +#: bookwyrm/templates/shelf/shelf.html:225 +msgid "This shelf is empty." +msgstr "" + +#: bookwyrm/templates/shelf/shelves_filter_field.html:6 +msgid "Filter by keyword" +msgstr "" + +#: bookwyrm/templates/shelf/shelves_filter_field.html:7 +msgid "Enter text here" +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 "" + +#: bookwyrm/templates/snippets/announcement.html:28 +#, python-format +msgid "Posted by %(username)s" +msgstr "" + +#: 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] "" +msgstr[1] "" + +#: 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 "" + +#: 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 "" + +#: 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: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 "" + +#: 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:68 +msgid "to" +msgstr "" + +#: bookwyrm/templates/snippets/create_status/review.html:24 +#, python-format +msgid "Your review of '%(book_title)s'" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: 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 "" + +#: bookwyrm/templates/snippets/footer.html:49 +msgid "BookWyrm's source code is freely available. You can contribute or report issues on GitHub." +msgstr "" + +#: bookwyrm/templates/snippets/form_rate_stars.html:20 +#: bookwyrm/templates/snippets/stars.html:38 +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] "" +msgstr[1] "" + +#: bookwyrm/templates/snippets/form_rate_stars.html:64 +#: bookwyrm/templates/snippets/stars.html:20 +#, python-format +msgid "%(rating)s star" +msgid_plural "%(rating)s stars" +msgstr[0] "" +msgstr[1] "" + +#: 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] "" +msgstr[1] "" + +#: 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] "" +msgstr[1] "" + +#: 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] "" +msgstr[1] "" + +#: bookwyrm/templates/snippets/generated_status/review_pure_name.html:12 +#, python-format +msgid "Review of \"%(book_title)s\": %(review_title)s" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: bookwyrm/templates/snippets/goal_progress.html:12 +#, python-format +msgid "You've read %(read_count)s of %(goal_count)s books." +msgstr "" + +#: bookwyrm/templates/snippets/goal_progress.html:14 +#, python-format +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" +msgstr "" + +#: bookwyrm/templates/snippets/page_text.html:14 +#, python-format +msgid "page %(page)s" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: bookwyrm/templates/snippets/reading_modals/stop_reading_modal.html:6 +#, python-format +msgid "Stop Reading \"%(book_title)s\"" +msgstr "" + +#: bookwyrm/templates/snippets/reading_modals/stop_reading_modal.html:32 +#: bookwyrm/templates/snippets/shelf_selector.html: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 "" + +#: 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 "" + +#: bookwyrm/templates/snippets/report_modal.html:10 +#, python-format +msgid "Report %(domain)s link" +msgstr "" + +#: bookwyrm/templates/snippets/report_modal.html:12 +#, python-format +msgid "Report @%(username)s" +msgstr "" + +#: bookwyrm/templates/snippets/report_modal.html:34 +#, python-format +msgid "This report will be sent to %(site_name)s's moderators for review." +msgstr "" + +#: 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 "" + +#: 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/stars.html:13 +msgid "Show rating" +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 "" + +#: bookwyrm/templates/snippets/status/content_status.html:91 +#, python-format +msgid "%(endpage)s" +msgstr "" + +#: bookwyrm/templates/snippets/status/content_status.html:93 +#, python-format +msgid "(%(percent)s%%" +msgstr "" + +#: bookwyrm/templates/snippets/status/content_status.html:93 +#, python-format +msgid " - %(endpercent)s%%" +msgstr "" + +#: 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 "" + +#: bookwyrm/templates/snippets/status/headers/comment.html:8 +#, python-format +msgid "commented on %(book)s by %(author_name)s" +msgstr "" + +#: bookwyrm/templates/snippets/status/headers/comment.html:15 +#, python-format +msgid "commented on %(book)s" +msgstr "" + +#: bookwyrm/templates/snippets/status/headers/note.html:8 +#, python-format +msgid "replied to %(username)s's status" +msgstr "" + +#: bookwyrm/templates/snippets/status/headers/quotation.html:8 +#, python-format +msgid "quoted %(book)s by %(author_name)s" +msgstr "" + +#: bookwyrm/templates/snippets/status/headers/quotation.html:15 +#, python-format +msgid "quoted %(book)s" +msgstr "" + +#: bookwyrm/templates/snippets/status/headers/rating.html:3 +#, python-format +msgid "rated %(book)s:" +msgstr "" + +#: bookwyrm/templates/snippets/status/headers/read.html:10 +#, python-format +msgid "finished reading %(book)s by %(author_name)s" +msgstr "" + +#: bookwyrm/templates/snippets/status/headers/read.html:17 +#, python-format +msgid "finished reading %(book)s" +msgstr "" + +#: bookwyrm/templates/snippets/status/headers/reading.html:10 +#, python-format +msgid "started reading %(book)s by %(author_name)s" +msgstr "" + +#: bookwyrm/templates/snippets/status/headers/reading.html:17 +#, python-format +msgid "started reading %(book)s" +msgstr "" + +#: bookwyrm/templates/snippets/status/headers/review.html:8 +#, python-format +msgid "reviewed %(book)s by %(author_name)s" +msgstr "" + +#: bookwyrm/templates/snippets/status/headers/review.html:15 +#, python-format +msgid "reviewed %(book)s" +msgstr "" + +#: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 +#, python-format +msgid "stopped reading %(book)s by %(author_name)s" +msgstr "" + +#: bookwyrm/templates/snippets/status/headers/stopped_reading.html:17 +#, python-format +msgid "stopped reading %(book)s" +msgstr "" + +#: bookwyrm/templates/snippets/status/headers/to_read.html:10 +#, python-format +msgid "wants to read %(book)s by %(author_name)s" +msgstr "" + +#: bookwyrm/templates/snippets/status/headers/to_read.html:17 +#, python-format +msgid "wants to read %(book)s" +msgstr "" + +#: 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 "" + +#: bookwyrm/templates/user/goal.html:12 +#, python-format +msgid "%(year)s Reading Progress" +msgstr "" + +#: 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 "" + +#: bookwyrm/templates/user/goal.html:44 +#, python-format +msgid "Your %(year)s Books" +msgstr "" + +#: bookwyrm/templates/user/goal.html:46 +#, python-format +msgid "%(username)s's %(year)s Books" +msgstr "" + +#: bookwyrm/templates/user/groups.html:14 +msgid "Your Groups" +msgstr "" + +#: bookwyrm/templates/user/groups.html:16 +#, python-format +msgid "Groups: %(username)s" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: bookwyrm/templates/user/relationships/followers.html:36 +#, python-format +msgid "%(username)s has no followers" +msgstr "" + +#: 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 "" + +#: 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 "" + +#: 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 "" + +#: bookwyrm/templates/user/user.html:76 +msgid "User Activity" +msgstr "" + +#: bookwyrm/templates/user/user.html:82 +msgid "Show RSS Options" +msgstr "" + +#: bookwyrm/templates/user/user.html:88 +msgid "RSS feed" +msgstr "" + +#: 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] "" +msgstr[1] "" + +#: bookwyrm/templates/user/user_preview.html:31 +#, python-format +msgid "%(counter)s following" +msgstr "" + +#: 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] "" +msgstr[1] "" + +#: 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 +#, python-format +msgid "File exceeds maximum size: %(max_size)sMB" +msgstr "" + +#: bookwyrm/templatetags/list_page_tags.py:14 +#, python-format +msgid "Book List: %(name)s" +msgstr "" + +#: 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] "" +msgstr[1] "" + +#: bookwyrm/templatetags/utilities.py:49 +#, python-format +msgid "%(title)s: %(subtitle)s" +msgstr "" + +#: bookwyrm/templatetags/utilities.py:133 +msgid "a new user account" +msgstr "" + +#: bookwyrm/views/updates.py:45 +#, python-format +msgid "Load %(count)d unread status" +msgid_plural "Load %(count)d unread statuses" +msgstr[0] "" +msgstr[1] "" + From f1bc5d235cd515511e5c35c89ef7abc87525e72f Mon Sep 17 00:00:00 2001 From: babastienne <16348048+babastienne@users.noreply.github.com> Date: Tue, 16 Dec 2025 23:02:55 +0100 Subject: [PATCH 210/962] =?UTF-8?q?[=E2=9C=A8=20Features]=20Add=20possibli?= =?UTF-8?q?ty=20to=20create=20new=20list=20from=20book=20page=20#3633?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When onto a book page, it is now possible to directly add a new list. Inside the list dorpdown the last entry is "+ Create new list...". If the user select this option, a modal is displayed and the user can directly create the list before confirming. After validation the user is redirected onto the list page where he can see it's book. --- bookwyrm/static/js/bookwyrm.js | 37 +++++++++++++++++++ bookwyrm/templates/book/book.html | 4 +- .../templates/lists/create_list_modal.html | 20 ++++++++++ bookwyrm/views/books/books.py | 1 + bookwyrm/views/list/lists.py | 14 ++++++- 5 files changed, 73 insertions(+), 3 deletions(-) create mode 100644 bookwyrm/templates/lists/create_list_modal.html diff --git a/bookwyrm/static/js/bookwyrm.js b/bookwyrm/static/js/bookwyrm.js index 3088165d6f..767a9b6bae 100644 --- a/bookwyrm/static/js/bookwyrm.js +++ b/bookwyrm/static/js/bookwyrm.js @@ -60,6 +60,12 @@ let BookWyrm = new (class { .forEach((form) => form.addEventListener("submit", (e) => this.setPreferredTimezone(e, form)) ); + + document + .querySelectorAll("button[name='button-book-list']") + .forEach((button) => + button.addEventListener("click", this.checkListSelection.bind(this)) + ); } /** @@ -862,4 +868,35 @@ let BookWyrm = new (class { this.toggleFocus(passwordElementId); } + + /** + * When user want to add book to list, it checks if the list needs + * to be created and if so open a modal to do it. Otherwise it submit + * the form to add the book to the selected list. + * + * @param {Event} event - The click event from the button + * @returns {undefined} + */ + checkListSelection(event) { + const selectElement = document.getElementById("id_list"); + const formElement = document.querySelector("form[name='list-add']"); + const modalElement = document.getElementById("modal-create-list-with-book"); + + if (!selectElement || !formElement) { + console.error("List management elements not found. Check your HTML IDs."); + + return; + } + + if (selectElement.value === "NEW_LIST_CREATION") { + if (modalElement) { + event.currentTarget.dataset.modalOpen = "modal-create-list-with-book"; + this.handleModalButton(event); + } else { + console.error("Modal element not found with ID: modal-create-list-with-book"); + } + } else { + formElement.submit(); + } + } })(); diff --git a/bookwyrm/templates/book/book.html b/bookwyrm/templates/book/book.html index 001a5f5bb0..84d31eb1b4 100644 --- a/bookwyrm/templates/book/book.html +++ b/bookwyrm/templates/book/book.html @@ -428,13 +428,15 @@

    {% trans "Lists" %}

    {% for list in list_options %} {% endfor %} +
    - +
    + {% include "lists/create_list_modal.html" with id="modal-create-list-with-book" %} {% endif %} {% endif %} diff --git a/bookwyrm/templates/lists/create_list_modal.html b/bookwyrm/templates/lists/create_list_modal.html new file mode 100644 index 0000000000..2160638341 --- /dev/null +++ b/bookwyrm/templates/lists/create_list_modal.html @@ -0,0 +1,20 @@ +{% extends 'components/modal.html' %} +{% load i18n %} +{% load static %} + +{% block modal-title %} +{% trans "Create new list" %} +{% endblock %} + +{% block modal-form-open %} +
    +{% endblock %} + +{% block modal-body %} +{% csrf_token %} + + +{% include 'lists/form.html' with curation_group=group %} +{% endblock %} + +{% block modal-form-close %}
    {% endblock %} diff --git a/bookwyrm/views/books/books.py b/bookwyrm/views/books/books.py index 8b5cb042db..9315fe0196 100644 --- a/bookwyrm/views/books/books.py +++ b/bookwyrm/views/books/books.py @@ -106,6 +106,7 @@ def get(self, request, book_id, **kwargs): if request.user.is_authenticated: data["list_options"] = request.user.list_set.exclude(id__in=data["lists"]) + data["list_form"] = forms.ListForm() data["file_link_form"] = forms.FileLinkForm() readthroughs = models.ReadThrough.objects.filter( user=request.user, diff --git a/bookwyrm/views/list/lists.py b/bookwyrm/views/list/lists.py index 64598435b4..f88fb56d9d 100644 --- a/bookwyrm/views/list/lists.py +++ b/bookwyrm/views/list/lists.py @@ -1,5 +1,7 @@ """book list views""" +import logging + from django.contrib.auth.decorators import login_required from django.core.paginator import Paginator from django.shortcuts import redirect @@ -10,8 +12,7 @@ from bookwyrm import forms, models from bookwyrm.lists_stream import ListsStream from bookwyrm.views.helpers import get_user_from_username - -import logging +from bookwyrm.views.list.list import add_book logger = logging.getLogger(__name__) @@ -46,6 +47,15 @@ def post(self, request): book_list.group = None book_list.save() + book_id = request.POST.get('book') + if book_id: + # We want to add a book to the new list directly after it's creation + updated_post = request.POST.copy() + updated_post['book_list'] = book_list.id + updated_post['book'] = book_id + request.POST = updated_post + return add_book(request) + return redirect(book_list.local_path) From bc02241bf33d2c478ce1d6ce20b5ed4183c07ec5 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Tue, 16 Dec 2025 17:17:22 -0800 Subject: [PATCH 211/962] New translations django.po (Yiddish) --- locale/yi_DE/LC_MESSAGES/django.po | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locale/yi_DE/LC_MESSAGES/django.po b/locale/yi_DE/LC_MESSAGES/django.po index 9c51fa6558..aa85472fae 100644 --- a/locale/yi_DE/LC_MESSAGES/django.po +++ b/locale/yi_DE/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-11-16 19:21+0000\n" -"PO-Revision-Date: 2025-12-16 18:25\n" +"PO-Revision-Date: 2025-12-17 01:17\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Yiddish\n" "Language: yi\n" @@ -19,15 +19,15 @@ msgstr "" #: bookwyrm/forms/admin.py:42 msgid "One Day" -msgstr "" +msgstr "אײן טאָג" #: bookwyrm/forms/admin.py:43 msgid "One Week" -msgstr "" +msgstr "אײן װאָך" #: bookwyrm/forms/admin.py:44 msgid "One Month" -msgstr "" +msgstr "אײן חודש" #: bookwyrm/forms/admin.py:45 msgid "Does Not Expire" From 5ab0e3e6834494dbe3b25e613fd7c23c869a7021 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Tue, 16 Dec 2025 19:02:26 -0800 Subject: [PATCH 212/962] New translations django.po (Yiddish) --- locale/yi_DE/LC_MESSAGES/django.po | 154 ++++++++++++++--------------- 1 file changed, 77 insertions(+), 77 deletions(-) diff --git a/locale/yi_DE/LC_MESSAGES/django.po b/locale/yi_DE/LC_MESSAGES/django.po index aa85472fae..61348e4def 100644 --- a/locale/yi_DE/LC_MESSAGES/django.po +++ b/locale/yi_DE/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-11-16 19:21+0000\n" -"PO-Revision-Date: 2025-12-17 01:17\n" +"PO-Revision-Date: 2025-12-17 03:02\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Yiddish\n" "Language: yi\n" @@ -31,169 +31,169 @@ msgstr "אײן חודש" #: bookwyrm/forms/admin.py:45 msgid "Does Not Expire" -msgstr "" +msgstr "גײט נישט אױס" #: bookwyrm/forms/admin.py:50 msgid "Unlimited" -msgstr "" +msgstr "אָן אַ שיעור" #: bookwyrm/forms/edit_user.py:99 bookwyrm/views/landing/password.py:117 msgid "Incorrect password" -msgstr "" +msgstr "פֿאַלשער פּאַראָל" #: bookwyrm/forms/edit_user.py:106 bookwyrm/forms/landing.py:93 msgid "Password does not match" -msgstr "" +msgstr "פּאַראָל פּאַסט נישט" #: bookwyrm/forms/edit_user.py:129 msgid "Incorrect Password" -msgstr "" +msgstr "פֿאַלשער פּאַראָל" #: bookwyrm/forms/forms.py:59 msgid "Reading finish date cannot be before start date." -msgstr "" +msgstr "סוף־דאַטע פֿון לײנען טאָר נישט זײן אײדער דער אָנהײב־דאַטע." #: bookwyrm/forms/forms.py:64 msgid "Reading stopped date cannot be before start date." -msgstr "" +msgstr "אױפֿהער־דאַטע פֿון לײנען טאָר נישט זײן אײדער דער אָנהײב־דאַטע." #: bookwyrm/forms/forms.py:72 msgid "Reading stopped date cannot be in the future." -msgstr "" +msgstr "אױפֿהער־דאַטע פֿון לײנען טאָר נישט זײן אין דער צוקונפֿט." #: bookwyrm/forms/forms.py:79 msgid "Reading finished date cannot be in the future." -msgstr "" +msgstr "סוף־דאַטע פֿון לײנען טאָר נישט זײן אין דער צוקונפֿט." #: bookwyrm/forms/landing.py:37 msgid "Username or password are incorrect" -msgstr "" +msgstr "ניצער־נאָמען אָדער פּאַראָל זענען פֿאַלש" #: bookwyrm/forms/landing.py:56 msgid "User with this username already exists" -msgstr "" +msgstr "עס איז שױן דאָ אַ ניצער מיט דעם ניצער־נאָמען" #: bookwyrm/forms/landing.py:65 msgid "A user with this email already exists." -msgstr "" +msgstr "עס איז שױן דאָ אַ ניצער מיט דעם בליצאַדרעס." #: bookwyrm/forms/landing.py:69 msgid "This email address cannot be registered." -msgstr "" +msgstr "מע קען נישט פֿאַרשרײַבן דעם בליצאַדרעס." #: bookwyrm/forms/landing.py:114 msgid "Password cannot be the same as your current password" -msgstr "" +msgstr "פּאַראָל קען ניזט זײן דער זעלבער װי דער איצטיקער" #: bookwyrm/forms/landing.py:145 bookwyrm/forms/landing.py:153 msgid "Incorrect code" -msgstr "" +msgstr "פֿאַלשער קאָד" #: bookwyrm/forms/links.py:36 msgid "This domain is blocked. Please contact your administrator if you think this is an error." -msgstr "" +msgstr "דאָס װעבזײַטל איז גערלײגט אין חרם. אױב איר מײנט אַז דאָס איז אַ טעות, פֿאַרבינט זיך מיט אײַער אַדמיניסטראַטאָר." #: bookwyrm/forms/links.py:51 msgid "This link with file type has already been added for this book. If it is not visible, the domain is still pending." -msgstr "" +msgstr "דאָס לינק מיט טעקע מין האָט מען שױן צוגעגעבן פֿאַר דעם בוך. אױב עס זעט זיך נישט אָן, הענגט נאָך דער שטח." #: bookwyrm/forms/lists.py:26 msgid "List Order" -msgstr "" +msgstr "רשימה־סדר" #: bookwyrm/forms/lists.py:27 msgid "Book Title" -msgstr "" +msgstr "בוכטיטל" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 #: bookwyrm/templates/snippets/create_status/review.html:32 msgid "Rating" -msgstr "" +msgstr "שאַצונג" #: bookwyrm/forms/lists.py:30 bookwyrm/templates/lists/list.html:185 msgid "Sort By" -msgstr "" +msgstr "סאָרטירן לױט" #: bookwyrm/forms/lists.py:34 msgid "Ascending" -msgstr "" +msgstr "אַרױף" #: bookwyrm/forms/lists.py:35 msgid "Descending" -msgstr "" +msgstr "אַראָפּ" #: bookwyrm/models/announcement.py:11 msgid "Primary" -msgstr "" +msgstr "ערשטיק" #: bookwyrm/models/announcement.py:12 msgid "Success" -msgstr "" +msgstr "הצלחה" #: bookwyrm/models/announcement.py:13 #: bookwyrm/templates/settings/invites/manage_invites.html:47 msgid "Link" -msgstr "" +msgstr "לינק" #: bookwyrm/models/announcement.py:14 msgid "Warning" -msgstr "" +msgstr "װאָרענונג" #: bookwyrm/models/announcement.py:15 msgid "Danger" -msgstr "" +msgstr "סכּנה" #: bookwyrm/models/antispam.py:113 bookwyrm/models/antispam.py:147 msgid "Automatically generated report" -msgstr "" +msgstr "אױטאָמאַטיש גענערירט באַריך" #: bookwyrm/models/base_model.py:18 bookwyrm/models/import_job.py:49 #: bookwyrm/models/job.py:18 bookwyrm/models/link.py:76 #: bookwyrm/templates/import/import_status.html:214 #: bookwyrm/templates/settings/link_domains/link_domains.html:19 msgid "Pending" -msgstr "" +msgstr "הענגענדיק" #: bookwyrm/models/base_model.py:19 msgid "Self deletion" -msgstr "" +msgstr "זיך־אָפּמעקונג" #: bookwyrm/models/base_model.py:20 msgid "Self deactivation" -msgstr "" +msgstr "זיך־דעאַקטיװירונג" #: bookwyrm/models/base_model.py:21 msgid "Moderator suspension" -msgstr "" +msgstr "שליש שליסענונג" #: bookwyrm/models/base_model.py:22 msgid "Moderator deletion" -msgstr "" +msgstr "שליש אָפּמעקונג" #: bookwyrm/models/base_model.py:23 msgid "Domain block" -msgstr "" +msgstr "שטח־חרם" #: bookwyrm/models/book.py:473 msgid "Audiobook" -msgstr "" +msgstr "אױדיאָבוך" #: bookwyrm/models/book.py:474 msgid "eBook" -msgstr "" +msgstr "ע־בוך" #: bookwyrm/models/book.py:475 msgid "Graphic novel" -msgstr "" +msgstr "גראַפֿישער ראָמאַן" #: bookwyrm/models/book.py:476 msgid "Hardcover" -msgstr "" +msgstr "באַטאָװלט" #: bookwyrm/models/book.py:477 msgid "Paperback" -msgstr "" +msgstr "בראָשירט" #: bookwyrm/models/book.py:486 bookwyrm/models/book.py:493 #: bookwyrm/models/book.py:499 bookwyrm/models/book.py:504 @@ -201,72 +201,72 @@ msgstr "" #: bookwyrm/models/book.py:533 bookwyrm/models/book.py:538 #, python-format msgid "%(value)s doesn't look like an ISBN" -msgstr "" +msgstr "%(value)s זעט נישט אױס װי אַן ISBN" #: bookwyrm/models/book.py:515 bookwyrm/models/book.py:555 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" -msgstr "" +msgstr "%(value)s האָט נישט דער ריכטיקער ISBN טשעקסום, האָבם מיר דערװאַרטן אױף %(check_version)s" #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:84 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 msgid "Comment" -msgstr "" +msgstr "באַמערקן" #: bookwyrm/models/bookwyrm_import_job.py:152 #: bookwyrm/templates/import/import_status.html:127 #: bookwyrm/templates/import/manual_review.html:13 #: bookwyrm/templates/snippets/create_status.html:16 msgid "Review" -msgstr "" +msgstr "רעצענזיע" #: bookwyrm/models/bookwyrm_import_job.py:153 msgid "Quotation" -msgstr "" +msgstr "ציטאַט" #: bookwyrm/models/bookwyrm_import_job.py:181 #: bookwyrm/templates/snippets/follow_button.html:22 msgid "Follow" -msgstr "" +msgstr "אַבאָנירן" #: bookwyrm/models/bookwyrm_import_job.py:182 #: 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 "" +msgstr "לײגן אין חרם" #: bookwyrm/models/bookwyrm_import_job.py:398 msgid "Unknown error importing book" -msgstr "" +msgstr "אומבאַקאַנטער טעוס מיטן אַרײַנפֿירן דעם בוך" #: bookwyrm/models/bookwyrm_import_job.py:496 msgid "unauthorized" -msgstr "" +msgstr "נישט־אױטאָריזירט" #: bookwyrm/models/bookwyrm_import_job.py:502 msgid "Unknown error importing book status" -msgstr "" +msgstr "אומבאַקאַנטער טעוס מיטן אַרײַנפֿירן דעם בוך־מצבֿ" #: bookwyrm/models/bookwyrm_import_job.py:696 #: bookwyrm/models/bookwyrm_import_job.py:722 msgid "connection_error" -msgstr "" +msgstr "פֿאַרבינדונג_טעות" #: bookwyrm/models/bookwyrm_import_job.py:732 msgid "invalid_relationship" -msgstr "" +msgstr "פּסולע באַציונג" #: bookwyrm/models/bookwyrm_import_job.py:740 msgid "Unkown error importing relationship" -msgstr "" +msgstr "אומבאַקאַנטער טעוס מיטן אַרײַנפֿירן די באַציונג" #: bookwyrm/models/federated_server.py:11 #: bookwyrm/templates/settings/federation/edit_instance.html:55 #: bookwyrm/templates/settings/federation/instance_list.html:22 msgid "Federated" -msgstr "" +msgstr "פֿעדערירט" #: bookwyrm/models/federated_server.py:12 bookwyrm/models/link.py:75 #: bookwyrm/templates/settings/federation/edit_instance.html:56 @@ -274,26 +274,26 @@ msgstr "" #: bookwyrm/templates/settings/federation/instance_list.html:26 #: bookwyrm/templates/settings/link_domains/link_domains.html:27 msgid "Blocked" -msgstr "" +msgstr "געלײגט אין חרם" #: bookwyrm/models/fields.py:35 #, python-format msgid "%(value)s is not a valid remote_id" -msgstr "" +msgstr "%(value)s איז נישט קײן גילטיק remote_id" #: bookwyrm/models/fields.py:44 bookwyrm/models/fields.py:53 #, python-format msgid "%(value)s is not a valid username" -msgstr "" +msgstr "%(value)s איז נישט קײן גילטיקער ניצער־נאָמען" #: bookwyrm/models/fields.py:201 bookwyrm/templates/layout.html:129 #: bookwyrm/templates/ostatus/error.html:29 msgid "username" -msgstr "" +msgstr "נניצער־נאָמען" #: bookwyrm/models/fields.py:206 msgid "A user with that username already exists." -msgstr "" +msgstr "עס איז שױן דאָ אַ ניצער מיט דער ניצער־נאָמען." #: bookwyrm/models/fields.py:225 #: bookwyrm/templates/snippets/privacy-icons.html:3 @@ -301,7 +301,7 @@ msgstr "" #: bookwyrm/templates/snippets/privacy_select.html:11 #: bookwyrm/templates/snippets/privacy_select_no_followers.html:11 msgid "Public" -msgstr "" +msgstr "עפֿנטלעך" #: bookwyrm/models/fields.py:226 #: bookwyrm/templates/snippets/privacy-icons.html:7 @@ -309,7 +309,7 @@ msgstr "" #: bookwyrm/templates/snippets/privacy_select.html:14 #: bookwyrm/templates/snippets/privacy_select_no_followers.html:14 msgid "Unlisted" -msgstr "" +msgstr "נישט אַרײַן־געשריבן" #: bookwyrm/models/fields.py:227 #: bookwyrm/templates/snippets/privacy_select.html:17 @@ -318,7 +318,7 @@ msgstr "" #: bookwyrm/templates/user/relationships/followers.html:21 #: bookwyrm/templates/user/relationships/layout.html:11 msgid "Followers" -msgstr "" +msgstr "אַבאָנירערעס" #: bookwyrm/models/fields.py:228 #: bookwyrm/templates/snippets/create_status/post_options_block.html:6 @@ -327,15 +327,15 @@ msgstr "" #: bookwyrm/templates/snippets/privacy_select.html:20 #: bookwyrm/templates/snippets/privacy_select_no_followers.html:17 msgid "Private" -msgstr "" +msgstr "פּריװאַט" #: bookwyrm/models/housekeeping.py:116 msgid "Missing" -msgstr "" +msgstr "פֿעלנדיק" #: bookwyrm/models/housekeeping.py:117 msgid "Wrong Path" -msgstr "" +msgstr "פֿאַלשער װעג" #: bookwyrm/models/import_job.py:50 bookwyrm/models/job.py:19 #: bookwyrm/templates/import/import.html:184 @@ -348,7 +348,7 @@ msgstr "" #: bookwyrm/templates/settings/imports/imports.html:270 #: bookwyrm/templates/snippets/user_active_tag.html:8 msgid "Active" -msgstr "" +msgstr "אַקטיװ" #: bookwyrm/models/import_job.py:51 bookwyrm/models/job.py:20 #: bookwyrm/templates/import/import.html:182 @@ -358,45 +358,45 @@ msgstr "" #: bookwyrm/templates/settings/files.html:160 #: bookwyrm/templates/settings/files.html:342 msgid "Complete" -msgstr "" +msgstr "פֿאַרענדיקט" #: bookwyrm/models/import_job.py:52 bookwyrm/models/job.py:21 msgid "Stopped" -msgstr "" +msgstr "אױפֿגעהערט" #: bookwyrm/models/import_job.py:86 bookwyrm/models/import_job.py:94 msgid "Import stopped" -msgstr "" +msgstr "אַרײַנשרײַבן אױפֿגעהערט" #: bookwyrm/models/import_job.py:378 bookwyrm/models/import_job.py:403 msgid "Error loading book" -msgstr "" +msgstr "טעות מיטן אַרײַנשרײַבן בוך" #: bookwyrm/models/import_job.py:387 msgid "Could not find a match for book" -msgstr "" +msgstr "אַקעגנער בוך נישט געפֿונען" #: bookwyrm/models/job.py:22 #: bookwyrm/templates/import/user_import_status.html:69 msgid "Failed" -msgstr "" +msgstr "נישט־געראָטן" #: bookwyrm/models/link.py:55 msgid "Free" -msgstr "" +msgstr "בחינמדיק" #: bookwyrm/models/link.py:56 msgid "Purchasable" -msgstr "" +msgstr "צום קױפֿן" #: bookwyrm/models/link.py:57 msgid "Available for loan" -msgstr "" +msgstr "אױף באָרג" #: bookwyrm/models/link.py:74 #: bookwyrm/templates/settings/link_domains/link_domains.html:23 msgid "Approved" -msgstr "" +msgstr "באַשטעטיקט" #: bookwyrm/models/report.py:85 msgid "Resolved report" From 5da9c48d68f76a467ad1629be3b2da9b0c024d5a Mon Sep 17 00:00:00 2001 From: Martynas Sklizmantas Date: Thu, 18 Dec 2025 00:32:37 +0100 Subject: [PATCH 213/962] Fix IntegrityError when resolve_remote_id returns None Fixes #3739 When `resolve_remote_id` fails to fetch a remote resource (connection error, 404, timeout, etc.), it returns `None`. The code was appending this `None` directly to the items list, which later causes an IntegrityError when Django tries to create the many-to-many relationship with a null foreign key. This affects both `ManyToManyField.field_from_activity()` and `TagField.field_from_activity()`. The fix checks for `None` before appending to the items list. --- bookwyrm/models/fields.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/bookwyrm/models/fields.py b/bookwyrm/models/fields.py index ecc1976db6..d4812f1faa 100644 --- a/bookwyrm/models/fields.py +++ b/bookwyrm/models/fields.py @@ -355,13 +355,13 @@ def field_from_activity(self, value, allow_external_connections=True, trigger=No validate_remote_id(remote_id) except ValidationError: continue - items.append( - activitypub.resolve_remote_id( - remote_id, - model=self.related_model, - allow_external_connections=allow_external_connections, - ) + item = activitypub.resolve_remote_id( + remote_id, + model=self.related_model, + allow_external_connections=allow_external_connections, ) + if item is not None: + items.append(item) return items @@ -419,13 +419,13 @@ def field_from_activity(self, value, allow_external_connections=True, trigger=No items.append(hashtag) else: # for other tag types we fetch them remotely - items.append( - activitypub.resolve_remote_id( - link.href, - model=self.related_model, - allow_external_connections=allow_external_connections, - ) + item = activitypub.resolve_remote_id( + link.href, + model=self.related_model, + allow_external_connections=allow_external_connections, ) + if item is not None: + items.append(item) return items From 1d7c19cfe737d885471f00d659c61d73b9fe215b Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Thu, 18 Dec 2025 16:17:31 -0800 Subject: [PATCH 214/962] New translations django.po (Spanish) --- locale/es_ES/LC_MESSAGES/django.po | 48 +++++++++++++++--------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/locale/es_ES/LC_MESSAGES/django.po b/locale/es_ES/LC_MESSAGES/django.po index 3420a408bc..f5ad1aab6f 100644 --- a/locale/es_ES/LC_MESSAGES/django.po +++ b/locale/es_ES/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-11-16 19:21+0000\n" -"PO-Revision-Date: 2025-11-16 19:34\n" +"PO-Revision-Date: 2025-12-19 00:17\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Spanish\n" "Language: es\n" @@ -83,7 +83,7 @@ msgstr "No se puede registrar esta dirección de correo electrónico." #: bookwyrm/forms/landing.py:114 msgid "Password cannot be the same as your current password" -msgstr "" +msgstr "La contraseña no puede ser la misma que la contraseña actual" #: bookwyrm/forms/landing.py:145 bookwyrm/forms/landing.py:153 msgid "Incorrect code" @@ -243,7 +243,7 @@ msgstr "Error desconocido al importar el libro" #: bookwyrm/models/bookwyrm_import_job.py:496 msgid "unauthorized" -msgstr "" +msgstr "no_autorizado" #: bookwyrm/models/bookwyrm_import_job.py:502 msgid "Unknown error importing book status" @@ -252,15 +252,15 @@ msgstr "Error desconocido al importar el estado del libro" #: bookwyrm/models/bookwyrm_import_job.py:696 #: bookwyrm/models/bookwyrm_import_job.py:722 msgid "connection_error" -msgstr "" +msgstr "error_de_conexión" #: bookwyrm/models/bookwyrm_import_job.py:732 msgid "invalid_relationship" -msgstr "" +msgstr "relación_inválida" #: bookwyrm/models/bookwyrm_import_job.py:740 msgid "Unkown error importing relationship" -msgstr "" +msgstr "Error desconocido importando la relación" #: bookwyrm/models/federated_server.py:11 #: bookwyrm/templates/settings/federation/edit_instance.html:55 @@ -331,11 +331,11 @@ msgstr "Privado" #: bookwyrm/models/housekeeping.py:116 msgid "Missing" -msgstr "" +msgstr "Ausente" #: bookwyrm/models/housekeeping.py:117 msgid "Wrong Path" -msgstr "" +msgstr "Ruta equivocada" #: bookwyrm/models/import_job.py:50 bookwyrm/models/job.py:19 #: bookwyrm/templates/import/import.html:184 @@ -444,7 +444,7 @@ msgstr "Elemento eliminado" #: bookwyrm/models/session.py:42 msgid "Unknown" -msgstr "" +msgstr "Desconocido" #: bookwyrm/models/status.py:192 #, python-format @@ -459,7 +459,7 @@ msgstr "Comentario de %(display_name)s sobre %(book_title)s" #: bookwyrm/models/status.py:418 #, python-format msgid "%(display_name)s's quote from %(book_title)s" -msgstr "" +msgstr "Cita de %(display_name)sde %(book_title)s" #: bookwyrm/models/status.py:454 #, python-format @@ -470,8 +470,8 @@ msgstr "Reseña de %(display_name)sde %(book_title)s" #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%(display_name)s calificó %(book_title)s: %(display_rating).1f estrella" +msgstr[1] "%(display_name)s calificó %(book_title)s: %(display_rating).1f estrellas" #: bookwyrm/models/user.py:39 bookwyrm/templates/book/book.html:336 msgid "Reviews" @@ -633,7 +633,7 @@ msgstr "El archivo que estás subiendo es demasiado grande." #: bookwyrm/templates/413.html:11 msgid "You you can try using a smaller file, or ask your BookWyrm server administrator to increase the DATA_UPLOAD_MAX_MEMORY_SIZE setting." -msgstr "" +msgstr "Puede intentar usar un archivo más pequeño, o preguntarle a su administrador del servidor que aumente el ajuste DATA_UPLOAD_MAX_MEMORY_SIZE." #: bookwyrm/templates/500.html:4 msgid "Oops!" @@ -920,7 +920,7 @@ msgstr "Wikipedia" #: bookwyrm/templates/author/author.html:79 msgid "View on Wikidata" -msgstr "" +msgstr "Ver en Wikidata" #: bookwyrm/templates/author/author.html:87 msgid "Website" @@ -1012,7 +1012,7 @@ msgstr "Enlace de Wikipedia:" #: bookwyrm/templates/author/edit_author.html:58 msgid "Wikidata:" -msgstr "" +msgstr "Wikidata:" #: bookwyrm/templates/author/edit_author.html:62 msgid "Website:" @@ -1146,7 +1146,7 @@ msgstr "Haz clic para ampliar" #: bookwyrm/templates/book/book.html:190 msgid "View on Finna" -msgstr "" +msgstr "Ver en Finna" #: bookwyrm/templates/book/book.html:222 #, python-format @@ -1287,7 +1287,7 @@ msgstr "Goodreads:" #: bookwyrm/templates/book/book_identifiers.html:58 #: bookwyrm/templates/book/edit/edit_book_form.html:390 msgid "Finna ID:" -msgstr "" +msgstr "ID de Finna:" #: bookwyrm/templates/book/cover_add_modal.html:5 msgid "Add cover" @@ -2010,7 +2010,7 @@ msgstr "Hola," #: bookwyrm/templates/email/html_layout.html:21 #, python-format msgid "BookWyrm hosted on %(site_name)s" -msgstr "" +msgstr "BookWyrm alojado en %(site_name)s" #: bookwyrm/templates/email/html_layout.html:23 msgid "Email preference" @@ -3063,7 +3063,7 @@ msgstr "OpenLibrary (CSV)" #: bookwyrm/templates/import/import.html:70 msgid "OpenReads (CSV)" -msgstr "" +msgstr "OpenReads (CSV)" #: bookwyrm/templates/import/import.html:73 msgid "Calibre (CSV)" @@ -3071,7 +3071,7 @@ msgstr "Calibre (CSV)" #: bookwyrm/templates/import/import.html:76 msgid "BookWyrm (CSV)" -msgstr "" +msgstr "BookWyrm (CSV)" #: bookwyrm/templates/import/import.html:82 msgid "You can download your Goodreads data from the Import/Export page of your Goodreads account." @@ -3088,11 +3088,11 @@ msgstr "Incluir reseñas" #: bookwyrm/templates/import/import.html:104 msgid "Create new shelves if they do not exist" -msgstr "" +msgstr "Crear nuevos estantes si no existen" #: bookwyrm/templates/import/import.html:109 msgid "Privacy setting for imported reviews and shelves:" -msgstr "" +msgstr "Configuración de privacidad para estantes y evaluaciones importados:" #: bookwyrm/templates/import/import.html:116 #: bookwyrm/templates/import/import.html:118 @@ -3294,12 +3294,12 @@ msgstr "Si deseas migrar otros elementos (comentarios, reseñas o citas), debes #: bookwyrm/templates/import/import_user.html:32 #, python-format msgid "Currently you are allowed to import one user every %(hours)s hours." -msgstr "" +msgstr "Actualmente se le permite importar un usuario cada %(hours)s horas." #: bookwyrm/templates/import/import_user.html:33 #, python-format msgid "You will next be able to import a user file at %(next_time)s" -msgstr "" +msgstr "Podrá importar un archivo de usuario de nuevo a las %(next_time)s" #: bookwyrm/templates/import/import_user.html:56 msgid "Step 1:" From 24805e51e60db97d69e35afaa234b180f4e7d319 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Fri, 19 Dec 2025 19:52:31 -0800 Subject: [PATCH 215/962] New translations django.po (Spanish) --- locale/es_ES/LC_MESSAGES/django.po | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/locale/es_ES/LC_MESSAGES/django.po b/locale/es_ES/LC_MESSAGES/django.po index f5ad1aab6f..2b564a1784 100644 --- a/locale/es_ES/LC_MESSAGES/django.po +++ b/locale/es_ES/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-11-16 19:21+0000\n" -"PO-Revision-Date: 2025-12-19 00:17\n" +"PO-Revision-Date: 2025-12-20 03:52\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Spanish\n" "Language: es\n" @@ -3467,11 +3467,11 @@ msgstr "Póngase en contacto con su administrador o {\n if (step.isOpen()) {\n const targetIsEl = step.el && event.currentTarget === step.el;\n const targetIsSelector =\n !isUndefined(selector) && event.currentTarget.matches(selector);\n\n if (targetIsSelector || targetIsEl) {\n step.tour.next();\n }\n }\n };\n}\n\n/**\n * Bind the event handler for advanceOn\n * @param {Step} step The step instance\n */\nexport function bindAdvance(step) {\n // An empty selector matches the step element\n const { event, selector } = step.options.advanceOn || {};\n if (event) {\n const handler = _setupAdvanceOnHandler(selector, step);\n\n // TODO: this should also bind/unbind on show/hide\n let el;\n try {\n el = document.querySelector(selector);\n } catch (e) {\n // TODO\n }\n if (!isUndefined(selector) && !el) {\n return console.error(\n `No element was found for the selector supplied to advanceOn: ${selector}`\n );\n } else if (el) {\n el.addEventListener(event, handler);\n step.on('destroy', () => {\n return el.removeEventListener(event, handler);\n });\n } else {\n document.body.addEventListener(event, handler, true);\n step.on('destroy', () => {\n return document.body.removeEventListener(event, handler, true);\n });\n }\n } else {\n return console.error(\n 'advanceOn was defined, but no event name was passed.'\n );\n }\n}\n","export default function getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}","export default function getWindow(node) {\n if (node == null) {\n return window;\n }\n\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView || window : window;\n }\n\n return node;\n}","import getWindow from \"./getWindow.js\";\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction isShadowRoot(node) {\n // IE 11 has no ShadowRoot\n if (typeof ShadowRoot === 'undefined') {\n return false;\n }\n\n var OwnElement = getWindow(node).ShadowRoot;\n return node instanceof OwnElement || node instanceof ShadowRoot;\n}\n\nexport { isElement, isHTMLElement, isShadowRoot };","import { auto } from \"../enums.js\";\nexport default function getBasePlacement(placement) {\n return placement.split('-')[0];\n}","import { isHTMLElement } from \"./instanceOf.js\";\nimport { round } from \"../utils/math.js\";\nexport default function getBoundingClientRect(element, includeScale) {\n if (includeScale === void 0) {\n includeScale = false;\n }\n\n var rect = element.getBoundingClientRect();\n var scaleX = 1;\n var scaleY = 1;\n\n if (isHTMLElement(element) && includeScale) {\n var offsetHeight = element.offsetHeight;\n var offsetWidth = element.offsetWidth; // Do not attempt to divide by 0, otherwise we get `Infinity` as scale\n // Fallback to 1 in case both values are `0`\n\n if (offsetWidth > 0) {\n scaleX = round(rect.width) / offsetWidth || 1;\n }\n\n if (offsetHeight > 0) {\n scaleY = round(rect.height) / offsetHeight || 1;\n }\n }\n\n return {\n width: rect.width / scaleX,\n height: rect.height / scaleY,\n top: rect.top / scaleY,\n right: rect.right / scaleX,\n bottom: rect.bottom / scaleY,\n left: rect.left / scaleX,\n x: rect.left / scaleX,\n y: rect.top / scaleY\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\"; // Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\n\nexport default function getLayoutRect(element) {\n var clientRect = getBoundingClientRect(element); // Use the clientRect sizes if it's not been transformed.\n // Fixes https://github.com/popperjs/popper-core/issues/1223\n\n var width = element.offsetWidth;\n var height = element.offsetHeight;\n\n if (Math.abs(clientRect.width - width) <= 1) {\n width = clientRect.width;\n }\n\n if (Math.abs(clientRect.height - height) <= 1) {\n height = clientRect.height;\n }\n\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: width,\n height: height\n };\n}","import { isShadowRoot } from \"./instanceOf.js\";\nexport default function contains(parent, child) {\n var rootNode = child.getRootNode && child.getRootNode(); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (rootNode && isShadowRoot(rootNode)) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe[prop-missing]: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}","import getWindow from \"./getWindow.js\";\nexport default function getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}","import { isElement } from \"./instanceOf.js\";\nexport default function getDocumentElement(element) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return ((isElement(element) ? element.ownerDocument : // $FlowFixMe[prop-missing]\n element.document) || window.document).documentElement;\n}","import getNodeName from \"./getNodeName.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport { isShadowRoot } from \"./instanceOf.js\";\nexport default function getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// this is a quicker (but less type safe) way to save quite some bytes from the bundle\n // $FlowFixMe[incompatible-return]\n // $FlowFixMe[prop-missing]\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || ( // DOM Element detected\n isShadowRoot(element) ? element.host : null) || // ShadowRoot detected\n // $FlowFixMe[incompatible-call]: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}","import getWindow from \"./getWindow.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isHTMLElement, isShadowRoot } from \"./instanceOf.js\";\nimport isTableElement from \"./isTableElement.js\";\nimport getParentNode from \"./getParentNode.js\";\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n return element.offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var isFirefox = navigator.userAgent.toLowerCase().indexOf('firefox') !== -1;\n var isIE = navigator.userAgent.indexOf('Trident') !== -1;\n\n if (isIE && isHTMLElement(element)) {\n // In IE 9, 10 and 11 fixed elements containing block is always established by the viewport\n var elementCss = getComputedStyle(element);\n\n if (elementCss.position === 'fixed') {\n return null;\n }\n }\n\n var currentNode = getParentNode(element);\n\n if (isShadowRoot(currentNode)) {\n currentNode = currentNode.host;\n }\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n // https://developer.mozilla.org/en-US/docs/Web/CSS/Containing_block#identifying_the_containing_block\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.contain === 'paint' || ['transform', 'perspective'].indexOf(css.willChange) !== -1 || isFirefox && css.willChange === 'filter' || isFirefox && css.filter && css.filter !== 'none') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nexport default function getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && (getNodeName(offsetParent) === 'html' || getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static')) {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}","import getNodeName from \"./getNodeName.js\";\nexport default function isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}","export default function getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}","import getFreshSideObject from \"./getFreshSideObject.js\";\nexport default function mergePaddingObject(paddingObject) {\n return Object.assign({}, getFreshSideObject(), paddingObject);\n}","export default function getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}","export default function expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}","export default function getVariation(placement) {\n return placement.split('-')[1];\n}","import { top, left, right, bottom, end } from \"../enums.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getWindow from \"../dom-utils/getWindow.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getComputedStyle from \"../dom-utils/getComputedStyle.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport { round } from \"../utils/math.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsetsByDPR(_ref) {\n var x = _ref.x,\n y = _ref.y;\n var win = window;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: round(x * dpr) / dpr || 0,\n y: round(y * dpr) / dpr || 0\n };\n}\n\nexport function mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n variation = _ref2.variation,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive,\n roundOffsets = _ref2.roundOffsets,\n isFixed = _ref2.isFixed;\n var _offsets$x = offsets.x,\n x = _offsets$x === void 0 ? 0 : _offsets$x,\n _offsets$y = offsets.y,\n y = _offsets$y === void 0 ? 0 : _offsets$y;\n\n var _ref3 = typeof roundOffsets === 'function' ? roundOffsets({\n x: x,\n y: y\n }) : {\n x: x,\n y: y\n };\n\n x = _ref3.x;\n y = _ref3.y;\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n var heightProp = 'clientHeight';\n var widthProp = 'clientWidth';\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n\n if (getComputedStyle(offsetParent).position !== 'static' && position === 'absolute') {\n heightProp = 'scrollHeight';\n widthProp = 'scrollWidth';\n }\n } // $FlowFixMe[incompatible-cast]: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n\n offsetParent = offsetParent;\n\n if (placement === top || (placement === left || placement === right) && variation === end) {\n sideY = bottom;\n var offsetY = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.height : // $FlowFixMe[prop-missing]\n offsetParent[heightProp];\n y -= offsetY - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left || (placement === top || placement === bottom) && variation === end) {\n sideX = right;\n var offsetX = isFixed && offsetParent === win && win.visualViewport ? win.visualViewport.width : // $FlowFixMe[prop-missing]\n offsetParent[widthProp];\n x -= offsetX - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n var _ref4 = roundOffsets === true ? roundOffsetsByDPR({\n x: x,\n y: y\n }) : {\n x: x,\n y: y\n };\n\n x = _ref4.x;\n y = _ref4.y;\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign({}, commonStyles, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) <= 1 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign({}, commonStyles, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref5) {\n var state = _ref5.state,\n options = _ref5.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive,\n _options$roundOffsets = options.roundOffsets,\n roundOffsets = _options$roundOffsets === void 0 ? true : _options$roundOffsets;\n\n if (process.env.NODE_ENV !== \"production\") {\n var transitionProperty = getComputedStyle(state.elements.popper).transitionProperty || '';\n\n if (adaptive && ['transform', 'top', 'right', 'bottom', 'left'].some(function (property) {\n return transitionProperty.indexOf(property) >= 0;\n })) {\n console.warn(['Popper: Detected CSS transitions on at least one of the following', 'CSS properties: \"transform\", \"top\", \"right\", \"bottom\", \"left\".', '\\n\\n', 'Disable the \"computeStyles\" modifier\\'s `adaptive` option to allow', 'for smooth transitions, or remove these properties from the CSS', 'transition declaration on the popper element if only transitioning', 'opacity or background-color for example.', '\\n\\n', 'We recommend using the popper element as a wrapper around an inner', 'element that can have any CSS property transitioned for animations.'].join(' '));\n }\n }\n\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n variation: getVariation(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration,\n isFixed: state.options.strategy === 'fixed'\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign({}, state.styles.popper, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive,\n roundOffsets: roundOffsets\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign({}, state.styles.arrow, mapToStyles(Object.assign({}, commonStyles, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false,\n roundOffsets: roundOffsets\n })));\n }\n\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};","export var top = 'top';\nexport var bottom = 'bottom';\nexport var right = 'right';\nexport var left = 'left';\nexport var auto = 'auto';\nexport var basePlacements = [top, bottom, right, left];\nexport var start = 'start';\nexport var end = 'end';\nexport var clippingParents = 'clippingParents';\nexport var viewport = 'viewport';\nexport var popper = 'popper';\nexport var reference = 'reference';\nexport var variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nexport var placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nexport var beforeRead = 'beforeRead';\nexport var read = 'read';\nexport var afterRead = 'afterRead'; // pure-logic modifiers\n\nexport var beforeMain = 'beforeMain';\nexport var main = 'main';\nexport var afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nexport var beforeWrite = 'beforeWrite';\nexport var write = 'write';\nexport var afterWrite = 'afterWrite';\nexport var modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];","var hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nexport default function getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}","var hash = {\n start: 'end',\n end: 'start'\n};\nexport default function getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash[matched];\n });\n}","import getWindow from \"./getWindow.js\";\nexport default function getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nexport default function getWindowScrollBarX(element) {\n // If has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on \n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}","import getComputedStyle from \"./getComputedStyle.js\";\nexport default function isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}","import getParentNode from \"./getParentNode.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nexport default function getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe[incompatible-return]: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}","import getScrollParent from \"./getScrollParent.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport getWindow from \"./getWindow.js\";\nimport isScrollParent from \"./isScrollParent.js\";\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the\nreference element's position.\n*/\n\nexport default function listScrollParents(element, list) {\n var _element$ownerDocumen;\n\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = scrollParent === ((_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body);\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe[incompatible-call]: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}","export default function rectToClientRect(rect) {\n return Object.assign({}, rect, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}","import { viewport } from \"../enums.js\";\nimport getViewportRect from \"./getViewportRect.js\";\nimport getDocumentRect from \"./getDocumentRect.js\";\nimport listScrollParents from \"./listScrollParents.js\";\nimport getOffsetParent from \"./getOffsetParent.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport { isElement, isHTMLElement } from \"./instanceOf.js\";\nimport getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getParentNode from \"./getParentNode.js\";\nimport contains from \"./contains.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport rectToClientRect from \"../utils/rectToClientRect.js\";\nimport { max, min } from \"../utils/math.js\";\n\nfunction getInnerBoundingClientRect(element) {\n var rect = getBoundingClientRect(element);\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element)) : isElement(clippingParent) ? getInnerBoundingClientRect(clippingParent) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe[incompatible-return]: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nexport default function getClippingRect(element, boundary, rootBoundary) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent);\n accRect.top = max(rect.top, accRect.top);\n accRect.right = min(rect.right, accRect.right);\n accRect.bottom = min(rect.bottom, accRect.bottom);\n accRect.left = max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}","import getWindow from \"./getWindow.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nexport default function getViewportRect(element) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0; // NB: This isn't supported on iOS <= 12. If the keyboard is open, the popper\n // can be obscured underneath it.\n // Also, `html.clientHeight` adds the bottom bar height in Safari iOS, even\n // if it isn't open, so if this isn't available, the popper will be detected\n // to overflow the bottom of the screen too early.\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height; // Uses Layout Viewport (like Chrome; Safari does not currently)\n // In Chrome, it returns a value very close to 0 (+/-) but contains rounding\n // errors due to floating point numbers, so we need to check precision.\n // Safari returns a number <= 0, usually < -1 when pinch-zoomed\n // Feature detection fails in mobile emulation mode in Chrome.\n // Math.abs(win.innerWidth / visualViewport.scale - visualViewport.width) <\n // 0.001\n // Fallback here: \"Not Safari\" userAgent\n\n if (!/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}","import getDocumentElement from \"./getDocumentElement.js\";\nimport getComputedStyle from \"./getComputedStyle.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getWindowScroll from \"./getWindowScroll.js\";\nimport { max } from \"../utils/math.js\"; // Gets the entire size of the scrollable document area, even extending outside\n// of the `` and `` rect bounds if horizontally scrollable\n\nexport default function getDocumentRect(element) {\n var _element$ownerDocumen;\n\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = (_element$ownerDocumen = element.ownerDocument) == null ? void 0 : _element$ownerDocumen.body;\n var width = max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}","import getBasePlacement from \"./getBasePlacement.js\";\nimport getVariation from \"./getVariation.js\";\nimport getMainAxisFromPlacement from \"./getMainAxisFromPlacement.js\";\nimport { top, right, bottom, left, start, end } from \"../enums.js\";\nexport default function computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = offsets[mainAxis] - (reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = offsets[mainAxis] + (reference[len] / 2 - element[len] / 2);\n break;\n\n default:\n }\n }\n\n return offsets;\n}","import getClippingRect from \"../dom-utils/getClippingRect.js\";\nimport getDocumentElement from \"../dom-utils/getDocumentElement.js\";\nimport getBoundingClientRect from \"../dom-utils/getBoundingClientRect.js\";\nimport computeOffsets from \"./computeOffsets.js\";\nimport rectToClientRect from \"./rectToClientRect.js\";\nimport { clippingParents, reference, popper, bottom, top, right, basePlacements, viewport } from \"../enums.js\";\nimport { isElement } from \"../dom-utils/instanceOf.js\";\nimport mergePaddingObject from \"./mergePaddingObject.js\";\nimport expandToHashMap from \"./expandToHashMap.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport default function detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary);\n var referenceClientRect = getBoundingClientRect(state.elements.reference);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign({}, popperRect, popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}","import getVariation from \"./getVariation.js\";\nimport { variationPlacements, basePlacements, placements as allPlacements } from \"../enums.js\";\nimport detectOverflow from \"./detectOverflow.js\";\nimport getBasePlacement from \"./getBasePlacement.js\";\nexport default function computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? allPlacements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements;\n var allowedPlacements = placements.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements;\n\n if (process.env.NODE_ENV !== \"production\") {\n console.error(['Popper: The `allowedAutoPlacements` option did not allow any', 'placements. Ensure the `placement` option matches the variation', 'of the allowed placements.', 'For example, \"auto\" cannot be used to allow \"bottom-start\".', 'Use \"auto-start\" instead.'].join(' '));\n }\n } // $FlowFixMe[incompatible-type]: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}","import getOppositePlacement from \"../utils/getOppositePlacement.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getOppositeVariationPlacement from \"../utils/getOppositeVariationPlacement.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport computeAutoPlacement from \"../utils/computeAutoPlacement.js\";\nimport { bottom, top, start, right, left, auto } from \"../enums.js\";\nimport getVariation from \"../utils/getVariation.js\"; // eslint-disable-next-line import/no-unused-modules\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};","import { top, bottom, left, right } from \"../enums.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign({}, state.attributes.popper, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};","import getBoundingClientRect from \"./getBoundingClientRect.js\";\nimport getNodeScroll from \"./getNodeScroll.js\";\nimport getNodeName from \"./getNodeName.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getWindowScrollBarX from \"./getWindowScrollBarX.js\";\nimport getDocumentElement from \"./getDocumentElement.js\";\nimport isScrollParent from \"./isScrollParent.js\";\nimport { round } from \"../utils/math.js\";\n\nfunction isElementScaled(element) {\n var rect = element.getBoundingClientRect();\n var scaleX = round(rect.width) / element.offsetWidth || 1;\n var scaleY = round(rect.height) / element.offsetHeight || 1;\n return scaleX !== 1 || scaleY !== 1;\n} // Returns the composite rect of an element relative to its offsetParent.\n// Composite means it takes into account transforms as well as layout.\n\n\nexport default function getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var offsetParentIsScaled = isHTMLElement(offsetParent) && isElementScaled(offsetParent);\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement, offsetParentIsScaled);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent, true);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}","import getWindowScroll from \"./getWindowScroll.js\";\nimport getWindow from \"./getWindow.js\";\nimport { isHTMLElement } from \"./instanceOf.js\";\nimport getHTMLElementScroll from \"./getHTMLElementScroll.js\";\nexport default function getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}","export default function getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}","import { modifierPhases } from \"../enums.js\"; // source: https://stackoverflow.com/questions/49875255\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nexport default function orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}","export default function debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}","export default function mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign({}, existing, current, {\n options: Object.assign({}, existing.options, current.options),\n data: Object.assign({}, existing.data, current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}","import getCompositeRect from \"./dom-utils/getCompositeRect.js\";\nimport getLayoutRect from \"./dom-utils/getLayoutRect.js\";\nimport listScrollParents from \"./dom-utils/listScrollParents.js\";\nimport getOffsetParent from \"./dom-utils/getOffsetParent.js\";\nimport getComputedStyle from \"./dom-utils/getComputedStyle.js\";\nimport orderModifiers from \"./utils/orderModifiers.js\";\nimport debounce from \"./utils/debounce.js\";\nimport validateModifiers from \"./utils/validateModifiers.js\";\nimport uniqueBy from \"./utils/uniqueBy.js\";\nimport getBasePlacement from \"./utils/getBasePlacement.js\";\nimport mergeByName from \"./utils/mergeByName.js\";\nimport detectOverflow from \"./utils/detectOverflow.js\";\nimport { isElement } from \"./dom-utils/instanceOf.js\";\nimport { auto } from \"./enums.js\";\nvar INVALID_ELEMENT_ERROR = 'Popper: Invalid reference or popper argument provided. They must be either a DOM element or virtual element.';\nvar INFINITE_LOOP_ERROR = 'Popper: An infinite loop in the modifiers cycle has been detected! The cycle has been interrupted to prevent a browser crash.';\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nexport function popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign({}, DEFAULT_OPTIONS, defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(setOptionsAction) {\n var options = typeof setOptionsAction === 'function' ? setOptionsAction(state.options) : setOptionsAction;\n cleanupModifierEffects();\n state.options = Object.assign({}, defaultOptions, state.options, options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n }); // Validate the provided modifiers so that the consumer will get warned\n // if one of the modifiers is invalid for any reason\n\n if (process.env.NODE_ENV !== \"production\") {\n var modifiers = uniqueBy([].concat(orderedModifiers, state.options.modifiers), function (_ref) {\n var name = _ref.name;\n return name;\n });\n validateModifiers(modifiers);\n\n if (getBasePlacement(state.options.placement) === auto) {\n var flipModifier = state.orderedModifiers.find(function (_ref2) {\n var name = _ref2.name;\n return name === 'flip';\n });\n\n if (!flipModifier) {\n console.error(['Popper: \"auto\" placements require the \"flip\" modifier be', 'present and enabled to work.'].join(' '));\n }\n }\n\n var _getComputedStyle = getComputedStyle(popper),\n marginTop = _getComputedStyle.marginTop,\n marginRight = _getComputedStyle.marginRight,\n marginBottom = _getComputedStyle.marginBottom,\n marginLeft = _getComputedStyle.marginLeft; // We no longer take into account `margins` on the popper, and it can\n // cause bugs with positioning, so we'll warn the consumer\n\n\n if ([marginTop, marginRight, marginBottom, marginLeft].some(function (margin) {\n return parseFloat(margin);\n })) {\n console.warn(['Popper: CSS \"margin\" styles cannot be used to apply padding', 'between the popper and its reference element or boundary.', 'To replicate margin, use the `offset` modifier, as well as', 'the `padding` option in the `preventOverflow` and `flip`', 'modifiers.'].join(' '));\n }\n }\n\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(INVALID_ELEMENT_ERROR);\n }\n\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n var __debug_loops__ = 0;\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (process.env.NODE_ENV !== \"production\") {\n __debug_loops__ += 1;\n\n if (__debug_loops__ > 100) {\n console.error(INFINITE_LOOP_ERROR);\n break;\n }\n }\n\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(INVALID_ELEMENT_ERROR);\n }\n\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref3) {\n var name = _ref3.name,\n _ref3$options = _ref3.options,\n options = _ref3$options === void 0 ? {} : _ref3$options,\n effect = _ref3.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\nexport var createPopper = /*#__PURE__*/popperGenerator(); // eslint-disable-next-line import/no-unused-modules\n\nexport { detectOverflow };","function _getCenteredStylePopperModifier() {\n return [\n {\n name: 'applyStyles',\n fn({ state }) {\n Object.keys(state.elements).forEach((name) => {\n if (name !== 'popper') {\n return;\n }\n const style = {\n position: 'fixed',\n left: '50%',\n top: '50%',\n transform: 'translate(-50%, -50%)'\n };\n\n const attributes = state.attributes[name] || {};\n const element = state.elements[name];\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach((name) => {\n const value = attributes[name];\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n }\n },\n {\n name: 'computeStyles',\n options: {\n adaptive: false\n }\n }\n ];\n}\n\n/**\n * Generates the array of options for a tooltip that doesn't have a\n * target element in the DOM -- and thus is positioned in the center\n * of the view\n *\n * @param {Step} step The step instance\n * @return {Object} The final Popper options object\n */\nexport function makeCenteredPopper(step) {\n const centeredStylePopperModifier = _getCenteredStylePopperModifier();\n\n let popperOptions = {\n placement: 'top',\n strategy: 'fixed',\n modifiers: [\n {\n name: 'focusAfterRender',\n enabled: true,\n phase: 'afterWrite',\n fn() {\n setTimeout(() => {\n if (step.el) {\n step.el.focus();\n }\n }, 300);\n }\n }\n ]\n };\n\n popperOptions = {\n ...popperOptions,\n modifiers: Array.from(\n new Set([...popperOptions.modifiers, ...centeredStylePopperModifier])\n )\n };\n\n return popperOptions;\n}\n","import { createPopper } from '@popperjs/core';\nimport { isFunction, isString } from './type-check';\nimport { makeCenteredPopper } from './popper-options';\n\n/**\n * Ensure class prefix ends in `-`\n * @param {string} prefix The prefix to prepend to the class names generated by nano-css\n * @return {string} The prefix ending in `-`\n */\nexport function normalizePrefix(prefix) {\n if (!isString(prefix) || prefix === '') {\n return '';\n }\n\n return prefix.charAt(prefix.length - 1) !== '-' ? `${prefix}-` : prefix;\n}\n\n/**\n * Resolves attachTo options, converting element option value to a qualified HTMLElement.\n * @param {Step} step The step instance\n * @returns {{}|{element, on}}\n * `element` is a qualified HTML Element\n * `on` is a string position value\n */\nexport function parseAttachTo(step) {\n const options = step.options.attachTo || {};\n const returnOpts = Object.assign({}, options);\n\n if (isFunction(returnOpts.element)) {\n // Bind the callback to step so that it has access to the object, to enable running additional logic\n returnOpts.element = returnOpts.element.call(step);\n }\n\n if (isString(returnOpts.element)) {\n // Can't override the element in user opts reference because we can't\n // guarantee that the element will exist in the future.\n try {\n returnOpts.element = document.querySelector(returnOpts.element);\n } catch (e) {\n // TODO\n }\n if (!returnOpts.element) {\n console.error(\n `The element for this Shepherd step was not found ${options.element}`\n );\n }\n }\n\n return returnOpts;\n}\n\n/**\n * Checks if the step should be centered or not. Does not trigger attachTo.element evaluation, making it a pure\n * alternative for the deprecated step.isCentered() method.\n * @param resolvedAttachToOptions\n * @returns {boolean}\n */\nexport function shouldCenterStep(resolvedAttachToOptions) {\n if (resolvedAttachToOptions === undefined || resolvedAttachToOptions === null) {\n return true\n }\n \n return !resolvedAttachToOptions.element || !resolvedAttachToOptions.on;\n}\n\n/**\n * Determines options for the tooltip and initializes\n * `step.tooltip` as a Popper instance.\n * @param {Step} step The step instance\n */\nexport function setupTooltip(step) {\n if (step.tooltip) {\n step.tooltip.destroy();\n }\n\n const attachToOptions = step._getResolvedAttachToOptions();\n\n let target = attachToOptions.element;\n const popperOptions = getPopperOptions(attachToOptions, step);\n\n if (shouldCenterStep(attachToOptions)) {\n target = document.body;\n const content = step.shepherdElementComponent.getElement();\n content.classList.add('shepherd-centered');\n }\n\n step.tooltip = createPopper(target, step.el, popperOptions);\n step.target = attachToOptions.element;\n\n return popperOptions;\n}\n\n/**\n * Create a unique id for steps, tours, modals, etc\n * @return {string}\n */\nexport function uuid() {\n let d = Date.now();\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (d + Math.random() * 16) % 16 | 0;\n d = Math.floor(d / 16);\n return (c == 'x' ? r : (r & 0x3) | 0x8).toString(16);\n });\n}\n\n/**\n * Gets the `Popper` options from a set of base `attachTo` options\n * @param attachToOptions\n * @param {Step} step The step instance\n * @return {Object}\n * @private\n */\nexport function getPopperOptions(attachToOptions, step) {\n let popperOptions = {\n modifiers: [\n {\n name: 'preventOverflow',\n options: {\n altAxis: true,\n tether: false\n }\n },\n {\n name: 'focusAfterRender',\n enabled: true,\n phase: 'afterWrite',\n fn() {\n setTimeout(() => {\n if (step.el) {\n step.el.focus();\n }\n }, 300);\n }\n }\n ],\n strategy: 'absolute'\n };\n\n if (shouldCenterStep(attachToOptions)) {\n popperOptions = makeCenteredPopper(step);\n } else {\n popperOptions.placement = attachToOptions.on;\n }\n\n const defaultStepOptions =\n step.tour && step.tour.options && step.tour.options.defaultStepOptions;\n\n if (defaultStepOptions) {\n popperOptions = _mergeModifiers(defaultStepOptions, popperOptions);\n }\n\n popperOptions = _mergeModifiers(step.options, popperOptions);\n\n return popperOptions;\n}\n\nfunction _mergeModifiers(stepOptions, popperOptions) {\n if (stepOptions.popperOptions) {\n let mergedPopperOptions = Object.assign(\n {},\n popperOptions,\n stepOptions.popperOptions\n );\n\n if (\n stepOptions.popperOptions.modifiers &&\n stepOptions.popperOptions.modifiers.length > 0\n ) {\n const names = stepOptions.popperOptions.modifiers.map((mod) => mod.name);\n const filteredModifiers = popperOptions.modifiers.filter(\n (mod) => !names.includes(mod.name)\n );\n\n mergedPopperOptions.modifiers = Array.from(\n new Set([...filteredModifiers, ...stepOptions.popperOptions.modifiers])\n );\n }\n\n return mergedPopperOptions;\n }\n\n return popperOptions;\n}\n","function noop() { }\nconst identity = x => x;\nfunction assign(tar, src) {\n // @ts-ignore\n for (const k in src)\n tar[k] = src[k];\n return tar;\n}\nfunction is_promise(value) {\n return value && typeof value === 'object' && typeof value.then === 'function';\n}\nfunction add_location(element, file, line, column, char) {\n element.__svelte_meta = {\n loc: { file, line, column, char }\n };\n}\nfunction run(fn) {\n return fn();\n}\nfunction blank_object() {\n return Object.create(null);\n}\nfunction run_all(fns) {\n fns.forEach(run);\n}\nfunction is_function(thing) {\n return typeof thing === 'function';\n}\nfunction safe_not_equal(a, b) {\n return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function');\n}\nlet src_url_equal_anchor;\nfunction src_url_equal(element_src, url) {\n if (!src_url_equal_anchor) {\n src_url_equal_anchor = document.createElement('a');\n }\n src_url_equal_anchor.href = url;\n return element_src === src_url_equal_anchor.href;\n}\nfunction not_equal(a, b) {\n return a != a ? b == b : a !== b;\n}\nfunction is_empty(obj) {\n return Object.keys(obj).length === 0;\n}\nfunction validate_store(store, name) {\n if (store != null && typeof store.subscribe !== 'function') {\n throw new Error(`'${name}' is not a store with a 'subscribe' method`);\n }\n}\nfunction subscribe(store, ...callbacks) {\n if (store == null) {\n return noop;\n }\n const unsub = store.subscribe(...callbacks);\n return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub;\n}\nfunction get_store_value(store) {\n let value;\n subscribe(store, _ => value = _)();\n return value;\n}\nfunction component_subscribe(component, store, callback) {\n component.$$.on_destroy.push(subscribe(store, callback));\n}\nfunction create_slot(definition, ctx, $$scope, fn) {\n if (definition) {\n const slot_ctx = get_slot_context(definition, ctx, $$scope, fn);\n return definition[0](slot_ctx);\n }\n}\nfunction get_slot_context(definition, ctx, $$scope, fn) {\n return definition[1] && fn\n ? assign($$scope.ctx.slice(), definition[1](fn(ctx)))\n : $$scope.ctx;\n}\nfunction get_slot_changes(definition, $$scope, dirty, fn) {\n if (definition[2] && fn) {\n const lets = definition[2](fn(dirty));\n if ($$scope.dirty === undefined) {\n return lets;\n }\n if (typeof lets === 'object') {\n const merged = [];\n const len = Math.max($$scope.dirty.length, lets.length);\n for (let i = 0; i < len; i += 1) {\n merged[i] = $$scope.dirty[i] | lets[i];\n }\n return merged;\n }\n return $$scope.dirty | lets;\n }\n return $$scope.dirty;\n}\nfunction update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn) {\n if (slot_changes) {\n const slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn);\n slot.p(slot_context, slot_changes);\n }\n}\nfunction update_slot(slot, slot_definition, ctx, $$scope, dirty, get_slot_changes_fn, get_slot_context_fn) {\n const slot_changes = get_slot_changes(slot_definition, $$scope, dirty, get_slot_changes_fn);\n update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn);\n}\nfunction get_all_dirty_from_scope($$scope) {\n if ($$scope.ctx.length > 32) {\n const dirty = [];\n const length = $$scope.ctx.length / 32;\n for (let i = 0; i < length; i++) {\n dirty[i] = -1;\n }\n return dirty;\n }\n return -1;\n}\nfunction exclude_internal_props(props) {\n const result = {};\n for (const k in props)\n if (k[0] !== '$')\n result[k] = props[k];\n return result;\n}\nfunction compute_rest_props(props, keys) {\n const rest = {};\n keys = new Set(keys);\n for (const k in props)\n if (!keys.has(k) && k[0] !== '$')\n rest[k] = props[k];\n return rest;\n}\nfunction compute_slots(slots) {\n const result = {};\n for (const key in slots) {\n result[key] = true;\n }\n return result;\n}\nfunction once(fn) {\n let ran = false;\n return function (...args) {\n if (ran)\n return;\n ran = true;\n fn.call(this, ...args);\n };\n}\nfunction null_to_empty(value) {\n return value == null ? '' : value;\n}\nfunction set_store_value(store, ret, value) {\n store.set(value);\n return ret;\n}\nconst has_prop = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);\nfunction action_destroyer(action_result) {\n return action_result && is_function(action_result.destroy) ? action_result.destroy : noop;\n}\n\nconst is_client = typeof window !== 'undefined';\nlet now = is_client\n ? () => window.performance.now()\n : () => Date.now();\nlet raf = is_client ? cb => requestAnimationFrame(cb) : noop;\n// used internally for testing\nfunction set_now(fn) {\n now = fn;\n}\nfunction set_raf(fn) {\n raf = fn;\n}\n\nconst tasks = new Set();\nfunction run_tasks(now) {\n tasks.forEach(task => {\n if (!task.c(now)) {\n tasks.delete(task);\n task.f();\n }\n });\n if (tasks.size !== 0)\n raf(run_tasks);\n}\n/**\n * For testing purposes only!\n */\nfunction clear_loops() {\n tasks.clear();\n}\n/**\n * Creates a new task that runs on each raf frame\n * until it returns a falsy value or is aborted\n */\nfunction loop(callback) {\n let task;\n if (tasks.size === 0)\n raf(run_tasks);\n return {\n promise: new Promise(fulfill => {\n tasks.add(task = { c: callback, f: fulfill });\n }),\n abort() {\n tasks.delete(task);\n }\n };\n}\n\n// Track which nodes are claimed during hydration. Unclaimed nodes can then be removed from the DOM\n// at the end of hydration without touching the remaining nodes.\nlet is_hydrating = false;\nfunction start_hydrating() {\n is_hydrating = true;\n}\nfunction end_hydrating() {\n is_hydrating = false;\n}\nfunction upper_bound(low, high, key, value) {\n // Return first index of value larger than input value in the range [low, high)\n while (low < high) {\n const mid = low + ((high - low) >> 1);\n if (key(mid) <= value) {\n low = mid + 1;\n }\n else {\n high = mid;\n }\n }\n return low;\n}\nfunction init_hydrate(target) {\n if (target.hydrate_init)\n return;\n target.hydrate_init = true;\n // We know that all children have claim_order values since the unclaimed have been detached if target is not \n let children = target.childNodes;\n // If target is , there may be children without claim_order\n if (target.nodeName === 'HEAD') {\n const myChildren = [];\n for (let i = 0; i < children.length; i++) {\n const node = children[i];\n if (node.claim_order !== undefined) {\n myChildren.push(node);\n }\n }\n children = myChildren;\n }\n /*\n * Reorder claimed children optimally.\n * We can reorder claimed children optimally by finding the longest subsequence of\n * nodes that are already claimed in order and only moving the rest. The longest\n * subsequence subsequence of nodes that are claimed in order can be found by\n * computing the longest increasing subsequence of .claim_order values.\n *\n * This algorithm is optimal in generating the least amount of reorder operations\n * possible.\n *\n * Proof:\n * We know that, given a set of reordering operations, the nodes that do not move\n * always form an increasing subsequence, since they do not move among each other\n * meaning that they must be already ordered among each other. Thus, the maximal\n * set of nodes that do not move form a longest increasing subsequence.\n */\n // Compute longest increasing subsequence\n // m: subsequence length j => index k of smallest value that ends an increasing subsequence of length j\n const m = new Int32Array(children.length + 1);\n // Predecessor indices + 1\n const p = new Int32Array(children.length);\n m[0] = -1;\n let longest = 0;\n for (let i = 0; i < children.length; i++) {\n const current = children[i].claim_order;\n // Find the largest subsequence length such that it ends in a value less than our current value\n // upper_bound returns first greater value, so we subtract one\n // with fast path for when we are on the current longest subsequence\n const seqLen = ((longest > 0 && children[m[longest]].claim_order <= current) ? longest + 1 : upper_bound(1, longest, idx => children[m[idx]].claim_order, current)) - 1;\n p[i] = m[seqLen] + 1;\n const newLen = seqLen + 1;\n // We can guarantee that current is the smallest value. Otherwise, we would have generated a longer sequence.\n m[newLen] = i;\n longest = Math.max(newLen, longest);\n }\n // The longest increasing subsequence of nodes (initially reversed)\n const lis = [];\n // The rest of the nodes, nodes that will be moved\n const toMove = [];\n let last = children.length - 1;\n for (let cur = m[longest] + 1; cur != 0; cur = p[cur - 1]) {\n lis.push(children[cur - 1]);\n for (; last >= cur; last--) {\n toMove.push(children[last]);\n }\n last--;\n }\n for (; last >= 0; last--) {\n toMove.push(children[last]);\n }\n lis.reverse();\n // We sort the nodes being moved to guarantee that their insertion order matches the claim order\n toMove.sort((a, b) => a.claim_order - b.claim_order);\n // Finally, we move the nodes\n for (let i = 0, j = 0; i < toMove.length; i++) {\n while (j < lis.length && toMove[i].claim_order >= lis[j].claim_order) {\n j++;\n }\n const anchor = j < lis.length ? lis[j] : null;\n target.insertBefore(toMove[i], anchor);\n }\n}\nfunction append(target, node) {\n target.appendChild(node);\n}\nfunction append_styles(target, style_sheet_id, styles) {\n const append_styles_to = get_root_for_style(target);\n if (!append_styles_to.getElementById(style_sheet_id)) {\n const style = element('style');\n style.id = style_sheet_id;\n style.textContent = styles;\n append_stylesheet(append_styles_to, style);\n }\n}\nfunction get_root_for_style(node) {\n if (!node)\n return document;\n const root = node.getRootNode ? node.getRootNode() : node.ownerDocument;\n if (root && root.host) {\n return root;\n }\n return node.ownerDocument;\n}\nfunction append_empty_stylesheet(node) {\n const style_element = element('style');\n append_stylesheet(get_root_for_style(node), style_element);\n return style_element.sheet;\n}\nfunction append_stylesheet(node, style) {\n append(node.head || node, style);\n}\nfunction append_hydration(target, node) {\n if (is_hydrating) {\n init_hydrate(target);\n if ((target.actual_end_child === undefined) || ((target.actual_end_child !== null) && (target.actual_end_child.parentElement !== target))) {\n target.actual_end_child = target.firstChild;\n }\n // Skip nodes of undefined ordering\n while ((target.actual_end_child !== null) && (target.actual_end_child.claim_order === undefined)) {\n target.actual_end_child = target.actual_end_child.nextSibling;\n }\n if (node !== target.actual_end_child) {\n // We only insert if the ordering of this node should be modified or the parent node is not target\n if (node.claim_order !== undefined || node.parentNode !== target) {\n target.insertBefore(node, target.actual_end_child);\n }\n }\n else {\n target.actual_end_child = node.nextSibling;\n }\n }\n else if (node.parentNode !== target || node.nextSibling !== null) {\n target.appendChild(node);\n }\n}\nfunction insert(target, node, anchor) {\n target.insertBefore(node, anchor || null);\n}\nfunction insert_hydration(target, node, anchor) {\n if (is_hydrating && !anchor) {\n append_hydration(target, node);\n }\n else if (node.parentNode !== target || node.nextSibling != anchor) {\n target.insertBefore(node, anchor || null);\n }\n}\nfunction detach(node) {\n node.parentNode.removeChild(node);\n}\nfunction destroy_each(iterations, detaching) {\n for (let i = 0; i < iterations.length; i += 1) {\n if (iterations[i])\n iterations[i].d(detaching);\n }\n}\nfunction element(name) {\n return document.createElement(name);\n}\nfunction element_is(name, is) {\n return document.createElement(name, { is });\n}\nfunction object_without_properties(obj, exclude) {\n const target = {};\n for (const k in obj) {\n if (has_prop(obj, k)\n // @ts-ignore\n && exclude.indexOf(k) === -1) {\n // @ts-ignore\n target[k] = obj[k];\n }\n }\n return target;\n}\nfunction svg_element(name) {\n return document.createElementNS('http://www.w3.org/2000/svg', name);\n}\nfunction text(data) {\n return document.createTextNode(data);\n}\nfunction space() {\n return text(' ');\n}\nfunction empty() {\n return text('');\n}\nfunction listen(node, event, handler, options) {\n node.addEventListener(event, handler, options);\n return () => node.removeEventListener(event, handler, options);\n}\nfunction prevent_default(fn) {\n return function (event) {\n event.preventDefault();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction stop_propagation(fn) {\n return function (event) {\n event.stopPropagation();\n // @ts-ignore\n return fn.call(this, event);\n };\n}\nfunction self(fn) {\n return function (event) {\n // @ts-ignore\n if (event.target === this)\n fn.call(this, event);\n };\n}\nfunction trusted(fn) {\n return function (event) {\n // @ts-ignore\n if (event.isTrusted)\n fn.call(this, event);\n };\n}\nfunction attr(node, attribute, value) {\n if (value == null)\n node.removeAttribute(attribute);\n else if (node.getAttribute(attribute) !== value)\n node.setAttribute(attribute, value);\n}\nfunction set_attributes(node, attributes) {\n // @ts-ignore\n const descriptors = Object.getOwnPropertyDescriptors(node.__proto__);\n for (const key in attributes) {\n if (attributes[key] == null) {\n node.removeAttribute(key);\n }\n else if (key === 'style') {\n node.style.cssText = attributes[key];\n }\n else if (key === '__value') {\n node.value = node[key] = attributes[key];\n }\n else if (descriptors[key] && descriptors[key].set) {\n node[key] = attributes[key];\n }\n else {\n attr(node, key, attributes[key]);\n }\n }\n}\nfunction set_svg_attributes(node, attributes) {\n for (const key in attributes) {\n attr(node, key, attributes[key]);\n }\n}\nfunction set_custom_element_data(node, prop, value) {\n if (prop in node) {\n node[prop] = typeof node[prop] === 'boolean' && value === '' ? true : value;\n }\n else {\n attr(node, prop, value);\n }\n}\nfunction xlink_attr(node, attribute, value) {\n node.setAttributeNS('http://www.w3.org/1999/xlink', attribute, value);\n}\nfunction get_binding_group_value(group, __value, checked) {\n const value = new Set();\n for (let i = 0; i < group.length; i += 1) {\n if (group[i].checked)\n value.add(group[i].__value);\n }\n if (!checked) {\n value.delete(__value);\n }\n return Array.from(value);\n}\nfunction to_number(value) {\n return value === '' ? null : +value;\n}\nfunction time_ranges_to_array(ranges) {\n const array = [];\n for (let i = 0; i < ranges.length; i += 1) {\n array.push({ start: ranges.start(i), end: ranges.end(i) });\n }\n return array;\n}\nfunction children(element) {\n return Array.from(element.childNodes);\n}\nfunction init_claim_info(nodes) {\n if (nodes.claim_info === undefined) {\n nodes.claim_info = { last_index: 0, total_claimed: 0 };\n }\n}\nfunction claim_node(nodes, predicate, processNode, createNode, dontUpdateLastIndex = false) {\n // Try to find nodes in an order such that we lengthen the longest increasing subsequence\n init_claim_info(nodes);\n const resultNode = (() => {\n // We first try to find an element after the previous one\n for (let i = nodes.claim_info.last_index; i < nodes.length; i++) {\n const node = nodes[i];\n if (predicate(node)) {\n const replacement = processNode(node);\n if (replacement === undefined) {\n nodes.splice(i, 1);\n }\n else {\n nodes[i] = replacement;\n }\n if (!dontUpdateLastIndex) {\n nodes.claim_info.last_index = i;\n }\n return node;\n }\n }\n // Otherwise, we try to find one before\n // We iterate in reverse so that we don't go too far back\n for (let i = nodes.claim_info.last_index - 1; i >= 0; i--) {\n const node = nodes[i];\n if (predicate(node)) {\n const replacement = processNode(node);\n if (replacement === undefined) {\n nodes.splice(i, 1);\n }\n else {\n nodes[i] = replacement;\n }\n if (!dontUpdateLastIndex) {\n nodes.claim_info.last_index = i;\n }\n else if (replacement === undefined) {\n // Since we spliced before the last_index, we decrease it\n nodes.claim_info.last_index--;\n }\n return node;\n }\n }\n // If we can't find any matching node, we create a new one\n return createNode();\n })();\n resultNode.claim_order = nodes.claim_info.total_claimed;\n nodes.claim_info.total_claimed += 1;\n return resultNode;\n}\nfunction claim_element_base(nodes, name, attributes, create_element) {\n return claim_node(nodes, (node) => node.nodeName === name, (node) => {\n const remove = [];\n for (let j = 0; j < node.attributes.length; j++) {\n const attribute = node.attributes[j];\n if (!attributes[attribute.name]) {\n remove.push(attribute.name);\n }\n }\n remove.forEach(v => node.removeAttribute(v));\n return undefined;\n }, () => create_element(name));\n}\nfunction claim_element(nodes, name, attributes) {\n return claim_element_base(nodes, name, attributes, element);\n}\nfunction claim_svg_element(nodes, name, attributes) {\n return claim_element_base(nodes, name, attributes, svg_element);\n}\nfunction claim_text(nodes, data) {\n return claim_node(nodes, (node) => node.nodeType === 3, (node) => {\n const dataStr = '' + data;\n if (node.data.startsWith(dataStr)) {\n if (node.data.length !== dataStr.length) {\n return node.splitText(dataStr.length);\n }\n }\n else {\n node.data = dataStr;\n }\n }, () => text(data), true // Text nodes should not update last index since it is likely not worth it to eliminate an increasing subsequence of actual elements\n );\n}\nfunction claim_space(nodes) {\n return claim_text(nodes, ' ');\n}\nfunction find_comment(nodes, text, start) {\n for (let i = start; i < nodes.length; i += 1) {\n const node = nodes[i];\n if (node.nodeType === 8 /* comment node */ && node.textContent.trim() === text) {\n return i;\n }\n }\n return nodes.length;\n}\nfunction claim_html_tag(nodes, is_svg) {\n // find html opening tag\n const start_index = find_comment(nodes, 'HTML_TAG_START', 0);\n const end_index = find_comment(nodes, 'HTML_TAG_END', start_index);\n if (start_index === end_index) {\n return new HtmlTagHydration(undefined, is_svg);\n }\n init_claim_info(nodes);\n const html_tag_nodes = nodes.splice(start_index, end_index - start_index + 1);\n detach(html_tag_nodes[0]);\n detach(html_tag_nodes[html_tag_nodes.length - 1]);\n const claimed_nodes = html_tag_nodes.slice(1, html_tag_nodes.length - 1);\n for (const n of claimed_nodes) {\n n.claim_order = nodes.claim_info.total_claimed;\n nodes.claim_info.total_claimed += 1;\n }\n return new HtmlTagHydration(claimed_nodes, is_svg);\n}\nfunction set_data(text, data) {\n data = '' + data;\n if (text.wholeText !== data)\n text.data = data;\n}\nfunction set_input_value(input, value) {\n input.value = value == null ? '' : value;\n}\nfunction set_input_type(input, type) {\n try {\n input.type = type;\n }\n catch (e) {\n // do nothing\n }\n}\nfunction set_style(node, key, value, important) {\n if (value === null) {\n node.style.removeProperty(key);\n }\n else {\n node.style.setProperty(key, value, important ? 'important' : '');\n }\n}\nfunction select_option(select, value) {\n for (let i = 0; i < select.options.length; i += 1) {\n const option = select.options[i];\n if (option.__value === value) {\n option.selected = true;\n return;\n }\n }\n select.selectedIndex = -1; // no option should be selected\n}\nfunction select_options(select, value) {\n for (let i = 0; i < select.options.length; i += 1) {\n const option = select.options[i];\n option.selected = ~value.indexOf(option.__value);\n }\n}\nfunction select_value(select) {\n const selected_option = select.querySelector(':checked') || select.options[0];\n return selected_option && selected_option.__value;\n}\nfunction select_multiple_value(select) {\n return [].map.call(select.querySelectorAll(':checked'), option => option.__value);\n}\n// unfortunately this can't be a constant as that wouldn't be tree-shakeable\n// so we cache the result instead\nlet crossorigin;\nfunction is_crossorigin() {\n if (crossorigin === undefined) {\n crossorigin = false;\n try {\n if (typeof window !== 'undefined' && window.parent) {\n void window.parent.document;\n }\n }\n catch (error) {\n crossorigin = true;\n }\n }\n return crossorigin;\n}\nfunction add_resize_listener(node, fn) {\n const computed_style = getComputedStyle(node);\n if (computed_style.position === 'static') {\n node.style.position = 'relative';\n }\n const iframe = element('iframe');\n iframe.setAttribute('style', 'display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; ' +\n 'overflow: hidden; border: 0; opacity: 0; pointer-events: none; z-index: -1;');\n iframe.setAttribute('aria-hidden', 'true');\n iframe.tabIndex = -1;\n const crossorigin = is_crossorigin();\n let unsubscribe;\n if (crossorigin) {\n iframe.src = \"data:text/html,\";\n unsubscribe = listen(window, 'message', (event) => {\n if (event.source === iframe.contentWindow)\n fn();\n });\n }\n else {\n iframe.src = 'about:blank';\n iframe.onload = () => {\n unsubscribe = listen(iframe.contentWindow, 'resize', fn);\n };\n }\n append(node, iframe);\n return () => {\n if (crossorigin) {\n unsubscribe();\n }\n else if (unsubscribe && iframe.contentWindow) {\n unsubscribe();\n }\n detach(iframe);\n };\n}\nfunction toggle_class(element, name, toggle) {\n element.classList[toggle ? 'add' : 'remove'](name);\n}\nfunction custom_event(type, detail, { bubbles = false, cancelable = false } = {}) {\n const e = document.createEvent('CustomEvent');\n e.initCustomEvent(type, bubbles, cancelable, detail);\n return e;\n}\nfunction query_selector_all(selector, parent = document.body) {\n return Array.from(parent.querySelectorAll(selector));\n}\nclass HtmlTag {\n constructor(is_svg = false) {\n this.is_svg = false;\n this.is_svg = is_svg;\n this.e = this.n = null;\n }\n c(html) {\n this.h(html);\n }\n m(html, target, anchor = null) {\n if (!this.e) {\n if (this.is_svg)\n this.e = svg_element(target.nodeName);\n else\n this.e = element(target.nodeName);\n this.t = target;\n this.c(html);\n }\n this.i(anchor);\n }\n h(html) {\n this.e.innerHTML = html;\n this.n = Array.from(this.e.childNodes);\n }\n i(anchor) {\n for (let i = 0; i < this.n.length; i += 1) {\n insert(this.t, this.n[i], anchor);\n }\n }\n p(html) {\n this.d();\n this.h(html);\n this.i(this.a);\n }\n d() {\n this.n.forEach(detach);\n }\n}\nclass HtmlTagHydration extends HtmlTag {\n constructor(claimed_nodes, is_svg = false) {\n super(is_svg);\n this.e = this.n = null;\n this.l = claimed_nodes;\n }\n c(html) {\n if (this.l) {\n this.n = this.l;\n }\n else {\n super.c(html);\n }\n }\n i(anchor) {\n for (let i = 0; i < this.n.length; i += 1) {\n insert_hydration(this.t, this.n[i], anchor);\n }\n }\n}\nfunction attribute_to_object(attributes) {\n const result = {};\n for (const attribute of attributes) {\n result[attribute.name] = attribute.value;\n }\n return result;\n}\nfunction get_custom_elements_slots(element) {\n const result = {};\n element.childNodes.forEach((node) => {\n result[node.slot || 'default'] = true;\n });\n return result;\n}\n\n// we need to store the information for multiple documents because a Svelte application could also contain iframes\n// https://github.com/sveltejs/svelte/issues/3624\nconst managed_styles = new Map();\nlet active = 0;\n// https://github.com/darkskyapp/string-hash/blob/master/index.js\nfunction hash(str) {\n let hash = 5381;\n let i = str.length;\n while (i--)\n hash = ((hash << 5) - hash) ^ str.charCodeAt(i);\n return hash >>> 0;\n}\nfunction create_style_information(doc, node) {\n const info = { stylesheet: append_empty_stylesheet(node), rules: {} };\n managed_styles.set(doc, info);\n return info;\n}\nfunction create_rule(node, a, b, duration, delay, ease, fn, uid = 0) {\n const step = 16.666 / duration;\n let keyframes = '{\\n';\n for (let p = 0; p <= 1; p += step) {\n const t = a + (b - a) * ease(p);\n keyframes += p * 100 + `%{${fn(t, 1 - t)}}\\n`;\n }\n const rule = keyframes + `100% {${fn(b, 1 - b)}}\\n}`;\n const name = `__svelte_${hash(rule)}_${uid}`;\n const doc = get_root_for_style(node);\n const { stylesheet, rules } = managed_styles.get(doc) || create_style_information(doc, node);\n if (!rules[name]) {\n rules[name] = true;\n stylesheet.insertRule(`@keyframes ${name} ${rule}`, stylesheet.cssRules.length);\n }\n const animation = node.style.animation || '';\n node.style.animation = `${animation ? `${animation}, ` : ''}${name} ${duration}ms linear ${delay}ms 1 both`;\n active += 1;\n return name;\n}\nfunction delete_rule(node, name) {\n const previous = (node.style.animation || '').split(', ');\n const next = previous.filter(name\n ? anim => anim.indexOf(name) < 0 // remove specific animation\n : anim => anim.indexOf('__svelte') === -1 // remove all Svelte animations\n );\n const deleted = previous.length - next.length;\n if (deleted) {\n node.style.animation = next.join(', ');\n active -= deleted;\n if (!active)\n clear_rules();\n }\n}\nfunction clear_rules() {\n raf(() => {\n if (active)\n return;\n managed_styles.forEach(info => {\n const { stylesheet } = info;\n let i = stylesheet.cssRules.length;\n while (i--)\n stylesheet.deleteRule(i);\n info.rules = {};\n });\n managed_styles.clear();\n });\n}\n\nfunction create_animation(node, from, fn, params) {\n if (!from)\n return noop;\n const to = node.getBoundingClientRect();\n if (from.left === to.left && from.right === to.right && from.top === to.top && from.bottom === to.bottom)\n return noop;\n const { delay = 0, duration = 300, easing = identity, \n // @ts-ignore todo: should this be separated from destructuring? Or start/end added to public api and documentation?\n start: start_time = now() + delay, \n // @ts-ignore todo:\n end = start_time + duration, tick = noop, css } = fn(node, { from, to }, params);\n let running = true;\n let started = false;\n let name;\n function start() {\n if (css) {\n name = create_rule(node, 0, 1, duration, delay, easing, css);\n }\n if (!delay) {\n started = true;\n }\n }\n function stop() {\n if (css)\n delete_rule(node, name);\n running = false;\n }\n loop(now => {\n if (!started && now >= start_time) {\n started = true;\n }\n if (started && now >= end) {\n tick(1, 0);\n stop();\n }\n if (!running) {\n return false;\n }\n if (started) {\n const p = now - start_time;\n const t = 0 + 1 * easing(p / duration);\n tick(t, 1 - t);\n }\n return true;\n });\n start();\n tick(0, 1);\n return stop;\n}\nfunction fix_position(node) {\n const style = getComputedStyle(node);\n if (style.position !== 'absolute' && style.position !== 'fixed') {\n const { width, height } = style;\n const a = node.getBoundingClientRect();\n node.style.position = 'absolute';\n node.style.width = width;\n node.style.height = height;\n add_transform(node, a);\n }\n}\nfunction add_transform(node, a) {\n const b = node.getBoundingClientRect();\n if (a.left !== b.left || a.top !== b.top) {\n const style = getComputedStyle(node);\n const transform = style.transform === 'none' ? '' : style.transform;\n node.style.transform = `${transform} translate(${a.left - b.left}px, ${a.top - b.top}px)`;\n }\n}\n\nlet current_component;\nfunction set_current_component(component) {\n current_component = component;\n}\nfunction get_current_component() {\n if (!current_component)\n throw new Error('Function called outside component initialization');\n return current_component;\n}\nfunction beforeUpdate(fn) {\n get_current_component().$$.before_update.push(fn);\n}\nfunction onMount(fn) {\n get_current_component().$$.on_mount.push(fn);\n}\nfunction afterUpdate(fn) {\n get_current_component().$$.after_update.push(fn);\n}\nfunction onDestroy(fn) {\n get_current_component().$$.on_destroy.push(fn);\n}\nfunction createEventDispatcher() {\n const component = get_current_component();\n return (type, detail, { cancelable = false } = {}) => {\n const callbacks = component.$$.callbacks[type];\n if (callbacks) {\n // TODO are there situations where events could be dispatched\n // in a server (non-DOM) environment?\n const event = custom_event(type, detail, { cancelable });\n callbacks.slice().forEach(fn => {\n fn.call(component, event);\n });\n return !event.defaultPrevented;\n }\n return true;\n };\n}\nfunction setContext(key, context) {\n get_current_component().$$.context.set(key, context);\n return context;\n}\nfunction getContext(key) {\n return get_current_component().$$.context.get(key);\n}\nfunction getAllContexts() {\n return get_current_component().$$.context;\n}\nfunction hasContext(key) {\n return get_current_component().$$.context.has(key);\n}\n// TODO figure out if we still want to support\n// shorthand events, or if we want to implement\n// a real bubbling mechanism\nfunction bubble(component, event) {\n const callbacks = component.$$.callbacks[event.type];\n if (callbacks) {\n // @ts-ignore\n callbacks.slice().forEach(fn => fn.call(this, event));\n }\n}\n\nconst dirty_components = [];\nconst intros = { enabled: false };\nconst binding_callbacks = [];\nconst render_callbacks = [];\nconst flush_callbacks = [];\nconst resolved_promise = Promise.resolve();\nlet update_scheduled = false;\nfunction schedule_update() {\n if (!update_scheduled) {\n update_scheduled = true;\n resolved_promise.then(flush);\n }\n}\nfunction tick() {\n schedule_update();\n return resolved_promise;\n}\nfunction add_render_callback(fn) {\n render_callbacks.push(fn);\n}\nfunction add_flush_callback(fn) {\n flush_callbacks.push(fn);\n}\n// flush() calls callbacks in this order:\n// 1. All beforeUpdate callbacks, in order: parents before children\n// 2. All bind:this callbacks, in reverse order: children before parents.\n// 3. All afterUpdate callbacks, in order: parents before children. EXCEPT\n// for afterUpdates called during the initial onMount, which are called in\n// reverse order: children before parents.\n// Since callbacks might update component values, which could trigger another\n// call to flush(), the following steps guard against this:\n// 1. During beforeUpdate, any updated components will be added to the\n// dirty_components array and will cause a reentrant call to flush(). Because\n// the flush index is kept outside the function, the reentrant call will pick\n// up where the earlier call left off and go through all dirty components. The\n// current_component value is saved and restored so that the reentrant call will\n// not interfere with the \"parent\" flush() call.\n// 2. bind:this callbacks cannot trigger new flush() calls.\n// 3. During afterUpdate, any updated components will NOT have their afterUpdate\n// callback called a second time; the seen_callbacks set, outside the flush()\n// function, guarantees this behavior.\nconst seen_callbacks = new Set();\nlet flushidx = 0; // Do *not* move this inside the flush() function\nfunction flush() {\n const saved_component = current_component;\n do {\n // first, call beforeUpdate functions\n // and update components\n while (flushidx < dirty_components.length) {\n const component = dirty_components[flushidx];\n flushidx++;\n set_current_component(component);\n update(component.$$);\n }\n set_current_component(null);\n dirty_components.length = 0;\n flushidx = 0;\n while (binding_callbacks.length)\n binding_callbacks.pop()();\n // then, once components are updated, call\n // afterUpdate functions. This may cause\n // subsequent updates...\n for (let i = 0; i < render_callbacks.length; i += 1) {\n const callback = render_callbacks[i];\n if (!seen_callbacks.has(callback)) {\n // ...so guard against infinite loops\n seen_callbacks.add(callback);\n callback();\n }\n }\n render_callbacks.length = 0;\n } while (dirty_components.length);\n while (flush_callbacks.length) {\n flush_callbacks.pop()();\n }\n update_scheduled = false;\n seen_callbacks.clear();\n set_current_component(saved_component);\n}\nfunction update($$) {\n if ($$.fragment !== null) {\n $$.update();\n run_all($$.before_update);\n const dirty = $$.dirty;\n $$.dirty = [-1];\n $$.fragment && $$.fragment.p($$.ctx, dirty);\n $$.after_update.forEach(add_render_callback);\n }\n}\n\nlet promise;\nfunction wait() {\n if (!promise) {\n promise = Promise.resolve();\n promise.then(() => {\n promise = null;\n });\n }\n return promise;\n}\nfunction dispatch(node, direction, kind) {\n node.dispatchEvent(custom_event(`${direction ? 'intro' : 'outro'}${kind}`));\n}\nconst outroing = new Set();\nlet outros;\nfunction group_outros() {\n outros = {\n r: 0,\n c: [],\n p: outros // parent group\n };\n}\nfunction check_outros() {\n if (!outros.r) {\n run_all(outros.c);\n }\n outros = outros.p;\n}\nfunction transition_in(block, local) {\n if (block && block.i) {\n outroing.delete(block);\n block.i(local);\n }\n}\nfunction transition_out(block, local, detach, callback) {\n if (block && block.o) {\n if (outroing.has(block))\n return;\n outroing.add(block);\n outros.c.push(() => {\n outroing.delete(block);\n if (callback) {\n if (detach)\n block.d(1);\n callback();\n }\n });\n block.o(local);\n }\n}\nconst null_transition = { duration: 0 };\nfunction create_in_transition(node, fn, params) {\n let config = fn(node, params);\n let running = false;\n let animation_name;\n let task;\n let uid = 0;\n function cleanup() {\n if (animation_name)\n delete_rule(node, animation_name);\n }\n function go() {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n if (css)\n animation_name = create_rule(node, 0, 1, duration, delay, easing, css, uid++);\n tick(0, 1);\n const start_time = now() + delay;\n const end_time = start_time + duration;\n if (task)\n task.abort();\n running = true;\n add_render_callback(() => dispatch(node, true, 'start'));\n task = loop(now => {\n if (running) {\n if (now >= end_time) {\n tick(1, 0);\n dispatch(node, true, 'end');\n cleanup();\n return running = false;\n }\n if (now >= start_time) {\n const t = easing((now - start_time) / duration);\n tick(t, 1 - t);\n }\n }\n return running;\n });\n }\n let started = false;\n return {\n start() {\n if (started)\n return;\n started = true;\n delete_rule(node);\n if (is_function(config)) {\n config = config();\n wait().then(go);\n }\n else {\n go();\n }\n },\n invalidate() {\n started = false;\n },\n end() {\n if (running) {\n cleanup();\n running = false;\n }\n }\n };\n}\nfunction create_out_transition(node, fn, params) {\n let config = fn(node, params);\n let running = true;\n let animation_name;\n const group = outros;\n group.r += 1;\n function go() {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n if (css)\n animation_name = create_rule(node, 1, 0, duration, delay, easing, css);\n const start_time = now() + delay;\n const end_time = start_time + duration;\n add_render_callback(() => dispatch(node, false, 'start'));\n loop(now => {\n if (running) {\n if (now >= end_time) {\n tick(0, 1);\n dispatch(node, false, 'end');\n if (!--group.r) {\n // this will result in `end()` being called,\n // so we don't need to clean up here\n run_all(group.c);\n }\n return false;\n }\n if (now >= start_time) {\n const t = easing((now - start_time) / duration);\n tick(1 - t, t);\n }\n }\n return running;\n });\n }\n if (is_function(config)) {\n wait().then(() => {\n // @ts-ignore\n config = config();\n go();\n });\n }\n else {\n go();\n }\n return {\n end(reset) {\n if (reset && config.tick) {\n config.tick(1, 0);\n }\n if (running) {\n if (animation_name)\n delete_rule(node, animation_name);\n running = false;\n }\n }\n };\n}\nfunction create_bidirectional_transition(node, fn, params, intro) {\n let config = fn(node, params);\n let t = intro ? 0 : 1;\n let running_program = null;\n let pending_program = null;\n let animation_name = null;\n function clear_animation() {\n if (animation_name)\n delete_rule(node, animation_name);\n }\n function init(program, duration) {\n const d = (program.b - t);\n duration *= Math.abs(d);\n return {\n a: t,\n b: program.b,\n d,\n duration,\n start: program.start,\n end: program.start + duration,\n group: program.group\n };\n }\n function go(b) {\n const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n const program = {\n start: now() + delay,\n b\n };\n if (!b) {\n // @ts-ignore todo: improve typings\n program.group = outros;\n outros.r += 1;\n }\n if (running_program || pending_program) {\n pending_program = program;\n }\n else {\n // if this is an intro, and there's a delay, we need to do\n // an initial tick and/or apply CSS animation immediately\n if (css) {\n clear_animation();\n animation_name = create_rule(node, t, b, duration, delay, easing, css);\n }\n if (b)\n tick(0, 1);\n running_program = init(program, duration);\n add_render_callback(() => dispatch(node, b, 'start'));\n loop(now => {\n if (pending_program && now > pending_program.start) {\n running_program = init(pending_program, duration);\n pending_program = null;\n dispatch(node, running_program.b, 'start');\n if (css) {\n clear_animation();\n animation_name = create_rule(node, t, running_program.b, running_program.duration, 0, easing, config.css);\n }\n }\n if (running_program) {\n if (now >= running_program.end) {\n tick(t = running_program.b, 1 - t);\n dispatch(node, running_program.b, 'end');\n if (!pending_program) {\n // we're done\n if (running_program.b) {\n // intro — we can tidy up immediately\n clear_animation();\n }\n else {\n // outro — needs to be coordinated\n if (!--running_program.group.r)\n run_all(running_program.group.c);\n }\n }\n running_program = null;\n }\n else if (now >= running_program.start) {\n const p = now - running_program.start;\n t = running_program.a + running_program.d * easing(p / running_program.duration);\n tick(t, 1 - t);\n }\n }\n return !!(running_program || pending_program);\n });\n }\n }\n return {\n run(b) {\n if (is_function(config)) {\n wait().then(() => {\n // @ts-ignore\n config = config();\n go(b);\n });\n }\n else {\n go(b);\n }\n },\n end() {\n clear_animation();\n running_program = pending_program = null;\n }\n };\n}\n\nfunction handle_promise(promise, info) {\n const token = info.token = {};\n function update(type, index, key, value) {\n if (info.token !== token)\n return;\n info.resolved = value;\n let child_ctx = info.ctx;\n if (key !== undefined) {\n child_ctx = child_ctx.slice();\n child_ctx[key] = value;\n }\n const block = type && (info.current = type)(child_ctx);\n let needs_flush = false;\n if (info.block) {\n if (info.blocks) {\n info.blocks.forEach((block, i) => {\n if (i !== index && block) {\n group_outros();\n transition_out(block, 1, 1, () => {\n if (info.blocks[i] === block) {\n info.blocks[i] = null;\n }\n });\n check_outros();\n }\n });\n }\n else {\n info.block.d(1);\n }\n block.c();\n transition_in(block, 1);\n block.m(info.mount(), info.anchor);\n needs_flush = true;\n }\n info.block = block;\n if (info.blocks)\n info.blocks[index] = block;\n if (needs_flush) {\n flush();\n }\n }\n if (is_promise(promise)) {\n const current_component = get_current_component();\n promise.then(value => {\n set_current_component(current_component);\n update(info.then, 1, info.value, value);\n set_current_component(null);\n }, error => {\n set_current_component(current_component);\n update(info.catch, 2, info.error, error);\n set_current_component(null);\n if (!info.hasCatch) {\n throw error;\n }\n });\n // if we previously had a then/catch block, destroy it\n if (info.current !== info.pending) {\n update(info.pending, 0);\n return true;\n }\n }\n else {\n if (info.current !== info.then) {\n update(info.then, 1, info.value, promise);\n return true;\n }\n info.resolved = promise;\n }\n}\nfunction update_await_block_branch(info, ctx, dirty) {\n const child_ctx = ctx.slice();\n const { resolved } = info;\n if (info.current === info.then) {\n child_ctx[info.value] = resolved;\n }\n if (info.current === info.catch) {\n child_ctx[info.error] = resolved;\n }\n info.block.p(child_ctx, dirty);\n}\n\nconst globals = (typeof window !== 'undefined'\n ? window\n : typeof globalThis !== 'undefined'\n ? globalThis\n : global);\n\nfunction destroy_block(block, lookup) {\n block.d(1);\n lookup.delete(block.key);\n}\nfunction outro_and_destroy_block(block, lookup) {\n transition_out(block, 1, 1, () => {\n lookup.delete(block.key);\n });\n}\nfunction fix_and_destroy_block(block, lookup) {\n block.f();\n destroy_block(block, lookup);\n}\nfunction fix_and_outro_and_destroy_block(block, lookup) {\n block.f();\n outro_and_destroy_block(block, lookup);\n}\nfunction update_keyed_each(old_blocks, dirty, get_key, dynamic, ctx, list, lookup, node, destroy, create_each_block, next, get_context) {\n let o = old_blocks.length;\n let n = list.length;\n let i = o;\n const old_indexes = {};\n while (i--)\n old_indexes[old_blocks[i].key] = i;\n const new_blocks = [];\n const new_lookup = new Map();\n const deltas = new Map();\n i = n;\n while (i--) {\n const child_ctx = get_context(ctx, list, i);\n const key = get_key(child_ctx);\n let block = lookup.get(key);\n if (!block) {\n block = create_each_block(key, child_ctx);\n block.c();\n }\n else if (dynamic) {\n block.p(child_ctx, dirty);\n }\n new_lookup.set(key, new_blocks[i] = block);\n if (key in old_indexes)\n deltas.set(key, Math.abs(i - old_indexes[key]));\n }\n const will_move = new Set();\n const did_move = new Set();\n function insert(block) {\n transition_in(block, 1);\n block.m(node, next);\n lookup.set(block.key, block);\n next = block.first;\n n--;\n }\n while (o && n) {\n const new_block = new_blocks[n - 1];\n const old_block = old_blocks[o - 1];\n const new_key = new_block.key;\n const old_key = old_block.key;\n if (new_block === old_block) {\n // do nothing\n next = new_block.first;\n o--;\n n--;\n }\n else if (!new_lookup.has(old_key)) {\n // remove old block\n destroy(old_block, lookup);\n o--;\n }\n else if (!lookup.has(new_key) || will_move.has(new_key)) {\n insert(new_block);\n }\n else if (did_move.has(old_key)) {\n o--;\n }\n else if (deltas.get(new_key) > deltas.get(old_key)) {\n did_move.add(new_key);\n insert(new_block);\n }\n else {\n will_move.add(old_key);\n o--;\n }\n }\n while (o--) {\n const old_block = old_blocks[o];\n if (!new_lookup.has(old_block.key))\n destroy(old_block, lookup);\n }\n while (n)\n insert(new_blocks[n - 1]);\n return new_blocks;\n}\nfunction validate_each_keys(ctx, list, get_context, get_key) {\n const keys = new Set();\n for (let i = 0; i < list.length; i++) {\n const key = get_key(get_context(ctx, list, i));\n if (keys.has(key)) {\n throw new Error('Cannot have duplicate keys in a keyed each');\n }\n keys.add(key);\n }\n}\n\nfunction get_spread_update(levels, updates) {\n const update = {};\n const to_null_out = {};\n const accounted_for = { $$scope: 1 };\n let i = levels.length;\n while (i--) {\n const o = levels[i];\n const n = updates[i];\n if (n) {\n for (const key in o) {\n if (!(key in n))\n to_null_out[key] = 1;\n }\n for (const key in n) {\n if (!accounted_for[key]) {\n update[key] = n[key];\n accounted_for[key] = 1;\n }\n }\n levels[i] = n;\n }\n else {\n for (const key in o) {\n accounted_for[key] = 1;\n }\n }\n }\n for (const key in to_null_out) {\n if (!(key in update))\n update[key] = undefined;\n }\n return update;\n}\nfunction get_spread_object(spread_props) {\n return typeof spread_props === 'object' && spread_props !== null ? spread_props : {};\n}\n\n// source: https://html.spec.whatwg.org/multipage/indices.html\nconst boolean_attributes = new Set([\n 'allowfullscreen',\n 'allowpaymentrequest',\n 'async',\n 'autofocus',\n 'autoplay',\n 'checked',\n 'controls',\n 'default',\n 'defer',\n 'disabled',\n 'formnovalidate',\n 'hidden',\n 'ismap',\n 'loop',\n 'multiple',\n 'muted',\n 'nomodule',\n 'novalidate',\n 'open',\n 'playsinline',\n 'readonly',\n 'required',\n 'reversed',\n 'selected'\n]);\n\nconst void_element_names = /^(?:area|base|br|col|command|embed|hr|img|input|keygen|link|meta|param|source|track|wbr)$/;\nfunction is_void(name) {\n return void_element_names.test(name) || name.toLowerCase() === '!doctype';\n}\n\nconst invalid_attribute_name_character = /[\\s'\">/=\\u{FDD0}-\\u{FDEF}\\u{FFFE}\\u{FFFF}\\u{1FFFE}\\u{1FFFF}\\u{2FFFE}\\u{2FFFF}\\u{3FFFE}\\u{3FFFF}\\u{4FFFE}\\u{4FFFF}\\u{5FFFE}\\u{5FFFF}\\u{6FFFE}\\u{6FFFF}\\u{7FFFE}\\u{7FFFF}\\u{8FFFE}\\u{8FFFF}\\u{9FFFE}\\u{9FFFF}\\u{AFFFE}\\u{AFFFF}\\u{BFFFE}\\u{BFFFF}\\u{CFFFE}\\u{CFFFF}\\u{DFFFE}\\u{DFFFF}\\u{EFFFE}\\u{EFFFF}\\u{FFFFE}\\u{FFFFF}\\u{10FFFE}\\u{10FFFF}]/u;\n// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n// https://infra.spec.whatwg.org/#noncharacter\nfunction spread(args, attrs_to_add) {\n const attributes = Object.assign({}, ...args);\n if (attrs_to_add) {\n const classes_to_add = attrs_to_add.classes;\n const styles_to_add = attrs_to_add.styles;\n if (classes_to_add) {\n if (attributes.class == null) {\n attributes.class = classes_to_add;\n }\n else {\n attributes.class += ' ' + classes_to_add;\n }\n }\n if (styles_to_add) {\n if (attributes.style == null) {\n attributes.style = style_object_to_string(styles_to_add);\n }\n else {\n attributes.style = style_object_to_string(merge_ssr_styles(attributes.style, styles_to_add));\n }\n }\n }\n let str = '';\n Object.keys(attributes).forEach(name => {\n if (invalid_attribute_name_character.test(name))\n return;\n const value = attributes[name];\n if (value === true)\n str += ' ' + name;\n else if (boolean_attributes.has(name.toLowerCase())) {\n if (value)\n str += ' ' + name;\n }\n else if (value != null) {\n str += ` ${name}=\"${value}\"`;\n }\n });\n return str;\n}\nfunction merge_ssr_styles(style_attribute, style_directive) {\n const style_object = {};\n for (const individual_style of style_attribute.split(';')) {\n const colon_index = individual_style.indexOf(':');\n const name = individual_style.slice(0, colon_index).trim();\n const value = individual_style.slice(colon_index + 1).trim();\n if (!name)\n continue;\n style_object[name] = value;\n }\n for (const name in style_directive) {\n const value = style_directive[name];\n if (value) {\n style_object[name] = value;\n }\n else {\n delete style_object[name];\n }\n }\n return style_object;\n}\nconst escaped = {\n '\"': '"',\n \"'\": ''',\n '&': '&',\n '<': '<',\n '>': '>'\n};\nfunction escape(html) {\n return String(html).replace(/[\"'&<>]/g, match => escaped[match]);\n}\nfunction escape_attribute_value(value) {\n return typeof value === 'string' ? escape(value) : value;\n}\nfunction escape_object(obj) {\n const result = {};\n for (const key in obj) {\n result[key] = escape_attribute_value(obj[key]);\n }\n return result;\n}\nfunction each(items, fn) {\n let str = '';\n for (let i = 0; i < items.length; i += 1) {\n str += fn(items[i], i);\n }\n return str;\n}\nconst missing_component = {\n $$render: () => ''\n};\nfunction validate_component(component, name) {\n if (!component || !component.$$render) {\n if (name === 'svelte:component')\n name += ' this={...}';\n throw new Error(`<${name}> is not a valid SSR component. You may need to review your build config to ensure that dependencies are compiled, rather than imported as pre-compiled modules`);\n }\n return component;\n}\nfunction debug(file, line, column, values) {\n console.log(`{@debug} ${file ? file + ' ' : ''}(${line}:${column})`); // eslint-disable-line no-console\n console.log(values); // eslint-disable-line no-console\n return '';\n}\nlet on_destroy;\nfunction create_ssr_component(fn) {\n function $$render(result, props, bindings, slots, context) {\n const parent_component = current_component;\n const $$ = {\n on_destroy,\n context: new Map(context || (parent_component ? parent_component.$$.context : [])),\n // these will be immediately discarded\n on_mount: [],\n before_update: [],\n after_update: [],\n callbacks: blank_object()\n };\n set_current_component({ $$ });\n const html = fn(result, props, bindings, slots);\n set_current_component(parent_component);\n return html;\n }\n return {\n render: (props = {}, { $$slots = {}, context = new Map() } = {}) => {\n on_destroy = [];\n const result = { title: '', head: '', css: new Set() };\n const html = $$render(result, props, {}, $$slots, context);\n run_all(on_destroy);\n return {\n html,\n css: {\n code: Array.from(result.css).map(css => css.code).join('\\n'),\n map: null // TODO\n },\n head: result.title + result.head\n };\n },\n $$render\n };\n}\nfunction add_attribute(name, value, boolean) {\n if (value == null || (boolean && !value))\n return '';\n const assignment = (boolean && value === true) ? '' : `=\"${escape_attribute_value(value.toString())}\"`;\n return ` ${name}${assignment}`;\n}\nfunction add_classes(classes) {\n return classes ? ` class=\"${classes}\"` : '';\n}\nfunction style_object_to_string(style_object) {\n return Object.keys(style_object)\n .filter(key => style_object[key])\n .map(key => `${key}: ${style_object[key]};`)\n .join(' ');\n}\nfunction add_styles(style_object) {\n const styles = style_object_to_string(style_object);\n return styles ? ` style=\"${styles}\"` : '';\n}\n\nfunction bind(component, name, callback) {\n const index = component.$$.props[name];\n if (index !== undefined) {\n component.$$.bound[index] = callback;\n callback(component.$$.ctx[index]);\n }\n}\nfunction create_component(block) {\n block && block.c();\n}\nfunction claim_component(block, parent_nodes) {\n block && block.l(parent_nodes);\n}\nfunction mount_component(component, target, anchor, customElement) {\n const { fragment, on_mount, on_destroy, after_update } = component.$$;\n fragment && fragment.m(target, anchor);\n if (!customElement) {\n // onMount happens before the initial afterUpdate\n add_render_callback(() => {\n const new_on_destroy = on_mount.map(run).filter(is_function);\n if (on_destroy) {\n on_destroy.push(...new_on_destroy);\n }\n else {\n // Edge case - component was destroyed immediately,\n // most likely as a result of a binding initialising\n run_all(new_on_destroy);\n }\n component.$$.on_mount = [];\n });\n }\n after_update.forEach(add_render_callback);\n}\nfunction destroy_component(component, detaching) {\n const $$ = component.$$;\n if ($$.fragment !== null) {\n run_all($$.on_destroy);\n $$.fragment && $$.fragment.d(detaching);\n // TODO null out other refs, including component.$$ (but need to\n // preserve final state?)\n $$.on_destroy = $$.fragment = null;\n $$.ctx = [];\n }\n}\nfunction make_dirty(component, i) {\n if (component.$$.dirty[0] === -1) {\n dirty_components.push(component);\n schedule_update();\n component.$$.dirty.fill(0);\n }\n component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31));\n}\nfunction init(component, options, instance, create_fragment, not_equal, props, append_styles, dirty = [-1]) {\n const parent_component = current_component;\n set_current_component(component);\n const $$ = component.$$ = {\n fragment: null,\n ctx: null,\n // state\n props,\n update: noop,\n not_equal,\n bound: blank_object(),\n // lifecycle\n on_mount: [],\n on_destroy: [],\n on_disconnect: [],\n before_update: [],\n after_update: [],\n context: new Map(options.context || (parent_component ? parent_component.$$.context : [])),\n // everything else\n callbacks: blank_object(),\n dirty,\n skip_bound: false,\n root: options.target || parent_component.$$.root\n };\n append_styles && append_styles($$.root);\n let ready = false;\n $$.ctx = instance\n ? instance(component, options.props || {}, (i, ret, ...rest) => {\n const value = rest.length ? rest[0] : ret;\n if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) {\n if (!$$.skip_bound && $$.bound[i])\n $$.bound[i](value);\n if (ready)\n make_dirty(component, i);\n }\n return ret;\n })\n : [];\n $$.update();\n ready = true;\n run_all($$.before_update);\n // `false` as a special case of no DOM component\n $$.fragment = create_fragment ? create_fragment($$.ctx) : false;\n if (options.target) {\n if (options.hydrate) {\n start_hydrating();\n const nodes = children(options.target);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n $$.fragment && $$.fragment.l(nodes);\n nodes.forEach(detach);\n }\n else {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n $$.fragment && $$.fragment.c();\n }\n if (options.intro)\n transition_in(component.$$.fragment);\n mount_component(component, options.target, options.anchor, options.customElement);\n end_hydrating();\n flush();\n }\n set_current_component(parent_component);\n}\nlet SvelteElement;\nif (typeof HTMLElement === 'function') {\n SvelteElement = class extends HTMLElement {\n constructor() {\n super();\n this.attachShadow({ mode: 'open' });\n }\n connectedCallback() {\n const { on_mount } = this.$$;\n this.$$.on_disconnect = on_mount.map(run).filter(is_function);\n // @ts-ignore todo: improve typings\n for (const key in this.$$.slotted) {\n // @ts-ignore todo: improve typings\n this.appendChild(this.$$.slotted[key]);\n }\n }\n attributeChangedCallback(attr, _oldValue, newValue) {\n this[attr] = newValue;\n }\n disconnectedCallback() {\n run_all(this.$$.on_disconnect);\n }\n $destroy() {\n destroy_component(this, 1);\n this.$destroy = noop;\n }\n $on(type, callback) {\n // TODO should this delegate to addEventListener?\n const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n callbacks.push(callback);\n return () => {\n const index = callbacks.indexOf(callback);\n if (index !== -1)\n callbacks.splice(index, 1);\n };\n }\n $set($$props) {\n if (this.$$set && !is_empty($$props)) {\n this.$$.skip_bound = true;\n this.$$set($$props);\n this.$$.skip_bound = false;\n }\n }\n };\n}\n/**\n * Base class for Svelte components. Used when dev=false.\n */\nclass SvelteComponent {\n $destroy() {\n destroy_component(this, 1);\n this.$destroy = noop;\n }\n $on(type, callback) {\n const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n callbacks.push(callback);\n return () => {\n const index = callbacks.indexOf(callback);\n if (index !== -1)\n callbacks.splice(index, 1);\n };\n }\n $set($$props) {\n if (this.$$set && !is_empty($$props)) {\n this.$$.skip_bound = true;\n this.$$set($$props);\n this.$$.skip_bound = false;\n }\n }\n}\n\nfunction dispatch_dev(type, detail) {\n document.dispatchEvent(custom_event(type, Object.assign({ version: '3.48.0' }, detail), { bubbles: true }));\n}\nfunction append_dev(target, node) {\n dispatch_dev('SvelteDOMInsert', { target, node });\n append(target, node);\n}\nfunction append_hydration_dev(target, node) {\n dispatch_dev('SvelteDOMInsert', { target, node });\n append_hydration(target, node);\n}\nfunction insert_dev(target, node, anchor) {\n dispatch_dev('SvelteDOMInsert', { target, node, anchor });\n insert(target, node, anchor);\n}\nfunction insert_hydration_dev(target, node, anchor) {\n dispatch_dev('SvelteDOMInsert', { target, node, anchor });\n insert_hydration(target, node, anchor);\n}\nfunction detach_dev(node) {\n dispatch_dev('SvelteDOMRemove', { node });\n detach(node);\n}\nfunction detach_between_dev(before, after) {\n while (before.nextSibling && before.nextSibling !== after) {\n detach_dev(before.nextSibling);\n }\n}\nfunction detach_before_dev(after) {\n while (after.previousSibling) {\n detach_dev(after.previousSibling);\n }\n}\nfunction detach_after_dev(before) {\n while (before.nextSibling) {\n detach_dev(before.nextSibling);\n }\n}\nfunction listen_dev(node, event, handler, options, has_prevent_default, has_stop_propagation) {\n const modifiers = options === true ? ['capture'] : options ? Array.from(Object.keys(options)) : [];\n if (has_prevent_default)\n modifiers.push('preventDefault');\n if (has_stop_propagation)\n modifiers.push('stopPropagation');\n dispatch_dev('SvelteDOMAddEventListener', { node, event, handler, modifiers });\n const dispose = listen(node, event, handler, options);\n return () => {\n dispatch_dev('SvelteDOMRemoveEventListener', { node, event, handler, modifiers });\n dispose();\n };\n}\nfunction attr_dev(node, attribute, value) {\n attr(node, attribute, value);\n if (value == null)\n dispatch_dev('SvelteDOMRemoveAttribute', { node, attribute });\n else\n dispatch_dev('SvelteDOMSetAttribute', { node, attribute, value });\n}\nfunction prop_dev(node, property, value) {\n node[property] = value;\n dispatch_dev('SvelteDOMSetProperty', { node, property, value });\n}\nfunction dataset_dev(node, property, value) {\n node.dataset[property] = value;\n dispatch_dev('SvelteDOMSetDataset', { node, property, value });\n}\nfunction set_data_dev(text, data) {\n data = '' + data;\n if (text.wholeText === data)\n return;\n dispatch_dev('SvelteDOMSetData', { node: text, data });\n text.data = data;\n}\nfunction validate_each_argument(arg) {\n if (typeof arg !== 'string' && !(arg && typeof arg === 'object' && 'length' in arg)) {\n let msg = '{#each} only iterates over array-like objects.';\n if (typeof Symbol === 'function' && arg && Symbol.iterator in arg) {\n msg += ' You can use a spread to convert this iterable into an array.';\n }\n throw new Error(msg);\n }\n}\nfunction validate_slots(name, slot, keys) {\n for (const slot_key of Object.keys(slot)) {\n if (!~keys.indexOf(slot_key)) {\n console.warn(`<${name}> received an unexpected slot \"${slot_key}\".`);\n }\n }\n}\nfunction validate_dynamic_element(tag) {\n const is_string = typeof tag === 'string';\n if (tag && !is_string) {\n throw new Error(' expects \"this\" attribute to be a string.');\n }\n}\nfunction validate_void_dynamic_element(tag) {\n if (tag && is_void(tag)) {\n throw new Error(` is self-closing and cannot have content.`);\n }\n}\n/**\n * Base class for Svelte components with some minor dev-enhancements. Used when dev=true.\n */\nclass SvelteComponentDev extends SvelteComponent {\n constructor(options) {\n if (!options || (!options.target && !options.$$inline)) {\n throw new Error(\"'target' is a required option\");\n }\n super();\n }\n $destroy() {\n super.$destroy();\n this.$destroy = () => {\n console.warn('Component was already destroyed'); // eslint-disable-line no-console\n };\n }\n $capture_state() { }\n $inject_state() { }\n}\n/**\n * Base class to create strongly typed Svelte components.\n * This only exists for typing purposes and should be used in `.d.ts` files.\n *\n * ### Example:\n *\n * You have component library on npm called `component-library`, from which\n * you export a component called `MyComponent`. For Svelte+TypeScript users,\n * you want to provide typings. Therefore you create a `index.d.ts`:\n * ```ts\n * import { SvelteComponentTyped } from \"svelte\";\n * export class MyComponent extends SvelteComponentTyped<{foo: string}> {}\n * ```\n * Typing this makes it possible for IDEs like VS Code with the Svelte extension\n * to provide intellisense and to use the component like this in a Svelte file\n * with TypeScript:\n * ```svelte\n * \n * \n * ```\n *\n * #### Why not make this part of `SvelteComponent(Dev)`?\n * Because\n * ```ts\n * class ASubclassOfSvelteComponent extends SvelteComponent<{foo: string}> {}\n * const component: typeof SvelteComponent = ASubclassOfSvelteComponent;\n * ```\n * will throw a type error, so we need to separate the more strictly typed class.\n */\nclass SvelteComponentTyped extends SvelteComponentDev {\n constructor(options) {\n super(options);\n }\n}\nfunction loop_guard(timeout) {\n const start = Date.now();\n return () => {\n if (Date.now() - start > timeout) {\n throw new Error('Infinite loop detected');\n }\n };\n}\n\nexport { HtmlTag, HtmlTagHydration, SvelteComponent, SvelteComponentDev, SvelteComponentTyped, SvelteElement, action_destroyer, add_attribute, add_classes, add_flush_callback, add_location, add_render_callback, add_resize_listener, add_styles, add_transform, afterUpdate, append, append_dev, append_empty_stylesheet, append_hydration, append_hydration_dev, append_styles, assign, attr, attr_dev, attribute_to_object, beforeUpdate, bind, binding_callbacks, blank_object, bubble, check_outros, children, claim_component, claim_element, claim_html_tag, claim_space, claim_svg_element, claim_text, clear_loops, component_subscribe, compute_rest_props, compute_slots, createEventDispatcher, create_animation, create_bidirectional_transition, create_component, create_in_transition, create_out_transition, create_slot, create_ssr_component, current_component, custom_event, dataset_dev, debug, destroy_block, destroy_component, destroy_each, detach, detach_after_dev, detach_before_dev, detach_between_dev, detach_dev, dirty_components, dispatch_dev, each, element, element_is, empty, end_hydrating, escape, escape_attribute_value, escape_object, escaped, exclude_internal_props, fix_and_destroy_block, fix_and_outro_and_destroy_block, fix_position, flush, getAllContexts, getContext, get_all_dirty_from_scope, get_binding_group_value, get_current_component, get_custom_elements_slots, get_root_for_style, get_slot_changes, get_spread_object, get_spread_update, get_store_value, globals, group_outros, handle_promise, hasContext, has_prop, identity, init, insert, insert_dev, insert_hydration, insert_hydration_dev, intros, invalid_attribute_name_character, is_client, is_crossorigin, is_empty, is_function, is_promise, is_void, listen, listen_dev, loop, loop_guard, merge_ssr_styles, missing_component, mount_component, noop, not_equal, now, null_to_empty, object_without_properties, onDestroy, onMount, once, outro_and_destroy_block, prevent_default, prop_dev, query_selector_all, raf, run, run_all, safe_not_equal, schedule_update, select_multiple_value, select_option, select_options, select_value, self, setContext, set_attributes, set_current_component, set_custom_element_data, set_data, set_data_dev, set_input_type, set_input_value, set_now, set_raf, set_store_value, set_style, set_svg_attributes, space, spread, src_url_equal, start_hydrating, stop_propagation, subscribe, svg_element, text, tick, time_ranges_to_array, to_number, toggle_class, transition_in, transition_out, trusted, update_await_block_branch, update_keyed_each, update_slot, update_slot_base, validate_component, validate_dynamic_element, validate_each_argument, validate_each_keys, validate_slots, validate_store, validate_void_dynamic_element, xlink_attr };\n","\n\n\n\n\n {@html text}\n\n","\n\n\n\n
    \n {#if buttons}\n {#each buttons as config}\n \n {/each}\n {/if}\n
    \n","\n\n\n\n\n ×\n\n","\n\n\n\n\n

    \n","\n\n\n\n
    \n {#if title}\n \n {/if}\n\n {#if cancelIcon && cancelIcon.enabled}\n \n {/if}\n
    \n","\n\n\n\n\n\n\n","\n\n\n\n\n {#if !isUndefined(step.options.title) || (step.options.cancelIcon && step.options.cancelIcon.enabled)}\n \n {/if}\n\n {#if !isUndefined(step.options.text)}\n \n {/if}\n\n {#if Array.isArray(step.options.buttons) && step.options.buttons.length}\n \n {/if}\n\n","\n\n\n\n\n {#if step.options.arrow && step.options.attachTo && step.options.attachTo.element && step.options.attachTo.on}\n
    \n {/if}\n \n\n","/**\n * Cleanup the steps and set pointerEvents back to 'auto'\n * @param tour The tour object\n */\nexport function cleanupSteps(tour) {\n if (tour) {\n const { steps } = tour;\n\n steps.forEach((step) => {\n if (\n step.options &&\n step.options.canClickTarget === false &&\n step.options.attachTo\n ) {\n if (step.target instanceof HTMLElement) {\n step.target.classList.remove('shepherd-target-click-disabled');\n }\n }\n });\n }\n}\n","\n\n\n \n\n\n\n","/**\n * Generates the svg path data for a rounded rectangle overlay\n * @param {Object} dimension - Dimensions of rectangle.\n * @param {number} width - Width.\n * @param {number} height - Height.\n * @param {number} [x=0] - Offset from top left corner in x axis. default 0.\n * @param {number} [y=0] - Offset from top left corner in y axis. default 0.\n * @param {number} [r=0] - Corner Radius. Keep this smaller than half of width or height.\n * @returns {string} - Rounded rectangle overlay path data.\n */\nexport function makeOverlayPath({ width, height, x = 0, y = 0, r = 0 }) {\n const { innerWidth: w, innerHeight: h } = window;\n\n return `M${w},${h}\\\nH0\\\nV0\\\nH${w}\\\nV${h}\\\nZ\\\nM${x + r},${y}\\\na${r},${r},0,0,0-${r},${r}\\\nV${height + y - r}\\\na${r},${r},0,0,0,${r},${r}\\\nH${width + x - r}\\\na${r},${r},0,0,0,${r}-${r}\\\nV${y + r}\\\na${r},${r},0,0,0-${r}-${r}\\\nZ`;\n}\n","import { isUndefined } from './utils/type-check';\n\nexport class Evented {\n on(event, handler, ctx, once = false) {\n if (isUndefined(this.bindings)) {\n this.bindings = {};\n }\n if (isUndefined(this.bindings[event])) {\n this.bindings[event] = [];\n }\n this.bindings[event].push({ handler, ctx, once });\n\n return this;\n }\n\n once(event, handler, ctx) {\n return this.on(event, handler, ctx, true);\n }\n\n off(event, handler) {\n if (isUndefined(this.bindings) || isUndefined(this.bindings[event])) {\n return this;\n }\n\n if (isUndefined(handler)) {\n delete this.bindings[event];\n } else {\n this.bindings[event].forEach((binding, index) => {\n if (binding.handler === handler) {\n this.bindings[event].splice(index, 1);\n }\n });\n }\n\n return this;\n }\n\n trigger(event, ...args) {\n if (!isUndefined(this.bindings) && this.bindings[event]) {\n this.bindings[event].forEach((binding, index) => {\n const { ctx, handler, once } = binding;\n\n const context = ctx || this;\n\n handler.apply(context, args);\n\n if (once) {\n this.bindings[event].splice(index, 1);\n }\n });\n }\n\n return this;\n }\n}\n","export var max = Math.max;\nexport var min = Math.min;\nexport var round = Math.round;","import getWindow from \"../dom-utils/getWindow.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};","import { popperGenerator, detectOverflow } from \"./createPopper.js\";\nimport eventListeners from \"./modifiers/eventListeners.js\";\nimport popperOffsets from \"./modifiers/popperOffsets.js\";\nimport computeStyles from \"./modifiers/computeStyles.js\";\nimport applyStyles from \"./modifiers/applyStyles.js\";\nimport offset from \"./modifiers/offset.js\";\nimport flip from \"./modifiers/flip.js\";\nimport preventOverflow from \"./modifiers/preventOverflow.js\";\nimport arrow from \"./modifiers/arrow.js\";\nimport hide from \"./modifiers/hide.js\";\nvar defaultModifiers = [eventListeners, popperOffsets, computeStyles, applyStyles, offset, flip, preventOverflow, arrow, hide];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper, popperGenerator, defaultModifiers, detectOverflow }; // eslint-disable-next-line import/no-unused-modules\n\nexport { createPopper as createPopperLite } from \"./popper-lite.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport * from \"./modifiers/index.js\";","import computeOffsets from \"../utils/computeOffsets.js\";\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};","import getNodeName from \"../dom-utils/getNodeName.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // This modifier takes the styles prepared by the `computeStyles` modifier\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe[cannot-write]\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n state.styles = initialStyles;\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n }\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect,\n requires: ['computeStyles']\n};","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport { top, left, right, placements } from \"../enums.js\"; // eslint-disable-next-line import/no-unused-modules\n\nexport function distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign({}, rects, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};","import { top, left, right, bottom, start } from \"../enums.js\";\nimport getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport getAltAxis from \"../utils/getAltAxis.js\";\nimport { within, withinMaxClamp } from \"../utils/within.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport detectOverflow from \"../utils/detectOverflow.js\";\nimport getVariation from \"../utils/getVariation.js\";\nimport getFreshSideObject from \"../utils/getFreshSideObject.js\";\nimport { min as mathMin, max as mathMax } from \"../utils/math.js\";\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign({}, state.rects, {\n placement: state.placement\n })) : tetherOffset;\n var normalizedTetherOffsetValue = typeof tetherOffsetValue === 'number' ? {\n mainAxis: tetherOffsetValue,\n altAxis: tetherOffsetValue\n } : Object.assign({\n mainAxis: 0,\n altAxis: 0\n }, tetherOffsetValue);\n var offsetModifierState = state.modifiersData.offset ? state.modifiersData.offset[state.placement] : null;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis) {\n var _offsetModifierState$;\n\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = offset + overflow[mainSide];\n var max = offset - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis : minLen - arrowLen - arrowPaddingMin - normalizedTetherOffsetValue.mainAxis;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis : maxLen + arrowLen + arrowPaddingMax + normalizedTetherOffsetValue.mainAxis;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = (_offsetModifierState$ = offsetModifierState == null ? void 0 : offsetModifierState[mainAxis]) != null ? _offsetModifierState$ : 0;\n var tetherMin = offset + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = offset + maxOffset - offsetModifierValue;\n var preventedOffset = within(tether ? mathMin(min, tetherMin) : min, offset, tether ? mathMax(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _offsetModifierState$2;\n\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _len = altAxis === 'y' ? 'height' : 'width';\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var isOriginSide = [top, left].indexOf(basePlacement) !== -1;\n\n var _offsetModifierValue = (_offsetModifierState$2 = offsetModifierState == null ? void 0 : offsetModifierState[altAxis]) != null ? _offsetModifierState$2 : 0;\n\n var _tetherMin = isOriginSide ? _min : _offset - referenceRect[_len] - popperRect[_len] - _offsetModifierValue + normalizedTetherOffsetValue.altAxis;\n\n var _tetherMax = isOriginSide ? _offset + referenceRect[_len] + popperRect[_len] - _offsetModifierValue - normalizedTetherOffsetValue.altAxis : _max;\n\n var _preventedOffset = tether && isOriginSide ? withinMaxClamp(_tetherMin, _offset, _tetherMax) : within(tether ? _tetherMin : _min, _offset, tether ? _tetherMax : _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};","export default function getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}","import { max as mathMax, min as mathMin } from \"./math.js\";\nexport function within(min, value, max) {\n return mathMax(min, mathMin(value, max));\n}\nexport function withinMaxClamp(min, value, max) {\n var v = within(min, value, max);\n return v > max ? max : v;\n}","import getBasePlacement from \"../utils/getBasePlacement.js\";\nimport getLayoutRect from \"../dom-utils/getLayoutRect.js\";\nimport contains from \"../dom-utils/contains.js\";\nimport getOffsetParent from \"../dom-utils/getOffsetParent.js\";\nimport getMainAxisFromPlacement from \"../utils/getMainAxisFromPlacement.js\";\nimport { within } from \"../utils/within.js\";\nimport mergePaddingObject from \"../utils/mergePaddingObject.js\";\nimport expandToHashMap from \"../utils/expandToHashMap.js\";\nimport { left, right, basePlacements, top, bottom } from \"../enums.js\";\nimport { isHTMLElement } from \"../dom-utils/instanceOf.js\"; // eslint-disable-next-line import/no-unused-modules\n\nvar toPaddingObject = function toPaddingObject(padding, state) {\n padding = typeof padding === 'function' ? padding(Object.assign({}, state.rects, {\n placement: state.placement\n })) : padding;\n return mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name,\n options = _ref.options;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = toPaddingObject(options.padding, state);\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect(_ref2) {\n var state = _ref2.state,\n options = _ref2.options;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (process.env.NODE_ENV !== \"production\") {\n if (!isHTMLElement(arrowElement)) {\n console.error(['Popper: \"arrow\" element must be an HTMLElement (not an SVGElement).', 'To use an SVG arrow, wrap it in an HTMLElement that will be used as', 'the arrow.'].join(' '));\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n if (process.env.NODE_ENV !== \"production\") {\n console.error(['Popper: \"arrow\" modifier\\'s `element` must be a child of the popper', 'element.'].join(' '));\n }\n\n return;\n }\n\n state.elements.arrow = arrowElement;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nexport default {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};","/* smoothscroll v0.4.4 - 2019 - Dustan Kasten, Jeremias Menichelli - MIT License */\n(function () {\n 'use strict';\n\n // polyfill\n function polyfill() {\n // aliases\n var w = window;\n var d = document;\n\n // return if scroll behavior is supported and polyfill is not forced\n if (\n 'scrollBehavior' in d.documentElement.style &&\n w.__forceSmoothScrollPolyfill__ !== true\n ) {\n return;\n }\n\n // globals\n var Element = w.HTMLElement || w.Element;\n var SCROLL_TIME = 468;\n\n // object gathering original scroll methods\n var original = {\n scroll: w.scroll || w.scrollTo,\n scrollBy: w.scrollBy,\n elementScroll: Element.prototype.scroll || scrollElement,\n scrollIntoView: Element.prototype.scrollIntoView\n };\n\n // define timing method\n var now =\n w.performance && w.performance.now\n ? w.performance.now.bind(w.performance)\n : Date.now;\n\n /**\n * indicates if a the current browser is made by Microsoft\n * @method isMicrosoftBrowser\n * @param {String} userAgent\n * @returns {Boolean}\n */\n function isMicrosoftBrowser(userAgent) {\n var userAgentPatterns = ['MSIE ', 'Trident/', 'Edge/'];\n\n return new RegExp(userAgentPatterns.join('|')).test(userAgent);\n }\n\n /*\n * IE has rounding bug rounding down clientHeight and clientWidth and\n * rounding up scrollHeight and scrollWidth causing false positives\n * on hasScrollableSpace\n */\n var ROUNDING_TOLERANCE = isMicrosoftBrowser(w.navigator.userAgent) ? 1 : 0;\n\n /**\n * changes scroll position inside an element\n * @method scrollElement\n * @param {Number} x\n * @param {Number} y\n * @returns {undefined}\n */\n function scrollElement(x, y) {\n this.scrollLeft = x;\n this.scrollTop = y;\n }\n\n /**\n * returns result of applying ease math function to a number\n * @method ease\n * @param {Number} k\n * @returns {Number}\n */\n function ease(k) {\n return 0.5 * (1 - Math.cos(Math.PI * k));\n }\n\n /**\n * indicates if a smooth behavior should be applied\n * @method shouldBailOut\n * @param {Number|Object} firstArg\n * @returns {Boolean}\n */\n function shouldBailOut(firstArg) {\n if (\n firstArg === null ||\n typeof firstArg !== 'object' ||\n firstArg.behavior === undefined ||\n firstArg.behavior === 'auto' ||\n firstArg.behavior === 'instant'\n ) {\n // first argument is not an object/null\n // or behavior is auto, instant or undefined\n return true;\n }\n\n if (typeof firstArg === 'object' && firstArg.behavior === 'smooth') {\n // first argument is an object and behavior is smooth\n return false;\n }\n\n // throw error when behavior is not supported\n throw new TypeError(\n 'behavior member of ScrollOptions ' +\n firstArg.behavior +\n ' is not a valid value for enumeration ScrollBehavior.'\n );\n }\n\n /**\n * indicates if an element has scrollable space in the provided axis\n * @method hasScrollableSpace\n * @param {Node} el\n * @param {String} axis\n * @returns {Boolean}\n */\n function hasScrollableSpace(el, axis) {\n if (axis === 'Y') {\n return el.clientHeight + ROUNDING_TOLERANCE < el.scrollHeight;\n }\n\n if (axis === 'X') {\n return el.clientWidth + ROUNDING_TOLERANCE < el.scrollWidth;\n }\n }\n\n /**\n * indicates if an element has a scrollable overflow property in the axis\n * @method canOverflow\n * @param {Node} el\n * @param {String} axis\n * @returns {Boolean}\n */\n function canOverflow(el, axis) {\n var overflowValue = w.getComputedStyle(el, null)['overflow' + axis];\n\n return overflowValue === 'auto' || overflowValue === 'scroll';\n }\n\n /**\n * indicates if an element can be scrolled in either axis\n * @method isScrollable\n * @param {Node} el\n * @param {String} axis\n * @returns {Boolean}\n */\n function isScrollable(el) {\n var isScrollableY = hasScrollableSpace(el, 'Y') && canOverflow(el, 'Y');\n var isScrollableX = hasScrollableSpace(el, 'X') && canOverflow(el, 'X');\n\n return isScrollableY || isScrollableX;\n }\n\n /**\n * finds scrollable parent of an element\n * @method findScrollableParent\n * @param {Node} el\n * @returns {Node} el\n */\n function findScrollableParent(el) {\n while (el !== d.body && isScrollable(el) === false) {\n el = el.parentNode || el.host;\n }\n\n return el;\n }\n\n /**\n * self invoked function that, given a context, steps through scrolling\n * @method step\n * @param {Object} context\n * @returns {undefined}\n */\n function step(context) {\n var time = now();\n var value;\n var currentX;\n var currentY;\n var elapsed = (time - context.startTime) / SCROLL_TIME;\n\n // avoid elapsed times higher than one\n elapsed = elapsed > 1 ? 1 : elapsed;\n\n // apply easing to elapsed time\n value = ease(elapsed);\n\n currentX = context.startX + (context.x - context.startX) * value;\n currentY = context.startY + (context.y - context.startY) * value;\n\n context.method.call(context.scrollable, currentX, currentY);\n\n // scroll more if we have not reached our destination\n if (currentX !== context.x || currentY !== context.y) {\n w.requestAnimationFrame(step.bind(w, context));\n }\n }\n\n /**\n * scrolls window or element with a smooth behavior\n * @method smoothScroll\n * @param {Object|Node} el\n * @param {Number} x\n * @param {Number} y\n * @returns {undefined}\n */\n function smoothScroll(el, x, y) {\n var scrollable;\n var startX;\n var startY;\n var method;\n var startTime = now();\n\n // define scroll context\n if (el === d.body) {\n scrollable = w;\n startX = w.scrollX || w.pageXOffset;\n startY = w.scrollY || w.pageYOffset;\n method = original.scroll;\n } else {\n scrollable = el;\n startX = el.scrollLeft;\n startY = el.scrollTop;\n method = scrollElement;\n }\n\n // scroll looping over a frame\n step({\n scrollable: scrollable,\n method: method,\n startTime: startTime,\n startX: startX,\n startY: startY,\n x: x,\n y: y\n });\n }\n\n // ORIGINAL METHODS OVERRIDES\n // w.scroll and w.scrollTo\n w.scroll = w.scrollTo = function() {\n // avoid action when no arguments are passed\n if (arguments[0] === undefined) {\n return;\n }\n\n // avoid smooth behavior if not required\n if (shouldBailOut(arguments[0]) === true) {\n original.scroll.call(\n w,\n arguments[0].left !== undefined\n ? arguments[0].left\n : typeof arguments[0] !== 'object'\n ? arguments[0]\n : w.scrollX || w.pageXOffset,\n // use top prop, second argument if present or fallback to scrollY\n arguments[0].top !== undefined\n ? arguments[0].top\n : arguments[1] !== undefined\n ? arguments[1]\n : w.scrollY || w.pageYOffset\n );\n\n return;\n }\n\n // LET THE SMOOTHNESS BEGIN!\n smoothScroll.call(\n w,\n d.body,\n arguments[0].left !== undefined\n ? ~~arguments[0].left\n : w.scrollX || w.pageXOffset,\n arguments[0].top !== undefined\n ? ~~arguments[0].top\n : w.scrollY || w.pageYOffset\n );\n };\n\n // w.scrollBy\n w.scrollBy = function() {\n // avoid action when no arguments are passed\n if (arguments[0] === undefined) {\n return;\n }\n\n // avoid smooth behavior if not required\n if (shouldBailOut(arguments[0])) {\n original.scrollBy.call(\n w,\n arguments[0].left !== undefined\n ? arguments[0].left\n : typeof arguments[0] !== 'object' ? arguments[0] : 0,\n arguments[0].top !== undefined\n ? arguments[0].top\n : arguments[1] !== undefined ? arguments[1] : 0\n );\n\n return;\n }\n\n // LET THE SMOOTHNESS BEGIN!\n smoothScroll.call(\n w,\n d.body,\n ~~arguments[0].left + (w.scrollX || w.pageXOffset),\n ~~arguments[0].top + (w.scrollY || w.pageYOffset)\n );\n };\n\n // Element.prototype.scroll and Element.prototype.scrollTo\n Element.prototype.scroll = Element.prototype.scrollTo = function() {\n // avoid action when no arguments are passed\n if (arguments[0] === undefined) {\n return;\n }\n\n // avoid smooth behavior if not required\n if (shouldBailOut(arguments[0]) === true) {\n // if one number is passed, throw error to match Firefox implementation\n if (typeof arguments[0] === 'number' && arguments[1] === undefined) {\n throw new SyntaxError('Value could not be converted');\n }\n\n original.elementScroll.call(\n this,\n // use left prop, first number argument or fallback to scrollLeft\n arguments[0].left !== undefined\n ? ~~arguments[0].left\n : typeof arguments[0] !== 'object' ? ~~arguments[0] : this.scrollLeft,\n // use top prop, second argument or fallback to scrollTop\n arguments[0].top !== undefined\n ? ~~arguments[0].top\n : arguments[1] !== undefined ? ~~arguments[1] : this.scrollTop\n );\n\n return;\n }\n\n var left = arguments[0].left;\n var top = arguments[0].top;\n\n // LET THE SMOOTHNESS BEGIN!\n smoothScroll.call(\n this,\n this,\n typeof left === 'undefined' ? this.scrollLeft : ~~left,\n typeof top === 'undefined' ? this.scrollTop : ~~top\n );\n };\n\n // Element.prototype.scrollBy\n Element.prototype.scrollBy = function() {\n // avoid action when no arguments are passed\n if (arguments[0] === undefined) {\n return;\n }\n\n // avoid smooth behavior if not required\n if (shouldBailOut(arguments[0]) === true) {\n original.elementScroll.call(\n this,\n arguments[0].left !== undefined\n ? ~~arguments[0].left + this.scrollLeft\n : ~~arguments[0] + this.scrollLeft,\n arguments[0].top !== undefined\n ? ~~arguments[0].top + this.scrollTop\n : ~~arguments[1] + this.scrollTop\n );\n\n return;\n }\n\n this.scroll({\n left: ~~arguments[0].left + this.scrollLeft,\n top: ~~arguments[0].top + this.scrollTop,\n behavior: arguments[0].behavior\n });\n };\n\n // Element.prototype.scrollIntoView\n Element.prototype.scrollIntoView = function() {\n // avoid smooth behavior if not required\n if (shouldBailOut(arguments[0]) === true) {\n original.scrollIntoView.call(\n this,\n arguments[0] === undefined ? true : arguments[0]\n );\n\n return;\n }\n\n // LET THE SMOOTHNESS BEGIN!\n var scrollableParent = findScrollableParent(this);\n var parentRects = scrollableParent.getBoundingClientRect();\n var clientRects = this.getBoundingClientRect();\n\n if (scrollableParent !== d.body) {\n // reveal element inside parent\n smoothScroll.call(\n this,\n scrollableParent,\n scrollableParent.scrollLeft + clientRects.left - parentRects.left,\n scrollableParent.scrollTop + clientRects.top - parentRects.top\n );\n\n // reveal parent in viewport unless is fixed\n if (w.getComputedStyle(scrollableParent).position !== 'fixed') {\n w.scrollBy({\n left: parentRects.left,\n top: parentRects.top,\n behavior: 'smooth'\n });\n }\n } else {\n // reveal element in viewport\n w.scrollBy({\n left: clientRects.left,\n top: clientRects.top,\n behavior: 'smooth'\n });\n }\n };\n }\n\n if (typeof exports === 'object' && typeof module !== 'undefined') {\n // commonjs\n module.exports = { polyfill: polyfill };\n } else {\n // global\n polyfill();\n }\n\n}());\n","import merge from 'deepmerge';\nimport { Evented } from './evented.js';\nimport autoBind from './utils/auto-bind.js';\nimport {\n isElement,\n isHTMLElement,\n isFunction,\n isUndefined\n} from './utils/type-check.js';\nimport { bindAdvance } from './utils/bind.js';\nimport {\n setupTooltip,\n parseAttachTo,\n normalizePrefix,\n uuid\n} from './utils/general.js';\nimport ShepherdElement from './components/shepherd-element.svelte';\n\n// Polyfills\nimport smoothscroll from 'smoothscroll-polyfill';\nsmoothscroll.polyfill();\n\n/**\n * A class representing steps to be added to a tour.\n * @extends {Evented}\n */\nexport class Step extends Evented {\n /**\n * Create a step\n * @param {Tour} tour The tour for the step\n * @param {object} options The options for the step\n * @param {boolean} options.arrow Whether to display the arrow for the tooltip or not. Defaults to `true`.\n * @param {object} options.attachTo The element the step should be attached to on the page.\n * An object with properties `element` and `on`.\n *\n * ```js\n * const step = new Step(tour, {\n * attachTo: { element: '.some .selector-path', on: 'left' },\n * ...moreOptions\n * });\n * ```\n *\n * If you don’t specify an `attachTo` the element will appear in the middle of the screen. The same will happen if your `attachTo.element` callback returns `null`, `undefined`, or a selector that does not exist in the DOM.\n * If you omit the `on` portion of `attachTo`, the element will still be highlighted, but the tooltip will appear\n * in the middle of the screen, without an arrow pointing to the target.\n * If the element to highlight does not yet exist while instantiating tour steps, you may use lazy evaluation by supplying a function to `attachTo.element`. The function will be called in the `before-show` phase.\n * @param {string|HTMLElement|function} options.attachTo.element An element selector string, DOM element, or a function (returning a selector, a DOM element, `null` or `undefined`).\n * @param {string} options.attachTo.on The optional direction to place the Popper tooltip relative to the element.\n * - Possible string values: 'auto', 'auto-start', 'auto-end', 'top', 'top-start', 'top-end', 'bottom', 'bottom-start', 'bottom-end', 'right', 'right-start', 'right-end', 'left', 'left-start', 'left-end'\n * @param {Object} options.advanceOn An action on the page which should advance shepherd to the next step.\n * It should be an object with a string `selector` and an `event` name\n * ```js\n * const step = new Step(tour, {\n * advanceOn: { selector: '.some .selector-path', event: 'click' },\n * ...moreOptions\n * });\n * ```\n * `event` doesn’t have to be an event inside the tour, it can be any event fired on any element on the page.\n * You can also always manually advance the Tour by calling `myTour.next()`.\n * @param {function} options.beforeShowPromise A function that returns a promise.\n * When the promise resolves, the rest of the `show` code for the step will execute.\n * @param {Object[]} options.buttons An array of buttons to add to the step. These will be rendered in a\n * footer below the main body text.\n * @param {function} options.buttons.button.action A function executed when the button is clicked on.\n * It is automatically bound to the `tour` the step is associated with, so things like `this.next` will\n * work inside the action.\n * You can use action to skip steps or navigate to specific steps, with something like:\n * ```js\n * action() {\n * return this.show('some_step_name');\n * }\n * ```\n * @param {string} options.buttons.button.classes Extra classes to apply to the `
    `\n * @param {boolean} options.buttons.button.disabled Should the button be disabled?\n * @param {string} options.buttons.button.label The aria-label text of the button\n * @param {boolean} options.buttons.button.secondary If true, a shepherd-button-secondary class is applied to the button\n * @param {string} options.buttons.button.text The HTML text of the button\n * @param {boolean} options.canClickTarget A boolean, that when set to false, will set `pointer-events: none` on the target\n * @param {object} options.cancelIcon Options for the cancel icon\n * @param {boolean} options.cancelIcon.enabled Should a cancel “✕” be shown in the header of the step?\n * @param {string} options.cancelIcon.label The label to add for `aria-label`\n * @param {string} options.classes A string of extra classes to add to the step's content element.\n * @param {string} options.highlightClass An extra class to apply to the `attachTo` element when it is\n * highlighted (that is, when its step is active). You can then target that selector in your CSS.\n * @param {string} options.id The string to use as the `id` for the step.\n * @param {number} options.modalOverlayOpeningPadding An amount of padding to add around the modal overlay opening\n * @param {number} options.modalOverlayOpeningRadius An amount of border radius to add around the modal overlay opening\n * @param {object} options.popperOptions Extra options to pass to Popper\n * @param {boolean|Object} options.scrollTo Should the element be scrolled to when this step is shown? If true, uses the default `scrollIntoView`,\n * if an object, passes that object as the params to `scrollIntoView` i.e. `{behavior: 'smooth', block: 'center'}`\n * @param {function} options.scrollToHandler A function that lets you override the default scrollTo behavior and\n * define a custom action to do the scrolling, and possibly other logic.\n * @param {function} options.showOn A function that, when it returns `true`, will show the step.\n * If it returns false, the step will be skipped.\n * @param {string} options.text The text in the body of the step. It can be one of three types:\n * ```\n * - HTML string\n * - `HTMLElement` object\n * - `Function` to be executed when the step is built. It must return one the two options above.\n * ```\n * @param {string} options.title The step's title. It becomes an `h3` at the top of the step. It can be one of two types:\n * ```\n * - HTML string\n * - `Function` to be executed when the step is built. It must return HTML string.\n * ```\n * @param {object} options.when You can define `show`, `hide`, etc events inside `when`. For example:\n * ```js\n * when: {\n * show: function() {\n * window.scrollTo(0, 0);\n * }\n * }\n * ```\n * @return {Step} The newly created Step instance\n */\n constructor(tour, options = {}) {\n super(tour, options);\n this.tour = tour;\n this.classPrefix = this.tour.options\n ? normalizePrefix(this.tour.options.classPrefix)\n : '';\n this.styles = tour.styles;\n\n /**\n * Resolved attachTo options. Due to lazy evaluation, we only resolve the options during `before-show` phase.\n * Do not use this directly, use the _getResolvedAttachToOptions method instead.\n * @type {null|{}|{element, to}}\n * @private\n */\n this._resolvedAttachTo = null;\n\n autoBind(this);\n\n this._setOptions(options);\n\n return this;\n }\n\n /**\n * Cancel the tour\n * Triggers the `cancel` event\n */\n cancel() {\n this.tour.cancel();\n this.trigger('cancel');\n }\n\n /**\n * Complete the tour\n * Triggers the `complete` event\n */\n complete() {\n this.tour.complete();\n this.trigger('complete');\n }\n\n /**\n * Remove the step, delete the step's element, and destroy the Popper instance for the step.\n * Triggers `destroy` event\n */\n destroy() {\n if (this.tooltip) {\n this.tooltip.destroy();\n this.tooltip = null;\n }\n\n if (isHTMLElement(this.el) && this.el.parentNode) {\n this.el.parentNode.removeChild(this.el);\n this.el = null;\n }\n\n this._updateStepTargetOnHide();\n\n this.trigger('destroy');\n }\n\n /**\n * Returns the tour for the step\n * @return {Tour} The tour instance\n */\n getTour() {\n return this.tour;\n }\n\n /**\n * Hide the step\n */\n hide() {\n this.tour.modal.hide();\n\n this.trigger('before-hide');\n\n if (this.el) {\n this.el.hidden = true;\n }\n\n this._updateStepTargetOnHide();\n\n this.trigger('hide');\n }\n\n /**\n * Resolves attachTo options.\n * @returns {{}|{element, on}}\n * @private\n */\n _resolveAttachToOptions() {\n this._resolvedAttachTo = parseAttachTo(this);\n return this._resolvedAttachTo;\n }\n\n /**\n * A selector for resolved attachTo options.\n * @returns {{}|{element, on}}\n * @private\n */\n _getResolvedAttachToOptions() {\n if (this._resolvedAttachTo === null) {\n return this._resolveAttachToOptions();\n }\n\n return this._resolvedAttachTo;\n }\n\n /**\n * Check if the step is open and visible\n * @return {boolean} True if the step is open and visible\n */\n isOpen() {\n return Boolean(this.el && !this.el.hidden);\n }\n\n /**\n * Wraps `_show` and ensures `beforeShowPromise` resolves before calling show\n * @return {*|Promise}\n */\n show() {\n if (isFunction(this.options.beforeShowPromise)) {\n const beforeShowPromise = this.options.beforeShowPromise();\n if (!isUndefined(beforeShowPromise)) {\n return beforeShowPromise.then(() => this._show());\n }\n }\n this._show();\n }\n\n /**\n * Updates the options of the step.\n *\n * @param {Object} options The options for the step\n */\n updateStepOptions(options) {\n Object.assign(this.options, options);\n\n if (this.shepherdElementComponent) {\n this.shepherdElementComponent.$set({ step: this });\n }\n }\n\n /**\n * Returns the element for the step\n * @return {HTMLElement|null|undefined} The element instance. undefined if it has never been shown, null if it has been destroyed\n */\n getElement() {\n return this.el;\n }\n\n /**\n * Returns the target for the step\n * @return {HTMLElement|null|undefined} The element instance. undefined if it has never been shown, null if query string has not been found\n */\n getTarget() {\n return this.target;\n }\n\n /**\n * Creates Shepherd element for step based on options\n *\n * @return {Element} The DOM element for the step tooltip\n * @private\n */\n _createTooltipContent() {\n const descriptionId = `${this.id}-description`;\n const labelId = `${this.id}-label`;\n\n this.shepherdElementComponent = new ShepherdElement({\n target: this.tour.options.stepsContainer || document.body,\n props: {\n classPrefix: this.classPrefix,\n descriptionId,\n labelId,\n step: this,\n styles: this.styles\n }\n });\n\n return this.shepherdElementComponent.getElement();\n }\n\n /**\n * If a custom scrollToHandler is defined, call that, otherwise do the generic\n * scrollIntoView call.\n *\n * @param {boolean|Object} scrollToOptions If true, uses the default `scrollIntoView`,\n * if an object, passes that object as the params to `scrollIntoView` i.e. `{ behavior: 'smooth', block: 'center' }`\n * @private\n */\n _scrollTo(scrollToOptions) {\n const { element } = this._getResolvedAttachToOptions();\n\n if (isFunction(this.options.scrollToHandler)) {\n this.options.scrollToHandler(element);\n } else if (\n isElement(element) &&\n typeof element.scrollIntoView === 'function'\n ) {\n element.scrollIntoView(scrollToOptions);\n }\n }\n\n /**\n * _getClassOptions gets all possible classes for the step\n * @param {Object} stepOptions The step specific options\n * @returns {String} unique string from array of classes\n * @private\n */\n _getClassOptions(stepOptions) {\n const defaultStepOptions =\n this.tour && this.tour.options && this.tour.options.defaultStepOptions;\n const stepClasses = stepOptions.classes ? stepOptions.classes : '';\n const defaultStepOptionsClasses =\n defaultStepOptions && defaultStepOptions.classes\n ? defaultStepOptions.classes\n : '';\n const allClasses = [\n ...stepClasses.split(' '),\n ...defaultStepOptionsClasses.split(' ')\n ];\n const uniqClasses = new Set(allClasses);\n\n return Array.from(uniqClasses).join(' ').trim();\n }\n\n /**\n * Sets the options for the step, maps `when` to events, sets up buttons\n * @param {Object} options The options for the step\n * @private\n */\n _setOptions(options = {}) {\n let tourOptions =\n this.tour && this.tour.options && this.tour.options.defaultStepOptions;\n\n tourOptions = merge({}, tourOptions || {});\n\n this.options = Object.assign(\n {\n arrow: true\n },\n tourOptions,\n options\n );\n\n const { when } = this.options;\n\n this.options.classes = this._getClassOptions(options);\n\n this.destroy();\n this.id = this.options.id || `step-${uuid()}`;\n\n if (when) {\n Object.keys(when).forEach((event) => {\n this.on(event, when[event], this);\n });\n }\n }\n\n /**\n * Create the element and set up the Popper instance\n * @private\n */\n _setupElements() {\n if (!isUndefined(this.el)) {\n this.destroy();\n }\n\n this.el = this._createTooltipContent();\n\n if (this.options.advanceOn) {\n bindAdvance(this);\n }\n setupTooltip(this);\n }\n\n /**\n * Triggers `before-show`, generates the tooltip DOM content,\n * sets up a Popper instance for the tooltip, then triggers `show`.\n * @private\n */\n _show() {\n this.trigger('before-show');\n\n // Force resolve to make sure the options are updated on subsequent shows.\n this._resolveAttachToOptions();\n this._setupElements();\n\n if (!this.tour.modal) {\n this.tour._setupModal();\n }\n\n this.tour.modal.setupForStep(this);\n this._styleTargetElementForStep(this);\n this.el.hidden = false;\n\n // start scrolling to target before showing the step\n if (this.options.scrollTo) {\n setTimeout(() => {\n this._scrollTo(this.options.scrollTo);\n });\n }\n\n this.el.hidden = false;\n\n const content = this.shepherdElementComponent.getElement();\n const target = this.target || document.body;\n target.classList.add(`${this.classPrefix}shepherd-enabled`);\n target.classList.add(`${this.classPrefix}shepherd-target`);\n content.classList.add('shepherd-enabled');\n\n this.trigger('show');\n }\n\n /**\n * Modulates the styles of the passed step's target element, based on the step's options and\n * the tour's `modal` option, to visually emphasize the element\n *\n * @param step The step object that attaches to the element\n * @private\n */\n _styleTargetElementForStep(step) {\n const targetElement = step.target;\n\n if (!targetElement) {\n return;\n }\n\n if (step.options.highlightClass) {\n targetElement.classList.add(step.options.highlightClass);\n }\n\n targetElement.classList.remove('shepherd-target-click-disabled');\n\n if (step.options.canClickTarget === false) {\n targetElement.classList.add('shepherd-target-click-disabled');\n }\n }\n\n /**\n * When a step is hidden, remove the highlightClass and 'shepherd-enabled'\n * and 'shepherd-target' classes\n * @private\n */\n _updateStepTargetOnHide() {\n const target = this.target || document.body;\n\n if (this.options.highlightClass) {\n target.classList.remove(this.options.highlightClass);\n }\n\n target.classList.remove(\n 'shepherd-target-click-disabled',\n `${this.classPrefix}shepherd-enabled`,\n `${this.classPrefix}shepherd-target`\n );\n }\n}\n","import { Evented } from './evented.js';\nimport { Step } from './step.js';\nimport autoBind from './utils/auto-bind.js';\nimport {\n isHTMLElement,\n isFunction,\n isString,\n isUndefined\n} from './utils/type-check.js';\nimport { cleanupSteps } from './utils/cleanup.js';\nimport { normalizePrefix, uuid } from './utils/general.js';\nimport ShepherdModal from './components/shepherd-modal.svelte';\n\nconst Shepherd = new Evented();\n\n/**\n * Class representing the site tour\n * @extends {Evented}\n */\nexport class Tour extends Evented {\n /**\n * @param {Object} options The options for the tour\n * @param {boolean} options.confirmCancel If true, will issue a `window.confirm` before cancelling\n * @param {string} options.confirmCancelMessage The message to display in the confirm dialog\n * @param {string} options.classPrefix The prefix to add to the `shepherd-enabled` and `shepherd-target` class names as well as the `data-shepherd-step-id`.\n * @param {Object} options.defaultStepOptions Default options for Steps ({@link Step#constructor}), created through `addStep`\n * @param {boolean} options.exitOnEsc Exiting the tour with the escape key will be enabled unless this is explicitly\n * set to false.\n * @param {boolean} options.keyboardNavigation Navigating the tour via left and right arrow keys will be enabled\n * unless this is explicitly set to false.\n * @param {HTMLElement} options.stepsContainer An optional container element for the steps.\n * If not set, the steps will be appended to `document.body`.\n * @param {HTMLElement} options.modalContainer An optional container element for the modal.\n * If not set, the modal will be appended to `document.body`.\n * @param {object[] | Step[]} options.steps An array of step options objects or Step instances to initialize the tour with\n * @param {string} options.tourName An optional \"name\" for the tour. This will be appended to the the tour's\n * dynamically generated `id` property -- which is also set on the `body` element as the `data-shepherd-active-tour` attribute\n * whenever the tour becomes active.\n * @param {boolean} options.useModalOverlay Whether or not steps should be placed above a darkened\n * modal overlay. If true, the overlay will create an opening around the target element so that it\n * can remain interactive\n * @returns {Tour}\n */\n constructor(options = {}) {\n super(options);\n\n autoBind(this);\n\n const defaultTourOptions = {\n exitOnEsc: true,\n keyboardNavigation: true\n };\n\n this.options = Object.assign({}, defaultTourOptions, options);\n this.classPrefix = normalizePrefix(this.options.classPrefix);\n this.steps = [];\n this.addSteps(this.options.steps);\n\n // Pass these events onto the global Shepherd object\n const events = [\n 'active',\n 'cancel',\n 'complete',\n 'inactive',\n 'show',\n 'start'\n ];\n events.map((event) => {\n ((e) => {\n this.on(e, (opts) => {\n opts = opts || {};\n opts.tour = this;\n Shepherd.trigger(e, opts);\n });\n })(event);\n });\n\n this._setTourID();\n\n return this;\n }\n\n /**\n * Adds a new step to the tour\n * @param {Object|Step} options An object containing step options or a Step instance\n * @param {number} index The optional index to insert the step at. If undefined, the step\n * is added to the end of the array.\n * @return {Step} The newly added step\n */\n addStep(options, index) {\n let step = options;\n\n if (!(step instanceof Step)) {\n step = new Step(this, step);\n } else {\n step.tour = this;\n }\n\n if (!isUndefined(index)) {\n this.steps.splice(index, 0, step);\n } else {\n this.steps.push(step);\n }\n\n return step;\n }\n\n /**\n * Add multiple steps to the tour\n * @param {Array | Array} steps The steps to add to the tour\n */\n addSteps(steps) {\n if (Array.isArray(steps)) {\n steps.forEach((step) => {\n this.addStep(step);\n });\n }\n\n return this;\n }\n\n /**\n * Go to the previous step in the tour\n */\n back() {\n const index = this.steps.indexOf(this.currentStep);\n this.show(index - 1, false);\n }\n\n /**\n * Calls _done() triggering the 'cancel' event\n * If `confirmCancel` is true, will show a window.confirm before cancelling\n */\n cancel() {\n if (this.options.confirmCancel) {\n const cancelMessage =\n this.options.confirmCancelMessage ||\n 'Are you sure you want to stop the tour?';\n const stopTour = window.confirm(cancelMessage);\n if (stopTour) {\n this._done('cancel');\n }\n } else {\n this._done('cancel');\n }\n }\n\n /**\n * Calls _done() triggering the `complete` event\n */\n complete() {\n this._done('complete');\n }\n\n /**\n * Gets the step from a given id\n * @param {Number|String} id The id of the step to retrieve\n * @return {Step} The step corresponding to the `id`\n */\n getById(id) {\n return this.steps.find((step) => {\n return step.id === id;\n });\n }\n\n /**\n * Gets the current step\n * @returns {Step|null}\n */\n getCurrentStep() {\n return this.currentStep;\n }\n\n /**\n * Hide the current step\n */\n hide() {\n const currentStep = this.getCurrentStep();\n\n if (currentStep) {\n return currentStep.hide();\n }\n }\n\n /**\n * Check if the tour is active\n * @return {boolean}\n */\n isActive() {\n return Shepherd.activeTour === this;\n }\n\n /**\n * Go to the next step in the tour\n * If we are at the end, call `complete`\n */\n next() {\n const index = this.steps.indexOf(this.currentStep);\n\n if (index === this.steps.length - 1) {\n this.complete();\n } else {\n this.show(index + 1, true);\n }\n }\n\n /**\n * Removes the step from the tour\n * @param {String} name The id for the step to remove\n */\n removeStep(name) {\n const current = this.getCurrentStep();\n\n // Find the step, destroy it and remove it from this.steps\n this.steps.some((step, i) => {\n if (step.id === name) {\n if (step.isOpen()) {\n step.hide();\n }\n\n step.destroy();\n this.steps.splice(i, 1);\n\n return true;\n }\n });\n\n if (current && current.id === name) {\n this.currentStep = undefined;\n\n // If we have steps left, show the first one, otherwise just cancel the tour\n this.steps.length ? this.show(0) : this.cancel();\n }\n }\n\n /**\n * Show a specific step in the tour\n * @param {Number|String} key The key to look up the step by\n * @param {Boolean} forward True if we are going forward, false if backward\n */\n show(key = 0, forward = true) {\n const step = isString(key) ? this.getById(key) : this.steps[key];\n\n if (step) {\n this._updateStateBeforeShow();\n\n const shouldSkipStep =\n isFunction(step.options.showOn) && !step.options.showOn();\n\n // If `showOn` returns false, we want to skip the step, otherwise, show the step like normal\n if (shouldSkipStep) {\n this._skipStep(step, forward);\n } else {\n this.trigger('show', {\n step,\n previous: this.currentStep\n });\n\n this.currentStep = step;\n step.show();\n }\n }\n }\n\n /**\n * Start the tour\n */\n start() {\n this.trigger('start');\n\n // Save the focused element before the tour opens\n this.focusedElBeforeOpen = document.activeElement;\n\n this.currentStep = null;\n\n this._setupModal();\n\n this._setupActiveTour();\n this.next();\n }\n\n /**\n * Called whenever the tour is cancelled or completed, basically anytime we exit the tour\n * @param {String} event The event name to trigger\n * @private\n */\n _done(event) {\n const index = this.steps.indexOf(this.currentStep);\n if (Array.isArray(this.steps)) {\n this.steps.forEach((step) => step.destroy());\n }\n\n cleanupSteps(this);\n\n this.trigger(event, { index });\n\n Shepherd.activeTour = null;\n this.trigger('inactive', { tour: this });\n\n if (this.modal) {\n this.modal.hide();\n }\n\n if (event === 'cancel' || event === 'complete') {\n if (this.modal) {\n const modalContainer = document.querySelector(\n '.shepherd-modal-overlay-container'\n );\n\n if (modalContainer) {\n modalContainer.remove();\n }\n }\n }\n\n // Focus the element that was focused before the tour started\n if (isHTMLElement(this.focusedElBeforeOpen)) {\n this.focusedElBeforeOpen.focus();\n }\n }\n\n /**\n * Make this tour \"active\"\n * @private\n */\n _setupActiveTour() {\n this.trigger('active', { tour: this });\n\n Shepherd.activeTour = this;\n }\n\n /**\n * _setupModal create the modal container and instance\n * @private\n */\n _setupModal() {\n this.modal = new ShepherdModal({\n target: this.options.modalContainer || document.body,\n props: {\n classPrefix: this.classPrefix,\n styles: this.styles\n }\n });\n }\n\n /**\n * Called when `showOn` evaluates to false, to skip the step or complete the tour if it's the last step\n * @param {Step} step The step to skip\n * @param {Boolean} forward True if we are going forward, false if backward\n * @private\n */\n _skipStep(step, forward) {\n const index = this.steps.indexOf(step);\n\n if (index === this.steps.length - 1) {\n this.complete();\n } else {\n const nextIndex = forward ? index + 1 : index - 1;\n this.show(nextIndex, forward);\n }\n }\n\n /**\n * Before showing, hide the current step and if the tour is not\n * already active, call `this._setupActiveTour`.\n * @private\n */\n _updateStateBeforeShow() {\n if (this.currentStep) {\n this.currentStep.hide();\n }\n\n if (!this.isActive()) {\n this._setupActiveTour();\n }\n }\n\n /**\n * Sets this.id to `${tourName}--${uuid}`\n * @private\n */\n _setTourID() {\n const tourName = this.options.tourName || 'tour';\n\n this.id = `${tourName}--${uuid()}`;\n }\n}\n\nexport { Shepherd };\n","import { Step } from './step.js';\nimport { Shepherd, Tour } from './tour.js';\n\nObject.assign(Shepherd, { Tour, Step });\n\nexport default Shepherd;\n"],"names":["cloneUnlessOtherwiseSpecified","value","options","clone","isMergeableObject","deepmerge","Array","isArray","defaultArrayMerge","target","source","concat","map","element","getEnumerableOwnPropertySymbols","Object","getOwnPropertySymbols","filter","symbol","propertyIsEnumerable","getKeys","keys","propertyIsOnObject","object","property","_","mergeObject","destination","forEach","key","hasOwnProperty","call","customMerge","getMergeFunction","arrayMerge","sourceIsArray","targetIsArray","isFunction","isString","autoBind","self","getOwnPropertyNames","constructor","i","length","val","bind","_setupAdvanceOnHandler","selector","step","event","isOpen","targetIsEl","currentTarget","el","undefined","isUndefined","matches","tour","next","bindAdvance","advanceOn","handler","document","querySelector","e","addEventListener","on","removeEventListener","body","console","error","getNodeName","toLowerCase","nodeName","getWindow","node","window","toString","ownerDocument","defaultView","isElement","OwnElement","Element","isHTMLElement","HTMLElement","isShadowRoot","ShadowRoot","getBasePlacement","placement","split","getBoundingClientRect","includeScale","rect","scaleX","scaleY","offsetHeight","offsetWidth","round","width","height","top","right","bottom","left","x","y","getLayoutRect","clientRect","Math","abs","offsetLeft","offsetTop","contains","parent","child","rootNode","getRootNode","isSameNode","parentNode","host","getComputedStyle","getDocumentElement","documentElement","getParentNode","assignedSlot","getTrueOffsetParent","position","offsetParent","getOffsetParent","indexOf","isFirefox","navigator","userAgent","getContainingBlock","currentNode","css","transform","perspective","contain","willChange","getMainAxisFromPlacement","mergePaddingObject","paddingObject","assign","expandToHashMap","reduce","hashMap","getVariation","mapToStyles","_ref2","_Object$assign2","popper","popperRect","variation","offsets","gpuAcceleration","adaptive","roundOffsets","isFixed","_offsets$x","_offsets$y","_ref3","hasX","hasY","sideX","sideY","win","heightProp","widthProp","end","visualViewport","commonStyles","unsetSides","roundOffsetsByDPR","dpr","devicePixelRatio","_ref4","_Object$assign","getOppositePlacement","replace","matched","hash","getOppositeVariationPlacement","getWindowScroll","scrollLeft","pageXOffset","scrollTop","pageYOffset","getWindowScrollBarX","isScrollParent","_getComputedStyle","test","overflow","overflowY","overflowX","getScrollParent","listScrollParents","list","_element$ownerDocumen","scrollParent","isBody","updatedList","rectToClientRect","getClientRectFromMixedType","clippingParent","viewport","html","clientWidth","clientHeight","clientTop","clientLeft","winScroll","max","scrollWidth","scrollHeight","direction","getClippingParents","clippingParents","clipperElement","canEscapeClipping","getClippingRect","boundary","rootBoundary","mainClippingParents","clippingRect","accRect","min","computeOffsets","_ref","reference","basePlacement","commonX","commonY","mainAxis","len","start","detectOverflow","state","_options","_options$placement","_options$boundary","_options$rootBoundary","_options$elementConte","elementContext","_options$altBoundary","altBoundary","_options$padding","padding","basePlacements","rects","elements","clippingClientRect","contextElement","referenceClientRect","popperOffsets","strategy","popperClientRect","elementClientRect","overflowOffsets","offsetData","modifiersData","offset","multiply","axis","computeAutoPlacement","flipVariations","_options$allowedAutoP","allowedAutoPlacements","allPlacements","placements","variationPlacements","allowedPlacements","overflows","acc","sort","a","b","getExpandedFallbackPlacements","auto","oppositePlacement","getSideOffsets","preventedOffsets","isAnySideFullyClipped","some","side","getCompositeRect","elementOrVirtualElement","isOffsetParentAnElement","isElementScaled","offsetParentIsScaled","scroll","order","modifiers","modifier","visited","add","name","requires","requiresIfExists","dep","has","depModifier","get","result","push","Map","Set","set","orderModifiers","orderedModifiers","modifierPhases","phase","debounce","fn","pending","Promise","resolve","then","mergeByName","merged","current","existing","data","areValidElements","_len","arguments","args","_key","_getCenteredStylePopperModifier","attributes","style","removeAttribute","setAttribute","makeCenteredPopper","centeredStylePopperModifier","popperOptions","enabled","setTimeout","focus","from","normalizePrefix","prefix","charAt","uuid","d","Date","now","c","random","floor","r","getPopperOptions","attachToOptions","altAxis","tether","defaultStepOptions","_mergeModifiers","stepOptions","mergedPopperOptions","mod","filteredModifiers","names","noop","tar","src","k","run","is_function","thing","safe_not_equal","detach","removeChild","svg_element","createElementNS","listen","attr","attribute","getAttribute","set_attributes","descriptors","getOwnPropertyDescriptors","__proto__","cssText","toggle_class","toggle","classList","get_current_component","current_component","Error","add_render_callback","render_callbacks","flush","saved_component","flushidx","dirty_components","component","$$","fragment","update","before_update","fns","dirty","p","ctx","after_update","binding_callbacks","pop","seen_callbacks","callback","flush_callbacks","update_scheduled","clear","group_outros","outros","check_outros","transition_in","block","local","outroing","delete","transition_out","o","create_component","mount_component","anchor","customElement","on_mount","on_destroy","m","new_on_destroy","destroy_component","detaching","init","instance","create_fragment","not_equal","props","append_styles","parent_component","bound","create","on_disconnect","context","callbacks","skip_bound","root","ready","ret","resolved_promise","fill","hydrate","nodes","children","childNodes","l","intro","createElement","button","button_class_value","insertBefore","apply","getConfigOption","option","config","$$props","action","classes","disabled","label","secondary","text","$$invalidate","createTextNode","each_blocks","iterations","create_if_block","footer","buttons","button_aria_label_value","appendChild","span","cancelIcon","preventDefault","cancel","h3","labelId","title","innerHTML","$$value","create_if_block_1","header","div","descriptionId","show_if_2","show_if_1","show_if","arrow","attachTo","div_aria_describedby_value","to_null_out","accounted_for","$$scope","updates","n","levels","getClassesArray","className","classPrefix","firstFocusableElement","focusableElements","lastFocusableElement","dataStepId","hasCancelIcon","hasTitle","id","querySelectorAll","oldClasses","remove","newClasses","keyCode","KEY_TAB","shiftKey","activeElement","KEY_ESC","exitOnEsc","LEFT_ARROW","keyboardNavigation","back","RIGHT_ARROW","cleanupSteps","steps","canClickTarget","svg","path","_getScrollParent","parentElement","closeModalOpening","openingProperties","hide","modalIsVisible","_cleanupStepEventListeners","positionModal","modalOverlayOpeningPadding","modalOverlayOpeningRadius","targetElement","elementRect","scrollRect","scrollBottom","show","rafId","cancelAnimationFrame","_preventModalBodyTouch","passive","_styleForStep","rafLoop","requestAnimationFrame","pathDefinition","innerWidth","w","innerHeight","h","stopPropagation","setupForStep","useModalOverlay","isNonNullObject","stringValue","prototype","$$typeof","REACT_ELEMENT_TYPE","canUseSymbol","Symbol","for","all","deepmerge.all","array","prev","cjs","Evented","once","bindings","off","binding","index","splice","trigger","DEFAULT_OPTIONS","createPopper","popperGenerator","generatorOptions","_generatorOptions$def","_generatorOptions","defaultModifiers","_generatorOptions$def2","defaultOptions","runModifierEffects","_ref3$options","effect","cleanupFn","effectCleanupFns","noopFn","cleanupModifierEffects","styles","isDestroyed","setOptions","setOptionsAction","scrollParents","forceUpdate","_state$elements","reset","_state$orderedModifie","_state$orderedModifie2","destroy","onFirstUpdate","eventListeners","_options$scroll","_options$resize","resize","popperOffsets$1","computeStyles$1","computeStyles","_ref5","_options$gpuAccelerat","_options$adaptive","_options$roundOffsets","applyStyles$1","applyStyles","effect$2","initialStyles","margin","styleProperties","offset$1","_options$offset","distanceAndSkiddingToXY","invertDistance","skidding","distance","_data$state$placement","flip$1","flip","_skip","_options$mainAxis","checkMainAxis","_options$altAxis","checkAltAxis","specifiedFallbackPlacements","fallbackPlacements","_options$flipVariatio","preferredPlacement","isBasePlacement","referenceRect","checksMap","makeFallbackChecks","firstFittingPlacement","_basePlacement","isStartVariation","isVertical","mainVariationSide","altVariationSide","checks","every","check","_loop","_i","fittingPlacement","find","slice","preventOverflow$1","preventOverflow","_options$tether","_options$tetherOffset","tetherOffset","tetherOffsetValue","normalizedTetherOffsetValue","offsetModifierState","_offsetModifierState$","mainSide","altSide","additive","minLen","maxLen","arrowElement","arrowRect","arrowPaddingObject","arrowPaddingMin","arrowPaddingMax","arrowLen","mathMax","min$1","mathMin","minOffset","maxOffset","clientOffset","arrowOffsetParent","offsetModifierValue","tetherMax","preventedOffset","_offsetModifierState$2","_offset","_min","_max","isOriginSide","_offsetModifierValue","_tetherMin","_tetherMax","v","withinMaxClamp","within","_preventedOffset","arrow$1","_state$modifiersData$","minProp","maxProp","endDiff","startDiff","clientSize","center","centerOffset","effect$1","_options$element","hide$1","referenceOverflow","popperAltOverflow","referenceClippingOffsets","popperEscapeOffsets","isReferenceHidden","hasPopperEscaped","SvelteComponent","$destroy","$on","type","$set","$$set","module","polyfill","scrollElement","shouldBailOut","firstArg","behavior","TypeError","hasScrollableSpace","ROUNDING_TOLERANCE","canOverflow","overflowValue","isScrollable","isScrollableY","isScrollableX","elapsed","startTime","SCROLL_TIME","cos","PI","currentX","startX","currentY","startY","method","scrollable","smoothScroll","scrollX","scrollY","original","__forceSmoothScrollPolyfill__","scrollTo","scrollBy","elementScroll","scrollIntoView","performance","isMicrosoftBrowser","w.scrollTo","w.scrollBy","Element.prototype.scrollTo","SyntaxError","Element.prototype.scrollBy","Element.prototype.scrollIntoView","parentRects","scrollableParent","clientRects","smoothscroll","Step","_resolvedAttachTo","_setOptions","complete","tooltip","_updateStepTargetOnHide","getTour","modal","hidden","_resolveAttachToOptions","returnOpts","_getResolvedAttachToOptions","Boolean","beforeShowPromise","_show","updateStepOptions","shepherdElementComponent","getElement","getTarget","_createTooltipContent","ShepherdElement","stepsContainer","_scrollTo","scrollToOptions","scrollToHandler","_getClassOptions","defaultStepOptionsClasses","allClasses","uniqClasses","join","trim","tourOptions","merge","when","_setupElements","content","_setupModal","_styleTargetElementForStep","highlightClass","Shepherd","Tour","defaultTourOptions","addSteps","events","opts","_setTourID","addStep","currentStep","confirmCancel","_done","getById","getCurrentStep","isActive","activeTour","removeStep","forward","_updateStateBeforeShow","showOn","_skipStep","previous","focusedElBeforeOpen","_setupActiveTour","modalContainer","ShepherdModal"],"mappings":"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"} \ No newline at end of file From 98897932a502bf92ed070a77a348a867dc4af276 Mon Sep 17 00:00:00 2001 From: Ian Young Date: Sat, 13 Dec 2025 23:36:46 -0600 Subject: [PATCH 217/962] Replace markdown library with mistune markdown.py had parsing errors that were throwing off img srcsets. --- bookwyrm/connectors/openlibrary.py | 6 +++--- bookwyrm/models/fields.py | 4 ++-- bookwyrm/views/status.py | 4 ++-- requirements.txt | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/bookwyrm/connectors/openlibrary.py b/bookwyrm/connectors/openlibrary.py index 032a86f580..55e3616fd4 100644 --- a/bookwyrm/connectors/openlibrary.py +++ b/bookwyrm/connectors/openlibrary.py @@ -3,7 +3,7 @@ import re from typing import Any, Optional, Union, Iterator, Iterable -from markdown import markdown +import mistune from bookwyrm import models from bookwyrm.book_search import SearchResult @@ -249,9 +249,9 @@ def ignore_edition(edition_data: JsonDict) -> bool: def get_description(description_blob: Union[JsonDict, str]) -> str: """descriptions can be a string or a dict""" if isinstance(description_blob, dict): - description = markdown(description_blob.get("value", "")) + description = mistune.html(description_blob.get("value", "")) else: - description = markdown(description_blob) + description = mistune.html(description_blob) if ( description.startswith("

    ") diff --git a/bookwyrm/models/fields.py b/bookwyrm/models/fields.py index ecc1976db6..787ad1dd9a 100644 --- a/bookwyrm/models/fields.py +++ b/bookwyrm/models/fields.py @@ -16,7 +16,7 @@ from django.utils import timezone from django.utils.translation import gettext_lazy as _ from django.utils.encoding import filepath_to_uri -from markdown import markdown +import mistune from bookwyrm import activitypub from bookwyrm.connectors import get_image @@ -605,7 +605,7 @@ def field_from_activity(self, value, allow_external_connections=True, trigger=No return clean(value) def field_to_activity(self, value): - return markdown(value) if value else value + return mistune.html(value) if value else value class ArrayField(ActivitypubFieldMixin, DjangoArrayField): diff --git a/bookwyrm/views/status.py b/bookwyrm/views/status.py index 2f698f04e0..cfa9736bee 100644 --- a/bookwyrm/views/status.py +++ b/bookwyrm/views/status.py @@ -16,7 +16,7 @@ from django.views import View from django.views.decorators.http import require_POST -from markdown import markdown +import mistune from bookwyrm import forms, models from bookwyrm.models.report import DELETE_ITEM from bookwyrm.utils import regex, sanitizer @@ -344,6 +344,6 @@ def _unwrap(text): def to_markdown(content): """catch links and convert to markdown""" content = format_links(content) - content = markdown(content) + content = mistune.html(content) # sanitize resulting html return sanitizer.clean(content) diff --git a/requirements.txt b/requirements.txt index 42dd578691..c5d500d3d6 100644 --- a/requirements.txt +++ b/requirements.txt @@ -20,7 +20,7 @@ flower==2.0.1 gunicorn==23.0.0 hiredis==2.3.2 libsass==0.23.0 -Markdown==3.6 +mistune==3.1.2 opentelemetry-api==1.24.0 opentelemetry-exporter-otlp-proto-grpc==1.24.0 opentelemetry-instrumentation-celery==0.45b0 From 568fe739034af006450808a46234f5a177f39d5f Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Sat, 20 Dec 2025 12:31:28 -0800 Subject: [PATCH 218/962] New translations django.po (Yiddish) --- locale/yi_DE/LC_MESSAGES/django.po | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/locale/yi_DE/LC_MESSAGES/django.po b/locale/yi_DE/LC_MESSAGES/django.po index 61348e4def..f6ff92768a 100644 --- a/locale/yi_DE/LC_MESSAGES/django.po +++ b/locale/yi_DE/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-11-16 19:21+0000\n" -"PO-Revision-Date: 2025-12-17 03:02\n" +"PO-Revision-Date: 2025-12-20 20:31\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Yiddish\n" "Language: yi\n" @@ -400,31 +400,31 @@ 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" -msgstr "" +msgstr "געשיקט אַן אָנזאָג צום באַריכטער" #: bookwyrm/models/report.py:88 msgid "Messaged reported user" -msgstr "" +msgstr "געשיקט אַן אָנזאָג צום געקלאָגענער" #: bookwyrm/models/report.py:89 msgid "Suspended user" -msgstr "" +msgstr "ניצער אױסגעשלאָסן" #: bookwyrm/models/report.py:90 msgid "Un-suspended user" -msgstr "" +msgstr "נניצער אומגעשלאָסן" #: bookwyrm/models/report.py:91 msgid "Changed user permission level" -msgstr "" +msgstr "געביטן די רשות־מדרגה פֿון ניצער" #: bookwyrm/models/report.py:92 msgid "Deleted user account" From 6803dd71179b2c3c8d12138b6f82d7e3fb84045a Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Sat, 20 Dec 2025 13:32:53 -0800 Subject: [PATCH 219/962] New translations django.po (Yiddish) --- locale/yi_DE/LC_MESSAGES/django.po | 40 +++++++++++++++--------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/locale/yi_DE/LC_MESSAGES/django.po b/locale/yi_DE/LC_MESSAGES/django.po index f6ff92768a..53840c93f6 100644 --- a/locale/yi_DE/LC_MESSAGES/django.po +++ b/locale/yi_DE/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-11-16 19:21+0000\n" -"PO-Revision-Date: 2025-12-20 20:31\n" +"PO-Revision-Date: 2025-12-20 21:32\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Yiddish\n" "Language: yi\n" @@ -428,78 +428,78 @@ msgstr "געביטן די רשות־מדרגה פֿון ניצער" #: bookwyrm/models/report.py:92 msgid "Deleted user account" -msgstr "" +msgstr "ניצער־קאָנטע אױסגעמעקט" #: bookwyrm/models/report.py:93 msgid "Blocked domain" -msgstr "" +msgstr "װעב־שטח געלײגט אױף חרם" #: bookwyrm/models/report.py:94 msgid "Approved domain" -msgstr "" +msgstr "װעב־שטח אַפּראָבירט" #: bookwyrm/models/report.py:95 msgid "Deleted item" -msgstr "" +msgstr "אײנס אױסגעמעקט" #: bookwyrm/models/session.py:42 msgid "Unknown" -msgstr "" +msgstr "אומבאַקאַנט" #: bookwyrm/models/status.py:192 #, python-format msgid "%(display_name)s's status" -msgstr "" +msgstr "%(display_name)sס מצבֿ" #: bookwyrm/models/status.py:367 #, python-format msgid "%(display_name)s's comment on %(book_title)s" -msgstr "" +msgstr "%(display_name)sס קאָמענטאַר װעגן %(book_title)s" #: bookwyrm/models/status.py:418 #, python-format msgid "%(display_name)s's quote from %(book_title)s" -msgstr "" +msgstr "%(display_name)sס ציטאַט פֿון %(book_title)s" #: bookwyrm/models/status.py:454 #, python-format msgid "%(display_name)s's review of %(book_title)s" -msgstr "" +msgstr "%(display_name)sס רעצענזיע פֿון %(book_title)s" #: bookwyrm/models/status.py:486 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" -msgstr[0] "" -msgstr[1] "" +msgstr[0] "%(display_name)s האָט געשאַצט %(book_title)s: %(display_rating). 1f שטערן" +msgstr[1] "%(display_name)s האָט געשאַצט %(book_title)s: %(display_rating). 1f שטערן" #: bookwyrm/models/user.py:39 bookwyrm/templates/book/book.html:336 msgid "Reviews" -msgstr "" +msgstr "רעצענזיעס" #: bookwyrm/models/user.py:40 msgid "Comments" -msgstr "" +msgstr "קאָמענטאַרן" #: bookwyrm/models/user.py:41 bookwyrm/templates/import/import_user.html:154 msgid "Quotations" -msgstr "" +msgstr "ציטאַטן" #: bookwyrm/models/user.py:42 msgid "Everything else" -msgstr "" +msgstr "איבעריקע" #: bookwyrm/settings.py:238 msgid "Home Timeline" -msgstr "" +msgstr "הײם־כראָנאָלאָגיע" #: bookwyrm/settings.py:238 msgid "Home" -msgstr "" +msgstr "הײם" #: bookwyrm/settings.py:239 msgid "Books Timeline" -msgstr "" +msgstr "ביכער־כראָנאָלאָגיע" #: bookwyrm/settings.py:239 #: bookwyrm/templates/guided_tour/user_profile.html:101 @@ -508,7 +508,7 @@ msgstr "" #: bookwyrm/templates/search/layout.html:44 #: bookwyrm/templates/user/layout.html:107 msgid "Books" -msgstr "" +msgstr "ביכער" #: bookwyrm/settings.py:316 msgid "English" From c4c3a33a49e95180eb5b4db5af6af0808fc83248 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Sat, 20 Dec 2025 14:30:13 -0800 Subject: [PATCH 220/962] New translations django.po (Yiddish) --- locale/yi_DE/LC_MESSAGES/django.po | 248 ++++++++++++++--------------- 1 file changed, 124 insertions(+), 124 deletions(-) diff --git a/locale/yi_DE/LC_MESSAGES/django.po b/locale/yi_DE/LC_MESSAGES/django.po index 53840c93f6..2019f00e2e 100644 --- a/locale/yi_DE/LC_MESSAGES/django.po +++ b/locale/yi_DE/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2025-11-16 19:21+0000\n" -"PO-Revision-Date: 2025-12-20 21:32\n" +"PO-Revision-Date: 2025-12-20 22:30\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Yiddish\n" "Language: yi\n" @@ -512,329 +512,329 @@ msgstr "ביכער" #: bookwyrm/settings.py:316 msgid "English" -msgstr "" +msgstr "English (ענגליש)" #: bookwyrm/settings.py:317 msgid "Català (Catalan)" -msgstr "" +msgstr "Català (קאַטאַלאַניש)" #: bookwyrm/settings.py:318 msgid "Deutsch (German)" -msgstr "" +msgstr "Deutsch (דײַטש)" #: bookwyrm/settings.py:319 msgid "Esperanto (Esperanto)" -msgstr "" +msgstr "Esperanto (עספּעראַנטאָ)" #: bookwyrm/settings.py:320 msgid "Español (Spanish)" -msgstr "" +msgstr "Español (שפּאַניש)" #: bookwyrm/settings.py:321 msgid "Euskara (Basque)" -msgstr "" +msgstr "Euskara (באַסקיש)" #: bookwyrm/settings.py:322 msgid "Galego (Galician)" -msgstr "" +msgstr "Galego (גאַליסיש)" #: bookwyrm/settings.py:323 msgid "Italiano (Italian)" -msgstr "" +msgstr "Italiano (איטאַליעניש)" #: bookwyrm/settings.py:324 msgid "한국어 (Korean)" -msgstr "" +msgstr "한국어 (קאָרעניש)" #: bookwyrm/settings.py:325 msgid "Suomi (Finnish)" -msgstr "" +msgstr "Suomi (פֿיניש)" #: bookwyrm/settings.py:326 msgid "Français (French)" -msgstr "" +msgstr "Français (פֿראַנצײזיש)" #: bookwyrm/settings.py:327 msgid "Lietuvių (Lithuanian)" -msgstr "" +msgstr "Lietuvių (ליטװיש)" #: bookwyrm/settings.py:328 msgid "Nederlands (Dutch)" -msgstr "" +msgstr "Nederlands (האָלענדיש)" #: bookwyrm/settings.py:329 msgid "Norsk (Norwegian)" -msgstr "" +msgstr "Norsk (נאָרװעגיש)" #: bookwyrm/settings.py:330 msgid "Polski (Polish)" -msgstr "" +msgstr "Polski (פּױליש)" #: bookwyrm/settings.py:331 msgid "Português do Brasil (Brazilian Portuguese)" -msgstr "" +msgstr "Português do Brasil (בראַזיליאַנער פּאָרטוגעזיש)" #: bookwyrm/settings.py:332 msgid "Português Europeu (European Portuguese)" -msgstr "" +msgstr "Português Europeu (אײראָפּעיש פּאָרטוגעזיש)" #: bookwyrm/settings.py:333 msgid "Română (Romanian)" -msgstr "" +msgstr "Română (רומעניש)" #: bookwyrm/settings.py:334 msgid "Svenska (Swedish)" -msgstr "" +msgstr "Svenska (שװעדיש)" #: bookwyrm/settings.py:335 msgid "Українська (Ukrainian)" -msgstr "" +msgstr "Українська (אוקראַיִניש)" #: bookwyrm/settings.py:336 msgid "简体中文 (Simplified Chinese)" -msgstr "" +msgstr "简体中文 (פֿאַרפּשוטערן כינעזיש)" #: bookwyrm/settings.py:337 msgid "繁體中文 (Traditional Chinese)" -msgstr "" +msgstr "繁體中文 (טראַדיציאָנעל כינעזיש)" #: bookwyrm/templates/403.html:5 msgid "Oh no!" -msgstr "" +msgstr "אױ, װײ!" #: bookwyrm/templates/403.html:9 bookwyrm/templates/landing/invite.html:21 msgid "Permission Denied" -msgstr "" +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 "" +msgstr " איר האָט נישט רשות צו זײן דעם בלאַט אָדער טאָן אַזאַ אַקציע. אײַער ניצער רשות־מדרגה איז %(level)s." #: bookwyrm/templates/403.html:15 msgid "If you think you should have access, please speak to your BookWyrm server administrator." -msgstr "" +msgstr "אױב איר מײנט אַז איר זאָלט האָבן צוטריט, זאָלט איר רעדן מיט אײַער BookWyrm צושטעלער־אַדמיניסטראַטאָר." #: bookwyrm/templates/404.html:4 bookwyrm/templates/404.html:8 msgid "Not Found" -msgstr "" +msgstr "נישט געפֿונען" #: bookwyrm/templates/404.html:9 msgid "The page you requested doesn't seem to exist!" -msgstr "" +msgstr "דער בלאָט װאָס האָט געבאָטן איז, אַ פּנים, נישטאָ!" #: bookwyrm/templates/413.html:4 bookwyrm/templates/413.html:8 msgid "File too large" -msgstr "" +msgstr "טעקע צו גרױס" #: bookwyrm/templates/413.html:9 msgid "The file you are uploading is too large." -msgstr "" +msgstr "די טעקע װאָס איר לאָדט אַרױף איז צו גרױס." #: bookwyrm/templates/413.html:11 msgid "You you can try using a smaller file, or ask your BookWyrm server administrator to increase the DATA_UPLOAD_MAX_MEMORY_SIZE setting." -msgstr "" +msgstr "איר זאָלסט פּרוּװן אַ טעקע אַ קלענערע, אָדער בעטן אַז אײַער BookWyrm צושטעלער־אַדמיניסטראַטאָר זאָל פֿאַרגרעסערן די DATA_UPLOAD_MAX_MEMORY_SIZE פֿיקסירונג." #: bookwyrm/templates/500.html:4 msgid "Oops!" -msgstr "" +msgstr "אוף!" #: bookwyrm/templates/500.html:8 msgid "Server Error" -msgstr "" +msgstr "צושטעלער־טעות" #: bookwyrm/templates/500.html:9 msgid "Something went wrong! Sorry about that." -msgstr "" +msgstr "עפּעס איז קאַליע געװאָרן! זײַט מוחל." #: bookwyrm/templates/about/about.html:9 #: bookwyrm/templates/about/layout.html:35 msgid "About" -msgstr "" +msgstr "װעגן" #: bookwyrm/templates/about/about.html:22 #: bookwyrm/templates/get_started/layout.html:22 #, python-format msgid "Welcome to %(site_name)s!" -msgstr "" +msgstr "ברוך־⁠הבאָ אין %(site_name)s!" #: bookwyrm/templates/about/about.html:26 #, 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:47 #, 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 פֿון 5 שטערן." #: bookwyrm/templates/about/about.html:66 #, python-format msgid "More %(site_name)s users want to read %(title)s than any other book." -msgstr "" +msgstr "עס זענען מער %(site_name)s ניצערס װאָס װילן לײנען %(title)s פֿון אַלע אַנדערע ביכער." #: bookwyrm/templates/about/about.html:85 #, python-format msgid "%(title)s has the most divisive ratings of any book on %(site_name)s." -msgstr "" +msgstr "%(title)s האָט די שפּאַלטערישסטע שאַצונגען פֿון אַלע ביכער אױף %(site_name)s." #: bookwyrm/templates/about/about.html:96 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 "האַלט דעם חשבון פֿון אײַער לײנען, שמועסט װעגן ביכער, שרײַבט רעצענזיעס, און אַנטדעקט װאָס נאָך צו לײנען. אַלעמאָל אָן רעקלאַמען, אַנטי־קאָרפּאָראַטיװ, און קהילה־געװענדט, BookWyrm איז מענטש־פֿאַרנעמיק פּראָגראַמװאַרג, געצילעװעט צו בלײַבן קלײן און פּערזענלעך. אױב איר האָט מעלה־פֿאַרלאַנגען, דיבוק־רעפּאָרטן, אָדער גרױסע שטרעבונגען, זײַט מקרבֿ און מאַכט זיך געהערט." #: bookwyrm/templates/about/about.html:107 msgid "Meet your admins" -msgstr "" +msgstr "באַקענען זיך מיט אײַערע אַדמינס" #: bookwyrm/templates/about/about.html:110 #, 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 "" +msgstr "%(site_name)sס שלישים און אַדמיניסטראַטאָרס האַלטן דעם זײט אױף, דורכפֿירן דעם אױפֿפֿיר־קאָדעקס, און ענטפֿערן אַז ניצערס באַריכטן מיסט און עבֿירות." #: bookwyrm/templates/about/about.html:124 msgid "Moderator" -msgstr "" +msgstr "שליש" #: bookwyrm/templates/about/about.html:126 bookwyrm/templates/user_menu.html:62 msgid "Admin" -msgstr "" +msgstr "אַדמין" #: bookwyrm/templates/about/about.html:142 #: 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 "" +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 "" +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 "" +msgstr "אימפּרעסום" #: bookwyrm/templates/about/layout.html:11 msgid "Active users:" -msgstr "" +msgstr "אַקטיװע ניצערס׃" #: bookwyrm/templates/about/layout.html:15 msgid "Statuses posted:" -msgstr "" +msgstr "מצבֿים געמאָלדן׃" #: bookwyrm/templates/about/layout.html:19 #: bookwyrm/templates/setup/config.html:68 msgid "Software version:" -msgstr "" +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 "" +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 "" +msgstr "דאַטנשיץ־פּאָליטיק" #: bookwyrm/templates/annual_summary/layout.html:7 #: bookwyrm/templates/feed/summary_card.html:8 #, python-format msgid "%(year)s in the books" -msgstr "" +msgstr "%(year)s אין די ביכער" #: bookwyrm/templates/annual_summary/layout.html:43 #, python-format msgid "%(year)s in the books" -msgstr "" +msgstr "%(year)s אין די ביכער" #: bookwyrm/templates/annual_summary/layout.html:47 #, python-format msgid "%(display_name)s’s year of reading" -msgstr "" +msgstr "%(display_name)sס לײעניאָר" #: bookwyrm/templates/annual_summary/layout.html:53 msgid "Share this page" -msgstr "" +msgstr "מעלדן דעם בלאַט" #: bookwyrm/templates/annual_summary/layout.html:67 msgid "Copy address" -msgstr "" +msgstr "קאָפּירן אַדרעס" #: bookwyrm/templates/annual_summary/layout.html:68 #: bookwyrm/templates/lists/list.html:277 msgid "Copied!" -msgstr "" +msgstr "קאָפּירט!" #: bookwyrm/templates/annual_summary/layout.html:77 msgid "Sharing status: public with key" -msgstr "" +msgstr "װײַזן־מצבֿ; עפֿנטלעך מיט שליסל" #: bookwyrm/templates/annual_summary/layout.html:78 msgid "The page can be seen by anyone with the complete address." -msgstr "" +msgstr "דען בלאַט קען יעדער אײנער זײן מיטן גאַנצן אַדרעס" #: bookwyrm/templates/annual_summary/layout.html:83 msgid "Make page private" -msgstr "" +msgstr "מאַכן בלאַט פּריװאַט" #: bookwyrm/templates/annual_summary/layout.html:89 msgid "Sharing status: private" -msgstr "" +msgstr "װײַזן־מצבֿ׃ פּריװאַט" #: bookwyrm/templates/annual_summary/layout.html:90 msgid "The page is private, only you can see it." -msgstr "" +msgstr "דער בלאַט איז פּריװאַט, איר אַלײן קען עס זײן" #: bookwyrm/templates/annual_summary/layout.html:95 msgid "Make page public" -msgstr "" +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 "" +msgstr "אַז איר מאַכט דעם בלאַט פּריװאַט, גיט דער געװעזנער שליסל מער נישט צוטריט צום בלאַט. עס װעט מאַכן אַ נײַעם שליסל אױב דער בלאַט איז נאָך אַ מאָל עפֿנטלעך געמאַכט." #: bookwyrm/templates/annual_summary/layout.html:112 #, python-format msgid "Sadly %(display_name)s didn’t finish any books in %(year)s" -msgstr "" +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] "" -msgstr[1] "" +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 בלעטער בסך־הכּל!" #: bookwyrm/templates/annual_summary/layout.html:124 msgid "That’s great!" -msgstr "" +msgstr "אױסגעצײכנט!" #: bookwyrm/templates/annual_summary/layout.html:128 #, python-format msgid "That makes an average of %(pages)s pages per book." -msgstr "" +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] "" -msgstr[1] "" +msgstr[0] "(נישטאָ קײן בלאַט־אינפֿאָרמאַציע פֿאַר %(no_page_number)s בוך)" +msgstr[1] "(נישטאָ קײן בלאַט־אינפֿאָרמאַציע פֿאַר %(no_page_number)s ביכער)" #: bookwyrm/templates/annual_summary/layout.html:150 msgid "Their shortest read this year…" -msgstr "" +msgstr "דאָס קורצסטע לײנונג הײַיאָר…" #: bookwyrm/templates/annual_summary/layout.html:157 #: bookwyrm/templates/annual_summary/layout.html:178 @@ -844,187 +844,187 @@ msgstr "" #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 msgid "by" -msgstr "" +msgstr "פֿון" #: bookwyrm/templates/annual_summary/layout.html:163 #: bookwyrm/templates/annual_summary/layout.html:184 #, python-format msgid "%(pages)s pages" -msgstr "" +msgstr "%(pages)s בלעטער" #: bookwyrm/templates/annual_summary/layout.html:171 msgid "…and the longest" -msgstr "" +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] "" -msgstr[1] "" +msgstr[0] "%(display_name)s האָט זיך געצילט צו לײנען אָפּ %(goal)s בוך אין %(year)s, און האָט דערגרײכט %(goal_percent)s%% פֿון דעם ציל!" +msgstr[1] "%(display_name)s האָט זיך געצילט צו לײנען אָפּ %(goal)s ביכער אין %(year)s, און האָט דערגרײכט %(goal_percent)s%% פֿון דעם ציל!" #: 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[1] "" +msgstr[0] "%(display_name)s האָט געלאָזט %(ratings_total)s שאַצונג,
    %(rating_average)s אין דורכשניץ" +msgstr[1] "%(display_name)s האָט געלאָזט %(ratings_total)s שאַצונגען,
    %(rating_average)s אין דורכשניץ" #: bookwyrm/templates/annual_summary/layout.html:240 msgid "Their best rated review" -msgstr "" +msgstr "די בעסטע רעצענזיע׃" #: bookwyrm/templates/annual_summary/layout.html:253 #, python-format msgid "Their rating: %(rating)s" -msgstr "" +msgstr "זײער שאַצונג׃ %(rating)s" #: bookwyrm/templates/annual_summary/layout.html:270 #, python-format msgid "All the books %(display_name)s read in %(year)s" -msgstr "" +msgstr "די אַלע ביכער װאָס %(display_name)s האָט געלײנט אין %(year)s" #: bookwyrm/templates/author/author.html:19 #: bookwyrm/templates/author/author.html:20 msgid "Edit Author" -msgstr "" +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 msgid "Aliases:" -msgstr "" +msgstr "אַליאַסן׃" #: bookwyrm/templates/author/author.html:49 msgid "Born:" -msgstr "" +msgstr "געבױרן׃" #: bookwyrm/templates/author/author.html:56 msgid "Died:" -msgstr "" +msgstr "געשטאָרבן׃" #: bookwyrm/templates/author/author.html:66 msgid "External links" -msgstr "" +msgstr "דרױסנדיקע פֿאַרבינדונגען" #: bookwyrm/templates/author/author.html:71 msgid "Wikipedia" -msgstr "" +msgstr "װיקיפּעדיע" #: bookwyrm/templates/author/author.html:79 msgid "View on Wikidata" -msgstr "" +msgstr "אָנקוקן אױפֿ װיקידאַטן" #: bookwyrm/templates/author/author.html:87 msgid "Website" -msgstr "" +msgstr "װעבזײַטל" #: bookwyrm/templates/author/author.html:95 msgid "View ISNI record" -msgstr "" +msgstr "אָנקוקן ISNI רעקאָרד" #: bookwyrm/templates/author/author.html:103 #: bookwyrm/templates/book/book.html:183 msgid "View on ISFDB" -msgstr "" +msgstr "אָנקוקן אױף ISFDB" #: bookwyrm/templates/author/author.html:108 #: bookwyrm/templates/author/sync_modal.html:5 #: bookwyrm/templates/book/book.html:150 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" -msgstr "" +msgstr "אַרײַנלאָדן דאַטן" #: bookwyrm/templates/author/author.html:112 #: bookwyrm/templates/book/book.html:154 msgid "View on OpenLibrary" -msgstr "" +msgstr "אָנקוקן אױף OpenLibrary" #: bookwyrm/templates/author/author.html:127 #: bookwyrm/templates/book/book.html:168 msgid "View on Inventaire" -msgstr "" +msgstr "אָנקוקן אױף Inventaire" #: bookwyrm/templates/author/author.html:143 msgid "View on LibraryThing" -msgstr "" +msgstr "אָנקוקן אױף LibraryThing" #: bookwyrm/templates/author/author.html:151 msgid "View on Goodreads" -msgstr "" +msgstr "אָנקוקן אױף Goodreads" #: bookwyrm/templates/author/author.html:166 #, python-format msgid "Books by %(name)s" -msgstr "" +msgstr "ביכער פֿון %(name)s" #: bookwyrm/templates/author/edit_author.html:5 msgid "Edit Author:" -msgstr "" +msgstr "רעדאַקטירן מחבר" #: bookwyrm/templates/author/edit_author.html:13 #: bookwyrm/templates/book/edit/edit_book.html:25 msgid "Added:" -msgstr "" +msgstr "צוגעגעבן" #: bookwyrm/templates/author/edit_author.html:14 #: bookwyrm/templates/book/edit/edit_book.html:28 msgid "Updated:" -msgstr "" +msgstr "דערהײַנטיקט׃" #: bookwyrm/templates/author/edit_author.html:16 #: bookwyrm/templates/book/edit/edit_book.html:32 msgid "Last edited by:" -msgstr "" +msgstr "פֿריער רעדאַקטירט פֿון׃" #: bookwyrm/templates/author/edit_author.html:33 #: bookwyrm/templates/book/edit/edit_book_form.html:21 msgid "Metadata" -msgstr "" +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 "" +msgstr "נאָמען׃" #: bookwyrm/templates/author/edit_author.html:44 #: bookwyrm/templates/book/edit/edit_book_form.html:91 #: bookwyrm/templates/book/edit/edit_book_form.html:161 msgid "Separate multiple values with commas." -msgstr "" +msgstr "זונדערט אָפּ פֿאַרשידענע גרײסן מיט קאָמעס׃" #: bookwyrm/templates/author/edit_author.html:50 msgid "Bio:" -msgstr "" +msgstr "ביאָגראַפֿיע׃" #: bookwyrm/templates/author/edit_author.html:56 msgid "Wikipedia link:" -msgstr "" +msgstr "װיקיפּעדיע פֿאַרבינדונג׃" #: bookwyrm/templates/author/edit_author.html:58 msgid "Wikidata:" -msgstr "" +msgstr "װיקידאַטן׃" #: bookwyrm/templates/author/edit_author.html:62 msgid "Website:" -msgstr "" +msgstr "װעבזײַטל׃" #: bookwyrm/templates/author/edit_author.html:67 msgid "Birth date:" -msgstr "" +msgstr "געבױרן־טאָג׃" #: bookwyrm/templates/author/edit_author.html:74 msgid "Death date:" -msgstr "" +msgstr "געשטאָרבן־טאָג" #: bookwyrm/templates/author/edit_author.html:81 msgid "Author Identifiers" @@ -1032,29 +1032,29 @@ msgstr "" #: bookwyrm/templates/author/edit_author.html:83 msgid "Openlibrary key:" -msgstr "" +msgstr "Openlibrary שליסל׃" #: bookwyrm/templates/author/edit_author.html:90 #: bookwyrm/templates/book/edit/edit_book_form.html:336 msgid "Inventaire ID:" -msgstr "" +msgstr "Inventaire ID:" #: bookwyrm/templates/author/edit_author.html:97 msgid "Librarything key:" -msgstr "" +msgstr "Librarything שליסל׃" #: bookwyrm/templates/author/edit_author.html:104 #: bookwyrm/templates/book/edit/edit_book_form.html:345 msgid "Goodreads key:" -msgstr "" +msgstr "Goodreads שליסל׃" #: bookwyrm/templates/author/edit_author.html:111 msgid "ISFDB:" -msgstr "" +msgstr "ISFDB:" #: bookwyrm/templates/author/edit_author.html:118 msgid "ISNI:" -msgstr "" +msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:128 #: bookwyrm/templates/book/book.html:249 @@ -1077,7 +1077,7 @@ msgstr "" #: bookwyrm/templates/shelf/form.html:25 #: bookwyrm/templates/snippets/reading_modals/layout.html:18 msgid "Save" -msgstr "" +msgstr "אױפֿהיטן" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 @@ -1103,7 +1103,7 @@ msgstr "" #: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:22 #: bookwyrm/templates/snippets/report_modal.html:52 msgid "Cancel" -msgstr "" +msgstr "אַנולירן" #: bookwyrm/templates/author/sync_modal.html:15 #, python-format From 882228de8ebfa0789290888a96600bfc9374d219 Mon Sep 17 00:00:00 2001 From: Ian Young Date: Sat, 20 Dec 2025 22:03:26 -0600 Subject: [PATCH 221/962] Strip newline from mistune output It doesn't hugely matter one way or another, but the existing tests all expect no newline, so why rock the boat. --- bookwyrm/connectors/openlibrary.py | 4 ++-- bookwyrm/models/fields.py | 2 +- bookwyrm/views/status.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bookwyrm/connectors/openlibrary.py b/bookwyrm/connectors/openlibrary.py index 55e3616fd4..fbe0907bb9 100644 --- a/bookwyrm/connectors/openlibrary.py +++ b/bookwyrm/connectors/openlibrary.py @@ -249,9 +249,9 @@ def ignore_edition(edition_data: JsonDict) -> bool: def get_description(description_blob: Union[JsonDict, str]) -> str: """descriptions can be a string or a dict""" if isinstance(description_blob, dict): - description = mistune.html(description_blob.get("value", "")) + description = mistune.html(description_blob.get("value", "")).rstrip() else: - description = mistune.html(description_blob) + description = mistune.html(description_blob).rstrip() if ( description.startswith("

    ") diff --git a/bookwyrm/models/fields.py b/bookwyrm/models/fields.py index 787ad1dd9a..bac1e028c4 100644 --- a/bookwyrm/models/fields.py +++ b/bookwyrm/models/fields.py @@ -605,7 +605,7 @@ def field_from_activity(self, value, allow_external_connections=True, trigger=No return clean(value) def field_to_activity(self, value): - return mistune.html(value) if value else value + return mistune.html(value).rstrip() if value else value class ArrayField(ActivitypubFieldMixin, DjangoArrayField): diff --git a/bookwyrm/views/status.py b/bookwyrm/views/status.py index cfa9736bee..fab7929e27 100644 --- a/bookwyrm/views/status.py +++ b/bookwyrm/views/status.py @@ -344,6 +344,6 @@ def _unwrap(text): def to_markdown(content): """catch links and convert to markdown""" content = format_links(content) - content = mistune.html(content) + content = mistune.html(content).rstrip() # sanitize resulting html return sanitizer.clean(content) From 74693247e8527852a3d9ebb63c823f3c76c03c68 Mon Sep 17 00:00:00 2001 From: Ian Young Date: Sat, 20 Dec 2025 22:10:53 -0600 Subject: [PATCH 222/962] Update test to reflect conversion of quote character --- bookwyrm/tests/connectors/test_openlibrary_connector.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/tests/connectors/test_openlibrary_connector.py b/bookwyrm/tests/connectors/test_openlibrary_connector.py index 19df39599d..be5a0b92e0 100644 --- a/bookwyrm/tests/connectors/test_openlibrary_connector.py +++ b/bookwyrm/tests/connectors/test_openlibrary_connector.py @@ -329,7 +329,7 @@ def test_create_edition_markdown_from_data(self): result = self.connector.create_edition_from_data(work, self.edition_md_data) self.assertEqual( result.description, - '

    \n

    "She didn\'t choose her garden" opens this chapbook ' + '

    \n

    "She didn\'t choose her garden" opens this chapbook ' "exploring Black womanhood, mental and physical health, spirituality, and " "ancestral roots. It is an investigation of how to locate a self amidst " "complex racial history and how to forge an authentic way forward. There's " From 5a36fe8d9d7a9c5b3392139635b1e00001b55c17 Mon Sep 17 00:00:00 2001 From: Ian Young Date: Sun, 31 Aug 2025 21:31:18 -0500 Subject: [PATCH 223/962] Whitelist img elements in statuses etc This is all that's needed to allow basic image insertion via markdown. --- bookwyrm/utils/sanitizer.py | 1 + 1 file changed, 1 insertion(+) diff --git a/bookwyrm/utils/sanitizer.py b/bookwyrm/utils/sanitizer.py index d5ac0daa6f..605939b02a 100644 --- a/bookwyrm/utils/sanitizer.py +++ b/bookwyrm/utils/sanitizer.py @@ -21,6 +21,7 @@ def clean(input_text: str) -> str: "ul", "ol", "li", + "img", }, attributes=["href", "rel", "src", "alt", "data-mention"], strip=True, From f9e7ead4c1b24811f50daf627c1400841b1ec223 Mon Sep 17 00:00:00 2001 From: Ian Young Date: Sun, 7 Sep 2025 20:55:40 -0500 Subject: [PATCH 224/962] Drag-n-drop uploader stub --- bookwyrm/static/js/xhr_files.js | 62 +++++++++++++++++++ bookwyrm/templates/layout.html | 1 + .../snippets/create_status/content_field.html | 1 + 3 files changed, 64 insertions(+) create mode 100644 bookwyrm/static/js/xhr_files.js diff --git a/bookwyrm/static/js/xhr_files.js b/bookwyrm/static/js/xhr_files.js new file mode 100644 index 0000000000..567f165cf6 --- /dev/null +++ b/bookwyrm/static/js/xhr_files.js @@ -0,0 +1,62 @@ +/* exported XhrFiles */ +/* globals BookWyrm */ + +let XhrFiles = new (class { + constructor() { + this.initEventListeners(); + } + + initEventListeners() { + window.addEventListener("dragover", (e) => { e.preventDefault(); }); + + window.addEventListener("drop", (e) => { e.preventDefault(); }); + + document + .querySelectorAll("[data-droppable-textfield]") + .forEach((t) => t.addEventListener("drop", this.dropFile.bind(this))); + } + + /** + * Upload file when dropped in element + * + * @param {Event} event + * @return {undefined} + */ + dropFile(event) { + console.log(event); + event.preventDefault(); + + let result = ""; + // Use DataTransferItemList interface to access the file(s) + [...event.dataTransfer.items].forEach((item, i) => { + // If dropped items aren't files, reject them + if (item.kind === "file") { + const file = item.getAsFile(); + this.uploadFile(file); + result += `• file[${i}].name = ${file.name}\n`; + } + }); + console.log(result); + } + + uploadFile(file) { + var xhr = new XMLHttpRequest(); + (xhr.upload || xhr).addEventListener('progress', function(e) { + var done = e.position || e.loaded + var total = e.totalSize || e.total; + console.log('xhr progress: ' + Math.round(done/total*100) + '%'); + }); + xhr.addEventListener('load', function(e) { + if (this.status != 200) { + console.log(e); + return; + } + console.log(e); + }); + xhr.open('post', '/your-sever-url', true); + var fd = new FormData(); + fd.append("filename", file.name); + fd.append("file", file); + xhr.send(fd); + } +})(); diff --git a/bookwyrm/templates/layout.html b/bookwyrm/templates/layout.html index ced4e80061..ec203b59d6 100644 --- a/bookwyrm/templates/layout.html +++ b/bookwyrm/templates/layout.html @@ -207,6 +207,7 @@ + diff --git a/bookwyrm/templates/snippets/create_status/content_field.html b/bookwyrm/templates/snippets/create_status/content_field.html index cc4205b2ce..7ae266d57a 100644 --- a/bookwyrm/templates/snippets/create_status/content_field.html +++ b/bookwyrm/templates/snippets/create_status/content_field.html @@ -12,6 +12,7 @@ + {% endblock %} diff --git a/bookwyrm/templates/lists/list_item.html b/bookwyrm/templates/lists/list_item.html index a6465d407a..3bff1a45f5 100644 --- a/bookwyrm/templates/lists/list_item.html +++ b/bookwyrm/templates/lists/list_item.html @@ -3,6 +3,7 @@ {% load book_display_tags %} {% load markdown %} {% load group_tags %} +{% load utilities %}

    {% with book=item.edition %} @@ -33,8 +34,8 @@ diff --git a/bookwyrm/templates/lists/suggestion_list.html b/bookwyrm/templates/lists/suggestion_list.html new file mode 100644 index 0000000000..2ebe8d236b --- /dev/null +++ b/bookwyrm/templates/lists/suggestion_list.html @@ -0,0 +1,19 @@ +{% extends 'lists/list.html' %} +{% load i18n %} +{% load group_tags %} +{% load utilities %} + +{% block breadcrumbs %} + +{% endblock %} + +{% block emded_link %}{% endblock %} diff --git a/bookwyrm/templatetags/utilities.py b/bookwyrm/templatetags/utilities.py index be2ff24d6d..6c0859a37e 100644 --- a/bookwyrm/templatetags/utilities.py +++ b/bookwyrm/templatetags/utilities.py @@ -33,6 +33,17 @@ def get_user_identifier(user): return user.localname if user.localname else user.username +@register.filter(is_safe=True) +@register.filter(name="user_link") +def get_link_to_user(user): + """get a link to a user profile, or display if the user has been deleted""" + username = user.display_name + if user.is_active: + return mark_safe(f"{username}") + text = _("deactivated user") + return mark_safe(f"{text}") + + @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""" @@ -95,7 +106,7 @@ def get_isni_bio(existing, author): return "" for value in existing: if hasattr(value, "bio") and auth_isni == re.sub(r"\D", "", str(value.isni)): - return mark_safe(f"Author of {value.bio}") + return mark_safe(_(f"Author of {value.bio}")) return "" diff --git a/bookwyrm/views/suggestion_list.py b/bookwyrm/views/suggestion_list.py index 8e3fa97f1c..db8de4a4e3 100644 --- a/bookwyrm/views/suggestion_list.py +++ b/bookwyrm/views/suggestion_list.py @@ -83,7 +83,7 @@ def get( data["suggested_books"] = get_list_suggestions( book_list, request.user, query=query, ignore_book=book_list.suggests_for ) - return TemplateResponse(request, "lists/list.html", data) + return TemplateResponse(request, "lists/suggestion_list.html", data) @method_decorator(login_required, name="dispatch") def post( From f0a1ba629eaf66fbaaaff51aa5ec098f45bd6088 Mon Sep 17 00:00:00 2001 From: Leni Kadali Date: Fri, 22 May 2026 22:10:53 +0300 Subject: [PATCH 681/962] Redo migration as part of branch update Redid migration as part of updating the branch --- ...{0229_listitem_raw_notes.py => 0230_listitem_raw_notes.py} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename bookwyrm/migrations/{0229_listitem_raw_notes.py => 0230_listitem_raw_notes.py} (70%) diff --git a/bookwyrm/migrations/0229_listitem_raw_notes.py b/bookwyrm/migrations/0230_listitem_raw_notes.py similarity index 70% rename from bookwyrm/migrations/0229_listitem_raw_notes.py rename to bookwyrm/migrations/0230_listitem_raw_notes.py index 98b0656bab..6155fc749b 100644 --- a/bookwyrm/migrations/0229_listitem_raw_notes.py +++ b/bookwyrm/migrations/0230_listitem_raw_notes.py @@ -1,4 +1,4 @@ -# Generated by Django 5.2.14 on 2026-05-20 20:27 +# Generated by Django 5.2.14 on 2026-05-22 19:10 from django.db import migrations, models @@ -6,7 +6,7 @@ class Migration(migrations.Migration): dependencies = [ - ('bookwyrm', '0228_remove_user_bookwyrm_us_is_acti_972dc4_idx_and_more'), + ('bookwyrm', '0229_series_mergedseries_seriesbook'), ] operations = [ From ff62f472ce8a9a4ae57e8d3be804b745e36e0ccf Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Fri, 22 May 2026 13:38:06 -0700 Subject: [PATCH 682/962] Adds arbitrary dev command runner to bw-dev --- bw-dev | 3 +++ 1 file changed, 3 insertions(+) diff --git a/bw-dev b/bw-dev index c28d914909..85e5a83203 100755 --- a/bw-dev +++ b/bw-dev @@ -128,6 +128,9 @@ case "$CMD" in down) $DOCKER_COMPOSE down ;; + devcommand) + $DOCKER_COMPOSE -f docker-compose.yml -f docker-compose.dev.yml --env-file .env --env-file .env.dev "$@" + ;; docker_cache_cleanup) echo "Showing current docker storage usage" docker system df From d1ffe75f29adc4dc0d6a9d7c4d66a796f8abfc9b Mon Sep 17 00:00:00 2001 From: Hugh Rundle Date: Sat, 23 May 2026 07:08:55 +1000 Subject: [PATCH 683/962] add merge migration --- bookwyrm/migrations/0230_merge_20260522_2105.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 bookwyrm/migrations/0230_merge_20260522_2105.py diff --git a/bookwyrm/migrations/0230_merge_20260522_2105.py b/bookwyrm/migrations/0230_merge_20260522_2105.py new file mode 100644 index 0000000000..37c10e382c --- /dev/null +++ b/bookwyrm/migrations/0230_merge_20260522_2105.py @@ -0,0 +1,14 @@ +# Generated by Django 5.2.14 on 2026-05-22 21:05 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('bookwyrm', '0229_alter_review_name'), + ('bookwyrm', '0229_series_mergedseries_seriesbook'), + ] + + operations = [ + ] From e79fc42b89a95cc2a6a0cbb0761b2f114b056fed Mon Sep 17 00:00:00 2001 From: Hugh Rundle Date: Sat, 23 May 2026 08:57:56 +1000 Subject: [PATCH 684/962] minor improvements from review --- ..._blocked_books.py => 0231_user_blocked_books.py} | 4 ++-- bookwyrm/models/book.py | 13 ++++++------- bookwyrm/models/status.py | 10 ++++++++-- bookwyrm/tests/views/test_feed.py | 2 +- bookwyrm/views/feed.py | 2 +- bookwyrm/views/preferences/books.py | 1 - bookwyrm/views/shelf/shelf.py | 2 +- bookwyrm/views/user.py | 2 +- 8 files changed, 20 insertions(+), 16 deletions(-) rename bookwyrm/migrations/{0229_user_blocked_books.py => 0231_user_blocked_books.py} (71%) diff --git a/bookwyrm/migrations/0229_user_blocked_books.py b/bookwyrm/migrations/0231_user_blocked_books.py similarity index 71% rename from bookwyrm/migrations/0229_user_blocked_books.py rename to bookwyrm/migrations/0231_user_blocked_books.py index 1a82e1ce51..ebfbc77f5b 100644 --- a/bookwyrm/migrations/0229_user_blocked_books.py +++ b/bookwyrm/migrations/0231_user_blocked_books.py @@ -1,4 +1,4 @@ -# Generated by Django 5.2.9 on 2026-05-10 07:32 +# Generated by Django 5.2.14 on 2026-05-22 21:53 from django.db import migrations, models @@ -6,7 +6,7 @@ class Migration(migrations.Migration): dependencies = [ - ('bookwyrm', '0228_remove_user_bookwyrm_us_is_acti_972dc4_idx_and_more'), + ('bookwyrm', '0230_merge_20260522_2105'), ] operations = [ diff --git a/bookwyrm/models/book.py b/bookwyrm/models/book.py index c420d3add8..3d0c797c72 100644 --- a/bookwyrm/models/book.py +++ b/bookwyrm/models/book.py @@ -853,18 +853,17 @@ def repair(self): self.save(update_fields=["parent_work"], broadcast=False) @classmethod - def viewer_aware_objects(cls, viewer, check_blocked=False): - """annotate a book query with metadata related to the user""" + def viewer_aware_objects(cls, viewer): + """filter blocked books and annotate a book query with metadata related to the user""" queryset = cls.objects - if check_blocked and hasattr(viewer, "blocked_books"): - blocked = cls.objects.filter(parent_work__in=viewer.blocked_books.all()) - queryset = queryset.exclude(id__in=blocked) - # TODO: could this just be queryset = queryset.exclude(parent_work__in=viewer.blocked_books.all()) ? - if not viewer or not viewer.is_authenticated: return queryset + queryset = queryset.exclude( + parent_work__in=viewer.blocked_books.values_list("id", flat=True) + ) + queryset = queryset.prefetch_related( Prefetch( "shelfbook_set", diff --git a/bookwyrm/models/status.py b/bookwyrm/models/status.py index 201b28b01f..6c3fd23b1e 100644 --- a/bookwyrm/models/status.py +++ b/bookwyrm/models/status.py @@ -277,9 +277,15 @@ def direct_filter(cls, queryset, viewer): ) @classmethod - def safety_filter(cls, viewer, privacy_levels=None): + def blocked_book_filter(cls, viewer, privacy_levels=None): + """filter out all statuses related to a book this user has blocked""" + queryset = super().privacy_filter(viewer, privacy_levels=privacy_levels) - blocked = viewer.blocked_books.all() if hasattr(viewer, "blocked_books") else [] + + if not viewer or not viewer.is_authenticated: + return queryset + + blocked = viewer.blocked_books.values_list("id", flat=True) book_comments = queryset.filter(comment__book__parent_work__in=blocked) book_quotations = queryset.filter(quotation__book__parent_work__in=blocked) diff --git a/bookwyrm/tests/views/test_feed.py b/bookwyrm/tests/views/test_feed.py index 9cc2a0d917..2ae3608307 100644 --- a/bookwyrm/tests/views/test_feed.py +++ b/bookwyrm/tests/views/test_feed.py @@ -233,7 +233,7 @@ def test_get_suggested_book_filters_blocked(self, *_): ) awful_book = models.Edition.objects.create( - parent_work=models.Work.objects.create(title="hi"), + parent_work=models.Work.objects.create(title="bad book"), title="This book is very bad", remote_id="https://example.com/book/99", ) diff --git a/bookwyrm/views/feed.py b/bookwyrm/views/feed.py index edb1f1f29a..da1c3048e5 100644 --- a/bookwyrm/views/feed.py +++ b/bookwyrm/views/feed.py @@ -275,7 +275,7 @@ def get_suggested_books(user, max_books=5): shelf_preview = { "name": shelf.name, "identifier": shelf.identifier, - "books": models.Edition.viewer_aware_objects(user, check_blocked=True) + "books": models.Edition.viewer_aware_objects(user) .filter( shelfbook__shelf=shelf, ) diff --git a/bookwyrm/views/preferences/books.py b/bookwyrm/views/preferences/books.py index 6ff8296bb3..12085793d7 100644 --- a/bookwyrm/views/preferences/books.py +++ b/bookwyrm/views/preferences/books.py @@ -1,5 +1,4 @@ from django.contrib.auth.decorators import login_required -from django.http import HttpResponse from django.shortcuts import get_object_or_404, redirect from django.template.response import TemplateResponse from django.utils.decorators import method_decorator diff --git a/bookwyrm/views/shelf/shelf.py b/bookwyrm/views/shelf/shelf.py index 5eb9140d44..ec9c3c2c78 100644 --- a/bookwyrm/views/shelf/shelf.py +++ b/bookwyrm/views/shelf/shelf.py @@ -49,7 +49,7 @@ def get(self, request, username, shelf_identifier=None): ) books = ( - models.Edition.viewer_aware_objects(request.user, check_blocked=True) + models.Edition.viewer_aware_objects(request.user) .filter( # privacy is ensured because the shelves are already filtered above shelfbook__shelf__in=shelves diff --git a/bookwyrm/views/user.py b/bookwyrm/views/user.py index 5a052e1850..63c846e4c3 100644 --- a/bookwyrm/views/user.py +++ b/bookwyrm/views/user.py @@ -71,7 +71,7 @@ def get(self, request, username): # user's posts activities = ( - models.Status.safety_filter( + models.Status.blocked_book_filter( request.user, ) .filter(user=user) From e114e6e5f43e24a0e4dccbaa8f0e1a93e40eb7ca Mon Sep 17 00:00:00 2001 From: Hugh Rundle Date: Sat, 23 May 2026 09:22:39 +1000 Subject: [PATCH 685/962] clean up view and filter logic for blocked books --- bookwyrm/templatetags/book_display_tags.py | 10 +++++----- bookwyrm/views/list/list.py | 22 +++++++++++----------- bookwyrm/views/user.py | 9 ++++----- 3 files changed, 20 insertions(+), 21 deletions(-) diff --git a/bookwyrm/templatetags/book_display_tags.py b/bookwyrm/templatetags/book_display_tags.py index f6726bcedc..4455626bc8 100644 --- a/bookwyrm/templatetags/book_display_tags.py +++ b/bookwyrm/templatetags/book_display_tags.py @@ -39,9 +39,9 @@ def get_author_edition(book, author): @register.filter(name="blocked_book_filter") def blocked_book_filter(queryset, viewer): """filter out blocked books from querysets with editions as 'book'""" - blocked = ( - viewer.blocked_books.all().values_list("id", flat=True) - if hasattr(viewer, "blocked_books") - else [] - ) + + if not viewer or not viewer.is_authenticated: + return queryset + + blocked = viewer.blocked_books.all().values_list("id", flat=True) return queryset.exclude(book__parent_work__in=blocked) diff --git a/bookwyrm/views/list/list.py b/bookwyrm/views/list/list.py index 6a3d3780de..389dc7e031 100644 --- a/bookwyrm/views/list/list.py +++ b/bookwyrm/views/list/list.py @@ -45,17 +45,17 @@ def get(self, request, list_id, **kwargs): if redirect_option := maybe_redirect_local_path(request, book_list): return redirect_option - # do not use this exclude in decrement_order etc because it will mess up ordering - if hasattr(request.user, "blocked_books"): - items = ( - book_list.listitem_set.filter(approved=True) - .exclude(book__parent_work__in=request.user.blocked_books.all()) - .prefetch_related("user", "book", "book__authors") - ) - else: - items = book_list.listitem_set.filter(approved=True).prefetch_related( - "user", "book", "book__authors" - ) + # NOTE: do not use this exclude in decrement_order etc because it will mess up ordering + blocked = [] + if request.user.is_authenticated: + blocked = request.user.blocked_books.values_list("id", flat=True) + + items = ( + book_list.listitem_set.filter(approved=True) + .exclude(book__parent_work__in=blocked) + .prefetch_related("user", "book", "book__authors") + ) + items = sort_list(request, items) paginated = Paginator(items, PAGE_LENGTH) diff --git a/bookwyrm/views/user.py b/bookwyrm/views/user.py index 63c846e4c3..578d29e610 100644 --- a/bookwyrm/views/user.py +++ b/bookwyrm/views/user.py @@ -52,11 +52,10 @@ def get(self, request, username): else: shelves = user.shelf_set.filter(books__isnull=False).distinct() - blocked = ( - request.user.blocked_books.all() - if hasattr(request.user, "blocked_books") - else [] - ) + blocked = [] + if request.user.is_authenticated: + blocked = request.user.blocked_books.values_list("id", flat=True) + for user_shelf in shelves.all()[:3]: shelf_preview.append( { From 1d1c85f8edca71def447a190172091e05c2cb592 Mon Sep 17 00:00:00 2001 From: Hugh Rundle Date: Sat, 23 May 2026 09:45:39 +1000 Subject: [PATCH 686/962] tidy list exclude --- bookwyrm/views/list/list.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/bookwyrm/views/list/list.py b/bookwyrm/views/list/list.py index 389dc7e031..f4a7b32900 100644 --- a/bookwyrm/views/list/list.py +++ b/bookwyrm/views/list/list.py @@ -118,7 +118,9 @@ def get_list_suggestions(book_list, user, query=None, num_suggestions=5): ) # just suggest whatever books are nearby suggestions = ( - user.shelfbook_set.exclude(book__parent_work__in=user.blocked_books.all()) + user.shelfbook_set.exclude( + book__parent_work__in=user.blocked_books.values_list("id", flat=True) + ) .filter(~Q(book__in=book_list.books.all())) .distinct()[:num_suggestions] ) @@ -126,7 +128,9 @@ def get_list_suggestions(book_list, user, query=None, num_suggestions=5): if len(suggestions) < num_suggestions: others = [ s.default_edition - for s in models.Work.objects.exclude(id__in=user.blocked_books.all()) + for s in models.Work.objects.exclude( + id__in=user.blocked_books.values_list("id", flat=True) + ) .filter( ~Q(editions__in=book_list.books.all()), ) From 7f041ecce0afc6766bd71a481c7a645025a9c700 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Sat, 23 May 2026 07:28:41 -0700 Subject: [PATCH 687/962] Fixes edit list item --- bookwyrm/templates/lists/edit_item_form.html | 3 ++- bookwyrm/views/list/list_item.py | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/bookwyrm/templates/lists/edit_item_form.html b/bookwyrm/templates/lists/edit_item_form.html index 2ef753e84e..0ede6212ab 100644 --- a/bookwyrm/templates/lists/edit_item_form.html +++ b/bookwyrm/templates/lists/edit_item_form.html @@ -5,7 +5,8 @@ action="{% url 'list-item' list.id item.id %}" > {% csrf_token %} - + + {% include "lists/item_notes_field.html" with form_id=item.id %} diff --git a/bookwyrm/views/list/list_item.py b/bookwyrm/views/list/list_item.py index 29b6bb7ec1..c771fd27b2 100644 --- a/bookwyrm/views/list/list_item.py +++ b/bookwyrm/views/list/list_item.py @@ -16,6 +16,8 @@ class ListItem(View): def post(self, request, list_id, list_item): """Edit a list item's notes""" list_item = get_object_or_404(models.ListItem, id=list_item, book_list=list_id) + list_item.raise_not_editable(request.user) + form = forms.ListItemForm(request.POST, instance=list_item) if form.is_valid(): item = form.save(request, commit=False) From db3d82fe39eb192368d257787f3072a2b7ae9f7e Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Sat, 23 May 2026 07:43:54 -0700 Subject: [PATCH 688/962] Only show "reader who liked..." message when books are present --- bookwyrm/templates/book/suggestion_list/list.html | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/bookwyrm/templates/book/suggestion_list/list.html b/bookwyrm/templates/book/suggestion_list/list.html index 2cb8c59725..fa0c62f9ac 100644 --- a/bookwyrm/templates/book/suggestion_list/list.html +++ b/bookwyrm/templates/book/suggestion_list/list.html @@ -11,14 +11,16 @@

    {% endif %}

    -

    - {% blocktrans trimmed with title=book.title %} - Readers who liked {{ title }} recommend giving these books a try: - {% endblocktrans %} -

    - {% if suggestion_list %} + {% if items|length > 0 %} +

    + {% blocktrans trimmed with title=book.title %} + Readers who liked {{ title }} recommend giving these books a try: + {% endblocktrans %} +

    + {% endif %} + {% if items|length == 0 %}
    From db3d9a1a3fbf0b235c217105ce4b3d61b00bdd82 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Sat, 23 May 2026 08:23:40 -0700 Subject: [PATCH 689/962] Fixes editing list items --- bookwyrm/models/list.py | 12 +++++ bookwyrm/templates/lists/edit_item_form.html | 6 +-- bookwyrm/templates/lists/list_item_notes.html | 3 +- bookwyrm/urls.py | 5 ++ bookwyrm/views/__init__.py | 2 +- bookwyrm/views/list/list_item.py | 48 ++++++++++++++----- 6 files changed, 59 insertions(+), 17 deletions(-) diff --git a/bookwyrm/models/list.py b/bookwyrm/models/list.py index 2fe51b2fc8..df18402a91 100644 --- a/bookwyrm/models/list.py +++ b/bookwyrm/models/list.py @@ -273,8 +273,14 @@ class ListItem(AbstractListItem): @property def work(self): + """match the suggestion list model by producing a work""" return self.edition.parent_work + @property + def edit_path_name(self): + """the form submit link to edit this item""" + return "list-item" + @property def privacy(self): """inherit the privacy of the list, or direct if pending""" @@ -317,8 +323,14 @@ class SuggestionListItem(AbstractListItem): @property def edition(self): + """match the list model by producing an edition""" return self.work.default_edition + @property + def edit_path_name(self): + """the form submit link to edit this item""" + return "suggestion-list-item" + class Meta: """A book may only be placed into a list once, and each order in the list may be used only once""" diff --git a/bookwyrm/templates/lists/edit_item_form.html b/bookwyrm/templates/lists/edit_item_form.html index 0ede6212ab..b0768ec33f 100644 --- a/bookwyrm/templates/lists/edit_item_form.html +++ b/bookwyrm/templates/lists/edit_item_form.html @@ -2,11 +2,11 @@
    {% csrf_token %} - - + + {% include "lists/item_notes_field.html" with form_id=item.id %} diff --git a/bookwyrm/templates/lists/list_item_notes.html b/bookwyrm/templates/lists/list_item_notes.html index 0a9d39198d..784d797c86 100644 --- a/bookwyrm/templates/lists/list_item_notes.html +++ b/bookwyrm/templates/lists/list_item_notes.html @@ -27,7 +27,8 @@ - {% include "lists/edit_item_form.html" with edition=item.book %} + {% url item.edit_path_name list.id item.id as path %} + {% include "lists/edit_item_form.html" with item=item list=list path=path %}
    {% endif %} diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py index 508627bea7..dec1f59677 100644 --- a/bookwyrm/urls.py +++ b/bookwyrm/urls.py @@ -657,6 +657,11 @@ re_path( rf"^list/(?P\d+){regex.SLUG}/?$", views.List.as_view(), name="list" ), + re_path( + r"^suggestionlist/(?P\d+)/item/(?P\d+)/?$", + views.SuggestionListItem.as_view(), + name="suggestion-list-item", + ), re_path( r"^list/(?P\d+)/item/(?P\d+)/?$", views.ListItem.as_view(), diff --git a/bookwyrm/views/__init__.py b/bookwyrm/views/__init__.py index 0e15e5a72a..60633d949e 100644 --- a/bookwyrm/views/__init__.py +++ b/bookwyrm/views/__init__.py @@ -132,7 +132,7 @@ # lists from .list.curate import Curate from .list.embed import unsafe_embed_list -from .list.list_item import ListItem +from .list.list_item import ListItem, SuggestionListItem from .list.lists import Lists, SavedLists, UserLists from .list.list import ( List, diff --git a/bookwyrm/views/list/list_item.py b/bookwyrm/views/list/list_item.py index c771fd27b2..fa49654366 100644 --- a/bookwyrm/views/list/list_item.py +++ b/bookwyrm/views/list/list_item.py @@ -1,11 +1,12 @@ """book list views""" from django.contrib.auth.decorators import login_required -from django.shortcuts import get_object_or_404, redirect +from django.shortcuts import get_object_or_404 from django.utils.decorators import method_decorator from django.views import View from bookwyrm import forms, models +from bookwyrm.views.helpers import redirect_to_referer from bookwyrm.views.status import to_markdown @@ -15,14 +16,37 @@ class ListItem(View): def post(self, request, list_id, list_item): """Edit a list item's notes""" - list_item = get_object_or_404(models.ListItem, id=list_item, book_list=list_id) - list_item.raise_not_editable(request.user) - - form = forms.ListItemForm(request.POST, instance=list_item) - if form.is_valid(): - item = form.save(request, commit=False) - item.notes = to_markdown(item.notes) - item.save() - else: - raise Exception(form.errors) - return redirect("list", list_item.book_list.id) + return edit_list_item( + request, list_id, list_item, models.ListItem, forms.ListItemForm + ) + + +@method_decorator(login_required, name="dispatch") +class SuggestionListItem(View): + """book suggestion list page""" + + def post(self, request, list_id, list_item): + """Edit a suggestion list item's notes""" + return edit_list_item( + request, + list_id, + list_item, + models.SuggestionListItem, + forms.SuggestionListItemForm, + ) + + +def edit_list_item(request, list_id, list_item, item_model, form): + """edit a list or suggestion list item""" + list_item = get_object_or_404(item_model, id=list_item, book_list=list_id) + list_item.raise_not_editable(request.user) + + form = form(request.POST, instance=list_item) + if form.is_valid(): + item = form.save(request, commit=False) + item.notes = to_markdown(item.notes) + item.save() + else: + raise Exception(form.errors) + + return redirect_to_referer(request) From 30b59be50f4b2fdf8f8575a5013c4a26a6fae094 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Sat, 23 May 2026 08:34:40 -0700 Subject: [PATCH 690/962] Use 6 instead of 5 results for add books to list --- bookwyrm/views/list/list.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/views/list/list.py b/bookwyrm/views/list/list.py index 2d0bbe83f4..8390342880 100644 --- a/bookwyrm/views/list/list.py +++ b/bookwyrm/views/list/list.py @@ -105,7 +105,7 @@ def post(self, request, list_id): def get_list_suggestions( - book_list, user, query=None, num_suggestions=5, ignore_book=None + book_list, user, query=None, num_suggestions=6, ignore_book=None ): """What books might a user want to add to a list""" if query: From 455e80425fd0bd198a1140c421fbef6e722871ca Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Sat, 23 May 2026 08:39:35 -0700 Subject: [PATCH 691/962] Gets correct count of suggestion list items on book page --- bookwyrm/templates/book/suggestion_list/list.html | 2 +- bookwyrm/views/books/books.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/bookwyrm/templates/book/suggestion_list/list.html b/bookwyrm/templates/book/suggestion_list/list.html index fa0c62f9ac..e18a2ba7ab 100644 --- a/bookwyrm/templates/book/suggestion_list/list.html +++ b/bookwyrm/templates/book/suggestion_list/list.html @@ -6,7 +6,7 @@

    {% trans "Suggestions" %} {% if suggestion_list and items|length > 0 %} - {% trans "View all suggestions" %} ({{ items|length }}) + {% trans "View all suggestions" %} ({{ item_count }}) {% endif %}

    diff --git a/bookwyrm/views/books/books.py b/bookwyrm/views/books/books.py index 714a892278..9c6b1d8d47 100644 --- a/bookwyrm/views/books/books.py +++ b/bookwyrm/views/books/books.py @@ -145,6 +145,7 @@ def get(self, request, book_id, **kwargs): } if hasattr(book.parent_work, "suggestion_list"): data["suggestion_list"] = book.parent_work.suggestion_list + data["item_count"] = data["suggestion_list"].suggestionlistitem_set.count() data["items"] = ( data["suggestion_list"] .suggestionlistitem_set.prefetch_related( From b92e0243603f93d4c2637bc598a89f6e43647ec1 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Sat, 23 May 2026 08:42:26 -0700 Subject: [PATCH 692/962] Don't allow saving suggestion lists --- bookwyrm/templates/lists/layout.html | 2 ++ bookwyrm/views/books/books.py | 4 +++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/bookwyrm/templates/lists/layout.html b/bookwyrm/templates/lists/layout.html index c9003b3252..cbb1f1404d 100644 --- a/bookwyrm/templates/lists/layout.html +++ b/bookwyrm/templates/lists/layout.html @@ -26,9 +26,11 @@

    {{ list.name }} {% include 'snippets/pr {% include 'snippets/toggle/open_button.html' with text=button_text icon_with_text="pencil" controls_text="edit_list" focus="edit_list_header" %}

    {% endif %} + {% if list.suggests_for == None %}
    {% include "lists/bookmark_button.html" with list=list %}
    + {% endif %}
    diff --git a/bookwyrm/views/books/books.py b/bookwyrm/views/books/books.py index 9c6b1d8d47..defdaacf2b 100644 --- a/bookwyrm/views/books/books.py +++ b/bookwyrm/views/books/books.py @@ -145,7 +145,9 @@ def get(self, request, book_id, **kwargs): } if hasattr(book.parent_work, "suggestion_list"): data["suggestion_list"] = book.parent_work.suggestion_list - data["item_count"] = data["suggestion_list"].suggestionlistitem_set.count() + data["item_count"] = data[ + "suggestion_list" + ].suggestionlistitem_set.count() data["items"] = ( data["suggestion_list"] .suggestionlistitem_set.prefetch_related( From eb19a6fd6cfa41c27b1a5f62f3ff2c5018d754b9 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Sat, 23 May 2026 09:05:27 -0700 Subject: [PATCH 693/962] Fixes editing notes from user suggestions page --- bookwyrm/templates/lists/edit_item_form.html | 3 +-- bookwyrm/templates/lists/list_item_notes.html | 3 +-- bookwyrm/templates/user/suggestions.html | 12 +++++++----- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/bookwyrm/templates/lists/edit_item_form.html b/bookwyrm/templates/lists/edit_item_form.html index b0768ec33f..686b1b7fe1 100644 --- a/bookwyrm/templates/lists/edit_item_form.html +++ b/bookwyrm/templates/lists/edit_item_form.html @@ -2,7 +2,7 @@ {% csrf_token %} @@ -18,4 +18,3 @@ - diff --git a/bookwyrm/templates/lists/list_item_notes.html b/bookwyrm/templates/lists/list_item_notes.html index 784d797c86..5a497266cb 100644 --- a/bookwyrm/templates/lists/list_item_notes.html +++ b/bookwyrm/templates/lists/list_item_notes.html @@ -27,8 +27,7 @@ - {% url item.edit_path_name list.id item.id as path %} - {% include "lists/edit_item_form.html" with item=item list=list path=path %} + {% include "lists/edit_item_form.html" with item=item list=list %} {% endif %} diff --git a/bookwyrm/templates/user/suggestions.html b/bookwyrm/templates/user/suggestions.html index a013de07aa..476f3101f6 100644 --- a/bookwyrm/templates/user/suggestions.html +++ b/bookwyrm/templates/user/suggestions.html @@ -19,19 +19,21 @@

    {% block panel %}
    -
      +
      {% for suggestion in suggestions %} -
    • +
      +

      {% blocktrans trimmed with list_name=suggestion.book_list.name url=suggestion.book_list.remote_id %} - From: {{ list_name }} + {{ list_name }} {% endblocktrans %}

      {% url 'book-remove-suggestion' suggestion.book_list.id as remove_book_url %} {% include "lists/list_item.html" with list=suggestion.book_list item=suggestion remove_book_url=remove_book_url %} -
    • +
      + {% endfor %} -
    +
    {% include 'snippets/pagination.html' with page=suggestions path=path %} From 3d553e3c0ac76dea581593b62fe99e3508f118f8 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Sat, 23 May 2026 09:09:56 -0700 Subject: [PATCH 694/962] Reorders migrations --- ...231_alter_list_options_alter_listitem_options_and_more.py} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename bookwyrm/migrations/{0230_alter_list_options_alter_listitem_options_and_more.py => 0231_alter_list_options_alter_listitem_options_and_more.py} (97%) diff --git a/bookwyrm/migrations/0230_alter_list_options_alter_listitem_options_and_more.py b/bookwyrm/migrations/0231_alter_list_options_alter_listitem_options_and_more.py similarity index 97% rename from bookwyrm/migrations/0230_alter_list_options_alter_listitem_options_and_more.py rename to bookwyrm/migrations/0231_alter_list_options_alter_listitem_options_and_more.py index afb97bc61b..c05beac76b 100644 --- a/bookwyrm/migrations/0230_alter_list_options_alter_listitem_options_and_more.py +++ b/bookwyrm/migrations/0231_alter_list_options_alter_listitem_options_and_more.py @@ -1,4 +1,4 @@ -# Generated by Django 5.2.14 on 2026-05-21 17:08 +# Generated by Django 5.2.14 on 2026-05-23 16:09 import bookwyrm.models.activitypub_mixin import bookwyrm.models.fields @@ -10,7 +10,7 @@ class Migration(migrations.Migration): dependencies = [ - ('bookwyrm', '0229_series_mergedseries_seriesbook'), + ('bookwyrm', '0230_merge_20260522_2105'), ] operations = [ From 2a36c19fa9cae4be9479b87f1af098fd2c66c306 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Sat, 23 May 2026 09:12:43 -0700 Subject: [PATCH 695/962] Small display fix on user suggestions view --- bookwyrm/templates/lists/list_item.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/templates/lists/list_item.html b/bookwyrm/templates/lists/list_item.html index 3bff1a45f5..f76fbf3454 100644 --- a/bookwyrm/templates/lists/list_item.html +++ b/bookwyrm/templates/lists/list_item.html @@ -32,7 +32,7 @@
    - {% for seriesbook in series.seriesbooks.all %} + {% for seriesbook in books %}
    diff --git a/bookwyrm/templates/search/book.html b/bookwyrm/templates/search/book.html index b93c967545..80812c9380 100644 --- a/bookwyrm/templates/search/book.html +++ b/bookwyrm/templates/search/book.html @@ -1,10 +1,20 @@ {% extends 'search/layout.html' %} {% load i18n %} {% load humanize %} +{% load utilities %} {% load book_display_tags %} {% block panel %} +{% if blocked_books_excluded %} +

    + {% url "prefs-block-books" as bb_path %} + {% blocktrans trimmed %} + Some results have been excluded because they are in your blocked books list + {% endblocktrans %} +

    +{% endif %} + {% if results or remote_results %}
      {% for result in results %} diff --git a/bookwyrm/tests/views/books/test_series.py b/bookwyrm/tests/views/books/test_series.py index 83a88e6174..33d13148b4 100644 --- a/bookwyrm/tests/views/books/test_series.py +++ b/bookwyrm/tests/views/books/test_series.py @@ -122,3 +122,30 @@ def test_seriesbook_api(self): result = view(request, self.seriesbook.id) self.assertIsInstance(result, ActivitypubResponse) self.assertEqual(result.status_code, 200) + + def test_series_page_with_blocked_book(self): + """do not display blocked books on series homepage""" + + bad_work = models.Work.objects.create(title="awful book") + + models.SeriesBook.objects.create( + book=bad_work, + series=self.series, + user=self.user, + remote_id="https://example.com/seriesbook/666", + ) + + view = views.Series.as_view() + request = self.factory.get("") + request.user = self.user + result = view(request, self.seriesbook.id) + + books = result.context_data["books"] + self.assertEqual(books.object_list.count(), 2) + + self.user.blocked_books.add(bad_work) + + result = view(request, self.series.id) + + books = result.context_data["books"] + self.assertEqual(books.object_list.count(), 1) diff --git a/bookwyrm/tests/views/test_author.py b/bookwyrm/tests/views/test_author.py index f43a75f937..0df3cdb6f5 100644 --- a/bookwyrm/tests/views/test_author.py +++ b/bookwyrm/tests/views/test_author.py @@ -91,6 +91,40 @@ def test_author_page_edition_author(self): validate_html(result.render()) self.assertEqual(result.status_code, 200) + def test_author_page_edition_author_blocked_book(self): + """blocked books should not display""" + view = views.Author.as_view() + models.Edition.objects.create( + title="Example Edition", + remote_id="https://example.com/book/1", + parent_work=self.work, + isbn_13="9780300112511", + ) + author = models.Author.objects.create(name="Jessica") + self.book.authors.add(author) + + bad_book = models.Edition.objects.create( + title="Bad Edition", + remote_id="https://example.com/book/3", + parent_work=models.Work.objects.create(title="Bad Work"), + isbn_13="9780123456789", + ) + bad_book.authors.add(author) + + self.local_user.blocked_books.add(bad_book.parent_work) + + request = self.factory.get("") + request.user = self.local_user + with patch("bookwyrm.views.author.is_api_request") as is_api: + is_api.return_value = False + result = view(request, author.id) + books = result.context_data["books"] + self.assertEqual(books.object_list.count(), 1) + + self.assertIsInstance(result, TemplateResponse) + validate_html(result.render()) + self.assertEqual(result.status_code, 200) + def test_author_page_empty(self): """there are so many views, this just makes sure it LOADS""" view = views.Author.as_view() diff --git a/bookwyrm/tests/views/test_search.py b/bookwyrm/tests/views/test_search.py index 2cbc15fce2..1119081ec1 100644 --- a/bookwyrm/tests/views/test_search.py +++ b/bookwyrm/tests/views/test_search.py @@ -235,3 +235,20 @@ def test_author_search(self): validate_html(response.render()) self.assertEqual(len(response.context_data["results"]), 1) self.assertEqual(response.context_data["results"][0], self.another_author) + + def test_search_books_blocked_book(self): + """don't return blocked books on search""" + + self.local_user.blocked_books.add(self.work) + + view = views.Search.as_view() + request = self.factory.get("", {"q": "Test Book", "remote": False}) + request.user = self.local_user + with patch("bookwyrm.views.search.is_api_request") as is_api: + is_api.return_value = False + response = view(request) + self.assertIsInstance(response, TemplateResponse) + validate_html(response.render()) + + self.assertEqual(response.context_data["blocked_books_excluded"], True) + self.assertEqual(len(response.context_data["results"]), 0) diff --git a/bookwyrm/views/author.py b/bookwyrm/views/author.py index 571343cd64..3348d87825 100644 --- a/bookwyrm/views/author.py +++ b/bookwyrm/views/author.py @@ -34,8 +34,14 @@ def get(self, request, author_id, slug=None): if redirect_local_path := maybe_redirect_local_path(request, author): return redirect_local_path + blocked_books = ( + request.user.blocked_books.values_list("id", flat=True) + if request.user.is_authenticated + else [] + ) books = ( models.Work.objects.filter(editions__authors=author) + .exclude(id__in=blocked_books) .order_by("created_date") .distinct() ) diff --git a/bookwyrm/views/books/series.py b/bookwyrm/views/books/series.py index fbad8d13f1..5c8434c8c0 100644 --- a/bookwyrm/views/books/series.py +++ b/bookwyrm/views/books/series.py @@ -30,20 +30,21 @@ def get(self, request, series_id, slug=None): if is_api_request(request): return ActivitypubResponse(series.to_activity(**request.GET)) - authors = models.Author.objects.none() - books = [] - items = ( - series.seriesbooks.filter(series=series.id) + blocked_books = ( + request.user.blocked_books.all() if request.user.is_authenticated else [] + ) + books = ( + series.seriesbooks.exclude(book__in=blocked_books) .prefetch_related("book__work", "book__authors") .order_by("series_number") ) - for item in items: - book = item.book.work.default_edition - book_data = {"book": book, "series_number": item.series_number} - books.append(book_data) - authors = authors.union(item.book.authors.all()) - paginated = Paginator(books, PAGE_LENGTH) + works = models.Work.objects.filter(id__in=books.values_list("book", flat=True)) + authors = models.Author.objects.filter( + id__in=works.values_list("authors", flat=True) + ) + + paginated = Paginator(books.all(), PAGE_LENGTH) page = paginated.get_page(request.GET.get("page")) data = { diff --git a/bookwyrm/views/search.py b/bookwyrm/views/search.py index 0c8fbf160e..08b7d62f63 100644 --- a/bookwyrm/views/search.py +++ b/bookwyrm/views/search.py @@ -75,10 +75,23 @@ def book_search(request): # try a local-only search local_results = search(query, min_confidence=min_confidence) - paginated = Paginator(local_results, PAGE_LENGTH) + + cleaned_results = local_results + if request.user.is_authenticated: + blocked = request.user.blocked_books.values_list("id", flat=True) + cleaned_results = list( + filter(lambda b: b.parent_work.id not in blocked, local_results) + ) + + blocked_books_excluded = ( + True if len(cleaned_results) < len(local_results) else False + ) + + paginated = Paginator(cleaned_results, PAGE_LENGTH) page = paginated.get_page(request.GET.get("page")) data = { "query": query, + "blocked_books_excluded": blocked_books_excluded, "results": page, "type": "book", "remote": search_remote, From 77e09991b8fa346fce453f0e4ed7f0c9fea9dcc2 Mon Sep 17 00:00:00 2001 From: Hugh Rundle Date: Sun, 24 May 2026 18:59:29 +1000 Subject: [PATCH 701/962] update wording on search page --- bookwyrm/templates/search/book.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/templates/search/book.html b/bookwyrm/templates/search/book.html index 80812c9380..9174e4655c 100644 --- a/bookwyrm/templates/search/book.html +++ b/bookwyrm/templates/search/book.html @@ -10,7 +10,7 @@

      {% url "prefs-block-books" as bb_path %} {% blocktrans trimmed %} - Some results have been excluded because they are in your blocked books list + Some blocked books have been excluded. {% endblocktrans %}

      {% endif %} From 2c410c0f7bdb3306d7562e4e680da1e230d636cf Mon Sep 17 00:00:00 2001 From: Hugh Rundle Date: Sun, 24 May 2026 19:04:20 +1000 Subject: [PATCH 702/962] add merge migration --- bookwyrm/migrations/0232_merge_20260524_0901.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 bookwyrm/migrations/0232_merge_20260524_0901.py diff --git a/bookwyrm/migrations/0232_merge_20260524_0901.py b/bookwyrm/migrations/0232_merge_20260524_0901.py new file mode 100644 index 0000000000..70a112c072 --- /dev/null +++ b/bookwyrm/migrations/0232_merge_20260524_0901.py @@ -0,0 +1,14 @@ +# Generated by Django 5.2.14 on 2026-05-24 09:01 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('bookwyrm', '0231_sitesettings_block_incoming_search_and_more'), + ('bookwyrm', '0231_user_blocked_books'), + ] + + operations = [ + ] From ea97cce0e74998f190aacbea51f28b18c64e05c8 Mon Sep 17 00:00:00 2001 From: ProtonsAndElectrons Date: Mon, 25 May 2026 01:33:29 +0200 Subject: [PATCH 703/962] Stabilize Readwise source URL test --- bookwyrm/tests/test_readwise.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/tests/test_readwise.py b/bookwyrm/tests/test_readwise.py index 16c26a2c16..312d1ea309 100644 --- a/bookwyrm/tests/test_readwise.py +++ b/bookwyrm/tests/test_readwise.py @@ -73,7 +73,7 @@ def test_build_readwise_highlight(self): self.assertEqual(result["author"], "Octavia Butler") self.assertEqual(result["source_type"], "bookwyrm") self.assertEqual(result["category"], "books") - self.assertEqual(result["source_url"], "https://example.com/book/1") + self.assertEqual(result["source_url"], quotation.book.remote_id) self.assertEqual(result["highlight_url"], quotation.remote_id) self.assertEqual(result["location_type"], "page") self.assertEqual(result["location"], 42) From 4ab4b6a4a455db2144de88309a432eccfcbfa8af Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 25 May 2026 09:31:11 -0700 Subject: [PATCH 704/962] Updates tests to reflect public suggestions --- bookwyrm/tests/views/test_user.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/bookwyrm/tests/views/test_user.py b/bookwyrm/tests/views/test_user.py index c566aa4dd5..b025c66282 100644 --- a/bookwyrm/tests/views/test_user.py +++ b/bookwyrm/tests/views/test_user.py @@ -364,4 +364,5 @@ def test_suggestions_page_is_not_self(self): request = self.factory.get("") request.user = self.anonymous_user result = view(request, "mouse") - self.assertEqual(result.status_code, 302) + self.assertEqual(result.status_code, 200) + validate_html(result.render()) From c14be3b7ee260e91b076fe354222bf85d7d800a7 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 25 May 2026 09:57:38 -0700 Subject: [PATCH 705/962] Landing page re-work --- bookwyrm/templates/landing/landing.html | 49 +++++----------------- bookwyrm/templates/landing/large-book.html | 39 ----------------- bookwyrm/templates/landing/small-book.html | 23 ---------- bookwyrm/templatetags/landing_page_tags.py | 8 +--- 4 files changed, 11 insertions(+), 108 deletions(-) delete mode 100644 bookwyrm/templates/landing/large-book.html delete mode 100644 bookwyrm/templates/landing/small-book.html diff --git a/bookwyrm/templates/landing/landing.html b/bookwyrm/templates/landing/landing.html index 050f62b33b..54639db079 100644 --- a/bookwyrm/templates/landing/landing.html +++ b/bookwyrm/templates/landing/landing.html @@ -13,46 +13,17 @@

      {% trans "Recent Books" %}

      {# 1 hour cache #} {% cache 3600 landing LANGUAGE_CODE %} {% get_landing_books as books %} -
      -
      -
      -
      - {% include 'landing/large-book.html' with book=books.0 %} -
      -
      -
      -
      -
      - {% include 'landing/small-book.html' with book=books.1 %} -
      -
      -
      -
      - {% include 'landing/small-book.html' with book=books.2 %} -
      -
      -
      -
      -
      -
      -
      -
      - {% include 'landing/small-book.html' with book=books.3 %} -
      -
      -
      -
      - {% include 'landing/small-book.html' with book=books.4 %} -
      -
      -
      -
      -
      - {% include 'landing/large-book.html' with book=books.5 %} -
      -
      +
      + {% for work in books %} + {% with book=work.default_edition %} + + {% endwith %} + {% endfor %}
      {% endcache %} {% endif %} -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/bookwyrm/templates/landing/large-book.html b/bookwyrm/templates/landing/large-book.html deleted file mode 100644 index 9b4fd1f938..0000000000 --- a/bookwyrm/templates/landing/large-book.html +++ /dev/null @@ -1,39 +0,0 @@ -{% load book_display_tags %} -{% load rating_tags %} -{% load markdown %} -{% load i18n %} - -{% if book %} - {% with book=book %} -
      -
      - {% include 'snippets/book_cover.html' with cover_class='is-w-l-mobile is-w-auto-tablet' size='xxlarge' %} - - {% include 'snippets/stars.html' with rating=book|rating:request.user %} -
      - - -
      -

      - {{ book.title }} -

      - - {% if book.authors %} -

      - {% trans "by" %} - {% include 'snippets/authors.html' with limit=3 %} -

      - {% endif %} - - {% if book|book_description %} -
      - {{ book|book_description|to_markdown|safe|truncatewords_html:50 }} -
      - {% endif %} -
      -
      - {% endwith %} -{% endif %} diff --git a/bookwyrm/templates/landing/small-book.html b/bookwyrm/templates/landing/small-book.html deleted file mode 100644 index 31f80e41f4..0000000000 --- a/bookwyrm/templates/landing/small-book.html +++ /dev/null @@ -1,23 +0,0 @@ -{% load rating_tags %} -{% load i18n %} - -{% if book %} - {% with book=book %} - - {% include 'snippets/book_cover.html' with cover_class='is-w-l-mobile is-w-auto align to-b to-l' size='xxlarge' %} - - - {% include 'snippets/stars.html' with rating=book|rating:request.user %} - -

      - {{ book.title }} -

      - - {% if book.authors.exists %} -

      - {% trans "by" %} - {% include 'snippets/authors.html' with limit=3 %} -

      - {% endif %} - {% endwith %} -{% endif %} diff --git a/bookwyrm/templatetags/landing_page_tags.py b/bookwyrm/templatetags/landing_page_tags.py index 50e0471fec..b63f9bb80b 100644 --- a/bookwyrm/templatetags/landing_page_tags.py +++ b/bookwyrm/templatetags/landing_page_tags.py @@ -70,10 +70,4 @@ def get_book_superlatives(): @register.simple_tag(takes_context=False) def get_landing_books(): """list of books for the landing page""" - return list( - set( - models.Edition.objects.exclude(cover__exact="") - .distinct() - .order_by("-updated_date")[:6] - ) - ) + return models.Work.objects.distinct().order_by("-updated_date")[:20] From d38674c028f90cc10a26615f118f0d460a0f9199 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 25 May 2026 09:58:21 -0700 Subject: [PATCH 706/962] Revert "Landing page re-work" This reverts commit c14be3b7ee260e91b076fe354222bf85d7d800a7. --- bookwyrm/templates/landing/landing.html | 49 +++++++++++++++++----- bookwyrm/templates/landing/large-book.html | 39 +++++++++++++++++ bookwyrm/templates/landing/small-book.html | 23 ++++++++++ bookwyrm/templatetags/landing_page_tags.py | 8 +++- 4 files changed, 108 insertions(+), 11 deletions(-) create mode 100644 bookwyrm/templates/landing/large-book.html create mode 100644 bookwyrm/templates/landing/small-book.html diff --git a/bookwyrm/templates/landing/landing.html b/bookwyrm/templates/landing/landing.html index 54639db079..050f62b33b 100644 --- a/bookwyrm/templates/landing/landing.html +++ b/bookwyrm/templates/landing/landing.html @@ -13,17 +13,46 @@

      {% trans "Recent Books" %}

      {# 1 hour cache #} {% cache 3600 landing LANGUAGE_CODE %} {% get_landing_books as books %} -
      - {% for work in books %} - {% with book=work.default_edition %} -
      - - {% include 'snippets/book_cover.html' with size='xxlarge' %} - +
      +
      +
      +
      + {% include 'landing/large-book.html' with book=books.0 %} +
      +
      +
      +
      +
      + {% include 'landing/small-book.html' with book=books.1 %} +
      +
      +
      +
      + {% include 'landing/small-book.html' with book=books.2 %} +
      +
      +
      +
      +
      +
      +
      +
      + {% include 'landing/small-book.html' with book=books.3 %} +
      +
      +
      +
      + {% include 'landing/small-book.html' with book=books.4 %} +
      +
      +
      +
      +
      + {% include 'landing/large-book.html' with book=books.5 %} +
      +
      - {% endwith %} - {% endfor %}
      {% endcache %} {% endif %} -{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/bookwyrm/templates/landing/large-book.html b/bookwyrm/templates/landing/large-book.html new file mode 100644 index 0000000000..9b4fd1f938 --- /dev/null +++ b/bookwyrm/templates/landing/large-book.html @@ -0,0 +1,39 @@ +{% load book_display_tags %} +{% load rating_tags %} +{% load markdown %} +{% load i18n %} + +{% if book %} + {% with book=book %} +
      +
      + {% include 'snippets/book_cover.html' with cover_class='is-w-l-mobile is-w-auto-tablet' size='xxlarge' %} + + {% include 'snippets/stars.html' with rating=book|rating:request.user %} +
      + + +
      +

      + {{ book.title }} +

      + + {% if book.authors %} +

      + {% trans "by" %} + {% include 'snippets/authors.html' with limit=3 %} +

      + {% endif %} + + {% if book|book_description %} +
      + {{ book|book_description|to_markdown|safe|truncatewords_html:50 }} +
      + {% endif %} +
      +
      + {% endwith %} +{% endif %} diff --git a/bookwyrm/templates/landing/small-book.html b/bookwyrm/templates/landing/small-book.html new file mode 100644 index 0000000000..31f80e41f4 --- /dev/null +++ b/bookwyrm/templates/landing/small-book.html @@ -0,0 +1,23 @@ +{% load rating_tags %} +{% load i18n %} + +{% if book %} + {% with book=book %} + + {% include 'snippets/book_cover.html' with cover_class='is-w-l-mobile is-w-auto align to-b to-l' size='xxlarge' %} + + + {% include 'snippets/stars.html' with rating=book|rating:request.user %} + +

      + {{ book.title }} +

      + + {% if book.authors.exists %} +

      + {% trans "by" %} + {% include 'snippets/authors.html' with limit=3 %} +

      + {% endif %} + {% endwith %} +{% endif %} diff --git a/bookwyrm/templatetags/landing_page_tags.py b/bookwyrm/templatetags/landing_page_tags.py index b63f9bb80b..50e0471fec 100644 --- a/bookwyrm/templatetags/landing_page_tags.py +++ b/bookwyrm/templatetags/landing_page_tags.py @@ -70,4 +70,10 @@ def get_book_superlatives(): @register.simple_tag(takes_context=False) def get_landing_books(): """list of books for the landing page""" - return models.Work.objects.distinct().order_by("-updated_date")[:20] + return list( + set( + models.Edition.objects.exclude(cover__exact="") + .distinct() + .order_by("-updated_date")[:6] + ) + ) From ec64b23b29da5baea9d935483099a8e8195e9f68 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 25 May 2026 10:00:10 -0700 Subject: [PATCH 707/962] Landing page re-work --- bookwyrm/templates/landing/landing.html | 49 +++++----------------- bookwyrm/templates/landing/large-book.html | 39 ----------------- bookwyrm/templates/landing/small-book.html | 23 ---------- bookwyrm/templatetags/landing_page_tags.py | 8 +--- 4 files changed, 11 insertions(+), 108 deletions(-) delete mode 100644 bookwyrm/templates/landing/large-book.html delete mode 100644 bookwyrm/templates/landing/small-book.html diff --git a/bookwyrm/templates/landing/landing.html b/bookwyrm/templates/landing/landing.html index 050f62b33b..54639db079 100644 --- a/bookwyrm/templates/landing/landing.html +++ b/bookwyrm/templates/landing/landing.html @@ -13,46 +13,17 @@

      {% trans "Recent Books" %}

      {# 1 hour cache #} {% cache 3600 landing LANGUAGE_CODE %} {% get_landing_books as books %} -
      -
      -
      -
      - {% include 'landing/large-book.html' with book=books.0 %} -
      -
      -
      -
      -
      - {% include 'landing/small-book.html' with book=books.1 %} -
      -
      -
      -
      - {% include 'landing/small-book.html' with book=books.2 %} -
      -
      -
      -
      -
      -
      -
      -
      - {% include 'landing/small-book.html' with book=books.3 %} -
      -
      -
      -
      - {% include 'landing/small-book.html' with book=books.4 %} -
      -
      -
      -
      -
      - {% include 'landing/large-book.html' with book=books.5 %} -
      -
      +
      + {% for work in books %} + {% with book=work.default_edition %} + + {% endwith %} + {% endfor %}
      {% endcache %} {% endif %} -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/bookwyrm/templates/landing/large-book.html b/bookwyrm/templates/landing/large-book.html deleted file mode 100644 index 9b4fd1f938..0000000000 --- a/bookwyrm/templates/landing/large-book.html +++ /dev/null @@ -1,39 +0,0 @@ -{% load book_display_tags %} -{% load rating_tags %} -{% load markdown %} -{% load i18n %} - -{% if book %} - {% with book=book %} -
      -
      - {% include 'snippets/book_cover.html' with cover_class='is-w-l-mobile is-w-auto-tablet' size='xxlarge' %} - - {% include 'snippets/stars.html' with rating=book|rating:request.user %} -
      - - -
      -

      - {{ book.title }} -

      - - {% if book.authors %} -

      - {% trans "by" %} - {% include 'snippets/authors.html' with limit=3 %} -

      - {% endif %} - - {% if book|book_description %} -
      - {{ book|book_description|to_markdown|safe|truncatewords_html:50 }} -
      - {% endif %} -
      -
      - {% endwith %} -{% endif %} diff --git a/bookwyrm/templates/landing/small-book.html b/bookwyrm/templates/landing/small-book.html deleted file mode 100644 index 31f80e41f4..0000000000 --- a/bookwyrm/templates/landing/small-book.html +++ /dev/null @@ -1,23 +0,0 @@ -{% load rating_tags %} -{% load i18n %} - -{% if book %} - {% with book=book %} - - {% include 'snippets/book_cover.html' with cover_class='is-w-l-mobile is-w-auto align to-b to-l' size='xxlarge' %} - - - {% include 'snippets/stars.html' with rating=book|rating:request.user %} - -

      - {{ book.title }} -

      - - {% if book.authors.exists %} -

      - {% trans "by" %} - {% include 'snippets/authors.html' with limit=3 %} -

      - {% endif %} - {% endwith %} -{% endif %} diff --git a/bookwyrm/templatetags/landing_page_tags.py b/bookwyrm/templatetags/landing_page_tags.py index 50e0471fec..b63f9bb80b 100644 --- a/bookwyrm/templatetags/landing_page_tags.py +++ b/bookwyrm/templatetags/landing_page_tags.py @@ -70,10 +70,4 @@ def get_book_superlatives(): @register.simple_tag(takes_context=False) def get_landing_books(): """list of books for the landing page""" - return list( - set( - models.Edition.objects.exclude(cover__exact="") - .distinct() - .order_by("-updated_date")[:6] - ) - ) + return models.Work.objects.distinct().order_by("-updated_date")[:20] From ecd5bfb934b816aacce7052d68e5dc430da8596b Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 25 May 2026 10:05:05 -0700 Subject: [PATCH 708/962] Fixes mobile display of landing page --- bookwyrm/templates/landing/landing.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/templates/landing/landing.html b/bookwyrm/templates/landing/landing.html index 54639db079..723235c2a6 100644 --- a/bookwyrm/templates/landing/landing.html +++ b/bookwyrm/templates/landing/landing.html @@ -16,7 +16,7 @@

      {% trans "Recent Books" %}

      {% for work in books %} {% with book=work.default_edition %} -
      +
      {% include 'snippets/book_cover.html' with size='xxlarge' %} From 6937e58383e4f6719d29d4296b07978df7441032 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 25 May 2026 11:18:24 -0700 Subject: [PATCH 709/962] Fixes other pages that use "small-book" template --- bookwyrm/templates/author/author.html | 2 +- bookwyrm/templates/book/edit/edit_series.html | 2 +- bookwyrm/templates/book/series.html | 2 +- bookwyrm/templates/snippets/small-book.html | 23 +++++++++++++++++++ 4 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 bookwyrm/templates/snippets/small-book.html diff --git a/bookwyrm/templates/author/author.html b/bookwyrm/templates/author/author.html index cf8a970984..c022d0dd4d 100644 --- a/bookwyrm/templates/author/author.html +++ b/bookwyrm/templates/author/author.html @@ -181,7 +181,7 @@

      {% blocktrans with name=author.name %}Books by {{ name }} {% with book=book|author_edition:author %}
      - {% include 'landing/small-book.html' with book=book %} + {% include 'snippets/small-book.html' with book=book %}
      {% include 'snippets/shelve_button/shelve_button.html' with book=book %}
      diff --git a/bookwyrm/templates/book/edit/edit_series.html b/bookwyrm/templates/book/edit/edit_series.html index 42b3f5441f..2eb961535a 100644 --- a/bookwyrm/templates/book/edit/edit_series.html +++ b/bookwyrm/templates/book/edit/edit_series.html @@ -69,7 +69,7 @@

      {% blocktrans with name=series.name %}Edit "{{ name }}"{% endb - {% include 'landing/small-book.html' with book=seriesbook.book.work.default_edition %} + {% include 'snippets/small-book.html' with book=seriesbook.book.work.default_edition %}

      diff --git a/bookwyrm/templates/book/series.html b/bookwyrm/templates/book/series.html index 9d8c86d1ce..666628fdd5 100644 --- a/bookwyrm/templates/book/series.html +++ b/bookwyrm/templates/book/series.html @@ -70,7 +70,7 @@

      {% trans "External links" %}

      {% if seriesbook.series_number %}{% blocktrans with series_number=seriesbook.series_number %}Book {{ series_number }}{% endblocktrans %}{% endif %} - {% include 'landing/small-book.html' with book=seriesbook.book.work.default_edition %} + {% include 'snippets/small-book.html' with book=seriesbook.book.work.default_edition %}
      {% endfor %} diff --git a/bookwyrm/templates/snippets/small-book.html b/bookwyrm/templates/snippets/small-book.html new file mode 100644 index 0000000000..4df1522e25 --- /dev/null +++ b/bookwyrm/templates/snippets/small-book.html @@ -0,0 +1,23 @@ +{% load rating_tags %} +{% load i18n %} + +{% if book %} + {% with book=book %} + + {% include 'snippets/book_cover.html' with size='xlarge' %} + + + {% include 'snippets/stars.html' with rating=book|rating:request.user %} + +

      + {{ book.title }} +

      + + {% if book.authors.exists %} +

      + {% trans "by" %} + {% include 'snippets/authors.html' with limit=3 %} +

      + {% endif %} + {% endwith %} +{% endif %} From 877a1ba78d677eed3861da85a24a3c68df66ebcc Mon Sep 17 00:00:00 2001 From: Leni Kadali Date: Tue, 26 May 2026 23:02:03 +0300 Subject: [PATCH 710/962] Make changes in correct view, correct assertion Previous commit made the changes in the List view when the fix was supposed to be in the ListItem view. Updated the assertion to check the correct fields and values. --- bookwyrm/migrations/0230_listitem_raw_notes.py | 2 +- bookwyrm/tests/views/lists/test_list_item.py | 4 ++-- bookwyrm/views/list/list_item.py | 14 ++++++++++++-- bookwyrm/views/list/lists.py | 15 --------------- 4 files changed, 15 insertions(+), 20 deletions(-) diff --git a/bookwyrm/migrations/0230_listitem_raw_notes.py b/bookwyrm/migrations/0230_listitem_raw_notes.py index 6155fc749b..1175588815 100644 --- a/bookwyrm/migrations/0230_listitem_raw_notes.py +++ b/bookwyrm/migrations/0230_listitem_raw_notes.py @@ -1,4 +1,4 @@ -# Generated by Django 5.2.14 on 2026-05-22 19:10 +# Generated by Django 5.2.14 on 2026-05-22 19:24 from django.db import migrations, models diff --git a/bookwyrm/tests/views/lists/test_list_item.py b/bookwyrm/tests/views/lists/test_list_item.py index 506a89c9b3..3b46a513b7 100644 --- a/bookwyrm/tests/views/lists/test_list_item.py +++ b/bookwyrm/tests/views/lists/test_list_item.py @@ -71,5 +71,5 @@ def test_add_list_item_notes(self): self.assertEqual(mock.call_count, 1) item.refresh_from_db() - self.assertEqual(item.notes, "beep boop") - self.assertEqual(item.raw_notes, "

      beep boop

      ") + self.assertEqual(item.notes, "

      beep boop

      ") + self.assertEqual(item.raw_notes, "beep boop") diff --git a/bookwyrm/views/list/list_item.py b/bookwyrm/views/list/list_item.py index 29b6bb7ec1..3d2b3a8064 100644 --- a/bookwyrm/views/list/list_item.py +++ b/bookwyrm/views/list/list_item.py @@ -5,8 +5,10 @@ from django.utils.decorators import method_decorator from django.views import View +from markdown import markdown + from bookwyrm import forms, models -from bookwyrm.views.status import to_markdown +from bookwyrm.utils import sanitizer @method_decorator(login_required, name="dispatch") @@ -18,9 +20,17 @@ def post(self, request, list_id, list_item): list_item = get_object_or_404(models.ListItem, id=list_item, book_list=list_id) form = forms.ListItemForm(request.POST, instance=list_item) if form.is_valid(): + # save the plain, unformatted version of the status for future editing item = form.save(request, commit=False) - item.notes = to_markdown(item.notes) + item.raw_notes = item.notes + item.notes = notes_to_markdown(item.notes) item.save() else: raise Exception(form.errors) return redirect("list", list_item.book_list.id) + +def notes_to_markdown(notes): + """convert to markdown""" + notes = markdown(notes) + # sanitize resulting html + return sanitizer.clean(notes) diff --git a/bookwyrm/views/list/lists.py b/bookwyrm/views/list/lists.py index 07a6012a3f..205d1a60fb 100644 --- a/bookwyrm/views/list/lists.py +++ b/bookwyrm/views/list/lists.py @@ -9,13 +9,10 @@ from django.utils.decorators import method_decorator from django.views import View -from markdown import markdown - from bookwyrm import forms, models from bookwyrm.lists_stream import ListsStream from bookwyrm.views.helpers import get_user_from_username from bookwyrm.views.list.list import add_book -from bookwyrm.utils import sanitizer logger = logging.getLogger(__name__) @@ -49,11 +46,6 @@ def post(self, request): if not book_list.curation == "group": book_list.group = None - # save the plain, unformatted version of the status for future editing - book_list.raw_notes = book_list.notes - book_list.notes = notes_to_markdown(book_list.notes) - book_list.save() - book_id = request.POST.get("book") if book_id: # We want to add a book to the new list directly after its creation @@ -102,10 +94,3 @@ def get(self, request, username): "path": user.local_path + "/lists", } return TemplateResponse(request, "user/lists.html", data) - - -def notes_to_markdown(notes): - """convert to markdown""" - notes = markdown(notes) - # sanitize resulting html - return sanitizer.clean(notes) From c9fe5e958a0f404c42ea645c782652a8ef9d4774 Mon Sep 17 00:00:00 2001 From: Ian Young Date: Wed, 25 Mar 2026 22:57:14 -0500 Subject: [PATCH 711/962] Merge migrations --- bookwyrm/migrations/0232_merge_20260527_0333.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 bookwyrm/migrations/0232_merge_20260527_0333.py diff --git a/bookwyrm/migrations/0232_merge_20260527_0333.py b/bookwyrm/migrations/0232_merge_20260527_0333.py new file mode 100644 index 0000000000..b9ea5aece8 --- /dev/null +++ b/bookwyrm/migrations/0232_merge_20260527_0333.py @@ -0,0 +1,13 @@ +# Generated by Django 5.2.9 on 2026-05-27 03:33 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0230_merge_20260326_0357"), + ("bookwyrm", "0231_sitesettings_block_incoming_search_and_more"), + ] + + operations = [] From d3feccaa75392a24e8aaee2ed4af61a03a8a127c Mon Sep 17 00:00:00 2001 From: Ian Young Date: Tue, 26 May 2026 22:36:21 -0500 Subject: [PATCH 712/962] Fix ruff violations --- bookwyrm/tests/views/test_user_upload.py | 9 +-------- bookwyrm/views/status.py | 1 - bookwyrm/views/user_upload.py | 7 ++----- 3 files changed, 3 insertions(+), 14 deletions(-) diff --git a/bookwyrm/tests/views/test_user_upload.py b/bookwyrm/tests/views/test_user_upload.py index 456e6e7240..ff99b8482f 100644 --- a/bookwyrm/tests/views/test_user_upload.py +++ b/bookwyrm/tests/views/test_user_upload.py @@ -1,16 +1,9 @@ -import pathlib from unittest.mock import patch -from PIL import Image -from django.contrib.auth.models import AnonymousUser -from django.core.files.base import ContentFile -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 +from bookwyrm import models, views class UserUploadViews(TestCase): diff --git a/bookwyrm/views/status.py b/bookwyrm/views/status.py index a2d9fbf027..894bed39ee 100644 --- a/bookwyrm/views/status.py +++ b/bookwyrm/views/status.py @@ -16,7 +16,6 @@ from django.views import View from django.views.decorators.http import require_POST -from functools import partial import mistune from bookwyrm import forms, models from bookwyrm.models.report import DELETE_ITEM diff --git a/bookwyrm/views/user_upload.py b/bookwyrm/views/user_upload.py index c07f56be12..e9f7f9d0ee 100644 --- a/bookwyrm/views/user_upload.py +++ b/bookwyrm/views/user_upload.py @@ -1,12 +1,9 @@ -import re import logging -import tempfile from PIL import Image from io import BytesIO from django.core.files import File from django.contrib.auth.decorators import login_required -from django.http import HttpResponse, HttpResponseBadRequest, Http404 from django.utils.decorators import method_decorator from django.views import View from django.http import JsonResponse @@ -55,7 +52,7 @@ def post(self, request): e.message_dict, status=422, ) - except Exception as e: + except Exception: return JsonResponse( {"original_file": "File was not a supported image type."}, status=422, @@ -66,7 +63,7 @@ def post(self, request): width, height = image.size for size in UPLOAD_IMAGE_DIMENSIONS: - v = self.create_version(image, upload, size) + self.create_version(image, upload, size) if width < size and height < size: break From 2a575a00bc9cc0a56f3668343d3510bc6b231a90 Mon Sep 17 00:00:00 2001 From: Ian Young Date: Tue, 26 May 2026 22:55:27 -0500 Subject: [PATCH 713/962] Add Django translation tools in JS --- bookwyrm/static/js/xhr_files.js | 10 ++++++---- bookwyrm/templates/layout.html | 1 + bookwyrm/urls.py | 2 ++ 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/bookwyrm/static/js/xhr_files.js b/bookwyrm/static/js/xhr_files.js index 173745b392..6d0bff0ca6 100644 --- a/bookwyrm/static/js/xhr_files.js +++ b/bookwyrm/static/js/xhr_files.js @@ -35,9 +35,11 @@ let XhrFiles = new (class { const file = item.getAsFile(); if (file.size > event.currentTarget.dataset.maxUpload) { - alert( - `File exceeds maximum size: ${event.currentTarget.dataset.maxUploadHuman}` - ); + const errStr = interpolate( + gettext("File exceeds maximum size: %s"), + [event.currentTarget.dataset.maxUploadHuman] + ) + alert(errStr); return; } @@ -56,7 +58,7 @@ let XhrFiles = new (class { console.error(this.response); if (this.status == 422) { - alert("The provided file isn't a valid image."); + alert(gettext("The provided file isn't a valid image")); } return; diff --git a/bookwyrm/templates/layout.html b/bookwyrm/templates/layout.html index c70c3805af..7662674b98 100644 --- a/bookwyrm/templates/layout.html +++ b/bookwyrm/templates/layout.html @@ -204,6 +204,7 @@ var csrf_token = '{{ csrf_token }}'; + diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py index aafb134381..0573647532 100644 --- a/bookwyrm/urls.py +++ b/bookwyrm/urls.py @@ -5,6 +5,7 @@ from django.contrib.staticfiles.urls import staticfiles_urlpatterns from django.urls import path, re_path, include from django.views.generic.base import TemplateView +from django.views.i18n import JavaScriptCatalog from bookwyrm import settings, views from bookwyrm.utils import regex @@ -30,6 +31,7 @@ STREAMS = "|".join(s["key"] for s in settings.STREAMS) urlpatterns = [ + path("jsi18n/", JavaScriptCatalog.as_view(), name="javascript-catalog"), path("admin/", admin.site.urls), path( "robots.txt", From 9c59f315f3c0c27de30b6442e7329533fe58b33e Mon Sep 17 00:00:00 2001 From: Hugh Rundle Date: Wed, 27 May 2026 21:33:37 +1000 Subject: [PATCH 714/962] Do not log PermissionDenied errors on unsigned get requests - subclass PermissionDenied as UnsignedGetRequest - skip logging for UnsignedGetRequest --- bookwyrm/middleware/require_signed_get.py | 6 +++++- bookwyrm/settings.py | 5 ++++- bookwyrm/utils/log.py | 18 ++++++++++++++++++ 3 files changed, 27 insertions(+), 2 deletions(-) diff --git a/bookwyrm/middleware/require_signed_get.py b/bookwyrm/middleware/require_signed_get.py index 66bf29c3c0..6d5ee3d971 100644 --- a/bookwyrm/middleware/require_signed_get.py +++ b/bookwyrm/middleware/require_signed_get.py @@ -13,6 +13,10 @@ from bookwyrm.views.inbox import raise_is_blocked_user_agent +class UnsignedGetRequest(PermissionDenied): + pass + + class RequireSignedGet: """lock down incoming GET API requests""" @@ -46,7 +50,7 @@ def __call__(self, request): # require signed headers for everything else if not has_valid_get_signature(request): - raise PermissionDenied + raise UnsignedGetRequest # we're good, continue return self.get_response(request) diff --git a/bookwyrm/settings.py b/bookwyrm/settings.py index 4b80665820..a70bf78e53 100644 --- a/bookwyrm/settings.py +++ b/bookwyrm/settings.py @@ -178,6 +178,9 @@ "ignore_missing_variable": { "()": "bookwyrm.utils.log.IgnoreVariableDoesNotExist", }, + "skip_unsigned_get_errors": { + "()": "bookwyrm.utils.log.SkipUnsignedGetErrors", + }, }, "handlers": { # Overrides the default handler to make it log to console @@ -185,7 +188,7 @@ # console if DEBUG=False) "console": { "level": LOG_LEVEL, - "filters": ["ignore_missing_variable"], + "filters": ["ignore_missing_variable", "skip_unsigned_get_errors"], "class": "logging.StreamHandler", }, # This is copied as-is from the default logger, and is diff --git a/bookwyrm/utils/log.py b/bookwyrm/utils/log.py index a18a26bac4..03da411f77 100644 --- a/bookwyrm/utils/log.py +++ b/bookwyrm/utils/log.py @@ -19,3 +19,21 @@ def filter(self, record: logging.LogRecord) -> bool: return False err_value = err_value.__context__ return True + + +class SkipUnsignedGetErrors(logging.Filter): + """ + UnsignedGetRequest is a custom error for PermissionDenied + exceptions when we require signed get requests. + + This allows us to ignore these "errors" since they are expected + """ + + def filter(self, record: logging.LogRecord) -> bool: + if record.exc_info: + (_, err_value, _) = record.exc_info + while err_value: + if type(err_value).__name__ == "UnsignedGetRequest": + return False + err_value = err_value.__context__ + return True From 77d6a8ba7d9197a51b63cca0ab6db72804f403f3 Mon Sep 17 00:00:00 2001 From: diaxoaine <42137630+diaxoaine@users.noreply.github.com> Date: Wed, 27 May 2026 23:46:23 +0700 Subject: [PATCH 715/962] Fix numeric ordering of series books --- bookwyrm/models/book.py | 11 +++++++++ bookwyrm/templates/book/series.html | 2 +- bookwyrm/tests/models/test_series.py | 16 ++++++++++++ bookwyrm/tests/views/books/test_series.py | 30 +++++++++++++++++++++++ bookwyrm/views/books/series.py | 21 ++++------------ 5 files changed, 63 insertions(+), 17 deletions(-) diff --git a/bookwyrm/models/book.py b/bookwyrm/models/book.py index dba62af5fb..7d91c06f18 100644 --- a/bookwyrm/models/book.py +++ b/bookwyrm/models/book.py @@ -1003,3 +1003,14 @@ def get_remote_id(self): def raise_not_editable(self, viewer): if not viewer.has_perm("bookwyrm.edit_book"): raise PermissionDenied() + + @property + def natural_sort_key(self): + """numeric-aware key for series_number, so '2' sorts before '10'""" + value = self.series_number or "" + if not value: + return float("inf"), "" + match = re.match(r"\d+(?:\.\d+)?", value) + numeric_prefix = float(match.group()) if match else float("inf") + rest = value[match.end() :] if match else value + return numeric_prefix, rest diff --git a/bookwyrm/templates/book/series.html b/bookwyrm/templates/book/series.html index 9d8c86d1ce..588b81cdbe 100644 --- a/bookwyrm/templates/book/series.html +++ b/bookwyrm/templates/book/series.html @@ -64,7 +64,7 @@

      {% trans "External links" %}

      - {% for seriesbook in series.seriesbooks.all %} + {% for seriesbook in series_books %}
      diff --git a/bookwyrm/tests/models/test_series.py b/bookwyrm/tests/models/test_series.py index aadcc61674..39e48af6c4 100644 --- a/bookwyrm/tests/models/test_series.py +++ b/bookwyrm/tests/models/test_series.py @@ -48,3 +48,19 @@ def test_seriesbook_fields(self): self.assertEqual(self.work.seriesbooks.first(), seriesbook) self.assertEqual(self.work.book_series()[0], self.series) self.assertEqual(self.series.seriesbooks.first(), seriesbook) + + def test_natural_sort_key(self): + cases = { + "2": (2.0, ""), + "10": (10.0, ""), + "4.5": (4.5, ""), + "2-beta": (2.0, "-beta"), + "1.5-rc": (1.5, "-rc"), + "Prequel": (float("inf"), "Prequel"), + None: (float("inf"), ""), + "": (float("inf"), ""), + } + for number, expected in cases.items(): + with self.subTest(series_number=number): + seriesbook = models.SeriesBook(series_number=number) + self.assertEqual(seriesbook.natural_sort_key, expected) diff --git a/bookwyrm/tests/views/books/test_series.py b/bookwyrm/tests/views/books/test_series.py index 83a88e6174..98c5eab5d5 100644 --- a/bookwyrm/tests/views/books/test_series.py +++ b/bookwyrm/tests/views/books/test_series.py @@ -64,6 +64,36 @@ def test_series_page(self): self.assertEqual(result.status_code, 200) + def test_series_page_orders_books_by_numeric_semantics(self): + """series books are ordered by numeric semantics, not lexicographically""" + series = models.Series.objects.create( + user=self.user, + name="ordering series", + remote_id="https://example.com/series/1", + ) + for i, number in enumerate( + ["10", "2-beta", "1", "Prequel", "2", "4.5", "2-alpha", "1.5-rc"] + ): + book = models.Work.objects.create(title=f"book {i}") + models.SeriesBook.objects.create( + book=book, + series=series, + user=self.user, + series_number=number, + remote_id=f"https://example.com/seriesbook/{i}", + ) + + view = views.Series.as_view() + request = self.factory.get("") + request.user = self.user + result = view(request, series.id) + + ordered = [sb.series_number for sb in result.context_data["series_books"]] + self.assertEqual( + ordered, + ["1", "1.5-rc", "2", "2-alpha", "2-beta", "4.5", "10", "Prequel"], + ) + def test_editseries_page(self): """there are so many views, this just makes sure it LOADS""" view = views.EditSeries.as_view() diff --git a/bookwyrm/views/books/series.py b/bookwyrm/views/books/series.py index fbad8d13f1..7ea175d99b 100644 --- a/bookwyrm/views/books/series.py +++ b/bookwyrm/views/books/series.py @@ -1,6 +1,5 @@ """book series""" -from django.core.paginator import Paginator from django.db.utils import IntegrityError from django.http import Http404 from django.shortcuts import redirect @@ -12,7 +11,6 @@ from bookwyrm.forms import SeriesForm from bookwyrm import models from bookwyrm.activitypub import ActivitypubResponse -from bookwyrm.settings import PAGE_LENGTH from bookwyrm.views.helpers import ( is_api_request, get_mergeable_object_or_404, @@ -31,24 +29,15 @@ def get(self, request, series_id, slug=None): return ActivitypubResponse(series.to_activity(**request.GET)) authors = models.Author.objects.none() - books = [] - items = ( - series.seriesbooks.filter(series=series.id) - .prefetch_related("book__work", "book__authors") - .order_by("series_number") - ) - for item in items: - book = item.book.work.default_edition - book_data = {"book": book, "series_number": item.series_number} - books.append(book_data) - authors = authors.union(item.book.authors.all()) + items = series.seriesbooks.prefetch_related("book__work", "book__authors").all() + series_books = sorted(items, key=lambda sb: sb.natural_sort_key) - paginated = Paginator(books, PAGE_LENGTH) - page = paginated.get_page(request.GET.get("page")) + for item in series_books: + authors = authors.union(item.book.authors.all()) data = { "series": series, - "books": page, + "series_books": series_books, "series_authors": {"authors": authors}, } From 785bbb6bb275d9f9c8ed3872e45cf4fbeb89c117 Mon Sep 17 00:00:00 2001 From: Hugh Rundle Date: Thu, 28 May 2026 07:21:16 +1000 Subject: [PATCH 716/962] Just return HttpResponseForbidden for invalid GET signatures --- bookwyrm/middleware/require_signed_get.py | 8 ++------ bookwyrm/settings.py | 5 +---- bookwyrm/utils/log.py | 18 ------------------ 3 files changed, 3 insertions(+), 28 deletions(-) diff --git a/bookwyrm/middleware/require_signed_get.py b/bookwyrm/middleware/require_signed_get.py index 6d5ee3d971..1a744eea8d 100644 --- a/bookwyrm/middleware/require_signed_get.py +++ b/bookwyrm/middleware/require_signed_get.py @@ -3,7 +3,7 @@ import re from requests.exceptions import HTTPError -from django.core.exceptions import PermissionDenied +from django.http import HttpResponseForbidden from bookwyrm.activitypub import resolve_remote_id from bookwyrm.connectors import get_data @@ -13,10 +13,6 @@ from bookwyrm.views.inbox import raise_is_blocked_user_agent -class UnsignedGetRequest(PermissionDenied): - pass - - class RequireSignedGet: """lock down incoming GET API requests""" @@ -50,7 +46,7 @@ def __call__(self, request): # require signed headers for everything else if not has_valid_get_signature(request): - raise UnsignedGetRequest + return HttpResponseForbidden("Invalid signature") # we're good, continue return self.get_response(request) diff --git a/bookwyrm/settings.py b/bookwyrm/settings.py index a70bf78e53..4b80665820 100644 --- a/bookwyrm/settings.py +++ b/bookwyrm/settings.py @@ -178,9 +178,6 @@ "ignore_missing_variable": { "()": "bookwyrm.utils.log.IgnoreVariableDoesNotExist", }, - "skip_unsigned_get_errors": { - "()": "bookwyrm.utils.log.SkipUnsignedGetErrors", - }, }, "handlers": { # Overrides the default handler to make it log to console @@ -188,7 +185,7 @@ # console if DEBUG=False) "console": { "level": LOG_LEVEL, - "filters": ["ignore_missing_variable", "skip_unsigned_get_errors"], + "filters": ["ignore_missing_variable"], "class": "logging.StreamHandler", }, # This is copied as-is from the default logger, and is diff --git a/bookwyrm/utils/log.py b/bookwyrm/utils/log.py index 03da411f77..a18a26bac4 100644 --- a/bookwyrm/utils/log.py +++ b/bookwyrm/utils/log.py @@ -19,21 +19,3 @@ def filter(self, record: logging.LogRecord) -> bool: return False err_value = err_value.__context__ return True - - -class SkipUnsignedGetErrors(logging.Filter): - """ - UnsignedGetRequest is a custom error for PermissionDenied - exceptions when we require signed get requests. - - This allows us to ignore these "errors" since they are expected - """ - - def filter(self, record: logging.LogRecord) -> bool: - if record.exc_info: - (_, err_value, _) = record.exc_info - while err_value: - if type(err_value).__name__ == "UnsignedGetRequest": - return False - err_value = err_value.__context__ - return True From e30c3df21b72899da17f60c92c4910f27d89d845 Mon Sep 17 00:00:00 2001 From: diaxoaine <42137630+diaxoaine@users.noreply.github.com> Date: Thu, 28 May 2026 09:49:52 +0700 Subject: [PATCH 717/962] address feedback --- bookwyrm/models/book.py | 4 ++-- bookwyrm/templates/book/series.html | 3 +++ bookwyrm/tests/models/test_series.py | 10 +++++++++ bookwyrm/tests/views/books/test_series.py | 26 +++++++++++++++++++++-- bookwyrm/views/books/series.py | 16 +++++++++----- 5 files changed, 50 insertions(+), 9 deletions(-) diff --git a/bookwyrm/models/book.py b/bookwyrm/models/book.py index 7d91c06f18..46526f3ac8 100644 --- a/bookwyrm/models/book.py +++ b/bookwyrm/models/book.py @@ -1007,8 +1007,8 @@ def raise_not_editable(self, viewer): @property def natural_sort_key(self): """numeric-aware key for series_number, so '2' sorts before '10'""" - value = self.series_number or "" - if not value: + value = self.series_number + if value is None or len(value) == 0: return float("inf"), "" match = re.match(r"\d+(?:\.\d+)?", value) numeric_prefix = float(match.group()) if match else float("inf") diff --git a/bookwyrm/templates/book/series.html b/bookwyrm/templates/book/series.html index 588b81cdbe..63b1901079 100644 --- a/bookwyrm/templates/book/series.html +++ b/bookwyrm/templates/book/series.html @@ -76,5 +76,8 @@

      {% trans "External links" %}

      {% endfor %}
      {% endwith %} +
      + {% include 'snippets/pagination.html' with page=series_books path=request.path %} +
      {% endblock %} diff --git a/bookwyrm/tests/models/test_series.py b/bookwyrm/tests/models/test_series.py index 39e48af6c4..2a19b84a70 100644 --- a/bookwyrm/tests/models/test_series.py +++ b/bookwyrm/tests/models/test_series.py @@ -52,11 +52,21 @@ def test_seriesbook_fields(self): def test_natural_sort_key(self): cases = { "2": (2.0, ""), + "0": (0.0, ""), + "0a": (0.0, "a"), "10": (10.0, ""), "4.5": (4.5, ""), + "01": (1.0, ""), + "007": (7.0, ""), "2-beta": (2.0, "-beta"), "1.5-rc": (1.5, "-rc"), + "12abc34": (12.0, "abc34"), + # values without a leading number sort last "Prequel": (float("inf"), "Prequel"), + "abc123": (float("inf"), "abc123"), + "Book 2": (float("inf"), "Book 2"), + " 2": (float("inf"), " 2"), + "v2": (float("inf"), "v2"), None: (float("inf"), ""), "": (float("inf"), ""), } diff --git a/bookwyrm/tests/views/books/test_series.py b/bookwyrm/tests/views/books/test_series.py index 98c5eab5d5..4040220a29 100644 --- a/bookwyrm/tests/views/books/test_series.py +++ b/bookwyrm/tests/views/books/test_series.py @@ -72,7 +72,18 @@ def test_series_page_orders_books_by_numeric_semantics(self): remote_id="https://example.com/series/1", ) for i, number in enumerate( - ["10", "2-beta", "1", "Prequel", "2", "4.5", "2-alpha", "1.5-rc"] + [ + "10", + "2-beta", + "1", + "Prequel", + "Book 2", + "2", + "4.5", + "Book 1", + "2-alpha", + "1.5-rc", + ] ): book = models.Work.objects.create(title=f"book {i}") models.SeriesBook.objects.create( @@ -91,7 +102,18 @@ def test_series_page_orders_books_by_numeric_semantics(self): ordered = [sb.series_number for sb in result.context_data["series_books"]] self.assertEqual( ordered, - ["1", "1.5-rc", "2", "2-alpha", "2-beta", "4.5", "10", "Prequel"], + [ + "1", + "1.5-rc", + "2", + "2-alpha", + "2-beta", + "4.5", + "10", + "Book 1", + "Book 2", + "Prequel", + ], ) def test_editseries_page(self): diff --git a/bookwyrm/views/books/series.py b/bookwyrm/views/books/series.py index 7ea175d99b..b2195c8dc6 100644 --- a/bookwyrm/views/books/series.py +++ b/bookwyrm/views/books/series.py @@ -1,5 +1,6 @@ """book series""" +from django.core.paginator import Paginator from django.db.utils import IntegrityError from django.http import Http404 from django.shortcuts import redirect @@ -11,6 +12,7 @@ from bookwyrm.forms import SeriesForm from bookwyrm import models from bookwyrm.activitypub import ActivitypubResponse +from bookwyrm.settings import PAGE_LENGTH from bookwyrm.views.helpers import ( is_api_request, get_mergeable_object_or_404, @@ -28,16 +30,20 @@ def get(self, request, series_id, slug=None): if is_api_request(request): return ActivitypubResponse(series.to_activity(**request.GET)) - authors = models.Author.objects.none() - items = series.seriesbooks.prefetch_related("book__work", "book__authors").all() + items = series.seriesbooks.prefetch_related( + "book__work", "book__work__editions__authors" + ).all() series_books = sorted(items, key=lambda sb: sb.natural_sort_key) + authors = models.Author.objects.filter( + id__in=items.values_list("book__work__editions__authors") + ) - for item in series_books: - authors = authors.union(item.book.authors.all()) + paginated = Paginator(series_books, PAGE_LENGTH) + page = paginated.get_page(request.GET.get("page")) data = { "series": series, - "series_books": series_books, + "series_books": page, "series_authors": {"authors": authors}, } From 490ddfc0ec2875679cd473f259098506cfbbb02d Mon Sep 17 00:00:00 2001 From: diaxoaine <42137630+diaxoaine@users.noreply.github.com> Date: Fri, 29 May 2026 19:17:08 +0700 Subject: [PATCH 718/962] Render stopped-reading status headers --- bookwyrm/templates/discover/card-header.html | 5 +++++ .../templates/snippets/status/headers/generatednote.html | 2 ++ 2 files changed, 7 insertions(+) diff --git a/bookwyrm/templates/discover/card-header.html b/bookwyrm/templates/discover/card-header.html index 89aa111092..8c8df30424 100644 --- a/bookwyrm/templates/discover/card-header.html +++ b/bookwyrm/templates/discover/card-header.html @@ -19,6 +19,11 @@ {{ username }} started reading {{ book_title }} {% endblocktrans %} {% endif %} + {% if status.content == 'stopped reading' or status.content == '

      stopped reading

      ' %} + {% blocktrans trimmed %} + {{ username }} stopped reading {{ book_title }} + {% endblocktrans %} + {% endif %} {% elif status.status_type == 'Rating' %} {% blocktrans trimmed %} {{ username }} rated {{ book_title }} diff --git a/bookwyrm/templates/snippets/status/headers/generatednote.html b/bookwyrm/templates/snippets/status/headers/generatednote.html index 398dc09db8..cec183f880 100644 --- a/bookwyrm/templates/snippets/status/headers/generatednote.html +++ b/bookwyrm/templates/snippets/status/headers/generatednote.html @@ -10,6 +10,8 @@ {% include 'snippets/status/headers/read.html' with book=status.mention_books.first %} {% elif status.content == 'started reading' or status.content == '

      started reading

      ' %} {% include 'snippets/status/headers/reading.html' with book=status.mention_books.first %} +{% elif status.content == 'stopped reading' or status.content == '

      stopped reading

      ' %} + {% include 'snippets/status/headers/stopped_reading.html' with book=status.mention_books.first %} {% else %} {{ status.content }} {% endif %} From c4b0eed319514d9a1f97baa14add94ed2bba92f1 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Sat, 30 May 2026 12:29:11 -0700 Subject: [PATCH 719/962] Revert "caching: set cache expire to 0 in debug mode" --- bookwyrm/settings.py | 3 --- nginx/locations | 2 +- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/bookwyrm/settings.py b/bookwyrm/settings.py index 4b80665820..3ad83783d9 100644 --- a/bookwyrm/settings.py +++ b/bookwyrm/settings.py @@ -110,7 +110,6 @@ ] MIDDLEWARE = [ - "django.middleware.cache.UpdateCacheMiddleware", "django.middleware.security.SecurityMiddleware", "django.contrib.sessions.middleware.SessionMiddleware", "django.middleware.locale.LocaleMiddleware", @@ -126,7 +125,6 @@ "django.middleware.clickjacking.XFrameOptionsMiddleware", "bookwyrm.middleware.FileTooBig", "bookwyrm.middleware.ForceLogoutMiddleware", - "django.middleware.cache.FetchFromCacheMiddleware", ] ROOT_URLCONF = "bookwyrm.urls" @@ -154,7 +152,6 @@ }, ] -CACHE_MIDDLEWARE_SECONDS = 0 if DEBUG else env.int("CACHE_MIDDLEWARE_SECONDS", 60) LOG_LEVEL = env("LOG_LEVEL", "INFO").upper() # Override aspects of the default handler to our taste # See https://docs.djangoproject.com/en/3.2/topics/logging/#default-logging-configuration diff --git a/nginx/locations b/nginx/locations index 80178f11dc..39a4fd49a3 100644 --- a/nginx/locations +++ b/nginx/locations @@ -21,7 +21,7 @@ add_header X-Cache-Status $upstream_cache_status; # ignore the set cookie header when deciding to # store a response in the cache -proxy_ignore_headers Set-Cookie; +proxy_ignore_headers Cache-Control Set-Cookie Expires; # PUT requests always bypass the cache # logged in sessions also do not populate the cache From 2e7ee676da6974f8a06313298099ba157f4817e0 Mon Sep 17 00:00:00 2001 From: diaxoaine <42137630+diaxoaine@users.noreply.github.com> Date: Sun, 31 May 2026 20:47:36 +0700 Subject: [PATCH 720/962] Admin can revoke sent request invites --- .../invites/manage_invite_requests.html | 49 ++++++++++++------- bookwyrm/tests/views/landing/test_invite.py | 38 ++++++++++++++ bookwyrm/views/admin/invite.py | 17 +++++++ 3 files changed, 85 insertions(+), 19 deletions(-) diff --git a/bookwyrm/templates/settings/invites/manage_invite_requests.html b/bookwyrm/templates/settings/invites/manage_invite_requests.html index 59eca25d58..8fea559acc 100644 --- a/bookwyrm/templates/settings/invites/manage_invite_requests.html +++ b/bookwyrm/templates/settings/invites/manage_invite_requests.html @@ -73,20 +73,29 @@

      {# no invite OR invite not yet used #} {% if not req.invite.times_used %} -
      - {% csrf_token %} - - {% if not req.invite %} - - {% else %} - - {% endif %} -
      +
      +
      + {% csrf_token %} + + {% if not req.invite %} + + {% else %} + + {% endif %} +
      +
      {% endif %} {# invite created but not used #} {% if req.invite and not req.invite.times_used %} - {# #} +
      +
      + {% csrf_token %} + + + +
      +
      {% elif req.invite %} {# accepted #} {% if req.invite.invitees.exists %} @@ -95,15 +104,17 @@

        {% endif %} {% else %} -
      - {% csrf_token %} - - {% if not req.ignored %} - - {% else %} - - {% endif %} -
      +
      +
      + {% csrf_token %} + + {% if not req.ignored %} + + {% else %} + + {% endif %} +
      +
      {% endif %}

      diff --git a/bookwyrm/tests/views/landing/test_invite.py b/bookwyrm/tests/views/landing/test_invite.py index 22fa5f6b0b..63bc282f7d 100644 --- a/bookwyrm/tests/views/landing/test_invite.py +++ b/bookwyrm/tests/views/landing/test_invite.py @@ -145,6 +145,44 @@ def test_manage_invite_requests_send(self): req.refresh_from_db() self.assertIsNotNone(req.invite) + def test_manage_invite_requests_revoke(self): + """revoke a sent, unused invite""" + invite = models.SiteInvite.objects.create(user=self.local_user) + req = models.InviteRequest.objects.create( + email="fish@example.com", invite=invite + ) + + view = views.ManageInviteRequests.as_view() + request = self.factory.post("", {"invite-request": req.id, "revoke": "true"}) + request.user = self.local_user + request.user.is_superuser = True + + view(request) + + req.refresh_from_db() + self.assertIsNone(req.invite) + self.assertFalse(models.SiteInvite.objects.filter(id=invite.id).exists()) + + def test_manage_invite_requests_revoke_used(self): + """a used invite is not revoked""" + invite = models.SiteInvite.objects.create( + user=self.local_user, use_limit=1, times_used=1 + ) + req = models.InviteRequest.objects.create( + email="fish@example.com", invite=invite + ) + + view = views.ManageInviteRequests.as_view() + request = self.factory.post("", {"invite-request": req.id, "revoke": "true"}) + request.user = self.local_user + request.user.is_superuser = True + + view(request) + + req.refresh_from_db() + self.assertIsNotNone(req.invite) + self.assertTrue(models.SiteInvite.objects.filter(id=invite.id).exists()) + def test_ignore_invite_request(self): """don't invite that jerk""" req = models.InviteRequest.objects.create(email="fish@example.com") diff --git a/bookwyrm/views/admin/invite.py b/bookwyrm/views/admin/invite.py index 0681a948fc..88e637269d 100644 --- a/bookwyrm/views/admin/invite.py +++ b/bookwyrm/views/admin/invite.py @@ -146,6 +146,9 @@ def get(self, request): def post(self, request): """send out an invite""" + if request.POST.get("revoke") == "true": + return self.delete(request) + invite_request = get_object_or_404( models.InviteRequest, id=request.POST.get("invite-request") ) @@ -165,6 +168,20 @@ def post(self, request): ) ) + def delete(self, request): + """revoke a sent, unused invite""" + invite_request = get_object_or_404( + models.InviteRequest, id=request.POST.get("invite-request") + ) + + if invite_request.invite and not invite_request.invite.times_used: + invite_request.invite.delete() + return redirect( + "{:s}?{:s}".format( + reverse("settings-invite-requests"), urlencode(request.GET.dict()) + ) + ) + class InviteRequest(View): """prospective users sign up here""" From d82c97fc00a3c9142e10118e528eb16a90cecf4f Mon Sep 17 00:00:00 2001 From: diaxoaine <42137630+diaxoaine@users.noreply.github.com> Date: Sun, 31 May 2026 23:47:47 +0700 Subject: [PATCH 721/962] Allow admins to delete invite codes --- .../invites/manage_invite_requests.html | 2 +- .../settings/invites/manage_invites.html | 11 ++++++++++- bookwyrm/tests/views/landing/test_invite.py | 17 +++++++++++++++-- bookwyrm/views/admin/invite.py | 15 +++++++++++++-- 4 files changed, 39 insertions(+), 6 deletions(-) diff --git a/bookwyrm/templates/settings/invites/manage_invite_requests.html b/bookwyrm/templates/settings/invites/manage_invite_requests.html index 8fea559acc..a8f0be1285 100644 --- a/bookwyrm/templates/settings/invites/manage_invite_requests.html +++ b/bookwyrm/templates/settings/invites/manage_invite_requests.html @@ -92,7 +92,7 @@

      {% csrf_token %} - +

      diff --git a/bookwyrm/templates/settings/invites/manage_invites.html b/bookwyrm/templates/settings/invites/manage_invites.html index 95b8bdf006..4c492b35a3 100644 --- a/bookwyrm/templates/settings/invites/manage_invites.html +++ b/bookwyrm/templates/settings/invites/manage_invites.html @@ -48,9 +48,10 @@

      {% trans "Generate New Invite" %}

      {% trans "Expires" %} {% trans "Max uses" %} {% trans "Times used" %} + {% trans "Action" %} {% if not invites %} - {% trans "No active invites" %} + {% trans "No active invites" %} {% endif %} {% for invite in invites %} @@ -58,6 +59,14 @@

      {% trans "Generate New Invite" %}

      {{ invite.expiry|naturaltime }} {{ invite.use_limit }} {{ invite.times_used }} + +
      + {% csrf_token %} + + + +
      + {% endfor %} diff --git a/bookwyrm/tests/views/landing/test_invite.py b/bookwyrm/tests/views/landing/test_invite.py index 63bc282f7d..4808a6401a 100644 --- a/bookwyrm/tests/views/landing/test_invite.py +++ b/bookwyrm/tests/views/landing/test_invite.py @@ -81,6 +81,19 @@ def test_manage_invites_post(self): self.assertEqual(invite.use_limit, 3) self.assertIsNone(invite.expiry) + def test_manage_invites_delete(self): + """delete an invite code""" + invite = models.SiteInvite.objects.create(user=self.local_user) + + view = views.ManageInvites.as_view() + request = self.factory.post("", {"invite": invite.id, "delete": "true"}) + request.user = self.local_user + request.user.is_superuser = True + + view(request) + + self.assertFalse(models.SiteInvite.objects.filter(id=invite.id).exists()) + def test_invite_request(self): """request to join a server""" form = forms.InviteRequestForm() @@ -153,7 +166,7 @@ def test_manage_invite_requests_revoke(self): ) view = views.ManageInviteRequests.as_view() - request = self.factory.post("", {"invite-request": req.id, "revoke": "true"}) + request = self.factory.post("", {"invite-request": req.id, "delete": "true"}) request.user = self.local_user request.user.is_superuser = True @@ -173,7 +186,7 @@ def test_manage_invite_requests_revoke_used(self): ) view = views.ManageInviteRequests.as_view() - request = self.factory.post("", {"invite-request": req.id, "revoke": "true"}) + request = self.factory.post("", {"invite-request": req.id, "delete": "true"}) request.user = self.local_user request.user.is_superuser = True diff --git a/bookwyrm/views/admin/invite.py b/bookwyrm/views/admin/invite.py index 88e637269d..2924e9d44a 100644 --- a/bookwyrm/views/admin/invite.py +++ b/bookwyrm/views/admin/invite.py @@ -48,6 +48,9 @@ def get(self, request): def post(self, request): """creates an invite database entry""" + if request.POST.get("delete") == "true": + return self.delete(request) + form = forms.CreateInviteForm(request.POST) if not form.is_valid(): return HttpResponseBadRequest(f"ERRORS: {form.errors}") @@ -65,6 +68,14 @@ def post(self, request): data = {"invites": paginated.page(1), "form": form} return TemplateResponse(request, "settings/invites/manage_invites.html", data) + def delete(self, request): + """delete an invite code""" + invite = get_object_or_404( + models.SiteInvite, id=request.POST.get("invite"), user=request.user + ) + invite.delete() + return redirect("settings-invites") + class Invite(View): """use an invite to register""" @@ -146,7 +157,7 @@ def get(self, request): def post(self, request): """send out an invite""" - if request.POST.get("revoke") == "true": + if request.POST.get("delete") == "true": return self.delete(request) invite_request = get_object_or_404( @@ -169,7 +180,7 @@ def post(self, request): ) def delete(self, request): - """revoke a sent, unused invite""" + """delete an unused invite request""" invite_request = get_object_or_404( models.InviteRequest, id=request.POST.get("invite-request") ) From af58a3e82511e8818dc0606eb15bcd8b93f0f6f3 Mon Sep 17 00:00:00 2001 From: Leni Kadali Date: Mon, 1 Jun 2026 10:17:58 +0300 Subject: [PATCH 722/962] Restore saving book list --- bookwyrm/views/list/lists.py | 1 + 1 file changed, 1 insertion(+) diff --git a/bookwyrm/views/list/lists.py b/bookwyrm/views/list/lists.py index 205d1a60fb..de6b9d0f7e 100644 --- a/bookwyrm/views/list/lists.py +++ b/bookwyrm/views/list/lists.py @@ -45,6 +45,7 @@ def post(self, request): # list should not have a group if it is not group curated if not book_list.curation == "group": book_list.group = None + book_list.save() book_id = request.POST.get("book") if book_id: From da76e477cad7af2613716ff72e24b3660d099573 Mon Sep 17 00:00:00 2001 From: Leni Kadali Date: Mon, 1 Jun 2026 11:45:59 +0300 Subject: [PATCH 723/962] Update ListForm, item_notes_field template Update ListForm, item_notes_field template to use the new `raw_notes` field. --- bookwyrm/forms/lists.py | 2 +- bookwyrm/templates/lists/item_notes_field.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/bookwyrm/forms/lists.py b/bookwyrm/forms/lists.py index 6c2a38c816..37933ddbf7 100644 --- a/bookwyrm/forms/lists.py +++ b/bookwyrm/forms/lists.py @@ -17,7 +17,7 @@ class Meta: class ListItemForm(CustomForm): class Meta: model = models.ListItem - fields = ["user", "book", "book_list", "notes"] + fields = ["user", "book", "book_list", "notes", "raw_notes"] class SortListForm(forms.Form): diff --git a/bookwyrm/templates/lists/item_notes_field.html b/bookwyrm/templates/lists/item_notes_field.html index c09c50236b..d10d882ac5 100644 --- a/bookwyrm/templates/lists/item_notes_field.html +++ b/bookwyrm/templates/lists/item_notes_field.html @@ -13,7 +13,7 @@ maxlength="300" name="notes" aria-describedby="notes_description_{{ form_id }}" - >{{ item.notes|default:'' }} + >{{ item.raw_notes|default:'' }}

      {% trans "An optional note that will be displayed with the book." %} From fbd4f6fa6b7082292e5887a1365e1614c4a6b5b7 Mon Sep 17 00:00:00 2001 From: Leni Kadali Date: Mon, 1 Jun 2026 11:56:26 +0300 Subject: [PATCH 724/962] Move, rename markdown method; update item save Moved and renamed the method that converts content to markdown so that it can be more easily re-used without running into import conflicts. Updated the initial save of a list item to save notes added if they are there. --- bookwyrm/views/helpers.py | 11 ++++++++++- bookwyrm/views/list/list.py | 6 ++++++ bookwyrm/views/list/list_item.py | 12 ++---------- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/bookwyrm/views/helpers.py b/bookwyrm/views/helpers.py index 3ed738f79b..36fe8d4cea 100644 --- a/bookwyrm/views/helpers.py +++ b/bookwyrm/views/helpers.py @@ -6,6 +6,8 @@ import dateutil.tz from dateutil.parser import ParserError +from markdown import markdown + from requests import HTTPError from django.db.models import Q from django.conf import settings as django_settings @@ -16,7 +18,7 @@ from bookwyrm import activitypub, models, settings from bookwyrm.connectors import ConnectorException, get_data from bookwyrm.status import create_generated_note -from bookwyrm.utils import regex +from bookwyrm.utils import regex, sanitizer from bookwyrm.utils.validate import validate_url_domain @@ -261,3 +263,10 @@ def get_mergeable_object_or_404(klass, id): pass raise Http404(f"No {queryset.model} with ID {id} exists") + + +def convert_to_markdown(content): + """convert given content to markdown""" + content = markdown(content) + # sanitize resulting html + return sanitizer.clean(content) diff --git a/bookwyrm/views/list/list.py b/bookwyrm/views/list/list.py index 10c2e763df..b6d6a5d217 100644 --- a/bookwyrm/views/list/list.py +++ b/bookwyrm/views/list/list.py @@ -21,6 +21,7 @@ from bookwyrm.activitypub import ActivitypubResponse from bookwyrm.settings import PAGE_LENGTH from bookwyrm.views.helpers import ( + convert_to_markdown, is_api_request, maybe_redirect_local_path, redirect_to_referer, @@ -225,6 +226,11 @@ def add_book(request): ) increment_order_in_reverse(book_list.id, order_max + 1) item.order = order_max + 1 + + if item.notes: + item.raw_notes = item.notes + item.notes = convert_to_markdown(item.notes) + item.save() return List().get(request, book_list.id, add_succeeded=True) diff --git a/bookwyrm/views/list/list_item.py b/bookwyrm/views/list/list_item.py index 3d2b3a8064..7ec4668b5a 100644 --- a/bookwyrm/views/list/list_item.py +++ b/bookwyrm/views/list/list_item.py @@ -5,10 +5,8 @@ from django.utils.decorators import method_decorator from django.views import View -from markdown import markdown - from bookwyrm import forms, models -from bookwyrm.utils import sanitizer +from bookwyrm.views.helpers import convert_to_markdown @method_decorator(login_required, name="dispatch") @@ -23,14 +21,8 @@ def post(self, request, list_id, list_item): # save the plain, unformatted version of the status for future editing item = form.save(request, commit=False) item.raw_notes = item.notes - item.notes = notes_to_markdown(item.notes) + item.notes = convert_to_markdown(item.notes) item.save() else: raise Exception(form.errors) return redirect("list", list_item.book_list.id) - -def notes_to_markdown(notes): - """convert to markdown""" - notes = markdown(notes) - # sanitize resulting html - return sanitizer.clean(notes) From 87501c8d4e5ea02c7cba2e71da3ac24afda06f24 Mon Sep 17 00:00:00 2001 From: diaxoaine <42137630+diaxoaine@users.noreply.github.com> Date: Wed, 3 Jun 2026 23:26:49 +0700 Subject: [PATCH 725/962] replace asyncio with gevent --- bookwyrm/models/activitypub_mixin.py | 52 ++++++------------- .../tests/models/test_activitypub_mixin.py | 10 ++-- 2 files changed, 22 insertions(+), 40 deletions(-) diff --git a/bookwyrm/models/activitypub_mixin.py b/bookwyrm/models/activitypub_mixin.py index d94780112d..311b4e233c 100644 --- a/bookwyrm/models/activitypub_mixin.py +++ b/bookwyrm/models/activitypub_mixin.py @@ -1,6 +1,5 @@ """activitypub model functionality""" -import asyncio from base64 import b64encode from collections import namedtuple from functools import reduce @@ -11,7 +10,8 @@ from uuid import uuid4 from typing_extensions import Self -import aiohttp +from gevent.pool import Pool +import requests from Crypto.PublicKey import RSA from Crypto.Signature import pkcs1_15 from Crypto.Hash import SHA256 @@ -541,27 +541,13 @@ def broadcast_task(sender_id: int, activity: str, recipients: list[str]): user_model = apps.get_model("bookwyrm.User", require_ready=True) sender = user_model.objects.select_related("key_pair").get(id=sender_id) - asyncio.run(async_broadcast(recipients, sender, activity)) + pool = Pool(100) + pool.map(lambda recipient: sign_and_send(sender, activity, recipient), recipients) -async def async_broadcast(recipients: list[str], sender, data: str): - """Send all the broadcasts simultaneously""" - timeout = aiohttp.ClientTimeout(total=10) - async with aiohttp.ClientSession(timeout=timeout) as session: - tasks = [] - for recipient in recipients: - tasks.append( - asyncio.ensure_future(sign_and_send(session, sender, data, recipient)) - ) - - results = await asyncio.gather(*tasks) - return results - -async def sign_and_send( - session: aiohttp.ClientSession, sender, data: str, destination: str, **kwargs -): - """Sign the messages and send them in an asynchronous bundle""" +def sign_and_send(sender, data: str, destination: str, **kwargs): + """Sign a message and send it to a single destination inbox""" now = http_date() if not sender.key_pair.private_key: @@ -587,23 +573,17 @@ async def sign_and_send( } try: - async with session.post(destination, data=data, headers=headers) as response: - if not response.ok: - logger.exception( - "Failed to send broadcast to %s: %s", destination, response.reason - ) - if kwargs.get("use_legacy_key") is not True: - logger.info("Trying again with legacy keyId header value") - asyncio.ensure_future( - sign_and_send( - session, sender, data, destination, use_legacy_key=True - ) - ) - - return response - except asyncio.TimeoutError: + response = requests.post(destination, data=data, headers=headers, timeout=10) + if not response.ok: + logger.error( + "Failed to send broadcast to %s: %s", destination, response.reason + ) + if kwargs.get("use_legacy_key") is not True: + logger.info("Trying again with legacy keyId header value") + sign_and_send(sender, data, destination, use_legacy_key=True) + except requests.exceptions.Timeout: logger.info("Connection timed out for url: %s", destination) - except aiohttp.ClientError as err: + except requests.exceptions.RequestException as err: logger.exception(err) diff --git a/bookwyrm/tests/models/test_activitypub_mixin.py b/bookwyrm/tests/models/test_activitypub_mixin.py index 3a257ca744..fef1432e7a 100644 --- a/bookwyrm/tests/models/test_activitypub_mixin.py +++ b/bookwyrm/tests/models/test_activitypub_mixin.py @@ -452,12 +452,14 @@ def test_to_ordered_collection(self, *_): self.assertEqual(page_2.orderedItems[-1]["content"], "

      test status 0

      ") def test_broadcast_task(self, *_): - """Should be calling asyncio""" + """Should sign and send to each recipient""" recipients = [ "https://instance.example/user/inbox", "https://instance.example/okay/inbox", ] - with patch("bookwyrm.models.activitypub_mixin.asyncio.run") as mock: + with patch("bookwyrm.models.activitypub_mixin.sign_and_send") as mock: broadcast_task(self.local_user.id, {}, recipients) - self.assertTrue(mock.called) - self.assertEqual(mock.call_count, 1) + self.assertEqual(mock.call_count, len(recipients)) + self.assertEqual( + {call.args[2] for call in mock.call_args_list}, set(recipients) + ) From e5be652ab3cdebe85b6d2f2c8046dbe152ca0bf5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 4 Jun 2026 03:09:17 +0000 Subject: [PATCH 726/962] build(deps-dev): bump aiohttp from 3.13.4 to 3.14.0 --- updated-dependencies: - dependency-name: aiohttp dependency-version: 3.14.0 dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 2f8047c088..aa00175c57 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [dependency-groups] main = [ - "aiohttp==3.13.4", + "aiohttp==3.14.0", "bleach==6.1.0", "boto3==1.34.74", "bw-file-resubmit==0.6.0rc2", From 9077aa8b5252b29d93f47e03ff06ababf683de49 Mon Sep 17 00:00:00 2001 From: Hugh Rundle Date: Sat, 6 Jun 2026 15:47:12 +1000 Subject: [PATCH 727/962] Fix Series view and tests --- bookwyrm/tests/views/books/test_series.py | 11 ++++++----- bookwyrm/views/books/series.py | 5 +++-- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/bookwyrm/tests/views/books/test_series.py b/bookwyrm/tests/views/books/test_series.py index fa16970b81..aeac4e073e 100644 --- a/bookwyrm/tests/views/books/test_series.py +++ b/bookwyrm/tests/views/books/test_series.py @@ -190,14 +190,15 @@ def test_series_page_with_blocked_book(self): view = views.Series.as_view() request = self.factory.get("") request.user = self.user - result = view(request, self.seriesbook.id) + result = view(request, self.series.id) - books = result.context_data["books"] - self.assertEqual(books.object_list.count(), 2) + books = result.context_data["series_books"] + print(books.object_list) + self.assertEqual(len(books.object_list), 2) self.user.blocked_books.add(bad_work) result = view(request, self.series.id) - books = result.context_data["books"] - self.assertEqual(books.object_list.count(), 1) + books = result.context_data["series_books"] + self.assertEqual(len(books.object_list), 1) diff --git a/bookwyrm/views/books/series.py b/bookwyrm/views/books/series.py index b2195c8dc6..8b75b4d990 100644 --- a/bookwyrm/views/books/series.py +++ b/bookwyrm/views/books/series.py @@ -30,9 +30,10 @@ def get(self, request, series_id, slug=None): if is_api_request(request): return ActivitypubResponse(series.to_activity(**request.GET)) - items = series.seriesbooks.prefetch_related( + blocked = request.user.blocked_books.all() if request.user else [] + items = series.seriesbooks.exclude(book__in=blocked).prefetch_related( "book__work", "book__work__editions__authors" - ).all() + ) series_books = sorted(items, key=lambda sb: sb.natural_sort_key) authors = models.Author.objects.filter( id__in=items.values_list("book__work__editions__authors") From 19fb9375950b74be771568d1c15513c737fad8d1 Mon Sep 17 00:00:00 2001 From: Tim Rogers Date: Sat, 6 Jun 2026 20:50:03 -0500 Subject: [PATCH 728/962] Updated author birth and death dates to allow partial dates --- bookwyrm/forms/author.py | 5 +-- ...recision_author_died_precision_and_more.py | 34 +++++++++++++++++++ bookwyrm/models/author.py | 4 +-- bookwyrm/models/fields.py | 3 ++ bookwyrm/templates/author/author.html | 9 +++-- bookwyrm/templates/author/edit_author.html | 4 +-- 6 files changed, 51 insertions(+), 8 deletions(-) create mode 100644 bookwyrm/migrations/0232_author_born_precision_author_died_precision_and_more.py diff --git a/bookwyrm/forms/author.py b/bookwyrm/forms/author.py index 8ec25374db..5fe6d0ed31 100644 --- a/bookwyrm/forms/author.py +++ b/bookwyrm/forms/author.py @@ -4,6 +4,7 @@ from bookwyrm import models from .custom_form import CustomForm +from .widgets import SelectDateWidget class AuthorForm(CustomForm): @@ -35,8 +36,8 @@ class Meta: ), "wikidata": forms.TextInput(attrs={"aria-describedby": "desc_wikidata"}), "website": forms.TextInput(attrs={"aria-describedby": "desc_website"}), - "born": forms.SelectDateWidget(attrs={"aria-describedby": "desc_born"}), - "died": forms.SelectDateWidget(attrs={"aria-describedby": "desc_died"}), + "born": SelectDateWidget(attrs={"aria-describedby": "desc_born"}), + "died": SelectDateWidget(attrs={"aria-describedby": "desc_died"}), "openlibrary_key": forms.TextInput( attrs={"aria-describedby": "desc_openlibrary_key"} ), diff --git a/bookwyrm/migrations/0232_author_born_precision_author_died_precision_and_more.py b/bookwyrm/migrations/0232_author_born_precision_author_died_precision_and_more.py new file mode 100644 index 0000000000..e7c986dd17 --- /dev/null +++ b/bookwyrm/migrations/0232_author_born_precision_author_died_precision_and_more.py @@ -0,0 +1,34 @@ +# Generated by Django 5.2.14 on 2026-06-06 19:42 + +import bookwyrm.models.fields +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('bookwyrm', '0231_sitesettings_block_incoming_search_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='author', + name='born_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='author', + name='died_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='author', + name='born', + field=bookwyrm.models.fields.PartialDateField(blank=True, null=True), + ), + migrations.AlterField( + model_name='author', + name='died', + field=bookwyrm.models.fields.PartialDateField(blank=True, null=True), + ), + ] diff --git a/bookwyrm/models/author.py b/bookwyrm/models/author.py index 54f7f0e0bd..3a8d9ebd8b 100644 --- a/bookwyrm/models/author.py +++ b/bookwyrm/models/author.py @@ -37,8 +37,8 @@ class Author(BookDataModel): max_length=255, blank=True, null=True, deduplication_field=True ) # idk probably other keys would be useful here? - born = fields.DateTimeField(blank=True, null=True) - died = fields.DateTimeField(blank=True, null=True) + born = fields.PartialDateField(blank=True, null=True) + died = fields.PartialDateField(blank=True, null=True) name = fields.CharField(max_length=255) aliases = fields.ArrayField( models.CharField(max_length=255), blank=True, default=list diff --git a/bookwyrm/models/fields.py b/bookwyrm/models/fields.py index d4812f1faa..c2a15c0e16 100644 --- a/bookwyrm/models/fields.py +++ b/bookwyrm/models/fields.py @@ -573,6 +573,9 @@ 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, trigger=None): + if not value: + return None + try: return from_partial_isoformat(value) except ValueError: diff --git a/bookwyrm/templates/author/author.html b/bookwyrm/templates/author/author.html index c022d0dd4d..20299a6821 100644 --- a/bookwyrm/templates/author/author.html +++ b/bookwyrm/templates/author/author.html @@ -4,6 +4,7 @@ {% load humanize %} {% load utilities %} {% load book_display_tags %} +{% load date_ext %} {% block title %}{{ author.name }}{% endblock %} @@ -44,19 +45,23 @@

      {% trans "Author details" %}

      {% endif %} + {% with date=author.born|naturalday_partial %} {% if author.born %}
      {% trans "Born:" %}
      -
      {{ author.born|naturalday }}
      +
      {{ date }}
      {% endif %} + {% endwith %} + {% with date=author.died|naturalday_partial %} {% if author.died %}
      {% trans "Died:" %}
      -
      {{ author.died|naturalday }}
      +
      {{ date }}
      {% endif %} + {% endwith %} {% if series %}
      diff --git a/bookwyrm/templates/author/edit_author.html b/bookwyrm/templates/author/edit_author.html index f3e908c9b6..82595d3247 100644 --- a/bookwyrm/templates/author/edit_author.html +++ b/bookwyrm/templates/author/edit_author.html @@ -65,14 +65,14 @@

      {% trans "Metadata" %}

      - + {{ form.born }} {% include 'snippets/form_errors.html' with errors_list=form.born.errors id="desc_born" %}
      - + {{ form.died }} {% include 'snippets/form_errors.html' with errors_list=form.died.errors id="desc_died" %}
      From 2baaa1562dac5918cf8756b46ad2290b7c0c2994 Mon Sep 17 00:00:00 2001 From: Hugh Rundle Date: Sun, 7 Jun 2026 15:13:04 +1000 Subject: [PATCH 729/962] fixes - fix incoming Mastodon reports janking everything up - fix statuses not attaching to reports sent to external server --- bookwyrm/activitypub/verbs.py | 22 +++++++++++++++++-- .../migrations/0232_merge_20260606_0829.py | 14 ++++++++++++ bookwyrm/views/report.py | 8 ++++++- 3 files changed, 41 insertions(+), 3 deletions(-) create mode 100644 bookwyrm/migrations/0232_merge_20260606_0829.py diff --git a/bookwyrm/activitypub/verbs.py b/bookwyrm/activitypub/verbs.py index debe34bccc..d507d6f194 100644 --- a/bookwyrm/activitypub/verbs.py +++ b/bookwyrm/activitypub/verbs.py @@ -276,13 +276,13 @@ def action(self, allow_external_connections=True): class Flag(Verb): """Report a user to their home server""" - to: str + to: str = None object: List[str] = None links: List[str] = None type: str = "Flag" content: str = None - def action(self, allow_external_connections=False): + def action(self, allow_external_connections=True): """Create the report and attach reported statuses""" report = self.to_model(allow_external_connections=allow_external_connections) # go through "objects" and figure out what they are @@ -296,5 +296,23 @@ def action(self, allow_external_connections=False): allow_external_connections=allow_external_connections, ) except ActivitySerializerError: + try: + # Mastodon includes the user in the object + item = resolve_remote_id( + remote_id=obj, + save=False, + model="User", + allow_external_connections=allow_external_connections, + ) + except ActivitySerializerError: + # ¯\_(ツ)_/¯ + continue + + # fix incoming Mastodon objects + if hasattr(item, "username"): + if not report.reported_user: + report.reported_user = item continue + report.statuses.add(item) + report.save(allow_external_connections=allow_external_connections) diff --git a/bookwyrm/migrations/0232_merge_20260606_0829.py b/bookwyrm/migrations/0232_merge_20260606_0829.py new file mode 100644 index 0000000000..e1f99b3e0a --- /dev/null +++ b/bookwyrm/migrations/0232_merge_20260606_0829.py @@ -0,0 +1,14 @@ +# Generated by Django 5.2.14 on 2026-06-06 08:29 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('bookwyrm', '0229_alter_report_statuses'), + ('bookwyrm', '0231_sitesettings_block_incoming_search_and_more'), + ] + + operations = [ + ] diff --git a/bookwyrm/views/report.py b/bookwyrm/views/report.py index f8f3d8ab1a..731d7473d2 100644 --- a/bookwyrm/views/report.py +++ b/bookwyrm/views/report.py @@ -33,7 +33,13 @@ def post(self, request): if not form.is_valid(): raise ValueError(form.errors) - report = form.save(request) + # don't broadcast before the statuses are attached + # there might be a better way to do this + report = form.save(request, commit=False) + report.save(broadcast=False) + form.save_m2m() + report.broadcast(report.to_activity(), report.user) + if report.links.exists(): # revert the domain to pending domain = report.links.first().domain From 991b5c53b409b5bbfaa577ed23c3dbfc56264ace Mon Sep 17 00:00:00 2001 From: Hugh Rundle Date: Sun, 7 Jun 2026 17:07:33 +1000 Subject: [PATCH 730/962] fix tests and tidy Flag activity - remove irrelevant kwarg allowing external calls - add mocks to tests --- bookwyrm/activitypub/verbs.py | 8 +++----- bookwyrm/tests/views/inbox/test_inbox_flag.py | 14 ++++++++++++-- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/bookwyrm/activitypub/verbs.py b/bookwyrm/activitypub/verbs.py index d507d6f194..0cdac2d01f 100644 --- a/bookwyrm/activitypub/verbs.py +++ b/bookwyrm/activitypub/verbs.py @@ -282,9 +282,9 @@ class Flag(Verb): type: str = "Flag" content: str = None - def action(self, allow_external_connections=True): + def action(self): """Create the report and attach reported statuses""" - report = self.to_model(allow_external_connections=allow_external_connections) + report = self.to_model() # go through "objects" and figure out what they are for obj in self.object: # what type of obj is it? @@ -293,7 +293,6 @@ def action(self, allow_external_connections=True): remote_id=obj, save=False, model="Status", - allow_external_connections=allow_external_connections, ) except ActivitySerializerError: try: @@ -302,7 +301,6 @@ def action(self, allow_external_connections=True): remote_id=obj, save=False, model="User", - allow_external_connections=allow_external_connections, ) except ActivitySerializerError: # ¯\_(ツ)_/¯ @@ -315,4 +313,4 @@ def action(self, allow_external_connections=True): continue report.statuses.add(item) - report.save(allow_external_connections=allow_external_connections) + report.save() diff --git a/bookwyrm/tests/views/inbox/test_inbox_flag.py b/bookwyrm/tests/views/inbox/test_inbox_flag.py index 0600f6c2a0..d8d2135000 100644 --- a/bookwyrm/tests/views/inbox/test_inbox_flag.py +++ b/bookwyrm/tests/views/inbox/test_inbox_flag.py @@ -51,7 +51,12 @@ def test_flag_local_user(self): "content": "hello hello", "@context": "https://www.w3.org/ns/activitystreams", } - views.inbox.activity_task(activity) + + with patch( + "bookwyrm.activitypub.verbs.resolve_remote_id", + side_effect=[self.local_user], + ): + views.inbox.activity_task(activity) # a report should now exist report = models.Report.objects.get( user=self.remote_user, reported_user=self.local_user @@ -81,7 +86,12 @@ def test_flag_local_user_with_statuses(self): "content": "hello hello", "@context": "https://www.w3.org/ns/activitystreams", } - views.inbox.activity_task(activity) + + with patch( + "bookwyrm.activitypub.verbs.resolve_remote_id", + side_effect=[self.local_user, status_1, status_2], + ): + views.inbox.activity_task(activity) # a report should now exist report = models.Report.objects.get( user=self.remote_user, reported_user=self.local_user From ec294df3f1db1e70f5d1bee1a58605a72fb3f171 Mon Sep 17 00:00:00 2001 From: Hugh Rundle Date: Sun, 7 Jun 2026 17:46:17 +1000 Subject: [PATCH 731/962] fix federated server notes Notes on federated servers were causing an error. Now they don't. --- bookwyrm/views/admin/federation.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/views/admin/federation.py b/bookwyrm/views/admin/federation.py index dea79099bf..85eb78c1da 100644 --- a/bookwyrm/views/admin/federation.py +++ b/bookwyrm/views/admin/federation.py @@ -156,7 +156,7 @@ def post(self, request, server): """update note""" server = get_object_or_404(models.FederatedServer, id=server) server.notes = request.POST.get("notes") - server.save(request) + server.save(update_fields=["notes"]) return redirect("settings-federated-server", server.id) From 0a4d54b8a170bce7d9fb9a779390587ca31f657a Mon Sep 17 00:00:00 2001 From: Ilkka Ollakka Date: Sun, 7 Jun 2026 15:41:30 +0300 Subject: [PATCH 732/962] utils/db: fix typehints changes for mypy --- bookwyrm/utils/db.py | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/bookwyrm/utils/db.py b/bookwyrm/utils/db.py index 21fd163431..00822907e4 100644 --- a/bookwyrm/utils/db.py +++ b/bookwyrm/utils/db.py @@ -1,7 +1,7 @@ """Database utilities""" from typing import Optional, Iterable, Set, cast -import sqlparse # type: ignore[import-untyped] +import sqlparse def format_trigger(sql: str) -> str: @@ -10,16 +10,13 @@ def format_trigger(sql: str) -> str: we remove whitespace and use consistent casing so as to avoid migrations due to formatting changes. """ - return cast( - str, - sqlparse.format( - sql, - strip_comments=True, - strip_whitespace=True, - use_space_around_operators=True, - keyword_case="upper", - identifier_case="lower", - ), + return sqlparse.format( + sql, + strip_comments=True, + strip_whitespace=True, + use_space_around_operators=True, + keyword_case="upper", + identifier_case="lower", ) From e988e41f27e20620f40b9b68eb20c4817ab9a417 Mon Sep 17 00:00:00 2001 From: Ilkka Ollakka Date: Sun, 7 Jun 2026 15:46:13 +0300 Subject: [PATCH 733/962] utils/db: remove ununsed import --- bookwyrm/utils/db.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/utils/db.py b/bookwyrm/utils/db.py index 00822907e4..03445cdf6d 100644 --- a/bookwyrm/utils/db.py +++ b/bookwyrm/utils/db.py @@ -1,6 +1,6 @@ """Database utilities""" -from typing import Optional, Iterable, Set, cast +from typing import Optional, Iterable, Set import sqlparse From ac4e2aa4217242c7dd7ac14e804f7f77949643c4 Mon Sep 17 00:00:00 2001 From: diaxoaine <42137630+diaxoaine@users.noreply.github.com> Date: Sun, 7 Jun 2026 23:19:12 +0700 Subject: [PATCH 734/962] Revert "replace asyncio with gevent" This reverts commit 87501c8d4e5ea02c7cba2e71da3ac24afda06f24. --- bookwyrm/models/activitypub_mixin.py | 52 +++++++++++++------ .../tests/models/test_activitypub_mixin.py | 10 ++-- 2 files changed, 40 insertions(+), 22 deletions(-) diff --git a/bookwyrm/models/activitypub_mixin.py b/bookwyrm/models/activitypub_mixin.py index 311b4e233c..d94780112d 100644 --- a/bookwyrm/models/activitypub_mixin.py +++ b/bookwyrm/models/activitypub_mixin.py @@ -1,5 +1,6 @@ """activitypub model functionality""" +import asyncio from base64 import b64encode from collections import namedtuple from functools import reduce @@ -10,8 +11,7 @@ from uuid import uuid4 from typing_extensions import Self -from gevent.pool import Pool -import requests +import aiohttp from Crypto.PublicKey import RSA from Crypto.Signature import pkcs1_15 from Crypto.Hash import SHA256 @@ -541,13 +541,27 @@ def broadcast_task(sender_id: int, activity: str, recipients: list[str]): user_model = apps.get_model("bookwyrm.User", require_ready=True) sender = user_model.objects.select_related("key_pair").get(id=sender_id) + asyncio.run(async_broadcast(recipients, sender, activity)) - pool = Pool(100) - pool.map(lambda recipient: sign_and_send(sender, activity, recipient), recipients) +async def async_broadcast(recipients: list[str], sender, data: str): + """Send all the broadcasts simultaneously""" + timeout = aiohttp.ClientTimeout(total=10) + async with aiohttp.ClientSession(timeout=timeout) as session: + tasks = [] + for recipient in recipients: + tasks.append( + asyncio.ensure_future(sign_and_send(session, sender, data, recipient)) + ) + + results = await asyncio.gather(*tasks) + return results -def sign_and_send(sender, data: str, destination: str, **kwargs): - """Sign a message and send it to a single destination inbox""" + +async def sign_and_send( + session: aiohttp.ClientSession, sender, data: str, destination: str, **kwargs +): + """Sign the messages and send them in an asynchronous bundle""" now = http_date() if not sender.key_pair.private_key: @@ -573,17 +587,23 @@ def sign_and_send(sender, data: str, destination: str, **kwargs): } try: - response = requests.post(destination, data=data, headers=headers, timeout=10) - if not response.ok: - logger.error( - "Failed to send broadcast to %s: %s", destination, response.reason - ) - if kwargs.get("use_legacy_key") is not True: - logger.info("Trying again with legacy keyId header value") - sign_and_send(sender, data, destination, use_legacy_key=True) - except requests.exceptions.Timeout: + async with session.post(destination, data=data, headers=headers) as response: + if not response.ok: + logger.exception( + "Failed to send broadcast to %s: %s", destination, response.reason + ) + if kwargs.get("use_legacy_key") is not True: + logger.info("Trying again with legacy keyId header value") + asyncio.ensure_future( + sign_and_send( + session, sender, data, destination, use_legacy_key=True + ) + ) + + return response + except asyncio.TimeoutError: logger.info("Connection timed out for url: %s", destination) - except requests.exceptions.RequestException as err: + except aiohttp.ClientError as err: logger.exception(err) diff --git a/bookwyrm/tests/models/test_activitypub_mixin.py b/bookwyrm/tests/models/test_activitypub_mixin.py index fef1432e7a..3a257ca744 100644 --- a/bookwyrm/tests/models/test_activitypub_mixin.py +++ b/bookwyrm/tests/models/test_activitypub_mixin.py @@ -452,14 +452,12 @@ def test_to_ordered_collection(self, *_): self.assertEqual(page_2.orderedItems[-1]["content"], "

      test status 0

      ") def test_broadcast_task(self, *_): - """Should sign and send to each recipient""" + """Should be calling asyncio""" recipients = [ "https://instance.example/user/inbox", "https://instance.example/okay/inbox", ] - with patch("bookwyrm.models.activitypub_mixin.sign_and_send") as mock: + with patch("bookwyrm.models.activitypub_mixin.asyncio.run") as mock: broadcast_task(self.local_user.id, {}, recipients) - self.assertEqual(mock.call_count, len(recipients)) - self.assertEqual( - {call.args[2] for call in mock.call_args_list}, set(recipients) - ) + self.assertTrue(mock.called) + self.assertEqual(mock.call_count, 1) From d28eca9c2d22b6e260c6a85a90cf2391aebdde22 Mon Sep 17 00:00:00 2001 From: diaxoaine <42137630+diaxoaine@users.noreply.github.com> Date: Mon, 8 Jun 2026 00:02:40 +0700 Subject: [PATCH 735/962] celery-worker: use threads pool instead of gevent --- docker-compose.yml | 2 +- pyproject.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 005781e822..737935fa72 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -144,7 +144,7 @@ services: build: . networks: - main - command: celery -A celerywyrm worker --pool=gevent --concurrency=1000 -l info -Q high_priority,medium_priority,low_priority,streams,images,suggested_users,email,connectors,lists,inbox,imports,import_triggered,broadcast,misc + command: celery -A celerywyrm worker --pool=threads --concurrency=100 -l info -Q high_priority,medium_priority,low_priority,streams,images,suggested_users,email,connectors,lists,inbox,imports,import_triggered,broadcast,misc healthcheck: test: celery -A celerywyrm status interval: 10s diff --git a/pyproject.toml b/pyproject.toml index 2f8047c088..758af5c772 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -4,7 +4,7 @@ main = [ "bleach==6.1.0", "boto3==1.34.74", "bw-file-resubmit==0.6.0rc2", - "celery[gevent,redis]==5.6.2", + "celery[redis]==5.6.2", "colorthief==0.2.1", "Django==5.2.14", "django-celery-beat==2.8.1", From 6d6687cb6e866643ebc6506975a19695de088a9d Mon Sep 17 00:00:00 2001 From: Tim Rogers Date: Sun, 7 Jun 2026 14:27:47 -0500 Subject: [PATCH 736/962] Added check to clear invalid files from book cover upload form before resubmit when file is invaild --- bookwyrm/views/books/edit_book.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/bookwyrm/views/books/edit_book.py b/bookwyrm/views/books/edit_book.py index 4ad3272977..bec94247bf 100644 --- a/bookwyrm/views/books/edit_book.py +++ b/bookwyrm/views/books/edit_book.py @@ -28,7 +28,6 @@ ) from bookwyrm.views.helpers import get_edition, get_mergeable_object_or_404 - @method_decorator(login_required, name="dispatch") @method_decorator( permission_required("bookwyrm.edit_book", raise_exception=True), name="dispatch" @@ -61,6 +60,8 @@ def post(self, request, book_id): data = {"book": book, "form": form} ensure_transient_values_persist(request, data) if not form.is_valid(): + if "cover" in form.errors and form.has_error("cover", "invalid_image"): + del data["form"].files["cover"] ensure_transient_values_persist(request, data, add_author=True) return TemplateResponse(request, "book/edit/edit_book.html", data) @@ -152,6 +153,8 @@ def post(self, request): } if not form.is_valid(): + if "cover" in form.errors and form.has_error("cover", "invalid_image"): + del data["form"].files["cover"] ensure_transient_values_persist(request, data, form=form) return TemplateResponse(request, "book/edit/edit_book.html", data) From 777bfc2df8083816e795d6949bcd7414d5dbebcd Mon Sep 17 00:00:00 2001 From: Tim Rogers Date: Sun, 7 Jun 2026 14:33:11 -0500 Subject: [PATCH 737/962] Whitespace correction --- bookwyrm/views/books/edit_book.py | 1 + 1 file changed, 1 insertion(+) diff --git a/bookwyrm/views/books/edit_book.py b/bookwyrm/views/books/edit_book.py index bec94247bf..5ccc86d0a3 100644 --- a/bookwyrm/views/books/edit_book.py +++ b/bookwyrm/views/books/edit_book.py @@ -28,6 +28,7 @@ ) from bookwyrm.views.helpers import get_edition, get_mergeable_object_or_404 + @method_decorator(login_required, name="dispatch") @method_decorator( permission_required("bookwyrm.edit_book", raise_exception=True), name="dispatch" From 6eb0fc467b796910584049fe487e2dcd84b28821 Mon Sep 17 00:00:00 2001 From: diaxoaine <42137630+diaxoaine@users.noreply.github.com> Date: Mon, 8 Jun 2026 14:30:00 +0700 Subject: [PATCH 738/962] LibraryThing import to respect shelf colunm --- bookwyrm/importers/librarything_import.py | 3 +- .../importers/test_librarything_import.py | 59 +++++++++++++++++++ 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/bookwyrm/importers/librarything_import.py b/bookwyrm/importers/librarything_import.py index f118d7ea20..9220689881 100644 --- a/bookwyrm/importers/librarything_import.py +++ b/bookwyrm/importers/librarything_import.py @@ -36,4 +36,5 @@ def get_shelf(self, normalized_row: dict[str, Optional[str]]) -> Optional[str]: return Shelf.READ_FINISHED if normalized_row["date_started"]: return Shelf.READING - return Shelf.TO_READ + # no reading dates: fall back to the "shelf" column + return super().get_shelf(normalized_row) or Shelf.TO_READ diff --git a/bookwyrm/tests/importers/test_librarything_import.py b/bookwyrm/tests/importers/test_librarything_import.py index d564801c90..4790e059e0 100644 --- a/bookwyrm/tests/importers/test_librarything_import.py +++ b/bookwyrm/tests/importers/test_librarything_import.py @@ -181,3 +181,62 @@ def test_handle_imported_book_review(self, *_): self.assertEqual(review.rating, 4.5) self.assertEqual(review.published_date, make_date(2007, 5, 8)) self.assertEqual(review.privacy, "unlisted") + + def test_get_shelf_prefers_reading_dates(self, *_): + """a recorded finish/start date wins over the shelf column""" + self.assertEqual( + self.importer.get_shelf( + { + "date_finished": "2007-05-08", + "date_started": None, + "shelf": "To read", + } + ), + models.Shelf.READ_FINISHED, + ) + self.assertEqual( + self.importer.get_shelf( + { + "date_finished": None, + "date_started": "2007-04-16", + "shelf": "Read", + } + ), + models.Shelf.READING, + ) + + def test_get_shelf_falls_back_to_shelf_column(self, *_): + """with no reading dates, recognised shelf values map to read statuses (#3887)""" + cases = [ + ("Read", models.Shelf.READ_FINISHED), + ("read", models.Shelf.READ_FINISHED), + ("Currently reading", models.Shelf.READING), + ("to-read", models.Shelf.TO_READ), + ] + for value, expected in cases: + with self.subTest(value=value): + self.assertEqual( + self.importer.get_shelf( + { + "date_finished": None, + "date_started": None, + "shelf": value, + } + ), + expected, + ) + + def test_get_shelf_passes_through_custom_values(self, *_): + """an unrecognized shelf value becomes a custom shelf""" + self.assertEqual( + self.importer.get_shelf( + {"date_finished": None, "date_started": None, "shelf": "Favorites"} + ), + "Favorites", + ) + self.assertEqual( + self.importer.get_shelf( + {"date_finished": None, "date_started": None, "shelf": None} + ), + models.Shelf.TO_READ, + ) From 5dd24f8ae00a1cab012f3ce89cb2964f914ecd86 Mon Sep 17 00:00:00 2001 From: diaxoaine <42137630+diaxoaine@users.noreply.github.com> Date: Mon, 8 Jun 2026 14:35:00 +0700 Subject: [PATCH 739/962] OpenReads import to respect shelf colunm --- bookwyrm/importers/openreads_import.py | 3 +- .../importers/test_librarything_import.py | 2 +- .../tests/importers/test_openreads_import.py | 59 +++++++++++++++++++ 3 files changed, 62 insertions(+), 2 deletions(-) diff --git a/bookwyrm/importers/openreads_import.py b/bookwyrm/importers/openreads_import.py index f17ce8425a..d99691a2d3 100644 --- a/bookwyrm/importers/openreads_import.py +++ b/bookwyrm/importers/openreads_import.py @@ -58,4 +58,5 @@ def get_shelf(self, normalized_row: dict[str, Optional[str]]) -> Optional[str]: return Shelf.READ_FINISHED if normalized_row["date_started"]: return Shelf.READING - return Shelf.TO_READ + # no reading dates: fall back to the "shelf" column + return super().get_shelf(normalized_row) or Shelf.TO_READ diff --git a/bookwyrm/tests/importers/test_librarything_import.py b/bookwyrm/tests/importers/test_librarything_import.py index 4790e059e0..a96ef979e0 100644 --- a/bookwyrm/tests/importers/test_librarything_import.py +++ b/bookwyrm/tests/importers/test_librarything_import.py @@ -206,7 +206,7 @@ def test_get_shelf_prefers_reading_dates(self, *_): ) def test_get_shelf_falls_back_to_shelf_column(self, *_): - """with no reading dates, recognised shelf values map to read statuses (#3887)""" + """with no reading dates, recognised shelf values map to read statuses""" cases = [ ("Read", models.Shelf.READ_FINISHED), ("read", models.Shelf.READ_FINISHED), diff --git a/bookwyrm/tests/importers/test_openreads_import.py b/bookwyrm/tests/importers/test_openreads_import.py index 729bbd44d0..899996876d 100644 --- a/bookwyrm/tests/importers/test_openreads_import.py +++ b/bookwyrm/tests/importers/test_openreads_import.py @@ -192,3 +192,62 @@ def test_handle_imported_book_review(self, *_): self.assertEqual(review.rating, 4) self.assertEqual(review.published_date, make_date(2023, 11, 15)) self.assertEqual(review.privacy, "unlisted") + + def test_get_shelf_prefers_reading_dates(self, *_): + """a recorded finish/start date wins over the shelf column""" + self.assertEqual( + self.importer.get_shelf( + { + "date_finished": "2007-05-08", + "date_started": None, + "shelf": "To read", + } + ), + models.Shelf.READ_FINISHED, + ) + self.assertEqual( + self.importer.get_shelf( + { + "date_finished": None, + "date_started": "2007-04-16", + "shelf": "Read", + } + ), + models.Shelf.READING, + ) + + def test_get_shelf_falls_back_to_shelf_column(self, *_): + """with no reading dates, recognized shelf values map to read statuses""" + cases = [ + ("Read", models.Shelf.READ_FINISHED), + ("read", models.Shelf.READ_FINISHED), + ("Currently reading", models.Shelf.READING), + ("to-read", models.Shelf.TO_READ), + ] + for value, expected in cases: + with self.subTest(value=value): + self.assertEqual( + self.importer.get_shelf( + { + "date_finished": None, + "date_started": None, + "shelf": value, + } + ), + expected, + ) + + def test_get_shelf_passes_through_custom_values(self, *_): + """an unrecognized shelf value becomes a custom shelf""" + self.assertEqual( + self.importer.get_shelf( + {"date_finished": None, "date_started": None, "shelf": "Favorites"} + ), + "Favorites", + ) + self.assertEqual( + self.importer.get_shelf( + {"date_finished": None, "date_started": None, "shelf": None} + ), + models.Shelf.TO_READ, + ) From 3dfbaf73d84726a317bb80b352d33b07b3bbde03 Mon Sep 17 00:00:00 2001 From: diaxoaine <42137630+diaxoaine@users.noreply.github.com> Date: Tue, 9 Jun 2026 09:36:17 +0700 Subject: [PATCH 740/962] calibre import to respect shelf colunm --- bookwyrm/importers/calibre_import.py | 4 +-- .../tests/importers/test_calibre_import.py | 36 +++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/bookwyrm/importers/calibre_import.py b/bookwyrm/importers/calibre_import.py index 76b7ae63fa..1b02698345 100644 --- a/bookwyrm/importers/calibre_import.py +++ b/bookwyrm/importers/calibre_import.py @@ -22,5 +22,5 @@ def __init__(self, *args: Any, **kwargs: Any): super().__init__(*args, **kwargs) def get_shelf(self, normalized_row: dict[str, Optional[str]]) -> Optional[str]: - # Calibre export does not indicate which shelf to use. Use a default one for now - return Shelf.TO_READ + # Calibre export does not indicate which shelf to use. + return super().get_shelf(normalized_row) or Shelf.TO_READ diff --git a/bookwyrm/tests/importers/test_calibre_import.py b/bookwyrm/tests/importers/test_calibre_import.py index 5cdddd7b58..ffe03a5462 100644 --- a/bookwyrm/tests/importers/test_calibre_import.py +++ b/bookwyrm/tests/importers/test_calibre_import.py @@ -82,3 +82,39 @@ def test_handle_imported_book(self, *_): shelf.refresh_from_db() self.assertEqual(shelf.books.first(), self.book) + + def test_get_shelf_falls_back_to_shelf_column(self, *_): + """with no reading dates, recognised shelf values map to read statuses""" + cases = [ + ("Read", models.Shelf.READ_FINISHED), + ("read", models.Shelf.READ_FINISHED), + ("Currently reading", models.Shelf.READING), + ("to-read", models.Shelf.TO_READ), + ] + for value, expected in cases: + with self.subTest(value=value): + self.assertEqual( + self.importer.get_shelf( + { + "date_finished": None, + "date_started": None, + "shelf": value, + } + ), + expected, + ) + + def test_get_shelf_passes_through_custom_values(self, *_): + """an unrecognized shelf value becomes a custom shelf""" + self.assertEqual( + self.importer.get_shelf( + {"date_finished": None, "date_started": None, "shelf": "Favorites"} + ), + "Favorites", + ) + self.assertEqual( + self.importer.get_shelf( + {"date_finished": None, "date_started": None, "shelf": None} + ), + models.Shelf.TO_READ, + ) From b54e3b41c6c02d49c81fab311e056561b1152b07 Mon Sep 17 00:00:00 2001 From: diaxoaine <42137630+diaxoaine@users.noreply.github.com> Date: Tue, 9 Jun 2026 19:05:24 +0700 Subject: [PATCH 741/962] Avoid queuing broadcast_task with no recipients --- bookwyrm/models/activitypub_mixin.py | 6 +++++- bookwyrm/tests/models/test_activitypub_mixin.py | 13 ++++++++++++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/bookwyrm/models/activitypub_mixin.py b/bookwyrm/models/activitypub_mixin.py index d94780112d..9dcde0a32d 100644 --- a/bookwyrm/models/activitypub_mixin.py +++ b/bookwyrm/models/activitypub_mixin.py @@ -136,6 +136,10 @@ def broadcast(self, activity, sender, software=None, queue=BROADCAST): except PermissionDenied: return + recipients = self.get_recipients(software=software) + if len(recipients) == 0: + return + # if we're posting about ShelfBooks, set a delay to give the base activity # time to add the book on remote servers first to avoid race conditions countdown = ( @@ -152,7 +156,7 @@ def broadcast(self, activity, sender, software=None, queue=BROADCAST): args=( sender.id, json.dumps(activity, cls=activitypub.ActivityEncoder), - self.get_recipients(software=software), + recipients, ), queue=queue, ) diff --git a/bookwyrm/tests/models/test_activitypub_mixin.py b/bookwyrm/tests/models/test_activitypub_mixin.py index 3a257ca744..63d522f4e7 100644 --- a/bookwyrm/tests/models/test_activitypub_mixin.py +++ b/bookwyrm/tests/models/test_activitypub_mixin.py @@ -1,6 +1,6 @@ """testing model activitypub utilities""" -from unittest.mock import patch +from unittest.mock import Mock, patch from collections import namedtuple from dataclasses import dataclass import re @@ -461,3 +461,14 @@ def test_broadcast_task(self, *_): broadcast_task(self.local_user.id, {}, recipients) self.assertTrue(mock.called) self.assertEqual(mock.call_count, 1) + + def test_broadcast_no_recipients(self, broadcast_mock, *_): + """should not queue a task when there is nobody to send to""" + mock_self = Mock() + mock_self.get_recipients.return_value = [] + + ActivitypubMixin.broadcast( + mock_self, {"type": "Create", "object": {}}, self.local_user + ) + + self.assertFalse(broadcast_mock.called) From 87ea764581ec846422ba6b4608d981d566af8aff Mon Sep 17 00:00:00 2001 From: diaxoaine <42137630+diaxoaine@users.noreply.github.com> Date: Tue, 9 Jun 2026 19:22:05 +0700 Subject: [PATCH 742/962] Fix activity type check in broadcast countdown --- bookwyrm/models/activitypub_mixin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/models/activitypub_mixin.py b/bookwyrm/models/activitypub_mixin.py index 9dcde0a32d..2b0cf20144 100644 --- a/bookwyrm/models/activitypub_mixin.py +++ b/bookwyrm/models/activitypub_mixin.py @@ -145,7 +145,7 @@ def broadcast(self, activity, sender, software=None, queue=BROADCAST): countdown = ( 10 if ( - isinstance(activity, object) + isinstance(activity, dict) and not isinstance(activity["object"], str) and activity["object"].get("type", None) in ["GeneratedNote", "Comment"] ) From afb6ecccce265f8dc228da87e9938c345294d8fc Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Tue, 9 Jun 2026 07:25:02 -0700 Subject: [PATCH 743/962] New Crowdin updates (#3908) * New translations django.po (Romanian) [ci skip] * New translations django.po (French) [ci skip] * New translations django.po (Spanish) [ci skip] * New translations django.po (Afrikaans) [ci skip] * New translations django.po (Arabic) [ci skip] * New translations django.po (Bulgarian) [ci skip] * New translations django.po (Catalan) [ci skip] * New translations django.po (Czech) [ci skip] * New translations django.po (Danish) [ci skip] * New translations django.po (German) [ci skip] * New translations django.po (Greek) [ci skip] * New translations django.po (Basque) [ci skip] * New translations django.po (Finnish) [ci skip] * New translations django.po (Irish) [ci skip] * New translations django.po (Hebrew) [ci skip] * New translations django.po (Hungarian) [ci skip] * New translations django.po (Italian) [ci skip] * New translations django.po (Japanese) [ci skip] * New translations django.po (Korean) [ci skip] * New translations django.po (Lithuanian) [ci skip] * New translations django.po (Dutch) [ci skip] * New translations django.po (Norwegian) [ci skip] * New translations django.po (Polish) [ci skip] * New translations django.po (Portuguese) [ci skip] * New translations django.po (Russian) [ci skip] * New translations django.po (Slovak) [ci skip] * New translations django.po (Slovenian) [ci skip] * New translations django.po (Serbian (Cyrillic)) [ci skip] * New translations django.po (Swedish) [ci skip] * New translations django.po (Turkish) [ci skip] * New translations django.po (Ukrainian) [ci skip] * New translations django.po (Chinese Simplified) [ci skip] * New translations django.po (Chinese Traditional) [ci skip] * New translations django.po (Vietnamese) [ci skip] * New translations django.po (Galician) [ci skip] * New translations django.po (Portuguese, Brazilian) [ci skip] * New translations django.po (Indonesian) [ci skip] * New translations django.po (Persian) [ci skip] * New translations django.po (Bengali) [ci skip] * New translations django.po (Yiddish) [ci skip] * New translations django.po (Welsh) [ci skip] * New translations django.po (Faroese) [ci skip] * New translations django.po (Esperanto) [ci skip] * New translations django.po (Bashkir) [ci skip] * New translations django.po (Bengali, India) [ci skip] * New translations django.po (Oulipo) [ci skip] * New translations django.po (Eastern Min) [ci skip] * New translations django.po (Galician) [ci skip] * New translations django.po (Romanian) [ci skip] * New translations django.po (French) [ci skip] * New translations django.po (Spanish) [ci skip] * New translations django.po (Afrikaans) [ci skip] * New translations django.po (Arabic) [ci skip] * New translations django.po (Bulgarian) [ci skip] * New translations django.po (Catalan) [ci skip] * New translations django.po (Czech) [ci skip] * New translations django.po (Danish) [ci skip] * New translations django.po (German) [ci skip] * New translations django.po (Greek) [ci skip] * New translations django.po (Basque) [ci skip] * New translations django.po (Finnish) [ci skip] * New translations django.po (Irish) [ci skip] * New translations django.po (Hebrew) [ci skip] * New translations django.po (Hungarian) [ci skip] * New translations django.po (Italian) [ci skip] * New translations django.po (Japanese) [ci skip] * New translations django.po (Korean) [ci skip] * New translations django.po (Lithuanian) [ci skip] * New translations django.po (Dutch) [ci skip] * New translations django.po (Norwegian) [ci skip] * New translations django.po (Polish) [ci skip] * New translations django.po (Portuguese) [ci skip] * New translations django.po (Russian) [ci skip] * New translations django.po (Slovak) [ci skip] * New translations django.po (Slovenian) [ci skip] * New translations django.po (Serbian (Cyrillic)) [ci skip] * New translations django.po (Swedish) [ci skip] * New translations django.po (Turkish) [ci skip] * New translations django.po (Ukrainian) [ci skip] * New translations django.po (Chinese Simplified) [ci skip] * New translations django.po (Chinese Traditional) [ci skip] * New translations django.po (Vietnamese) [ci skip] * New translations django.po (Galician) [ci skip] * New translations django.po (Portuguese, Brazilian) [ci skip] * New translations django.po (Indonesian) [ci skip] * New translations django.po (Persian) [ci skip] * New translations django.po (Bengali) [ci skip] * New translations django.po (Yiddish) [ci skip] * New translations django.po (Welsh) [ci skip] * New translations django.po (Faroese) [ci skip] * New translations django.po (Esperanto) [ci skip] * New translations django.po (Bashkir) [ci skip] * New translations django.po (Bengali, India) [ci skip] * New translations django.po (Oulipo) [ci skip] * New translations django.po (Eastern Min) [ci skip] * New translations django.po (Dutch) [ci skip] * New translations django.po (Galician) [ci skip] * New translations django.po (French) [ci skip] * New translations django.po (Indonesian) [ci skip] * New translations django.po (Indonesian) [ci skip] * New translations django.po (Indonesian) [ci skip] * New translations django.po (Indonesian) [ci skip] * New translations django.po (Indonesian) [ci skip] * New translations django.po (Indonesian) [ci skip] * New translations django.po (Russian) [ci skip] * New translations django.po (Russian) [ci skip] * New translations django.po (Russian) [ci skip] * New translations django.po (Russian) [ci skip] * New translations django.po (Russian) [ci skip] * New translations django.po (Russian) [ci skip] * New translations django.po (Indonesian) [ci skip] * New translations django.po (Russian) [ci skip] * New translations django.po (Russian) [ci skip] * New translations django.po (Russian) [ci skip] * New translations django.po (Russian) [ci skip] * New translations django.po (Russian) [ci skip] * New translations django.po (Russian) [ci skip] * New translations django.po (Russian) [ci skip] * New translations django.po (Russian) [ci skip] * New translations django.po (Russian) [ci skip] * New translations django.po (Russian) [ci skip] * New translations django.po (Russian) [ci skip] * New translations django.po (Russian) [ci skip] * New translations django.po (Russian) [ci skip] * New translations django.po (Russian) [ci skip] * New translations django.po (Russian) [ci skip] * New translations django.po (Russian) [ci skip] * New translations django.po (Indonesian) [ci skip] * New translations django.po (Indonesian) [ci skip] * New translations django.po (Hebrew) [ci skip] * New translations django.po (Russian) [ci skip] * New translations django.po (Russian) [ci skip] * New translations django.po (Russian) [ci skip] --- locale/af_ZA/LC_MESSAGES/django.po | 571 +++++++++------ locale/ar_SA/LC_MESSAGES/django.po | 575 +++++++++------ locale/ba_RU/LC_MESSAGES/django.po | 570 +++++++++------ locale/bg_BG/LC_MESSAGES/django.po | 571 +++++++++------ locale/bn_BD/LC_MESSAGES/django.po | 571 +++++++++------ locale/bn_IN/LC_MESSAGES/django.po | 571 +++++++++------ locale/ca_ES/LC_MESSAGES/django.po | 575 +++++++++------ locale/cdo/LC_MESSAGES/django.po | 571 +++++++++------ locale/cs_CZ/LC_MESSAGES/django.po | 575 +++++++++------ locale/cy_GB/LC_MESSAGES/django.po | 575 +++++++++------ locale/da_DK/LC_MESSAGES/django.po | 571 +++++++++------ locale/de_DE/LC_MESSAGES/django.po | 575 +++++++++------ locale/el_GR/LC_MESSAGES/django.po | 575 +++++++++------ locale/en_Oulipo/LC_MESSAGES/django.po | 571 +++++++++------ locale/eo_UY/LC_MESSAGES/django.po | 575 +++++++++------ locale/es_ES/LC_MESSAGES/django.po | 575 +++++++++------ locale/eu_ES/LC_MESSAGES/django.po | 574 +++++++++------ locale/fa_IR/LC_MESSAGES/django.po | 567 ++++++++++----- locale/fi_FI/LC_MESSAGES/django.po | 575 +++++++++------ locale/fo_FO/LC_MESSAGES/django.po | 571 +++++++++------ locale/fr_FR/LC_MESSAGES/django.po | 575 +++++++++------ locale/ga_IE/LC_MESSAGES/django.po | 574 +++++++++------ locale/gl_ES/LC_MESSAGES/django.po | 575 +++++++++------ locale/he_IL/LC_MESSAGES/django.po | 587 +++++++++------ locale/hu_HU/LC_MESSAGES/django.po | 571 +++++++++------ locale/id_ID/LC_MESSAGES/django.po | 970 ++++++++++++++----------- locale/it_IT/LC_MESSAGES/django.po | 575 +++++++++------ locale/ja_JP/LC_MESSAGES/django.po | 574 +++++++++------ locale/ko_KR/LC_MESSAGES/django.po | 572 +++++++++------ locale/lt_LT/LC_MESSAGES/django.po | 577 +++++++++------ locale/nl_NL/LC_MESSAGES/django.po | 575 +++++++++------ locale/no_NO/LC_MESSAGES/django.po | 575 +++++++++------ locale/pl_PL/LC_MESSAGES/django.po | 577 +++++++++------ locale/pt_BR/LC_MESSAGES/django.po | 575 +++++++++------ locale/pt_PT/LC_MESSAGES/django.po | 575 +++++++++------ locale/ro_RO/LC_MESSAGES/django.po | 575 +++++++++------ locale/ru_RU/LC_MESSAGES/django.po | 939 ++++++++++++++---------- locale/sk_SK/LC_MESSAGES/django.po | 573 +++++++++------ locale/sl_SI/LC_MESSAGES/django.po | 573 +++++++++------ locale/sr_SP/LC_MESSAGES/django.po | 572 +++++++++------ locale/sv_SE/LC_MESSAGES/django.po | 575 +++++++++------ locale/tr_TR/LC_MESSAGES/django.po | 572 +++++++++------ locale/uk_UA/LC_MESSAGES/django.po | 575 +++++++++------ locale/vi_VN/LC_MESSAGES/django.po | 570 +++++++++------ locale/yi_DE/LC_MESSAGES/django.po | 571 +++++++++------ locale/zh_Hans/LC_MESSAGES/django.po | 574 +++++++++------ locale/zh_Hant/LC_MESSAGES/django.po | 570 +++++++++------ 47 files changed, 17586 insertions(+), 10134 deletions(-) diff --git a/locale/af_ZA/LC_MESSAGES/django.po b/locale/af_ZA/LC_MESSAGES/django.po index f9575341e7..6c558b5fba 100644 --- a/locale/af_ZA/LC_MESSAGES/django.po +++ b/locale/af_ZA/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-06 18:48\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:12\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Afrikaans\n" "Language: af\n" @@ -107,7 +107,7 @@ msgstr "" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "" @@ -175,39 +175,43 @@ msgstr "" msgid "Domain block" msgstr "" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,19 +465,19 @@ msgstr "" msgid "%(display_name)s's quote from %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" msgstr[0] "" msgstr[1] "" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "" @@ -489,19 +493,19 @@ msgstr "" msgid "Everything else" msgstr "" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -510,91 +514,91 @@ msgstr "" msgid "Books" msgstr "" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "" @@ -839,7 +843,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -910,57 +914,62 @@ msgstr "" msgid "Died:" msgstr "" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "" @@ -997,8 +1006,8 @@ msgid "Name:" msgstr "" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "" @@ -1035,7 +1044,8 @@ msgid "Openlibrary key:" msgstr "" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "" @@ -1044,7 +1054,7 @@ msgid "Librarything key:" msgstr "" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "" @@ -1057,8 +1067,8 @@ msgid "ISNI:" msgstr "" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1070,7 +1080,7 @@ msgstr "" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1082,10 +1092,10 @@ msgstr "" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1095,7 +1105,7 @@ msgstr "" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1112,7 +1122,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "" #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1129,97 +1140,116 @@ msgstr "" msgid "Unable to connect to remote source." msgstr "" -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "" msgstr[1] "" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" msgstr[0] "" msgstr[1] "" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "" -#: bookwyrm/templates/book/book.html:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "" -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1234,15 +1264,15 @@ msgstr "" msgid "Lists" msgstr "" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1265,25 +1295,26 @@ msgid "Copied ISBN!" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "" @@ -1294,12 +1325,12 @@ msgid "Goodreads:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1308,12 +1339,12 @@ msgid "Add cover" msgstr "" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "" @@ -1378,15 +1409,32 @@ msgstr "" msgid "Creating a new author: %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1448,124 +1496,190 @@ msgstr "" msgid "Subtitle:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1752,19 +1866,11 @@ msgstr "" msgid "rated it" msgstr "" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "" -#: 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." @@ -1809,7 +1915,7 @@ msgstr "" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "" @@ -1870,7 +1976,7 @@ msgstr "" #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1964,21 +2070,22 @@ msgid "%(username)s started reading %(username)s rated %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "" @@ -2164,14 +2271,14 @@ msgstr "" msgid "Alternatively, you can try enabling more status types" msgstr "" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: bookwyrm/templates/feed/layout.html:14 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" msgstr "" -#: bookwyrm/templates/feed/goal_card.html:18 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "" @@ -2459,6 +2566,10 @@ msgstr "" msgid "Edit group" msgstr "" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "" @@ -3697,6 +3808,7 @@ msgid "Search for a book, author, user, or list" msgstr "" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "" @@ -4309,7 +4421,7 @@ msgstr[0] "" msgstr[1] "" #: bookwyrm/templates/notifications/items/status_preview.html:4 -#: bookwyrm/templates/snippets/status/content_status.html:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "" @@ -4776,7 +4888,7 @@ msgstr "" 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 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "" @@ -4969,9 +5081,8 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "" #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" +msgid "Update read dates for \"%(title)s\"" msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 @@ -5026,6 +5137,11 @@ msgstr "" msgid "Delete these read dates" msgstr "" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5036,39 +5152,33 @@ msgstr "" msgid "Report" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "" - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "" @@ -5169,13 +5279,13 @@ msgstr "" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 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:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "" @@ -5549,7 +5659,7 @@ msgid "Dashboard" msgstr "" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "" @@ -5563,31 +5673,31 @@ msgstr "" msgid "Works" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "" @@ -5899,13 +6009,49 @@ msgid "Unable to save settings" msgstr "" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6616,10 +6762,6 @@ msgstr "" msgid "Tasks" msgstr "" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "" @@ -7279,10 +7421,6 @@ msgstr "" msgid "An excerpt from '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "" @@ -7295,12 +7433,12 @@ msgstr "" msgid "to" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "" @@ -7401,6 +7539,13 @@ msgid_plural "rated %(title)s: %(display_ratin msgstr[0] "" msgstr[1] "" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" +msgstr[1] "" + #: 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" @@ -7613,35 +7758,35 @@ msgstr "" msgid "Show rating" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "" @@ -7700,16 +7845,22 @@ msgstr "" msgid "started reading %(book)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -7988,15 +8139,23 @@ msgid_plural "%(num)d books - by %(user)s" msgstr[0] "" msgstr[1] "" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/ar_SA/LC_MESSAGES/django.po b/locale/ar_SA/LC_MESSAGES/django.po index b330565a9b..1b83eaf9f3 100644 --- a/locale/ar_SA/LC_MESSAGES/django.po +++ b/locale/ar_SA/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-06 18:48\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:12\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Arabic\n" "Language: ar\n" @@ -107,7 +107,7 @@ msgstr "عنوان الكتاب" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "" @@ -175,39 +175,43 @@ msgstr "حذف المراقب" msgid "Domain block" msgstr "حجب النطاق" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "كتاب مسموع" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "كتاب الكتروني" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "الرواية الرسومية" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "غلاف صُلْب" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "غلاف ورقي" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "%(value)s لا يبدو مثل ISBN" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "%(value)s ليس لديه صيغة ISBN الصحيح، توقعنا %(check_version)s" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,12 +465,12 @@ msgstr "" msgid "%(display_name)s's quote from %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" @@ -477,7 +481,7 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "" @@ -493,19 +497,19 @@ msgstr "" msgid "Everything else" msgstr "كل شيء آخر" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "الخط الزمني الرئيسي" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "الصفحة الرئيسية" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "الخط الزمني اللكتب" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -514,91 +518,91 @@ msgstr "الخط الزمني اللكتب" msgid "Books" msgstr "الكتب" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "الإنجليزية" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "Deutsch (الألمانية)" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "Español (الإسبانية)" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "Français (الفرنسية)" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "بولندي (البولندية)" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "السويدية (السويدي)" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "" @@ -851,7 +855,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -930,57 +934,62 @@ msgstr "ولد:" msgid "Died:" msgstr "مات:" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "الروابط الخارجية" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "ويكيبيديا" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "تحميل البيانات" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "عرض على OpenLibrary" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "" @@ -1017,8 +1026,8 @@ msgid "Name:" msgstr "الإسم:" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "" @@ -1055,7 +1064,8 @@ msgid "Openlibrary key:" msgstr "" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "" @@ -1064,7 +1074,7 @@ msgid "Librarything key:" msgstr "" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "مفتاح Goodreads" @@ -1077,8 +1087,8 @@ msgid "ISNI:" msgstr "" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1090,7 +1100,7 @@ msgstr "" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1102,10 +1112,10 @@ msgstr "حفظ" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1115,7 +1125,7 @@ msgstr "حفظ" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1132,7 +1142,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "" #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1149,31 +1160,50 @@ msgstr "تأكيد" msgid "Unable to connect to remote source." msgstr "" -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "تعديل الكتاب" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "انقر لإضافة غلاف" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "إخفاق في تحميل الغلاف" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "اضغط للتوسيع" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" @@ -1184,17 +1214,17 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "إضافة وصف" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "الوصف:" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" @@ -1205,49 +1235,49 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "" -#: bookwyrm/templates/book/book.html:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "ليس لديك أي نشاط للقراءة لهذا الكتاب." -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "تعليقاتك" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "الإقتباسات الخاصة بك" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "المواضيع" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "الأماكن" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1262,15 +1292,15 @@ msgstr "الأماكن" msgid "Lists" msgstr "القوائم" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "إضافة إلى قائمة" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1293,25 +1323,26 @@ msgid "Copied ISBN!" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "" @@ -1322,12 +1353,12 @@ msgid "Goodreads:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1336,12 +1367,12 @@ msgid "Add cover" msgstr "إضافة غلاف" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "تحميل الغلاف:" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "" @@ -1406,15 +1437,32 @@ msgstr "هذا مؤلف جديد" msgid "Creating a new author: %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1476,124 +1524,190 @@ msgstr "ترتيب العنوان:" msgid "Subtitle:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "اللغات:" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "تاريخ النشر الأول:" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "المؤلفون" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "صفحة المؤلف ل %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "إضافة مؤلف" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "الغلاف" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "الخصائص المادية" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "الصفحات:" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1780,19 +1894,11 @@ msgstr "" msgid "rated it" msgstr "" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "" -#: 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." @@ -1837,7 +1943,7 @@ msgstr "رمز التأكيد:" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "قدم" @@ -1898,7 +2004,7 @@ msgstr "" #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -2000,21 +2106,22 @@ msgid "%(username)s started reading %(username)s rated %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "" @@ -2200,14 +2307,14 @@ msgstr "" msgid "Alternatively, you can try enabling more status types" msgstr "" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: bookwyrm/templates/feed/layout.html:14 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" msgstr "" -#: bookwyrm/templates/feed/goal_card.html:18 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "" @@ -2495,6 +2602,10 @@ msgstr "" msgid "Edit group" msgstr "" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "" @@ -3753,6 +3864,7 @@ msgid "Search for a book, author, user, or list" msgstr "" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "" @@ -4385,7 +4497,7 @@ msgstr[4] "" msgstr[5] "" #: bookwyrm/templates/notifications/items/status_preview.html:4 -#: bookwyrm/templates/snippets/status/content_status.html:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "" @@ -4856,7 +4968,7 @@ msgstr "" 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 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "" @@ -5049,9 +5161,8 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "" #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" +msgid "Update read dates for \"%(title)s\"" msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 @@ -5106,6 +5217,11 @@ msgstr "" msgid "Delete these read dates" msgstr "" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5116,39 +5232,33 @@ msgstr "" msgid "Report" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "" - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "" @@ -5257,13 +5367,13 @@ msgstr "" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 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:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "" @@ -5637,7 +5747,7 @@ msgid "Dashboard" msgstr "لوحة التحكم" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "إجمالي المستخدمين" @@ -5651,31 +5761,31 @@ msgstr "" msgid "Works" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "أيام" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "أسابيع" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "" @@ -6003,13 +6113,49 @@ msgid "Unable to save settings" msgstr "" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6720,10 +6866,6 @@ msgstr "" msgid "Tasks" msgstr "" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "" @@ -7391,10 +7533,6 @@ msgstr "" msgid "An excerpt from '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "" @@ -7407,12 +7545,12 @@ msgstr "" msgid "to" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "" @@ -7529,6 +7667,17 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + #: 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" @@ -7745,35 +7894,35 @@ msgstr "" msgid "Show rating" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "" @@ -7832,16 +7981,22 @@ msgstr "" msgid "started reading %(book)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -8132,15 +8287,23 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/ba_RU/LC_MESSAGES/django.po b/locale/ba_RU/LC_MESSAGES/django.po index 9c70221fd9..db9529918a 100644 --- a/locale/ba_RU/LC_MESSAGES/django.po +++ b/locale/ba_RU/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-06 18:49\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:14\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Bashkir\n" "Language: ba\n" @@ -107,7 +107,7 @@ msgstr "" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "" @@ -175,39 +175,43 @@ msgstr "" msgid "Domain block" msgstr "" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,18 +465,18 @@ msgstr "" msgid "%(display_name)s's quote from %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" msgstr[0] "" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "" @@ -488,19 +492,19 @@ msgstr "" msgid "Everything else" msgstr "" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -509,91 +513,91 @@ msgstr "" msgid "Books" msgstr "" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "" @@ -836,7 +840,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -905,57 +909,62 @@ msgstr "" msgid "Died:" msgstr "" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "" @@ -992,8 +1001,8 @@ msgid "Name:" msgstr "" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "" @@ -1030,7 +1039,8 @@ msgid "Openlibrary key:" msgstr "" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "" @@ -1039,7 +1049,7 @@ msgid "Librarything key:" msgstr "" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "" @@ -1052,8 +1062,8 @@ msgid "ISNI:" msgstr "" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1065,7 +1075,7 @@ msgstr "" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1077,10 +1087,10 @@ msgstr "" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1090,7 +1100,7 @@ msgstr "" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1107,7 +1117,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "" #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1124,95 +1135,114 @@ msgstr "" msgid "Unable to connect to remote source." msgstr "" -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" msgstr[0] "" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "" -#: bookwyrm/templates/book/book.html:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "" -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1227,15 +1257,15 @@ msgstr "" msgid "Lists" msgstr "" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1258,25 +1288,26 @@ msgid "Copied ISBN!" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "" @@ -1287,12 +1318,12 @@ msgid "Goodreads:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1301,12 +1332,12 @@ msgid "Add cover" msgstr "" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "" @@ -1371,15 +1402,32 @@ msgstr "" msgid "Creating a new author: %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1441,124 +1489,190 @@ msgstr "" msgid "Subtitle:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1745,19 +1859,11 @@ msgstr "" msgid "rated it" msgstr "" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "" -#: 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." @@ -1802,7 +1908,7 @@ msgstr "" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "" @@ -1863,7 +1969,7 @@ msgstr "" #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1955,21 +2061,22 @@ msgid "%(username)s started reading %(username)s rated %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "" @@ -2155,14 +2262,14 @@ msgstr "" msgid "Alternatively, you can try enabling more status types" msgstr "" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: bookwyrm/templates/feed/layout.html:14 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" msgstr "" -#: bookwyrm/templates/feed/goal_card.html:18 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "" @@ -2450,6 +2557,10 @@ msgstr "" msgid "Edit group" msgstr "" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "" @@ -3683,6 +3794,7 @@ msgid "Search for a book, author, user, or list" msgstr "" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "" @@ -4290,7 +4402,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:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "" @@ -4756,7 +4868,7 @@ msgstr "" 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 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "" @@ -4949,9 +5061,8 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "" #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" +msgid "Update read dates for \"%(title)s\"" msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 @@ -5006,6 +5117,11 @@ msgstr "" msgid "Delete these read dates" msgstr "" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5016,39 +5132,33 @@ msgstr "" msgid "Report" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "" - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "" @@ -5147,13 +5257,13 @@ msgstr "" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 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:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "" @@ -5527,7 +5637,7 @@ msgid "Dashboard" msgstr "" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "" @@ -5541,31 +5651,31 @@ msgstr "" msgid "Works" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "" @@ -5873,13 +5983,49 @@ msgid "Unable to save settings" msgstr "" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6590,10 +6736,6 @@ msgstr "" msgid "Tasks" msgstr "" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "" @@ -7251,10 +7393,6 @@ msgstr "" msgid "An excerpt from '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "" @@ -7267,12 +7405,12 @@ msgstr "" msgid "to" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "" @@ -7369,6 +7507,12 @@ msgid "rated %(title)s: %(display_rating)s sta msgid_plural "rated %(title)s: %(display_rating)s stars" msgstr[0] "" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" + #: 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" @@ -7580,35 +7724,35 @@ msgstr "" msgid "Show rating" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "" @@ -7667,16 +7811,22 @@ msgstr "" msgid "started reading %(book)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -7952,15 +8102,23 @@ msgid "%(num)d book - by %(user)s" msgid_plural "%(num)d books - by %(user)s" msgstr[0] "" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/bg_BG/LC_MESSAGES/django.po b/locale/bg_BG/LC_MESSAGES/django.po index 755094a9c8..bfc14e5fb1 100644 --- a/locale/bg_BG/LC_MESSAGES/django.po +++ b/locale/bg_BG/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-06 18:48\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:12\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Bulgarian\n" "Language: bg\n" @@ -107,7 +107,7 @@ msgstr "Заглавие на книгата" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "Оценка" @@ -175,39 +175,43 @@ msgstr "Изтриване от модератор" msgid "Domain block" msgstr "Блокиране на домейн" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "Аудиокнига" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "Е-книга" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "Графичен роман" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "Твърди корици" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "Меки корици" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,19 +465,19 @@ msgstr "" msgid "%(display_name)s's quote from %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" msgstr[0] "" msgstr[1] "" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "" @@ -489,19 +493,19 @@ msgstr "" msgid "Everything else" msgstr "" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -510,91 +514,91 @@ msgstr "" msgid "Books" msgstr "" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "" @@ -839,7 +843,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -910,57 +914,62 @@ msgstr "" msgid "Died:" msgstr "" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "" @@ -997,8 +1006,8 @@ msgid "Name:" msgstr "" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "" @@ -1035,7 +1044,8 @@ msgid "Openlibrary key:" msgstr "" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "" @@ -1044,7 +1054,7 @@ msgid "Librarything key:" msgstr "" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "" @@ -1057,8 +1067,8 @@ msgid "ISNI:" msgstr "" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1070,7 +1080,7 @@ msgstr "" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1082,10 +1092,10 @@ msgstr "" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1095,7 +1105,7 @@ msgstr "" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1112,7 +1122,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "" #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1129,97 +1140,116 @@ msgstr "" msgid "Unable to connect to remote source." msgstr "" -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "" msgstr[1] "" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" msgstr[0] "" msgstr[1] "" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "" -#: bookwyrm/templates/book/book.html:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "" -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1234,15 +1264,15 @@ msgstr "" msgid "Lists" msgstr "" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1265,25 +1295,26 @@ msgid "Copied ISBN!" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "" @@ -1294,12 +1325,12 @@ msgid "Goodreads:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1308,12 +1339,12 @@ msgid "Add cover" msgstr "" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "" @@ -1378,15 +1409,32 @@ msgstr "" msgid "Creating a new author: %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1448,124 +1496,190 @@ msgstr "" msgid "Subtitle:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1752,19 +1866,11 @@ msgstr "" msgid "rated it" msgstr "" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "" -#: 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." @@ -1809,7 +1915,7 @@ msgstr "" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "" @@ -1870,7 +1976,7 @@ msgstr "" #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1964,21 +2070,22 @@ msgid "%(username)s started reading %(username)s rated %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "" @@ -2164,14 +2271,14 @@ msgstr "" msgid "Alternatively, you can try enabling more status types" msgstr "" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: bookwyrm/templates/feed/layout.html:14 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" msgstr "" -#: bookwyrm/templates/feed/goal_card.html:18 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "" @@ -2459,6 +2566,10 @@ msgstr "" msgid "Edit group" msgstr "" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "" @@ -3697,6 +3808,7 @@ msgid "Search for a book, author, user, or list" msgstr "" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "" @@ -4309,7 +4421,7 @@ msgstr[0] "" msgstr[1] "" #: bookwyrm/templates/notifications/items/status_preview.html:4 -#: bookwyrm/templates/snippets/status/content_status.html:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "" @@ -4776,7 +4888,7 @@ msgstr "" 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 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "" @@ -4969,9 +5081,8 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "" #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" +msgid "Update read dates for \"%(title)s\"" msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 @@ -5026,6 +5137,11 @@ msgstr "" msgid "Delete these read dates" msgstr "" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5036,39 +5152,33 @@ msgstr "" msgid "Report" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "" - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "" @@ -5169,13 +5279,13 @@ msgstr "" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 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:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "" @@ -5549,7 +5659,7 @@ msgid "Dashboard" msgstr "" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "" @@ -5563,31 +5673,31 @@ msgstr "" msgid "Works" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "" @@ -5899,13 +6009,49 @@ msgid "Unable to save settings" msgstr "" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6616,10 +6762,6 @@ msgstr "" msgid "Tasks" msgstr "" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "" @@ -7279,10 +7421,6 @@ msgstr "" msgid "An excerpt from '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "" @@ -7295,12 +7433,12 @@ msgstr "" msgid "to" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "" @@ -7401,6 +7539,13 @@ msgid_plural "rated %(title)s: %(display_ratin msgstr[0] "" msgstr[1] "" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" +msgstr[1] "" + #: 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" @@ -7613,35 +7758,35 @@ msgstr "" msgid "Show rating" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "" @@ -7700,16 +7845,22 @@ msgstr "" msgid "started reading %(book)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -7988,15 +8139,23 @@ msgid_plural "%(num)d books - by %(user)s" msgstr[0] "" msgstr[1] "" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/bn_BD/LC_MESSAGES/django.po b/locale/bn_BD/LC_MESSAGES/django.po index 030c1afa38..67a320f7c8 100644 --- a/locale/bn_BD/LC_MESSAGES/django.po +++ b/locale/bn_BD/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-06 18:49\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:13\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Bengali\n" "Language: bn\n" @@ -107,7 +107,7 @@ msgstr "" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "" @@ -175,39 +175,43 @@ msgstr "" msgid "Domain block" msgstr "" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,19 +465,19 @@ msgstr "" msgid "%(display_name)s's quote from %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" msgstr[0] "" msgstr[1] "" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "" @@ -489,19 +493,19 @@ msgstr "" msgid "Everything else" msgstr "" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -510,91 +514,91 @@ msgstr "" msgid "Books" msgstr "" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "" @@ -839,7 +843,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -910,57 +914,62 @@ msgstr "" msgid "Died:" msgstr "" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "" @@ -997,8 +1006,8 @@ msgid "Name:" msgstr "" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "" @@ -1035,7 +1044,8 @@ msgid "Openlibrary key:" msgstr "" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "" @@ -1044,7 +1054,7 @@ msgid "Librarything key:" msgstr "" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "" @@ -1057,8 +1067,8 @@ msgid "ISNI:" msgstr "" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1070,7 +1080,7 @@ msgstr "" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1082,10 +1092,10 @@ msgstr "" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1095,7 +1105,7 @@ msgstr "" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1112,7 +1122,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "" #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1129,97 +1140,116 @@ msgstr "" msgid "Unable to connect to remote source." msgstr "" -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "" msgstr[1] "" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" msgstr[0] "" msgstr[1] "" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "" -#: bookwyrm/templates/book/book.html:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "" -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1234,15 +1264,15 @@ msgstr "" msgid "Lists" msgstr "" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1265,25 +1295,26 @@ msgid "Copied ISBN!" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "" @@ -1294,12 +1325,12 @@ msgid "Goodreads:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1308,12 +1339,12 @@ msgid "Add cover" msgstr "" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "" @@ -1378,15 +1409,32 @@ msgstr "" msgid "Creating a new author: %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1448,124 +1496,190 @@ msgstr "" msgid "Subtitle:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1752,19 +1866,11 @@ msgstr "" msgid "rated it" msgstr "" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "" -#: 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." @@ -1809,7 +1915,7 @@ msgstr "" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "" @@ -1870,7 +1976,7 @@ msgstr "" #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1964,21 +2070,22 @@ msgid "%(username)s started reading %(username)s rated %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "" @@ -2164,14 +2271,14 @@ msgstr "" msgid "Alternatively, you can try enabling more status types" msgstr "" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: bookwyrm/templates/feed/layout.html:14 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" msgstr "" -#: bookwyrm/templates/feed/goal_card.html:18 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "" @@ -2459,6 +2566,10 @@ msgstr "" msgid "Edit group" msgstr "" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "" @@ -3697,6 +3808,7 @@ msgid "Search for a book, author, user, or list" msgstr "" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "" @@ -4309,7 +4421,7 @@ msgstr[0] "" msgstr[1] "" #: bookwyrm/templates/notifications/items/status_preview.html:4 -#: bookwyrm/templates/snippets/status/content_status.html:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "" @@ -4776,7 +4888,7 @@ msgstr "" 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 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "" @@ -4969,9 +5081,8 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "" #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" +msgid "Update read dates for \"%(title)s\"" msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 @@ -5026,6 +5137,11 @@ msgstr "" msgid "Delete these read dates" msgstr "" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5036,39 +5152,33 @@ msgstr "" msgid "Report" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "" - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "" @@ -5169,13 +5279,13 @@ msgstr "" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 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:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "" @@ -5549,7 +5659,7 @@ msgid "Dashboard" msgstr "" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "" @@ -5563,31 +5673,31 @@ msgstr "" msgid "Works" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "" @@ -5899,13 +6009,49 @@ msgid "Unable to save settings" msgstr "" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6616,10 +6762,6 @@ msgstr "" msgid "Tasks" msgstr "" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "" @@ -7279,10 +7421,6 @@ msgstr "" msgid "An excerpt from '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "" @@ -7295,12 +7433,12 @@ msgstr "" msgid "to" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "" @@ -7401,6 +7539,13 @@ msgid_plural "rated %(title)s: %(display_ratin msgstr[0] "" msgstr[1] "" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" +msgstr[1] "" + #: 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" @@ -7613,35 +7758,35 @@ msgstr "" msgid "Show rating" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "" @@ -7700,16 +7845,22 @@ msgstr "" msgid "started reading %(book)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -7988,15 +8139,23 @@ msgid_plural "%(num)d books - by %(user)s" msgstr[0] "" msgstr[1] "" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/bn_IN/LC_MESSAGES/django.po b/locale/bn_IN/LC_MESSAGES/django.po index ba98c86b4d..e8b7ed4c71 100644 --- a/locale/bn_IN/LC_MESSAGES/django.po +++ b/locale/bn_IN/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-06 18:49\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:14\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Bengali, India\n" "Language: bn_IN\n" @@ -107,7 +107,7 @@ msgstr "" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "" @@ -175,39 +175,43 @@ msgstr "" msgid "Domain block" msgstr "" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,19 +465,19 @@ msgstr "" msgid "%(display_name)s's quote from %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" msgstr[0] "" msgstr[1] "" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "" @@ -489,19 +493,19 @@ msgstr "" msgid "Everything else" msgstr "" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -510,91 +514,91 @@ msgstr "" msgid "Books" msgstr "" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "" @@ -839,7 +843,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -910,57 +914,62 @@ msgstr "" msgid "Died:" msgstr "" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "" @@ -997,8 +1006,8 @@ msgid "Name:" msgstr "" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "" @@ -1035,7 +1044,8 @@ msgid "Openlibrary key:" msgstr "" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "" @@ -1044,7 +1054,7 @@ msgid "Librarything key:" msgstr "" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "" @@ -1057,8 +1067,8 @@ msgid "ISNI:" msgstr "" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1070,7 +1080,7 @@ msgstr "" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1082,10 +1092,10 @@ msgstr "" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1095,7 +1105,7 @@ msgstr "" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1112,7 +1122,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "" #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1129,97 +1140,116 @@ msgstr "" msgid "Unable to connect to remote source." msgstr "" -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "" msgstr[1] "" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" msgstr[0] "" msgstr[1] "" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "" -#: bookwyrm/templates/book/book.html:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "" -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1234,15 +1264,15 @@ msgstr "" msgid "Lists" msgstr "" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1265,25 +1295,26 @@ msgid "Copied ISBN!" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "" @@ -1294,12 +1325,12 @@ msgid "Goodreads:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1308,12 +1339,12 @@ msgid "Add cover" msgstr "" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "" @@ -1378,15 +1409,32 @@ msgstr "" msgid "Creating a new author: %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1448,124 +1496,190 @@ msgstr "" msgid "Subtitle:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1752,19 +1866,11 @@ msgstr "" msgid "rated it" msgstr "" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "" -#: 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." @@ -1809,7 +1915,7 @@ msgstr "" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "" @@ -1870,7 +1976,7 @@ msgstr "" #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1964,21 +2070,22 @@ msgid "%(username)s started reading %(username)s rated %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "" @@ -2164,14 +2271,14 @@ msgstr "" msgid "Alternatively, you can try enabling more status types" msgstr "" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: bookwyrm/templates/feed/layout.html:14 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" msgstr "" -#: bookwyrm/templates/feed/goal_card.html:18 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "" @@ -2459,6 +2566,10 @@ msgstr "" msgid "Edit group" msgstr "" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "" @@ -3697,6 +3808,7 @@ msgid "Search for a book, author, user, or list" msgstr "" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "" @@ -4309,7 +4421,7 @@ msgstr[0] "" msgstr[1] "" #: bookwyrm/templates/notifications/items/status_preview.html:4 -#: bookwyrm/templates/snippets/status/content_status.html:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "" @@ -4776,7 +4888,7 @@ msgstr "" 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 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "" @@ -4969,9 +5081,8 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "" #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" +msgid "Update read dates for \"%(title)s\"" msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 @@ -5026,6 +5137,11 @@ msgstr "" msgid "Delete these read dates" msgstr "" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5036,39 +5152,33 @@ msgstr "" msgid "Report" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "" - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "" @@ -5169,13 +5279,13 @@ msgstr "" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 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:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "" @@ -5549,7 +5659,7 @@ msgid "Dashboard" msgstr "" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "" @@ -5563,31 +5673,31 @@ msgstr "" msgid "Works" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "" @@ -5899,13 +6009,49 @@ msgid "Unable to save settings" msgstr "" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6616,10 +6762,6 @@ msgstr "" msgid "Tasks" msgstr "" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "" @@ -7279,10 +7421,6 @@ msgstr "" msgid "An excerpt from '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "" @@ -7295,12 +7433,12 @@ msgstr "" msgid "to" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "" @@ -7401,6 +7539,13 @@ msgid_plural "rated %(title)s: %(display_ratin msgstr[0] "" msgstr[1] "" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" +msgstr[1] "" + #: 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" @@ -7613,35 +7758,35 @@ msgstr "" msgid "Show rating" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "" @@ -7700,16 +7845,22 @@ msgstr "" msgid "started reading %(book)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -7988,15 +8139,23 @@ msgid_plural "%(num)d books - by %(user)s" msgstr[0] "" msgstr[1] "" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/ca_ES/LC_MESSAGES/django.po b/locale/ca_ES/LC_MESSAGES/django.po index f0af60c158..77b52620c0 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: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-06 18:48\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:13\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Catalan\n" "Language: ca\n" @@ -107,7 +107,7 @@ msgstr "Títol del llibre" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "Valoració" @@ -175,39 +175,43 @@ msgstr "Eliminació pel moderador" msgid "Domain block" msgstr "Bloqueig de domini" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "Audiollibre" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "Llibre electrònic" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "Novel·la gràfica" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "Tapa dura" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "Edició de butxaca" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "%(value)s no semblen ISBN" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "%(value)s no té l'ISBN checksum correcte, hauria de ser %(check_version)s" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,19 +465,19 @@ msgstr "Comentari de %(display_name)s sobre %(book_title)s" msgid "%(display_name)s's quote from %(book_title)s" msgstr "Cita de %(display_name)s sobre %(book_title)s" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "Ressenya de %(display_name)s sobre %(book_title)s" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" msgstr[0] "" msgstr[1] "%(display_name)s ha valorat %(book_title)s: %(display_rating). 1f estrelles" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "Ressenya" @@ -489,19 +493,19 @@ msgstr "Citacions" msgid "Everything else" msgstr "Tota la resta" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "Línia de temps Inici" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "Inici" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "Cronologia dels llibres" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -510,91 +514,91 @@ msgstr "Cronologia dels llibres" msgid "Books" msgstr "Llibres" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "English (Anglès)" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "Català" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "Deutsch (Alemany)" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "Esperanto (Esperanto)" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "Español (espanyol)" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "Euskera (Basc)" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "Galego (gallec)" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "Italiano (italià)" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "한국어 (Coreà)" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "Suomi (finès)" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "Français (francès)" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (Lituà)" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "Països Baixos (Holandès)" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "Norsk (noruec)" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "Polski (polonès)" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (portuguès del Brasil)" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Portuguès europeu)" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "Română (romanès)" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "Svenska (suec)" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "Українська (Ucraïnès)" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (xinès simplificat)" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (xinès tradicional)" @@ -839,7 +843,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -910,57 +914,62 @@ msgstr "Data de naixement:" msgid "Died:" msgstr "Data de defunció:" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "Sèrie:" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "Enllaços externs" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "Vikipèdia" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "Mira-ho a la Wikidata" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "Pàgina web" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "Veure el registre ISNI" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "Veure a ISFDB" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "Carregueu dades" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "Veure a OpenLibrary" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "Veure a Inventaire" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "Veure a LibraryThing" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "Veure a Goodreads" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "Llibres de %(name)s" @@ -997,8 +1006,8 @@ msgid "Name:" msgstr "Nom:" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "Separeu diversos valors amb comes." @@ -1035,7 +1044,8 @@ msgid "Openlibrary key:" msgstr "Clau d'OpenLibrary:" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "ID a l'Inventaire:" @@ -1044,7 +1054,7 @@ msgid "Librarything key:" msgstr "Clau de Librarything:" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "Identificador a Goodreads:" @@ -1057,8 +1067,8 @@ msgid "ISNI:" msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1070,7 +1080,7 @@ msgstr "ISNI:" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1082,10 +1092,10 @@ msgstr "Desa" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1095,7 +1105,7 @@ msgstr "Desa" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1112,7 +1122,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "La càrrega de les dades es connectarà a %(source_name)s i comprovarà si hi ha metadades sobre aquest autor que no estan aquí. Les metadades existents no seran sobreescrites." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1129,97 +1140,116 @@ msgstr "Confirmeu" msgid "Unable to connect to remote source." msgstr "No ha estat possible connectar a la font externa." -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "Edita el llibre" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "Fes clic per afegir una coberta" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "No sh'a pogut carregar la coberta" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "Feu clic per ampliar" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "Mira-ho a Finna" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "(%(review_count)s ressenya)" msgstr[1] "(%(review_count)s ressenyes)" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "Afegiu una descripció" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "Descripció:" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" msgstr[0] "%(count)s edició" msgstr[1] "%(count)s edicions" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "Has deixat aquesta edició a:" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "Una edició diferent d'aquest llibre és al teu %(shelf_name)s prestatge." -#: bookwyrm/templates/book/book.html:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "Les vostres lectures" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "Afegiu dates de lectura" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "No tens cap activitat de lectura per aquest llibre." -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "Les vostres ressenyes" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "El vostres comentaris" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "Les teves cites" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "Temes" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "Llocs" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1234,15 +1264,15 @@ msgstr "Llocs" msgid "Lists" msgstr "Llistes" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "Afegiu a la llista" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1265,25 +1295,26 @@ msgid "Copied ISBN!" msgstr "ISBN copiat!" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "Nombre OCLC:" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "ASIN:" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "ASIN d'audiollibre:" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "Identificador ISFDB:" @@ -1294,12 +1325,12 @@ msgid "Goodreads:" msgstr "Goodreads:" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "Finna ID:" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1308,12 +1339,12 @@ msgid "Add cover" msgstr "Afegiu una coberta" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "Carregueu una coberta:" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "Carregueu una coberta des d'un enllaç:" @@ -1378,15 +1409,32 @@ msgstr "Es tracta d'un nou autor" msgid "Creating a new author: %(name)s" msgstr "Creando un autor nuevo: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "Es tracta d'una edició d'una obra ja existent?" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "Es tracta d'una publicació nova" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1448,124 +1496,190 @@ msgstr "Ordena per títol:" msgid "Subtitle:" msgstr "Subtítol:" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "Sèrie:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "Nombre de la sèrie:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "Idiomes:" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "Temes:" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "Afegiu un tema" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "Elimineu un tema" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "Afegiu un altre tema" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "Posició:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "Publicació" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "Editorial:" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "Data de publicació per primera vegada:" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "Data de publicació:" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "Autoria" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "Elimineu %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "Pàgina de l'autor de %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "Afegiu autoria:" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "Afegiu autoria" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "Jane Doe" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "Afegiu un altre autor" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "Coberta" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "Propietats físiques" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "Format:" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "Detalls del format:" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "Pàgines:" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "Identificadors del llibre" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "ISBN 13:" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "ISBN 10:" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "ID OpenLibrary:" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "Nom" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1752,19 +1866,11 @@ msgstr "Publicat el %(date)s" msgid "rated it" msgstr "el va valorar amb" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "Sèries per" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "Llibre %(series_number)s" -#: bookwyrm/templates/book/series.html:28 -msgid "Unsorted Book" -msgstr "Llibre sense classificar" - #: 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." @@ -1809,7 +1915,7 @@ msgstr "Codi de confirmació:" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "Envieu" @@ -1870,7 +1976,7 @@ msgstr "Podeu dir que no en qualsevol moment al vostre perf #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1964,21 +2070,22 @@ msgid "%(username)s started reading %(username)s ha començat a llegir %(book_title)s" #: bookwyrm/templates/discover/card-header.html:23 +#: bookwyrm/templates/discover/card-header.html:32 #, python-format msgid "%(username)s rated %(book_title)s" msgstr "%(username)s ha valorat %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "%(username)s ha comentat %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "%(username)s ha comentat sobre %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "%(username)s ha citat %(book_title)s" @@ -2164,14 +2271,14 @@ msgstr "No hi ha cap tipus d'activitat de moment. Proveu de seguir usuaris per a msgid "Alternatively, you can try enabling more status types" msgstr "Alternativament, pots intentar habilitar més tipus d'estat" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: bookwyrm/templates/feed/layout.html:14 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" msgstr "Objectiu de lectura del %(year)s" -#: bookwyrm/templates/feed/goal_card.html:18 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "Pots establir o canviar el teu objectiu de lectura en qualsevol moment des de la teva pàgina de perfil" @@ -2459,6 +2566,10 @@ msgstr "Aquest grup no té llistes" msgid "Edit group" msgstr "Edita el grup" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "Cerca per afegir un usuari" @@ -3697,6 +3808,7 @@ msgid "Search for a book, author, user, or list" msgstr "Cerca un llibre, un usuari o una llista" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "Escanejeu codi de barres" @@ -4309,7 +4421,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:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "Avís de contingut" @@ -4776,7 +4888,7 @@ msgstr "Exporta la llista de llibres" 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 "El vostre fitxer d'exportació CSV inclourà tots els llibres dels vostres prestatges, els llibres que hàgiu revisat i els llibres amb activitat de lectura.
      Feu servir això per importar a un servei com Goodreads." -#: bookwyrm/templates/preferences/export.html:20 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "Baixa el fitxer" @@ -4969,10 +5081,9 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "Esteu eliminant aquest diari de lectures i les seves %(count)s actualitzacions de progrés associades." #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" -msgstr "Actualitza dates de lectura per a \"%(title)s\"" +msgid "Update read dates for \"%(title)s\"" +msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 #: bookwyrm/templates/readthrough/readthrough_modal.html:38 @@ -5026,6 +5137,11 @@ msgstr "Edita dates de lectura" msgid "Delete these read dates" msgstr "Elimina aquestes dates de lectura" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "Actualitza dates de lectura per a \"%(title)s\"" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5036,41 +5152,33 @@ msgstr "Afegeix dates de lectura per a \"%(title)s\"" msgid "Report" msgstr "Notifica" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "\n" -" Scan Barcode\n" -" " - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "Sol·licitant permisos per a la càmera..." -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "Dona permisos d'accés a la càmera per escanejar el codi de barres d'aquest llibre." -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "No s'ha pogut accedir a la càmera" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "S'està escanejant..." -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "Alinea el codi de barres del teu llibre amb la càmera." -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "S'ha escanejat l'ISBN" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "Cercant el llibre:" @@ -5171,13 +5279,13 @@ msgstr "Fals" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 msgid "Start date:" msgstr "Data d'inici:" #: bookwyrm/templates/settings/announcements/announcement.html:62 #: bookwyrm/templates/settings/announcements/edit_announcement.html:89 -#: bookwyrm/templates/settings/dashboard/dashboard.html:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "Data final:" @@ -5551,7 +5659,7 @@ msgid "Dashboard" msgstr "Panell de control" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "Total d'usuàries" @@ -5565,31 +5673,31 @@ msgstr "Actives aquest mes" msgid "Works" msgstr "Treballs" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "Activitat de la instància" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "Interval:" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "Dies" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "Setmanes" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "Activitat de registre d'usuàries" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "Activitat de l'estat" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "Treballs creats" @@ -5901,13 +6009,49 @@ msgid "Unable to save settings" msgstr "No s'ha pogut desar la configuració" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6618,10 +6762,6 @@ msgstr "Tasques programades" msgid "Tasks" msgstr "Tasques" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "Nom" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "Tasques Celery" @@ -7281,10 +7421,6 @@ msgstr "Cita:" msgid "An excerpt from '%(book_title)s'" msgstr "Un extracte de '%(book_title)s'" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "Posició:" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "A la pàgina:" @@ -7297,12 +7433,12 @@ msgstr "Al per cent:" msgid "to" msgstr "a" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "La teva ressenya de '%(book_title)s'" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "Ressenya:" @@ -7403,6 +7539,13 @@ msgid_plural "rated %(title)s: %(display_ratin msgstr[0] "ha valorat %(title)s: %(display_rating)s estrella" msgstr[1] "ha valorat %(title)s: %(display_rating)s estrelles" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" +msgstr[1] "" + #: 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" @@ -7615,35 +7758,35 @@ msgstr "Acaba de llegir" msgid "Show rating" msgstr "Mostra la valoració" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "Mostra l'estat" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "(Pàgina %(page)s" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "%(endpage)s" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "(%(percent)s%%" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr " - %(endpercent)s%%" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "Obre imatge en una finestra nova" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "Amaga l'estat" @@ -7702,16 +7845,22 @@ msgstr "ha començat a llegir %(book)s de %(book)s" msgstr "ha començat a llegir %(book)s" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "ha escrit una ressenya de %(book)s de %(author_name)s" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "ha escrit una ressenya de %(book)s" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -7990,15 +8139,23 @@ 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:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "compte d'usuari nou" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/cdo/LC_MESSAGES/django.po b/locale/cdo/LC_MESSAGES/django.po index d2f439f458..eaae87729a 100644 --- a/locale/cdo/LC_MESSAGES/django.po +++ b/locale/cdo/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-06 18:49\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:14\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Eastern Min\n" "Language: cdo\n" @@ -107,7 +107,7 @@ msgstr "書名" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "分數" @@ -175,39 +175,43 @@ msgstr "審覈員除去" msgid "Domain block" msgstr "" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "有聲書" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "電子書" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "視覺文學" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "精裝" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "平裝" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,19 +465,19 @@ msgstr "" msgid "%(display_name)s's quote from %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" msgstr[0] "" msgstr[1] "" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "書評" @@ -489,19 +493,19 @@ msgstr "" msgid "Everything else" msgstr "" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "頭頁時間線" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "頭頁" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "書其時間線" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -510,91 +514,91 @@ msgstr "書其時間線" msgid "Books" msgstr "書" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "English (英語)" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "Deutsch (德語)" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "Español (西語)" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "Galego (加利西亞話)" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "Français (法語)" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (立陶宛話)" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (官話)" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (官話)" @@ -839,7 +843,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -910,57 +914,62 @@ msgstr "出世:" msgid "Died:" msgstr "過後:" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "系列:" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "維基百科" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "去OpenLibrary看" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "去Inventaire看" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "去LibraryThing看" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "去Goodreads看" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "%(name)s 寫其書" @@ -997,8 +1006,8 @@ msgid "Name:" msgstr "名字:" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "請使半形逗號 (,) 隔開這幾芘值." @@ -1035,7 +1044,8 @@ msgid "Openlibrary key:" msgstr "Openlibrary 密匙:" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "Inventaire ID:" @@ -1044,7 +1054,7 @@ msgid "Librarything key:" msgstr "Librarything 密匙:" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "Goodreads 密匙:" @@ -1057,8 +1067,8 @@ msgid "ISNI:" msgstr "" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1070,7 +1080,7 @@ msgstr "" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1082,10 +1092,10 @@ msgstr "存下" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1095,7 +1105,7 @@ msgstr "存下" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1112,7 +1122,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "" #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1129,97 +1140,116 @@ msgstr "確認" msgid "Unable to connect to remote source." msgstr "" -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "修改者書" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "書皮做儥出" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "(%(review_count)s 條書評)" msgstr[1] "(%(review_count)s 條評價)" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "加添介紹" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "介紹:" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" msgstr[0] "" msgstr[1] "" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, 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:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "這幫讀其書" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "加添讀書時間" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "汝故未讀這本書." -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "汝寫其書評" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "汝做其評論" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "汝抄下其話" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "主題" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "所在" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1234,15 +1264,15 @@ msgstr "所在" msgid "Lists" msgstr "單單" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "添遘單單裏勢" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1265,25 +1295,26 @@ msgid "Copied ISBN!" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "OCLC 號:" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "ASIN:" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "" @@ -1294,12 +1325,12 @@ msgid "Goodreads:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1308,12 +1339,12 @@ msgid "Add cover" msgstr "加添書皮" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "乞蜀芘書皮:" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "" @@ -1378,15 +1409,32 @@ msgstr "嚽是蜀隻新其作者" msgid "Creating a new author: %(name)s" msgstr "着𡅏乞新其作者開網頁: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "嚽是伓是本站已經有其書其另蜀芘版本?" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "嚽是新其作品" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1448,124 +1496,190 @@ msgstr "" msgid "Subtitle:" msgstr "副題:" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "系列:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "系列編號:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "語言:" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "位址:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "出版" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "出版者:" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "頭版其時間:" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "出版其時間:" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "作者" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "除去 %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "%(name)s 其作者頁" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "加添作者:" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "書皮" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "實體性質" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "格式:" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "裝訂情況:" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "頁數:" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "ISBN 13:" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "ISBN 10:" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "Openlibrary ID:" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1752,19 +1866,11 @@ msgstr "着 %(date)s 出版" msgid "rated it" msgstr "拍了分數" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "" -#: 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." @@ -1809,7 +1915,7 @@ msgstr "確認碼:" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "交付" @@ -1870,7 +1976,7 @@ msgstr "汝乜乇前後都會使由汝其 資料設定 #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1964,21 +2070,22 @@ msgid "%(username)s started reading %(username)s 開始讀 %(book_title)s" #: bookwyrm/templates/discover/card-header.html:23 +#: bookwyrm/templates/discover/card-header.html:32 #, python-format msgid "%(username)s rated %(book_title)s" msgstr "%(username)s%(book_title)s 拍了分數" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "%(username)s 寫了 %(book_title)s 其書評" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "%(username)s 評了幾句 %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "%(username)s 抄下 %(book_title)s 裏勢其文字" @@ -2164,14 +2271,14 @@ msgstr "現刻世乇活動都無! 試蜀試先關注蜀隻儂" msgid "Alternatively, you can try enabling more status types" msgstr "" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: 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 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "汝乜乇前後都會使着汝自家其 資料頁 裏勢定下或者改蜀下汝其讀書目標" @@ -2459,6 +2566,10 @@ msgstr "這芘群裏勢故無單單" msgid "Edit group" msgstr "修改群" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "討儂加裏" @@ -3697,6 +3808,7 @@ msgid "Search for a book, author, user, or list" msgstr "" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "" @@ -4309,7 +4421,7 @@ msgstr[0] "" msgstr[1] "" #: bookwyrm/templates/notifications/items/status_preview.html:4 -#: bookwyrm/templates/snippets/status/content_status.html:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "" @@ -4776,7 +4888,7 @@ msgstr "" 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 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "" @@ -4969,9 +5081,8 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "" #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" +msgid "Update read dates for \"%(title)s\"" msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 @@ -5026,6 +5137,11 @@ msgstr "修改讀書時間" msgid "Delete these read dates" msgstr "除去這価讀書時間其紀錄" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5036,39 +5152,33 @@ msgstr "" msgid "Report" msgstr "舉報" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "" - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "" @@ -5169,13 +5279,13 @@ msgstr "否" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 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:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "結束其日子:" @@ -5549,7 +5659,7 @@ msgid "Dashboard" msgstr "" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "所有其儂" @@ -5563,31 +5673,31 @@ msgstr "這蜀月日有使其" msgid "Works" msgstr "作品" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "實例活動" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "區段:" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "日" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "禮拜" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "各儂其註冊活動" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "" @@ -5899,13 +6009,49 @@ msgid "Unable to save settings" msgstr "" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6616,10 +6762,6 @@ msgstr "" msgid "Tasks" msgstr "" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "" @@ -7279,10 +7421,6 @@ msgstr "抄錄:" 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 "頁碼:" @@ -7295,12 +7433,12 @@ msgstr "百分比:" msgid "to" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "汝乞 '%(book_title)s' 寫其書評" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "書評:" @@ -7401,6 +7539,13 @@ msgid_plural "rated %(title)s: %(display_ratin msgstr[0] "乞 %(title)s 拍了分數: %(display_rating)s 粒星" msgstr[1] "乞 %(title)s 拍了分數: %(display_rating)s 粒星" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" +msgstr[1] "" + #: 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" @@ -7613,35 +7758,35 @@ msgstr "讀完了" msgid "Show rating" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "" @@ -7700,16 +7845,22 @@ msgstr "" msgid "started reading %(book)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -7988,15 +8139,23 @@ msgid_plural "%(num)d books - by %(user)s" msgstr[0] "" msgstr[1] "" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/cs_CZ/LC_MESSAGES/django.po b/locale/cs_CZ/LC_MESSAGES/django.po index a0b2b7b837..3f6bf10094 100644 --- a/locale/cs_CZ/LC_MESSAGES/django.po +++ b/locale/cs_CZ/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-06 18:48\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:13\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Czech\n" "Language: cs\n" @@ -107,7 +107,7 @@ msgstr "Název knihy" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "Hodnocení" @@ -175,39 +175,43 @@ msgstr "Odstraněn moderátorem" msgid "Domain block" msgstr "Blokování domény" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "Audiokniha" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "Ekniha" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "Grafický román" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "Pevná vazba" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "Měkká vazba" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "%(value)s nevypadá jako ISBN" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "%(value)s nemá správný kontrolní součet ISBN, očekávali jsme %(check_version)s" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,12 +465,12 @@ msgstr "Komentář %(display_name)s k %(book_title)s" msgid "%(display_name)s's quote from %(book_title)s" msgstr "Citát %(display_name)s z %(book_title)s" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "%(display_name)s' hodnocení knihy %(book_title)s" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" @@ -475,7 +479,7 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "Hodnocení" @@ -491,19 +495,19 @@ msgstr "Citace" msgid "Everything else" msgstr "Vše ostatní" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "Domovská časová osa" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "Domov" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "Zeď knih" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -512,91 +516,91 @@ msgstr "Zeď knih" msgid "Books" msgstr "Knihy" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "Anglicky" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "Català (katalánština)" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "Deutsch (němčina)" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "Esperanto (Esperanto)" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "Español (španělština)" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "Euskara (Basque)" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "Galego (galicijština)" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "Italiano (italština)" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "한국어 (Korejština)" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "Suomi (finština)" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "Français (francouzština)" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (litevština)" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "Nederlands (Nizozemština)" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "Norsk (norština)" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "Polski (polština)" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (portugalština (Brazílie))" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (portugalština (Evropa))" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "Română (rumunština)" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "Svenska (švédština)" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "Українська (Ukrajinština)" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (zjednodušená čínština)" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (tradiční čínština)" @@ -845,7 +849,7 @@ msgstr "Nejkratší četbou v tomto roce…" #: 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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -920,57 +924,62 @@ msgstr "Narozený/á:" msgid "Died:" msgstr "Zemřel/a:" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "Série:" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "Externí odkazy" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "Wikipedie" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "Zobrazit na Wikidatech" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "Webová stránka" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "Zobrazit ISNI záznam" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "Prohlédnout na ISFDB" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "Načíst data" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "Zobrazit na OpenLibrary" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "Zobrazit na Inventaire" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "Zobrazit na LibraryThing" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "Zobrazit na Goodreads" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "Knihy od %(name)s" @@ -1007,8 +1016,8 @@ msgid "Name:" msgstr "Jméno:" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "Oddělte více hodnot čárkami." @@ -1045,7 +1054,8 @@ msgid "Openlibrary key:" msgstr "Openlibrary klíč:" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "Inventaire ID:" @@ -1054,7 +1064,7 @@ msgid "Librarything key:" msgstr "Librarything klíč:" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "Klíč Goodreads:" @@ -1067,8 +1077,8 @@ msgid "ISNI:" msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1080,7 +1090,7 @@ msgstr "ISNI:" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1092,10 +1102,10 @@ msgstr "Uložit" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1105,7 +1115,7 @@ msgstr "Uložit" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1122,7 +1132,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "Načítání dat se připojí k %(source_name)s a zkontrolujte metadata o tomto autorovi, která zde nejsou přítomna. Stávající metadata nebudou přepsána." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1139,31 +1150,50 @@ msgstr "Potvrdit" msgid "Unable to connect to remote source." msgstr "Nelze se připojit ke vzdálenému zdroji." -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "Upravit knihu" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "Klepnutím přidáte obal" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "Nezdařilo se obálku načíst" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "Kliknutím zvětšíte" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" @@ -1172,17 +1202,17 @@ msgstr[1] "(%(review_count)s hodnocení)" msgstr[2] "(%(review_count)s hodnocení)" msgstr[3] "(%(review_count)s hodnocení)" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "Přidat popis" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "Popis:" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" @@ -1191,49 +1221,49 @@ msgstr[1] "%(count)s vydání" msgstr[2] "%(count)s vydání" msgstr[3] "%(count)s vydání" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "Toto vydání bylo odloženo v:" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "Jiné vydání této knihy je na vaší poličce %(shelf_name)s." -#: bookwyrm/templates/book/book.html:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "Vaše aktivita čtení" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "Přidat datum přečtení" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "Tuto knihu jste ještě nečetly." -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "Tvoje hodnocení" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "Vaše komentáře" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "Vaše citace" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "Témata" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "Místa" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1248,15 +1278,15 @@ msgstr "Místa" msgid "Lists" msgstr "Seznamy" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "Přidat na seznam" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1279,25 +1309,26 @@ msgid "Copied ISBN!" msgstr "ISBN zkopírováno!" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "OCLC číslo:" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "ASIN:" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "Audible ASIN:" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "ISFDB ID:" @@ -1308,12 +1339,12 @@ msgid "Goodreads:" msgstr "Goodreads:" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "Finna ID:" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1322,12 +1353,12 @@ msgid "Add cover" msgstr "Přidat obálku" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "Nahrát obálku:" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "Nahrát obal z URL:" @@ -1392,15 +1423,32 @@ msgstr "Tohle je nový autor" msgid "Creating a new author: %(name)s" msgstr "Vytvoření nového autora: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "Je to edice již existující práce?" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "Toto je nová práce" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1462,124 +1510,190 @@ msgstr "" msgid "Subtitle:" msgstr "Podtitulek:" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "Série:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "Číslo série:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "Jazyky:" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "Témata:" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "Přidat téma" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "Odebrat téma" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "Přidat další téma" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "Datum publikace" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "Vydavatel:" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "Prvně vydáno:" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "Datum vydání:" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "Autoři" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "Odstranit %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "Stránka autora %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "Přidat autory:" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "Přidat autora" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "Jane Doe" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "Přidat dalšího autora" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "Obálka" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "Fyzické vlastnosti" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "Formát:" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "Podrobnosti o formátu:" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "Stránek:" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "Identifikátory knih" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "ISBN 13:" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "ISBN 10:" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "Openlibrary ID:" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1766,19 +1880,11 @@ msgstr "Vydáno %(date)s" msgid "rated it" msgstr "ohodnotil" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "Série od" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "Kniha %(series_number)s" -#: bookwyrm/templates/book/series.html:28 -msgid "Unsorted Book" -msgstr "Nevytříděná kniha" - #: 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." @@ -1823,7 +1929,7 @@ msgstr "Potvrzovací kód:" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "Odeslat" @@ -1884,7 +1990,7 @@ msgstr "Můžete se kdykoliv odhlásit v nastavení profilu #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1982,21 +2088,22 @@ msgid "%(username)s started reading %(username)s začal číst %(book_title)s" #: bookwyrm/templates/discover/card-header.html:23 +#: bookwyrm/templates/discover/card-header.html:32 #, python-format msgid "%(username)s rated %(book_title)s" msgstr "%(username)s ohodnotil %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "%(username)s hodnotil*a %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "%(username)s okomentoval %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "%(username)s citoval %(book_title)s" @@ -2182,14 +2289,14 @@ msgstr "Momentálně tu nejsou žádné aktivity! Pro začátek zkuste sledovat msgid "Alternatively, you can try enabling more status types" msgstr "Případně můžete zkusit povolit více typů stavů" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: bookwyrm/templates/feed/layout.html:14 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" msgstr "%(year)s cíl pro čtení" -#: bookwyrm/templates/feed/goal_card.html:18 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "Cíl čtení můžete nastavit nebo změnit kdykoliv na vaší profilové stránce" @@ -2477,6 +2584,10 @@ msgstr "Tato skupina nemá žádné seznamy" msgid "Edit group" msgstr "Upravit skupinu" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "Vyhledat uživatele pro přidání" @@ -3725,6 +3836,7 @@ msgid "Search for a book, author, user, or list" msgstr "Hledat knihu, autora, uživatele nebo seznam" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "Skenovat čarový kód" @@ -4347,7 +4459,7 @@ msgstr[2] "" msgstr[3] "" #: bookwyrm/templates/notifications/items/status_preview.html:4 -#: bookwyrm/templates/snippets/status/content_status.html:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "Varování o obsahu" @@ -4816,7 +4928,7 @@ msgstr "" 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 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "" @@ -5009,9 +5121,8 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "" #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" +msgid "Update read dates for \"%(title)s\"" msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 @@ -5066,6 +5177,11 @@ msgstr "" msgid "Delete these read dates" msgstr "" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5076,41 +5192,33 @@ msgstr "" msgid "Report" msgstr "Nahlásit" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "\n" -" Skenovat čárový kód\n" -" " - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "Pořaduji přístup ke kameře..." -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "Udělte přístup k fotoaparátu pro naskenování čárového kódu knihy." -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "Skenuji..." -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "Zarovnejte čárový kód své knihy s kamerou." -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "ISBN naskenováno" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "" @@ -5215,13 +5323,13 @@ msgstr "" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 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:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "" @@ -5595,7 +5703,7 @@ msgid "Dashboard" msgstr "" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "" @@ -5609,31 +5717,31 @@ msgstr "" msgid "Works" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "" @@ -5953,13 +6061,49 @@ msgid "Unable to save settings" msgstr "" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6670,10 +6814,6 @@ msgstr "" msgid "Tasks" msgstr "" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "" @@ -7337,10 +7477,6 @@ msgstr "" msgid "An excerpt from '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "" @@ -7353,12 +7489,12 @@ msgstr "" msgid "to" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "Tvoje hodnocení knihy '%(book_title)s'" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "Recenze:" @@ -7467,6 +7603,15 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + #: 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" @@ -7681,35 +7826,35 @@ msgstr "Přečteno" msgid "Show rating" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "" @@ -7768,16 +7913,22 @@ msgstr "" msgid "started reading %(book)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "hodnotil*a %(book)s od %(author_name)s" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "hodnotil*a %(book)s" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -8062,15 +8213,23 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/cy_GB/LC_MESSAGES/django.po b/locale/cy_GB/LC_MESSAGES/django.po index d66b9039d3..1956f4fbb6 100644 --- a/locale/cy_GB/LC_MESSAGES/django.po +++ b/locale/cy_GB/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-06 18:49\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:13\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Welsh\n" "Language: cy\n" @@ -107,7 +107,7 @@ msgstr "Teitl y Llyfr" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "Cyfraddiad" @@ -175,39 +175,43 @@ msgstr "Dileu cymedrolwr" msgid "Domain block" msgstr "Parth wedi ei rwystro" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "Llyfr sain" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "eLyfr" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "Nofel graffig" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "Clawr caled" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "Clawr meddal" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,12 +465,12 @@ msgstr "" msgid "%(display_name)s's quote from %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" @@ -477,7 +481,7 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "Adolygiadau" @@ -493,19 +497,19 @@ msgstr "Dyfyniadau" msgid "Everything else" msgstr "Popeth arall" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "Ffrwd gartref" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "Cartref" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "Ffrwd lyfrau" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -514,91 +518,91 @@ msgstr "Ffrwd lyfrau" msgid "Books" msgstr "Llyfrau" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "Saesneg" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "Deutsch (Almaeneg)" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "Español (Sbaeneg)" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "Galego (Galiseg)" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "Italiano (Eidaleg)" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "Suomoi (Finneg)" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "Français (Ffrangeg)" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (Lithwaneg)" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "Norsk (Norwyaidd)" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (Portiwgaleg Brasil)" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Portiwgaleg Ewropeaidd)" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "Română (Rwmaneg)" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "Svenska (Swedeg)" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (Tsieinëeg Syml)" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (Tsieinëeg Traddodiadol)" @@ -851,7 +855,7 @@ msgstr "Eu llyfr byrraf eleni…" #: 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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -930,57 +934,62 @@ msgstr "Ganwyd:" msgid "Died:" msgstr "Bu farw:" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "Cyfres:" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "Dolenni allanol" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "Wicipedia" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "Gwelwch y cofnod ISNI" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "Llwythwch y data" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "Gwelwch ar OpenLibrary" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "Gweld ar Inventaire" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "Gweld ar LibraryThing" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "Gweld ar Goodreads" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "Llyfrau gan %(name)s" @@ -1017,8 +1026,8 @@ msgid "Name:" msgstr "Enw:" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "Rhifau lluosol gwahanol gyda chomas." @@ -1055,7 +1064,8 @@ msgid "Openlibrary key:" msgstr "Allwedd Openlibrary:" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "ID Inventaire:" @@ -1064,7 +1074,7 @@ msgid "Librarything key:" msgstr "Allwedd Librarything:" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "Allwedd Goodreads:" @@ -1077,8 +1087,8 @@ msgid "ISNI:" msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1090,7 +1100,7 @@ msgstr "ISNI:" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1102,10 +1112,10 @@ msgstr "Cadw" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1115,7 +1125,7 @@ msgstr "Cadw" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1132,7 +1142,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "Cysylltir data a lwythir at %(source_name)s a bydd yn gwirio metadata eraill am yr awdur hwn. Ni fydd yn ysgrifennu dros fetadata presennol." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1149,31 +1160,50 @@ msgstr "Cadarnhau" msgid "Unable to connect to remote source." msgstr "Methu â chysylltu â'r rhwydwaith." -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "Golygu'r Llyfr" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "Cliciwch i ychwanegu clawr" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "Methwyd â llwytho clawr" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "Cliciwch i ehangu" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" @@ -1184,17 +1214,17 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "(adolygiadau %(review_count)s)" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "Ychwanegu disgrifiad" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "Disgrifiad:" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" @@ -1205,49 +1235,49 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "Argraffiadau %(count)s" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "Rydych wedi rhoi'r fersiwn yma ar silff:" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "Mae fersiwn wahanolo'r llyfr hwn ar eich %(shelf_name)ssilff." -#: bookwyrm/templates/book/book.html:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "Eich darllen" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "Ychwanegu dyddiadau darllen" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "Does gennych ddim cofnod darllen ar gyfer y llyfr hwn." -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "Eich adolygiadau" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "Eich sylwadau" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "Eich dyfyniadau" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "Pynciau" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "Lleoedd" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1262,15 +1292,15 @@ msgstr "Lleoedd" msgid "Lists" msgstr "Rhestrau" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "Ychwanegu i'r rhestr" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1293,25 +1323,26 @@ msgid "Copied ISBN!" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "Rhif OCLC:" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "ASIN:" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "" @@ -1322,12 +1353,12 @@ msgid "Goodreads:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1336,12 +1367,12 @@ msgid "Add cover" msgstr "Ychwanegu clawr" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "Lanlwythwch y clawr:" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "" @@ -1406,15 +1437,32 @@ msgstr "Awdur newydd yw hwn" msgid "Creating a new author: %(name)s" msgstr "Yn creu awdur newydd: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "Ai fersiwn o waith sy'n bodoli eisoes ydyw?" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "Llyfr newydd yw hwn" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1476,124 +1524,190 @@ msgstr "" msgid "Subtitle:" msgstr "Is-deitl:" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "Cyfres:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "Rhif y cyfres:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "Iaith:" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "Pynciau:" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "Ychwanegu pwnc" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "Tynnu pwnc" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "Ychwanegu Pwnc Arall" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "Cyhoeddiad" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "Cyhoeddwr:" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "Dyddiad y cyhoeddiad cyntaf:" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "Dyddiad Cyhoeddi:" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "Awduron" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "Tynnwch %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "Awdur tudalen %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "Ychwanegwch awduron:" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "Ychwanegwch awdur" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "Sian ap Sion" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "Ychwanegwch Awdur Arall" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "Clawr" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "Priodweddau" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "Fformat:" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "Fformatio'r manylion:" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "Tudalennau:" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "Manylion y Llyfr" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "ISBN 13:" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "ISBN 10:" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "Openlibrary ID:" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1780,19 +1894,11 @@ msgstr "Dyddiad Cyhoeddi: %(date)s" msgid "rated it" msgstr "graddio fe" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "" -#: 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." @@ -1837,7 +1943,7 @@ msgstr "Côd cadarnhau:" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "Cyflwyno" @@ -1898,7 +2004,7 @@ msgstr "Gallwch optio allan unrhyw bryd yn eich gosodiadau #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -2000,21 +2106,22 @@ msgid "%(username)s started reading %(username)s wedi dechrau darllen %(book_title)s" #: bookwyrm/templates/discover/card-header.html:23 +#: bookwyrm/templates/discover/card-header.html:32 #, python-format msgid "%(username)s rated %(book_title)s" msgstr "Mae %(username)s wedi gwerthuso%(book_title)s" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "Mae %(username)s wedi adolygu %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "Mae %(username)s wedi rhoi sylw ar %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "Mae %(username)s wedi dyfynnu %(book_title)s" @@ -2200,14 +2307,14 @@ msgstr "Does dim gweithgareddau! Dilynwch ddefnyddiwr i gychwyn arni" msgid "Alternatively, you can try enabling more status types" msgstr "Neu, ceisiwch wireddu rhagor o fathau o statws" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: bookwyrm/templates/feed/layout.html:14 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" msgstr "Amcan Darllen %(year)s" -#: bookwyrm/templates/feed/goal_card.html:18 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "Fe allwch osod neu newid eich amcan darllen unrhyw bryd o'ch tudalen proffil " @@ -2495,6 +2602,10 @@ msgstr "Does dim rhestrau â'r grŵp hwn" msgid "Edit group" msgstr "Golygu'r grŵp" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "Chwilio i ychwanegu defnyddiwr" @@ -3753,6 +3864,7 @@ msgid "Search for a book, author, user, or list" msgstr "" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "" @@ -4385,7 +4497,7 @@ msgstr[4] "" msgstr[5] "" #: bookwyrm/templates/notifications/items/status_preview.html:4 -#: bookwyrm/templates/snippets/status/content_status.html:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "" @@ -4856,7 +4968,7 @@ msgstr "" 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 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "" @@ -5049,9 +5161,8 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "" #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" +msgid "Update read dates for \"%(title)s\"" msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 @@ -5106,6 +5217,11 @@ msgstr "" msgid "Delete these read dates" msgstr "" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5116,39 +5232,33 @@ msgstr "" msgid "Report" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "" - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "" @@ -5257,13 +5367,13 @@ msgstr "" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 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:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "" @@ -5637,7 +5747,7 @@ msgid "Dashboard" msgstr "" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "" @@ -5651,31 +5761,31 @@ msgstr "" msgid "Works" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "" @@ -6003,13 +6113,49 @@ msgid "Unable to save settings" msgstr "" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6720,10 +6866,6 @@ msgstr "" msgid "Tasks" msgstr "" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "" @@ -7391,10 +7533,6 @@ msgstr "" msgid "An excerpt from '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "" @@ -7407,12 +7545,12 @@ msgstr "" msgid "to" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "" @@ -7529,6 +7667,17 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" +msgstr[5] "" + #: 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" @@ -7745,35 +7894,35 @@ msgstr "" msgid "Show rating" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "" @@ -7832,16 +7981,22 @@ msgstr "" msgid "started reading %(book)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -8132,15 +8287,23 @@ msgstr[3] "" msgstr[4] "" msgstr[5] "" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/da_DK/LC_MESSAGES/django.po b/locale/da_DK/LC_MESSAGES/django.po index 9ac477b878..17af7c44b2 100644 --- a/locale/da_DK/LC_MESSAGES/django.po +++ b/locale/da_DK/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-06 18:48\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:13\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Danish\n" "Language: da\n" @@ -107,7 +107,7 @@ msgstr "Bogtitel" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "Bedømmelse" @@ -175,39 +175,43 @@ msgstr "Slettet af moderator" msgid "Domain block" msgstr "Domæneblokering" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "Lydbog" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "e-bog" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "Grafisk roman" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "Hardcover" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "Paperback" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,19 +465,19 @@ msgstr "%(display_name)ss kommentar på %(book_title)s" msgid "%(display_name)s's quote from %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" msgstr[0] "" msgstr[1] "" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "Anmeldelser" @@ -489,19 +493,19 @@ msgstr "Citater" msgid "Everything else" msgstr "Alt det andet" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "Hjem-tidslinje" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "Hjem" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "Bøger-tidslinje" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -510,91 +514,91 @@ msgstr "Bøger-tidslinje" msgid "Books" msgstr "Bøger" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "Engelsk" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "Català (catalansk)" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "Deutsch (tysk)" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "Esperanto (Esperanto)" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "Español (spansk)" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "Euskara (Baskisk)" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "Galego (galicisk)" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "Italiano (italiensk)" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "Suomi (finsk)" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "Français (fransk)" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (litauisk)" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "Nederlands (hollandsk)" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "Norsk (norsk)" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "Polski (polsk)" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (brasiliansk portugisisk)" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (europæisk portugisisk)" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "Română (rumænsk)" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "Svenska (svensk)" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "Українська (ukrainsk)" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (forenklet kinesisk)" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (traditionelt kinesisk)" @@ -839,7 +843,7 @@ msgstr "Vedkommendes korteste læsning 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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -910,57 +914,62 @@ msgstr "Født:" msgid "Died:" msgstr "Død:" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "Serie:" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "Eksterne links" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "Wikipedia" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "Hjemmeside" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "Se ISNI-optegnelse" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "Se på ISFDB" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "Indlæs data" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "Se på OpenLibrary" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "Se på Inventaire" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "Se på LibraryThing" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "Se på Goodreads" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "Bøger af %(name)s" @@ -997,8 +1006,8 @@ msgid "Name:" msgstr "Navn:" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "Adskil flere værdier med kommaer." @@ -1035,7 +1044,8 @@ msgid "Openlibrary key:" msgstr "Openlibrary-nøgle:" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "Inventaire-ID:" @@ -1044,7 +1054,7 @@ msgid "Librarything key:" msgstr "Librarything-nøgle:" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "Goodreads-nøgle:" @@ -1057,8 +1067,8 @@ msgid "ISNI:" msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1070,7 +1080,7 @@ msgstr "ISNI:" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1082,10 +1092,10 @@ msgstr "Gem" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1095,7 +1105,7 @@ msgstr "Gem" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1112,7 +1122,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "Indlæsning af data vil forbinde til %(source_name)s og tjekke efter metadata om denne forfatter, som ikke er til stede her. Eksisterende metadata vil ikke blive overskrevet." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1129,97 +1140,116 @@ msgstr "Bekræft" msgid "Unable to connect to remote source." msgstr "Kan ikke forbinde til ekstern kilde." -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "Rediger bog" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "Klik for at tilføje omslag" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "Kunne ikke indlæse omslag" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "Klik for at forstørre" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "(%(review_count)s anmeldelse)" msgstr[1] "(%(review_count)s anmeldelser)" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "Tilføj beskrivelse" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "Beskrivelse:" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" msgstr[0] "%(count)s udgave" msgstr[1] "%(count)s udgaver" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "Du har tilføjet denne udgave til hylden:" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "En anden udgave af denne bog er på din %(shelf_name)s hylde." -#: bookwyrm/templates/book/book.html:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "Din læseaktivitet" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "Tilføj læste datoer" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "Du har ikke nogen læseaktivitet for denne bog." -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "Dine anmeldelser" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "Dine kommentarer" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "Dine citater" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "Emner" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "Steder" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1234,15 +1264,15 @@ msgstr "Steder" msgid "Lists" msgstr "Lister" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "Tilføj til liste" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1265,25 +1295,26 @@ msgid "Copied ISBN!" msgstr "ISBN kopieret!" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "OCLC nummer:" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "ASIN:" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "Audible ASIN:" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "ISFDB ID:" @@ -1294,12 +1325,12 @@ msgid "Goodreads:" msgstr "Goodreads:" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1308,12 +1339,12 @@ msgid "Add cover" msgstr "Tilføj omslag" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "Upload omslag:" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "Indlæs omslag fra URL:" @@ -1378,15 +1409,32 @@ msgstr "Dette er en ny forfatter" msgid "Creating a new author: %(name)s" msgstr "Opretter en ny forfatter: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "Er dette en udgave af et eksisterende værk?" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "Dette er et nyt værk" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1448,124 +1496,190 @@ msgstr "Sorteringstitel:" msgid "Subtitle:" msgstr "Undertitel:" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "Serie:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "Nummer i serie:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "Sprog:" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "Emner:" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "Tilføj emne" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "Fjern emne" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "Tilføj endnu et emne" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "Udgivelse" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "Forlag:" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "Dato for første udgivelse:" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "Udgivelsesdato:" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "Forfattere" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "Fjern %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "Forfatterside for %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "Tilføj forfattere:" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "Tilføj forfatter" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "Ukendt Navn" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "Tilføj en forfatter mere" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "Forside" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "Fysiske egenskaber" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "Format:" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "Formatdetaljer:" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "Sider:" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "Bogidentifikatorer" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "ISBN 13:" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "ISBN 10:" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "Openlibrary ID:" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1752,19 +1866,11 @@ msgstr "Udgivet %(date)s" msgid "rated it" msgstr "gav den" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "Bog %(series_number)s" -#: bookwyrm/templates/book/series.html:28 -msgid "Unsorted Book" -msgstr "Usorteret Bog" - #: 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." @@ -1809,7 +1915,7 @@ msgstr "Bekræftelseskode:" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "Send" @@ -1870,7 +1976,7 @@ msgstr "Du kan til enhver tid ændre mening i dine profilin #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1964,21 +2070,22 @@ msgid "%(username)s started reading %(username)s rated %(book_title)s" msgstr "%(username)s bedømte %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "" @@ -2164,14 +2271,14 @@ msgstr "Der er ingen aktiviteter lige nu! Prøv at følge en bruger for at komme msgid "Alternatively, you can try enabling more status types" msgstr "Du kan også prøve at aktivere flere statustyper" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: bookwyrm/templates/feed/layout.html:14 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" msgstr "Læsemål for %(year)s" -#: bookwyrm/templates/feed/goal_card.html:18 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "Du kan til enhver tid indstille eller ændre dit læsemål fra din profilside" @@ -2459,6 +2566,10 @@ msgstr "" msgid "Edit group" msgstr "" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "" @@ -3697,6 +3808,7 @@ msgid "Search for a book, author, user, or list" msgstr "" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "" @@ -4309,7 +4421,7 @@ msgstr[0] "" msgstr[1] "" #: bookwyrm/templates/notifications/items/status_preview.html:4 -#: bookwyrm/templates/snippets/status/content_status.html:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "" @@ -4776,7 +4888,7 @@ msgstr "" 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 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "" @@ -4969,9 +5081,8 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "" #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" +msgid "Update read dates for \"%(title)s\"" msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 @@ -5026,6 +5137,11 @@ msgstr "" msgid "Delete these read dates" msgstr "" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5036,39 +5152,33 @@ msgstr "" msgid "Report" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "" - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "" @@ -5169,13 +5279,13 @@ msgstr "" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 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:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "" @@ -5549,7 +5659,7 @@ msgid "Dashboard" msgstr "" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "" @@ -5563,31 +5673,31 @@ msgstr "" msgid "Works" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "" @@ -5899,13 +6009,49 @@ msgid "Unable to save settings" msgstr "" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6616,10 +6762,6 @@ msgstr "" msgid "Tasks" msgstr "" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "" @@ -7279,10 +7421,6 @@ msgstr "" msgid "An excerpt from '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "" @@ -7295,12 +7433,12 @@ msgstr "" msgid "to" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "" @@ -7401,6 +7539,13 @@ msgid_plural "rated %(title)s: %(display_ratin msgstr[0] "" msgstr[1] "" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" +msgstr[1] "" + #: 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" @@ -7613,35 +7758,35 @@ msgstr "" msgid "Show rating" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "" @@ -7700,16 +7845,22 @@ msgstr "" msgid "started reading %(book)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -7988,15 +8139,23 @@ msgid_plural "%(num)d books - by %(user)s" msgstr[0] "" msgstr[1] "" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/de_DE/LC_MESSAGES/django.po b/locale/de_DE/LC_MESSAGES/django.po index 3542aba444..7fa8c493fb 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: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-03-18 08:12\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:13\n" "Last-Translator: Mouse Reeve \n" "Language-Team: German\n" "Language: de\n" @@ -107,7 +107,7 @@ msgstr "Buchtitel" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "Bewertung" @@ -175,39 +175,43 @@ msgstr "Löschung durch Moderator*in" msgid "Domain block" msgstr "Domainsperrung" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "Hörbuch" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "E-Book" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "Graphic Novel" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "Hardcover" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "Taschenbuch" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "%(value)s sieht nicht wie eine ISBN aus" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "%(value)s hat keine korrekte ISBN-Prüfsumme, wir erwarteten %(check_version)s" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,19 +465,19 @@ msgstr "%(display_name)ss Kommentar zu %(book_title)s" msgid "%(display_name)s's quote from %(book_title)s" msgstr "%(display_name)ss Zitat aus %(book_title)s" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "%(display_name)ss Rezension zu %(book_title)s" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" msgstr[0] "%(display_name)s bewertete %(book_title)s: %(display_rating).1f Stern" msgstr[1] "%(display_name)s bewertete %(book_title)s: %(display_rating).1f Sterne" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "Rezensionen" @@ -489,19 +493,19 @@ msgstr "Zitate" msgid "Everything else" msgstr "Alles andere" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "Start-Zeitleiste" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "Startseite" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "Bücher-Timeline" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -510,91 +514,91 @@ msgstr "Bücher-Timeline" msgid "Books" msgstr "Bücher" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "English (Englisch)" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "Català (Katalanisch)" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "Deutsch" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "Esperanto (Esperanto)" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "Español (Spanisch)" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "Euskara (Baskisch)" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "Galego (Galizisch)" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "Italiano (Italienisch)" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "한국어 (Koreanisch)" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "Suomi (Finnisch)" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "Français (Französisch)" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (Litauisch)" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "Nederlands (Niederländisch)" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "Norsk (Norwegisch)" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "Polski (Polnisch)" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (brasilianisches Portugiesisch)" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Portugiesisch)" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "Română (Rumänisch)" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "Svenska (Schwedisch)" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "Українська (Ukrainisch)" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (vereinfachtes Chinesisch)" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (Chinesisch, traditionell)" @@ -839,7 +843,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -910,57 +914,62 @@ msgstr "Geboren:" msgid "Died:" msgstr "Gestorben:" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "Serie:" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "Externe Links" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "Wikipedia" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "Auf Wikidata ansehen" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "Webseite" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "ISNI-Datensatz anzeigen" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "Auf ISFDB ansehen" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "Lade Daten" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "Auf OpenLibrary ansehen" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "Auf Inventaire anzeigen" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "Auf LibraryThing anzeigen" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "Auf Goodreads ansehen" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "Bücher von %(name)s" @@ -997,8 +1006,8 @@ msgid "Name:" msgstr "Name:" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "Mehrere Werte durch Kommas getrennt eingeben." @@ -1035,7 +1044,8 @@ msgid "Openlibrary key:" msgstr "Openlibrary-Schlüssel:" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "Inventaire-ID:" @@ -1044,7 +1054,7 @@ msgid "Librarything key:" msgstr "Librarything-Schlüssel:" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "Goodreads-Schlüssel:" @@ -1057,8 +1067,8 @@ msgid "ISNI:" msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1070,7 +1080,7 @@ msgstr "ISNI:" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1082,10 +1092,10 @@ msgstr "Speichern" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1095,7 +1105,7 @@ msgstr "Speichern" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1112,7 +1122,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "Das Laden von Daten wird eine Verbindung zu %(source_name)s aufbauen und überprüfen, ob Autor*in-Informationen vorliegen, die hier noch nicht bekannt sind. Bestehende Informationen werden nicht überschrieben." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1129,97 +1140,116 @@ msgstr "Bestätigen" msgid "Unable to connect to remote source." msgstr "Verbindung zum Server konnte nicht hergestellt werden." -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "Buch bearbeiten" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "Cover durch Klicken hinzufügen" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "Fehler beim Laden des Titelbilds" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "Zum Vergrößern anklicken" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "Auf Finna ansehen" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "Auf Libris ansehen" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "(%(review_count)s Rezension)" msgstr[1] "(%(review_count)s Besprechungen)" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "Beschreibung hinzufügen" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "Beschreibung:" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" msgstr[0] "%(count)s Auflage" msgstr[1] "%(count)s Auflagen" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "Du hast diese Ausgabe im folgenden Regal:" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "Eine andere Ausgabe dieses Buches befindet sich in deinem %(shelf_name)s Regal." -#: bookwyrm/templates/book/book.html:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "Deine Leseaktivität" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "Lesedaten hinzufügen" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "Du hast keine Leseaktivität für dieses Buch." -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "Deine Rezensionen" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "Deine Kommentare" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "Deine Zitate" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "Themen" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "Orte" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1234,15 +1264,15 @@ msgstr "Orte" msgid "Lists" msgstr "Listen" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "Zur Liste hinzufügen" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "Neue Liste erstellen..." -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1265,25 +1295,26 @@ msgid "Copied ISBN!" msgstr "ISBN kopiert!" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "OCLC-Nummer:" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "ASIN:" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "Audible ASIN:" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "ISFDB ID:" @@ -1294,12 +1325,12 @@ msgid "Goodreads:" msgstr "Goodreads:" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "Finna ID:" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "Libris-ID:" @@ -1308,12 +1339,12 @@ msgid "Add cover" msgstr "Titelbild hinzufügen" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "Titelbild hochladen:" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "Titelbild via URL herunterladen:" @@ -1378,15 +1409,32 @@ msgstr "Neue*r Autor*in" msgid "Creating a new author: %(name)s" msgstr "Als neue*r Autor*in erstellen: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "Ist das eine Ausgabe eines vorhandenen Werkes?" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "Dies ist ein neues Werk." -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1448,124 +1496,190 @@ msgstr "Sortieren nach Titel:" msgid "Subtitle:" msgstr "Untertitel:" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "Serie:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "Nummer in der Serie:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "Sprachen:" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "Themen:" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "Thema hinzufügen" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "Thema entfernen" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "Weiteres Thema hinzufügen" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "Position:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "Veröffentlichung" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "Verlag:" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "Erstveröffentlichungsdatum:" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "Veröffentlichungsdatum:" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "Autor*innen" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "%(name)s entfernen" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "Autor*inseite für %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "Autor*innen hinzufügen:" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "Autor*in hinzufügen" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "Lisa Musterfrau" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "Weitere*n Autor*in hinzufügen" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "Cover" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "Physikalische Eigenschaften" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "Format:" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "Formatdetails:" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "Seiten:" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "Buch-Identifikatoren" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "ISBN 13:" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "ISBN 10:" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "OpenLibrary-ID:" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "Name" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1752,19 +1866,11 @@ msgstr "Erschienen am %(date)s" msgid "rated it" msgstr "bewertet es mit" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "Serie von" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "Buch %(series_number)s" -#: bookwyrm/templates/book/series.html:28 -msgid "Unsorted Book" -msgstr "Nicht einsortiertes Buch" - #: 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." @@ -1809,7 +1915,7 @@ msgstr "Bestätigungscode:" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "Absenden" @@ -1870,7 +1976,7 @@ msgstr "Du kannst dich jederzeit in deinen Profileinstellun #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1964,21 +2070,22 @@ msgid "%(username)s started reading %(username)s hat angefangen, %(book_title)s zu lesen" #: bookwyrm/templates/discover/card-header.html:23 +#: bookwyrm/templates/discover/card-header.html:32 #, python-format msgid "%(username)s rated %(book_title)s" msgstr "%(username)s hat %(book_title)s bewertet" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "%(username)s hat %(book_title)s besprochen" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "%(username)s hat %(book_title)s kommentiert" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "%(username)s hat %(book_title)s zitiert" @@ -2164,14 +2271,14 @@ msgstr "Hier sind noch keine Aktivitäten! Folge Anderen, um loszulegen" msgid "Alternatively, you can try enabling more status types" msgstr "Alternativ könntest du auch weitere Statustypen aktivieren" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: bookwyrm/templates/feed/layout.html:14 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" msgstr "Leseziel für %(year)s" -#: bookwyrm/templates/feed/goal_card.html:18 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "Du kannst dein Leseziel jederzeit auf deiner Profilseite festlegen oder ändern" @@ -2459,6 +2566,10 @@ msgstr "Diese Gruppe enthält keine Listen" msgid "Edit group" msgstr "Gruppe bearbeiten" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "Suche, um eine*n Benutzer*in hinzuzufügen" @@ -3697,6 +3808,7 @@ msgid "Search for a book, author, user, or list" msgstr "Nach einem Buch, Autor*in, Benutzer*in oder einer Liste suchen" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "Barcode scannen" @@ -4309,7 +4421,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:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "Inhaltswarnung" @@ -4776,7 +4888,7 @@ msgstr "Bücherliste exportieren" 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 "Die exportierte CSV-Datei wird alle Bücher aus deinen Regalen, die du rezensiert hast und die du gerade liest, enthalten.
      Nutze sie, um deine Daten in andere Services wie Goodreads zu importieren." -#: bookwyrm/templates/preferences/export.html:20 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "Datei herunterladen" @@ -4969,10 +5081,9 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "Du löscht diesen Leseforschritt und %(count)s zugehörige Zwischenstände." #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" -msgstr "Lesedaten für „%(title)s“ aktualisieren" +msgid "Update read dates for \"%(title)s\"" +msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 #: bookwyrm/templates/readthrough/readthrough_modal.html:38 @@ -5026,6 +5137,11 @@ msgstr "Lesedaten bearbeiten" msgid "Delete these read dates" msgstr "Diese Lesedaten löschen" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "Lesedaten für „%(title)s“ aktualisieren" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5036,41 +5152,33 @@ msgstr "Lesedaten für „%(title)s“ hinzufügen" msgid "Report" msgstr "Melden" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "\n" -" Barcode scannen\n" -" " - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "Kamera wird angefragt..." -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "Erlaube Zugriff auf die Kamera, um den Barcode eines Buches zu scannen." -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "Konnte nicht auf die Kamera zugreifen" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "Scannen..." -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "Richte den Barcode des Buches mit der Kamera aus." -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "ISBN gescannt" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "Nach Buch suchen:" @@ -5171,13 +5279,13 @@ msgstr "Nein" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 msgid "Start date:" msgstr "Startdatum:" #: bookwyrm/templates/settings/announcements/announcement.html:62 #: bookwyrm/templates/settings/announcements/edit_announcement.html:89 -#: bookwyrm/templates/settings/dashboard/dashboard.html:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "Enddatum:" @@ -5551,7 +5659,7 @@ msgid "Dashboard" msgstr "Übersicht" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "Benutzer*innen insgesamt" @@ -5565,31 +5673,31 @@ msgstr "Diesen Monat aktiv" msgid "Works" msgstr "Werke" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "Instanzaktivität" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "Intervall:" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "Tage" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "Wochen" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "Neuanmeldungen" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "Statusaktivitäten" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "Erstellte Werke" @@ -5901,13 +6009,49 @@ msgid "Unable to save settings" msgstr "Einstellungen konnten nicht gespeichert werden" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "Föderation deaktivieren" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "Verhindert, dass deine Instanz mit anderen föderierten Diensten interagiert. Bestehende Daten von anderen Instanzen werden weiterhin vorhanden sein." +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6618,10 +6762,6 @@ msgstr "Geplante Aufgaben" msgid "Tasks" msgstr "Aufgaben" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "Name" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "Celery Aufgabe" @@ -7281,10 +7421,6 @@ msgstr "Zitat:" msgid "An excerpt from '%(book_title)s'" msgstr "Ein Auszug aus „%(book_title)s“" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "Position:" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "Auf Seite:" @@ -7297,12 +7433,12 @@ msgstr "Bei Prozent:" msgid "to" msgstr "bis" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "Deine Rezension von '%(book_title)s'" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "Rezension:" @@ -7403,6 +7539,13 @@ msgid_plural "rated %(title)s: %(display_ratin msgstr[0] "hat %(title)s mit %(display_rating)s Stern bewertet" msgstr[1] "hat %(title)s mit %(display_rating)s Sternen bewertet" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" +msgstr[1] "" + #: 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" @@ -7615,35 +7758,35 @@ msgstr "Lesen abschließen" msgid "Show rating" msgstr "Bewertung anzeigen" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "Status anzeigen" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "(Seite %(page)s" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "%(endpage)s" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "(%(percent)s%%" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr " - %(endpercent)s%%" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "Bild in neuem Fenster öffnen" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "Status ausblenden" @@ -7702,16 +7845,22 @@ msgstr "hat angefangen, %(book)s von %(book)s" msgstr "hat angefangen, %(book)s zu lesen" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "hat %(book)s von %(author_name)s besprochen" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "hat %(book)s besprochen" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -7990,15 +8139,23 @@ 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:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "Ein neues Benutzerkonto" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/el_GR/LC_MESSAGES/django.po b/locale/el_GR/LC_MESSAGES/django.po index b57b4082cd..1ae201eef2 100644 --- a/locale/el_GR/LC_MESSAGES/django.po +++ b/locale/el_GR/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-06 18:48\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:13\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Greek\n" "Language: el\n" @@ -107,7 +107,7 @@ msgstr "Τίτλος Βιβλίου" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "Αξιολογήσεις" @@ -175,39 +175,43 @@ msgstr "Διαγραφή συντονιστή" msgid "Domain block" msgstr "Aποκλεισμός τομέα" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "Ηχογραφημένο βιβλίο" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "Ηλεκτρονικό βιβλίο" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "Γραφικό μυθιστόρημα" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "Σκληρό εξώφυλλο" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "Χαρτόδετο" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,19 +465,19 @@ msgstr "" msgid "%(display_name)s's quote from %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" msgstr[0] "" msgstr[1] "" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "Κριτικές" @@ -489,19 +493,19 @@ msgstr "" msgid "Everything else" msgstr "Οτιδήποτε άλλο" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "Αρχική σελίδα" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "Χρονολόγιο Βιβλίων" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -510,91 +514,91 @@ msgstr "Χρονολόγιο Βιβλίων" msgid "Books" msgstr "Βιβλία" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "Αγγλικά" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "Català (Καταλανικά)" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "Deutsch (Γερμανικά)" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "Español (Ισπανικά)" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "Italiano (Ιταλικά)" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "Suomi (Φινλανδικά)" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "Français (Γαλλικά)" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (Λιθουανικά)" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "Norsk (Νορβηγικά)" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "Polski (Πολωνικά)" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (Πορτογαλικά Βραζιλίας)" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Ευρωπαϊκά Πορτογαλικά)" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "Română (Ρουμανικά)" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "Svenska (Σουηδικά)" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (Απλοποιημένα Κινέζικα)" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (Παραδοσιακά Κινέζικα)" @@ -839,7 +843,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -910,57 +914,62 @@ msgstr "Γεννήθηκε:" msgid "Died:" msgstr "Πέθανε:" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "Σειρά:" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "Εξωτερικοί σύνδεσμοι" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "Βικιπαίδεια" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "Ιστοσελίδα" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "Προβολή αρχείου ISNI" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "Φόρτωση δεδομένων" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "Προβολή στο OpenLibrary" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "Προβολή στο Inventaire" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "Προβολή στο LibraryThing" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "Δείτε στο Goodreads" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "Βιβλία από %(name)s" @@ -997,8 +1006,8 @@ msgid "Name:" msgstr "Όνομα:" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "Διαχωρίστε τις πολλαπλές τιμές με κόμμα." @@ -1035,7 +1044,8 @@ msgid "Openlibrary key:" msgstr "Κλειδί Openlibrary:" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "Inventaire ID:" @@ -1044,7 +1054,7 @@ msgid "Librarything key:" msgstr "Κλειδί Librarything:" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "Κλειδί Goodreads:" @@ -1057,8 +1067,8 @@ msgid "ISNI:" msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1070,7 +1080,7 @@ msgstr "ISNI:" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1082,10 +1092,10 @@ msgstr "Αποθήκευση" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1095,7 +1105,7 @@ msgstr "Αποθήκευση" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1112,7 +1122,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "Loading data will connect to %(source_name)s and check for any metadata about this author which aren't present here. Υπάρχοντα μεταδεδομένα δεν θα overwritten." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1129,97 +1140,116 @@ msgstr "Επιβεβαίωση" msgid "Unable to connect to remote source." msgstr "Αδυναμία σύνδεσης με την απομακρυσμένη πηγή." -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "Επεξεργασία Βιβλίου" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "Κλικ για προσθήκη εξωφύλλου" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "Αποτυχία φόρτωσης εξωφύλλου" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "Κλικ για μεγέθυνση" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "(%(review_count)s αξιολόγηση)" msgstr[1] "(%(review_count)s αξιολογήσεις)" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "Προσθήκη Περιγραφής" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "Περιγραφή:" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" msgstr[0] "%(count)s έκδοση" msgstr[1] "%(count)s εκδόσεις" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "Έχετε κρατήσει αυτή την έκδοση στο:" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, 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:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "Η δραστηριότητα ανάγνωσής σας" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "Προσθήκη ημερομηνιών ανάγνωσης" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "Δεν έχετε καμία δραστηριότητα ανάγνωσης για αυτό το βιβλίο." -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "Οι κριτικές σας" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "Τα σχόλιά σας" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "Τα αποσπάσματά σας" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "Θέματα" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "Τοποθεσίες" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1234,15 +1264,15 @@ msgstr "Τοποθεσίες" msgid "Lists" msgstr "Λίστες" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "Προσθήκη σε λίστα" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1265,25 +1295,26 @@ msgid "Copied ISBN!" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "Αριθμός OCLC:" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "ASIN:" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "ISFDB ID:" @@ -1294,12 +1325,12 @@ msgid "Goodreads:" msgstr "Goodreads:" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1308,12 +1339,12 @@ msgid "Add cover" msgstr "Προσθέστε ένα εξώφυλλο" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "Ανέβασμα εξώφυλλου:" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "" @@ -1378,15 +1409,32 @@ msgstr "Αυτός είναι ένας νέος συγγραφέας" msgid "Creating a new author: %(name)s" msgstr "Δημιουργία ενός νέου συγγραφέα: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "Είναι μια έκδοση ενός υπάρχοντος έργου;" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "Αυτό είναι ένα νέο έργο" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1448,124 +1496,190 @@ msgstr "" msgid "Subtitle:" msgstr "Υπότιτλοι:" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "Σειρά:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "Αριθμός σειράς:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "Γλώσσες:" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "Θέματα:" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "Προσθήκη θέματος" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "Αφαίρεση θέματος" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "Προσθήκη Άλλου Θέματος" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "Έκδοση" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "Εκδότης:" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "Ημερομηνία πρώτης έκδοσης:" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "Ημερομηνία έκδοσης:" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "Συγγραφείς" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "Αφαίρεση %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "Σελίδα συγγραφέα %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "Προσθήκη Συγγραφέων:" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "Προσθήκη Συγγραφέα" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "Jane Doe" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "Προσθήκη Άλλου Συγγραφέα" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "Εξώφυλλο" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "Μορφή:" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "Λεπτομέρειες μορφής:" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "Σελίδες:" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "Αναγνωριστικά Βιβλίου" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "ISBN 13:" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "ISBN 10:" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "Κλειδί Openlibrary:" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1752,19 +1866,11 @@ msgstr "Δημοσιεύθηκε %(date)s" msgid "rated it" msgstr "βαθμολογήστε" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "Σειρά από" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, 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." @@ -1809,7 +1915,7 @@ msgstr "Κωδικός επιβεβαίωσης:" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "Υποβολή" @@ -1870,7 +1976,7 @@ msgstr "Μπορείτε να εξαιρεθείτε ανά πάσα στιγμ #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1964,21 +2070,22 @@ msgid "%(username)s started reading %(username)s άρχισε να διαβάζει το %(book_title)s" #: bookwyrm/templates/discover/card-header.html:23 +#: bookwyrm/templates/discover/card-header.html:32 #, python-format msgid "%(username)s rated %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "" @@ -2164,14 +2271,14 @@ msgstr "Δεν υπάρχουν δραστηριότητες αυτή τη στ msgid "Alternatively, you can try enabling more status types" msgstr "Εναλλακτικά, μπορείτε να δοκιμάσετε να ενεργοποιήσετε περισσότερους τύπους κατάστασης" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: 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 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "Μπορείτε να ορίσετε ή να αλλάξετε το στόχο ανάγνωσης οποιαδήποτε στιγμή από τη σελίδα του προφίλ σας " @@ -2459,6 +2566,10 @@ msgstr "Αυτή η ομάδα δεν έχει λίστες" msgid "Edit group" msgstr "Επεξεργασία ομάδας" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "Αναζήτηση για να προσθέσετε ένα χρήστη" @@ -3697,6 +3808,7 @@ msgid "Search for a book, author, user, or list" msgstr "" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "Σάρωση Barcode" @@ -4309,7 +4421,7 @@ msgstr[0] "" msgstr[1] "" #: bookwyrm/templates/notifications/items/status_preview.html:4 -#: bookwyrm/templates/snippets/status/content_status.html:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "Προειδοποίηση περιεχομένου" @@ -4776,7 +4888,7 @@ msgstr "" 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 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "Λήψη αρχείου" @@ -4969,10 +5081,9 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "Διαγράφετε αυτή την ανάγνωση και τις %(count)s σχετικές ενημερώσεις προόδου." #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" -msgstr "Ενημέρωση ημερομηνιών ανάγνωσης για \"%(title)s\"" +msgid "Update read dates for \"%(title)s\"" +msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 #: bookwyrm/templates/readthrough/readthrough_modal.html:38 @@ -5026,6 +5137,11 @@ msgstr "Επεξεργασία ημερομηνιών ανάγνωσης" msgid "Delete these read dates" msgstr "Διαγραφή αυτών των ημερομηνιών ανάγνωσης" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "Ενημέρωση ημερομηνιών ανάγνωσης για \"%(title)s\"" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5036,41 +5152,33 @@ msgstr "Προσθήκη ημερομηνιών ανάγνωσης για το \ msgid "Report" msgstr "Αναφορά" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "\n" -" Σάρωση Barcode\n" -" " - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "Αίτηση κάμερας..." -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "Παραχώρηση πρόσβασης στην κάμερα για σάρωση του barcode ενός βιβλίου." -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "Αδυναμία πρόσβασης στην κάμερα" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "Σάρωση..." -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "Σάρωση ISBN" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "Αναζήτηση βιβλίου:" @@ -5171,13 +5279,13 @@ msgstr "Ψευδές" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 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:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "Ημερομηνία λήξης:" @@ -5551,7 +5659,7 @@ msgid "Dashboard" msgstr "Πίνακας Ελέγχου" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "Σύνολο χρηστών" @@ -5565,31 +5673,31 @@ msgstr "Ενεργοί αυτόν το μήνα" msgid "Works" msgstr "Έργα" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "Ημέρες" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "Εβδομάδες" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "" @@ -5901,13 +6009,49 @@ msgid "Unable to save settings" msgstr "Δεν είναι δυνατή η αποθήκευση των ρυθμίσεων" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6618,10 +6762,6 @@ msgstr "" msgid "Tasks" msgstr "" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "" @@ -7281,10 +7421,6 @@ msgstr "" msgid "An excerpt from '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "Στη σελίδα:" @@ -7297,12 +7433,12 @@ msgstr "" msgid "to" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "" @@ -7403,6 +7539,13 @@ msgid_plural "rated %(title)s: %(display_ratin msgstr[0] "" msgstr[1] "" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" +msgstr[1] "" + #: 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" @@ -7615,35 +7758,35 @@ msgstr "" msgid "Show rating" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "" @@ -7702,16 +7845,22 @@ msgstr "" msgid "started reading %(book)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -7990,15 +8139,23 @@ msgid_plural "%(num)d books - by %(user)s" msgstr[0] "" msgstr[1] "" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/en_Oulipo/LC_MESSAGES/django.po b/locale/en_Oulipo/LC_MESSAGES/django.po index 03632b2010..3aad94825e 100644 --- a/locale/en_Oulipo/LC_MESSAGES/django.po +++ b/locale/en_Oulipo/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-06 18:49\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:14\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Oulipo\n" "Language: en_Oulipo\n" @@ -107,7 +107,7 @@ msgstr "" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "Rating" @@ -175,39 +175,43 @@ msgstr "Admin discard" msgid "Domain block" msgstr "Domain block" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "Audiobook" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "Digital Book" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "Graphic story" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "Hardback" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "Softback" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,19 +465,19 @@ msgstr "" msgid "%(display_name)s's quote from %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" msgstr[0] "" msgstr[1] "" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "Rundowns" @@ -489,19 +493,19 @@ msgstr "" msgid "Everything else" msgstr "" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "Community Posts" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "Community" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "Book Posts" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -510,91 +514,91 @@ msgstr "Book Posts" msgid "Books" msgstr "Books" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "" @@ -839,7 +843,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -910,57 +914,62 @@ msgstr "Born:" msgid "Died:" msgstr "" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "Compilation:" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "Books by %(name)s" @@ -997,8 +1006,8 @@ msgid "Name:" msgstr "" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "Split up with commas" @@ -1035,7 +1044,8 @@ msgid "Openlibrary key:" msgstr "" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "" @@ -1044,7 +1054,7 @@ msgid "Librarything key:" msgstr "" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "" @@ -1057,8 +1067,8 @@ msgid "ISNI:" msgstr "" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1070,7 +1080,7 @@ msgstr "" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1082,10 +1092,10 @@ msgstr "Confirm" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1095,7 +1105,7 @@ msgstr "Confirm" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1112,7 +1122,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "" #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1129,97 +1140,116 @@ msgstr "Confirm" msgid "Unable to connect to remote source." msgstr "" -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "Modify Book" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "Could not load illustration" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "(%(review_count)s rundown)" msgstr[1] "(%(review_count)s rundowns)" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "Add About" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "About:" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" msgstr[0] "" msgstr[1] "" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "A variant of this book is on your %(shelf_name)s stack." -#: bookwyrm/templates/book/book.html:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "Your book activity" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "Add activity chronology" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "No activity for this book." -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "Your rundowns" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "Your annotations" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "Your quotations" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "Topics" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "Locations" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1234,15 +1264,15 @@ msgstr "Locations" msgid "Lists" msgstr "Lists" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "Add to list" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1265,25 +1295,26 @@ msgid "Copied ISBN!" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "OCLC lookup:" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "ASIN:" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "" @@ -1294,12 +1325,12 @@ msgid "Goodreads:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1308,12 +1339,12 @@ msgid "Add cover" msgstr "Add front illustration" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "Upload front illustration" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "" @@ -1378,15 +1409,32 @@ msgstr "This is an unknown author" msgid "Creating a new author: %(name)s" msgstr "Adding an author: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "Is this a variant of a known work?" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "This is an unknown work" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1448,124 +1496,190 @@ msgstr "" msgid "Subtitle:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "Compilation:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "Compilation ordinal:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "Cants" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "Publication" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "Publication company:" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "Orignal publication:" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "Publication:" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "Discard %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "Author landing for %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "Front illustration" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "Physical Information" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "Format info:" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "Pagination:" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "Book Lookups" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1752,19 +1866,11 @@ msgstr "Put out in %(date)s" msgid "rated it" msgstr "" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "" -#: 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." @@ -1809,7 +1915,7 @@ msgstr "Confirmation string:" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "" @@ -1870,7 +1976,7 @@ msgstr "You can opt-out in your configuration options." #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1964,21 +2070,22 @@ msgid "%(username)s started reading %(username)s rated %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "" @@ -2164,14 +2271,14 @@ msgstr "Nothing much going on right now! Try following an account to start thing msgid "Alternatively, you can try enabling more status types" msgstr "" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: bookwyrm/templates/feed/layout.html:14 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" msgstr "%(year)s Book Goal" -#: bookwyrm/templates/feed/goal_card.html:18 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "You can modify your goal in your configuration options." @@ -2459,6 +2566,10 @@ msgstr "" msgid "Edit group" msgstr "" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "" @@ -3697,6 +3808,7 @@ msgid "Search for a book, author, user, or list" msgstr "" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "" @@ -4309,7 +4421,7 @@ msgstr[0] "" msgstr[1] "" #: bookwyrm/templates/notifications/items/status_preview.html:4 -#: bookwyrm/templates/snippets/status/content_status.html:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "" @@ -4776,7 +4888,7 @@ msgstr "" 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 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "" @@ -4969,9 +5081,8 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "" #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" +msgid "Update read dates for \"%(title)s\"" msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 @@ -5026,6 +5137,11 @@ msgstr "Modify activity chronology" msgid "Delete these read dates" msgstr "" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5036,39 +5152,33 @@ msgstr "" msgid "Report" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "" - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "" @@ -5169,13 +5279,13 @@ msgstr "" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 msgid "Start date:" msgstr "Start" #: bookwyrm/templates/settings/announcements/announcement.html:62 #: bookwyrm/templates/settings/announcements/edit_announcement.html:89 -#: bookwyrm/templates/settings/dashboard/dashboard.html:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "Finish" @@ -5549,7 +5659,7 @@ msgid "Dashboard" msgstr "" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "Total accounts" @@ -5563,31 +5673,31 @@ msgstr "" msgid "Works" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "Activity" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "Signup activity" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "" @@ -5899,13 +6009,49 @@ msgid "Unable to save settings" msgstr "" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6616,10 +6762,6 @@ msgstr "" msgid "Tasks" msgstr "" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "" @@ -7279,10 +7421,6 @@ msgstr "" msgid "An excerpt from '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "" @@ -7295,12 +7433,12 @@ msgstr "" msgid "to" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "" @@ -7401,6 +7539,13 @@ msgid_plural "rated %(title)s: %(display_ratin msgstr[0] "" msgstr[1] "" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" +msgstr[1] "" + #: 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" @@ -7613,35 +7758,35 @@ msgstr "" msgid "Show rating" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "" @@ -7700,16 +7845,22 @@ msgstr "" msgid "started reading %(book)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -7988,15 +8139,23 @@ msgid_plural "%(num)d books - by %(user)s" msgstr[0] "" msgstr[1] "" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/eo_UY/LC_MESSAGES/django.po b/locale/eo_UY/LC_MESSAGES/django.po index 4ca5bbfcbb..fd862628bd 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: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-06 18:49\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:14\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Esperanto\n" "Language: eo\n" @@ -107,7 +107,7 @@ msgstr "Titolo de la libro" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "Takso" @@ -175,39 +175,43 @@ msgstr "Forigo fare de kontrolanto" msgid "Domain block" msgstr "Blokado de domajno" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "Sonlibro" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "Bitlibro" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "Grafika romano" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "Rigidkovrila" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "Poŝlibro" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,19 +465,19 @@ msgstr "" msgid "%(display_name)s's quote from %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" msgstr[0] "" msgstr[1] "" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "Recenzoj" @@ -489,19 +493,19 @@ msgstr "Citaĵoj" msgid "Everything else" msgstr "Ĉio alia" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "Hejma novaĵfluo" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "Hejmo" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "Libra novaĵfluo" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -510,91 +514,91 @@ msgstr "Libra novaĵfluo" msgid "Books" msgstr "Libroj" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "English (Angla)" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "Català (Kataluna)" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "Deutsch (Germana)" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "Esperanto (Esperanto)" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "Español (Hispana)" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "Euskara (Eŭska)" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "Galego (Galega)" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "Italiano (Itala)" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "Suomi (Finna)" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "Français (Franca)" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (Litova)" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "Nederlands (Nederlanda)" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "Norsk (Norvega)" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "Polski (Pola)" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (Brazila portugala)" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Eŭropa portugala)" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "Română (Rumana)" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "Svenska (Sveda)" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "Українська (la ukraina)" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (Simpligita ĉina)" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (Tradicia ĉina)" @@ -839,7 +843,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -910,57 +914,62 @@ msgstr "Naskiĝis:" msgid "Died:" msgstr "Mortis:" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "Serio:" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "Eksteraj ligiloj" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "Vikipedio" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "Retejo" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "Vidi la ISNI-registraĵon" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "Vidi ĉe ISFDB" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "Ŝarĝi per la datumaro" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "Vidi ĉe OpenLibrary" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "Vidi ĉe Inventaire" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "Vidi ĉe LibraryThing" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "Vidi ĉe Goodreads" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "Libroj de %(name)s" @@ -997,8 +1006,8 @@ msgid "Name:" msgstr "Nomo:" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "Apartigu plurajn valorojn per komoj." @@ -1035,7 +1044,8 @@ msgid "Openlibrary key:" msgstr "Ŝlosilo de Openlibrary:" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "Inventaire ID:" @@ -1044,7 +1054,7 @@ msgid "Librarything key:" msgstr "Ŝlosilo de Librarything:" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "Ŝlosilo de Goodreads:" @@ -1057,8 +1067,8 @@ msgid "ISNI:" msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1070,7 +1080,7 @@ msgstr "ISNI:" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1082,10 +1092,10 @@ msgstr "Konservi" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1095,7 +1105,7 @@ msgstr "Konservi" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1112,7 +1122,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "La ŝarĝado konektos al %(source_name)s kaj kontrolos ĉu estas metadatumoj pri ĉi tiu aŭtoro kiuj ne jam ĉeestas ĉi tie. La ekzistantaj datumoj ne anstataŭiĝos." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1129,97 +1140,116 @@ msgstr "Konfirmi" msgid "Unable to connect to remote source." msgstr "La konekto al la fora fonto malsukcesis." -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "Modifi libron" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "Alklaku por aldoni kovrilon" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "Elŝuto de la kovrilo malsukcesis" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "Alklaku por grandigi" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "(%(review_count)s recenzo)" msgstr[1] "(%(review_count)s recenzoj)" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "Aldoni priskribon" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "Priskribo:" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" msgstr[0] "%(count)s eldono" msgstr[1] "%(count)s eldonoj" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "Vi surbretigis ĉi tiun eldonon sur:" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "Alia eldono de ĉi tiu libro estas sur via breto %(shelf_name)s." -#: bookwyrm/templates/book/book.html:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "Via lega agado" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "Aldoni legodatojn" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "Vi ne havas legan agadon por ĉi tiu libro." -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "Viaj recenzoj" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "Viaj komentoj" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "Viaj citaĵoj" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "Temoj" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "Lokoj" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1234,15 +1264,15 @@ msgstr "Lokoj" msgid "Lists" msgstr "Listoj" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "Aldoni al la listo" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1265,25 +1295,26 @@ msgid "Copied ISBN!" msgstr "Kopiis la ISBN!" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "Numero OCLC:" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "ASIN:" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "ASIN Audible:" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "ISFDB ID:" @@ -1294,12 +1325,12 @@ msgid "Goodreads:" msgstr "Goodreads:" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1308,12 +1339,12 @@ msgid "Add cover" msgstr "Aldoni kovrilon" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "Alŝuti kovrilon:" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "Ŝarĝi la kovrilon el URL:" @@ -1378,15 +1409,32 @@ msgstr "Ĉi tiu estas nova aŭtoro" msgid "Creating a new author: %(name)s" msgstr "Kreiĝos nova aŭtoro: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "Ĉu ĉi tio estas eldono de ekzistanta verkaĵo?" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "Ĉi tio estas nova verkaĵo" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1448,124 +1496,190 @@ msgstr "Ordiga titolo:" msgid "Subtitle:" msgstr "Subtitolo:" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "Serio:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "Numero en la serio:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "Lingvoj:" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "Temoj:" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "Aldoni temon" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "Forigi temon" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "Aldoni alian temon" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "Pozicio:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "Eldonado" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "Eldonejo:" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "Dato de la unua eldono:" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "Dato de la eldonado:" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "Aŭtoroj" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "Forigi %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "Aŭtorpaĝo de %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "Aldoni aŭtorojn:" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "Aldoni aŭtoron" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "Johana Cervino" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "Aldoni alian aŭtoron" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "Kovrilo" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "Fizikaj ecoj" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "Formato:" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "Detaloj de la formato:" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "Paĝoj:" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "Libroidentigiloj" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "ISBN 13:" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "ISBN 10:" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "Openlibrary ID:" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "Nomo" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1752,19 +1866,11 @@ msgstr "Eldonita je %(date)s" msgid "rated it" msgstr "taksis ĝin" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "Serio de" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "Libro %(series_number)s" -#: bookwyrm/templates/book/series.html:28 -msgid "Unsorted Book" -msgstr "Sennumera libro" - #: 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." @@ -1809,7 +1915,7 @@ msgstr "Konfirmkodo:" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "Sendi" @@ -1870,7 +1976,7 @@ msgstr "Vi povas ŝanĝi vian decidon iam ajn en viaj agord #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1964,21 +2070,22 @@ msgid "%(username)s started reading %(username)s komencis legi %(book_title)s" #: bookwyrm/templates/discover/card-header.html:23 +#: bookwyrm/templates/discover/card-header.html:32 #, python-format msgid "%(username)s rated %(book_title)s" msgstr "%(username)s taksis %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "%(username)s recenzis %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "%(username)s komentis pri %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "%(username)s citis %(book_title)s" @@ -2164,14 +2271,14 @@ msgstr "Ĝuste nun estas neniu ago! Provu sekvi uzanton por komenci" msgid "Alternatively, you can try enabling more status types" msgstr "Aliokaze, vi povas provi ŝalti pli da tipoj de afiŝoj" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: bookwyrm/templates/feed/layout.html:14 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" msgstr "Legocelo por %(year)s" -#: bookwyrm/templates/feed/goal_card.html:18 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "Vi povas aldoni aŭ ŝanĝi vian legocelon iam ajn per via profilpaĝo" @@ -2459,6 +2566,10 @@ msgstr "Ĉi tiu grupo havas neniun liston" msgid "Edit group" msgstr "Modifi grupon" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "Serĉi kaj aldoni uzanton" @@ -3697,6 +3808,7 @@ msgid "Search for a book, author, user, or list" msgstr "" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "Skani strikodon" @@ -4309,7 +4421,7 @@ msgstr[0] "Nova raporto bezonas kontrolon" msgstr[1] "%(display_count)s novaj raportoj bezonas kontrolon" #: bookwyrm/templates/notifications/items/status_preview.html:4 -#: bookwyrm/templates/snippets/status/content_status.html:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "Averto pri enhavo" @@ -4776,7 +4888,7 @@ msgstr "" 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 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "Elŝuti la dosieron" @@ -4969,10 +5081,9 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "Vi forigos ĉi tiun legadon kaj ĝiajn %(count)s asociitajn ĝisdatigojn de progreso." #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" -msgstr "Ĝisdatigi legodatojn por «%(title)s»" +msgid "Update read dates for \"%(title)s\"" +msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 #: bookwyrm/templates/readthrough/readthrough_modal.html:38 @@ -5026,6 +5137,11 @@ msgstr "Modifi la legodatojn" msgid "Delete these read dates" msgstr "Forigi ĉi tiujn legodatojn" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "Ĝisdatigi legodatojn por «%(title)s»" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5036,41 +5152,33 @@ msgstr "Aldoni legodatojn por «%(title)s»" msgid "Report" msgstr "Raporti" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "\n" -" Skani strikodon\n" -" " - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "Petado de permeso por la kamerao..." -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "Permesu la aliron al la kamerao por skani strikodon de libro." -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "Ne eblis atingi la kameraon" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "Skanado..." -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "Rektigu la strikodon de la libro kun la kamerao." -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "ISBN skaniĝis" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "Serĉado de la libro:" @@ -5171,13 +5279,13 @@ msgstr "Malvera" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 msgid "Start date:" msgstr "Komenca dato:" #: bookwyrm/templates/settings/announcements/announcement.html:62 #: bookwyrm/templates/settings/announcements/edit_announcement.html:89 -#: bookwyrm/templates/settings/dashboard/dashboard.html:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "Fina dato:" @@ -5551,7 +5659,7 @@ msgid "Dashboard" msgstr "Panelo" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "Suma nombro de uzantoj" @@ -5565,31 +5673,31 @@ msgstr "Aktivaj ĉi-monate" msgid "Works" msgstr "Verkoj" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "Aktiveco de la instanco" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "Intertempo:" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "Tagoj" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "Semajnoj" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "Novaj aliĝoj" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "Novaj afiŝoj" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "Verkoj kreitaj" @@ -5901,13 +6009,49 @@ msgid "Unable to save settings" msgstr "Ne eblis konservi la agordojn" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6618,10 +6762,6 @@ msgstr "" msgid "Tasks" msgstr "" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "Nomo" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "" @@ -7281,10 +7421,6 @@ msgstr "Citaĵo:" msgid "An excerpt from '%(book_title)s'" msgstr "Ekstrakto de ‘%(book_title)s’" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "Pozicio:" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "Ĉe paĝo:" @@ -7297,12 +7433,12 @@ msgstr "Ĉe elcento:" msgid "to" msgstr "ĝis" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "Via recenzo de «%(book_title)s»" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "Recenzo:" @@ -7403,6 +7539,13 @@ msgid_plural "rated %(title)s: %(display_ratin msgstr[0] "taksis %(title)s: %(display_rating)s stelo" msgstr[1] "taksis %(title)s: %(display_rating)s steloj" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" +msgstr[1] "" + #: 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" @@ -7615,35 +7758,35 @@ msgstr "Ĉesi legi" msgid "Show rating" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "Montri la afiŝon" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "(Paĝo %(page)s" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "%(endpage)s" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "(%(percent)s%%" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr " - %(endpercent)s%%" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "Malfermi la bildon en nova fenestro" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "Kaŝi la afiŝon" @@ -7702,16 +7845,22 @@ msgstr "komencis legi %(book)s de %(book)s" msgstr "komencis legi %(book)s" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "recenzis %(book)s de %(author_name)s" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "recenzis %(book)s" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -7990,15 +8139,23 @@ msgid_plural "%(num)d books - by %(user)s" msgstr[0] "%(num)d libro – de %(user)s" msgstr[1] "%(num)d libroj – de %(user)s" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/es_ES/LC_MESSAGES/django.po b/locale/es_ES/LC_MESSAGES/django.po index 70e5f1d6e4..e26a2f7f84 100644 --- a/locale/es_ES/LC_MESSAGES/django.po +++ b/locale/es_ES/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-03-03 19:41\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:12\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Spanish\n" "Language: es\n" @@ -107,7 +107,7 @@ msgstr "Título" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "Valoración" @@ -175,39 +175,43 @@ msgstr "Eliminación de moderador" msgid "Domain block" msgstr "Bloqueo de dominio" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "Audio libro" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "Libro electrónico" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "Novela gráfica" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "Tapa dura" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "Tapa blanda" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "%(value)s no se parece a un ISBN" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "%(value)s no tiene una suma de verificación ISBN correcta, esperábamos %(check_version)s" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,19 +465,19 @@ msgstr "Comentario de %(display_name)s sobre %(book_title)s" msgid "%(display_name)s's quote from %(book_title)s" msgstr "Cita de %(display_name)sde %(book_title)s" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "Reseña de %(display_name)sde %(book_title)s" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" msgstr[0] "%(display_name)s calificó %(book_title)s: %(display_rating).1f estrella" msgstr[1] "%(display_name)s calificó %(book_title)s: %(display_rating).1f estrellas" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "Reseñas" @@ -489,19 +493,19 @@ msgstr "Citas" msgid "Everything else" msgstr "Todo lo demás" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "Línea de tiempo principal" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "Inicio" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "Línea temporal de libros" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -510,91 +514,91 @@ msgstr "Línea temporal de libros" msgid "Books" msgstr "Libros" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "English (Inglés)" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "Català (Catalán)" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "Deutsch (Alemán)" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "Esperanto (Esperanto)" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "Español" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "Euskera" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "Galego (gallego)" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "Italiano" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "한국어 (Coreano)" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "Suomi (finés)" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "Français (Francés)" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (Lituano)" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "Países bajos (holandés)" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "Norsk (noruego)" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "Polski (Polaco)" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (portugués brasileño)" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Portugués europeo)" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "Română (rumano)" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "Svenska (Sueco)" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "Українська (ucraniano)" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (Chino simplificado)" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (Chino tradicional)" @@ -839,7 +843,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -910,57 +914,62 @@ msgstr "Fecha de nacimiento:" msgid "Died:" msgstr "Fecha de defunción:" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "Serie:" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "Enlaces externos" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "Wikipedia" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "Ver en Wikidata" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "Sitio Web" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "Ver registro ISNI" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "Ver en ISFDB" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "Cargar datos" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "Ver en OpenLibrary" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "Ver en Inventaire" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "Ver en LibraryThing" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "Ver en Goodreads" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "Libros de %(name)s" @@ -997,8 +1006,8 @@ msgid "Name:" msgstr "Nombre:" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "Separar varios valores con comas." @@ -1035,7 +1044,8 @@ msgid "Openlibrary key:" msgstr "Clave OpenLibrary:" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "ID Inventaire:" @@ -1044,7 +1054,7 @@ msgid "Librarything key:" msgstr "Clave Librarything:" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "Clave Goodreads:" @@ -1057,8 +1067,8 @@ msgid "ISNI:" msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1070,7 +1080,7 @@ msgstr "ISNI:" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1082,10 +1092,10 @@ msgstr "Guardar" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1095,7 +1105,7 @@ msgstr "Guardar" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1112,7 +1122,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "La carga de datos se conectará a %(source_name)s y comprobará si hay metadatos sobre este autore que no están presentes aquí. Los metadatos existentes no serán sobrescritos." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1129,97 +1140,116 @@ msgstr "Confirmar" msgid "Unable to connect to remote source." msgstr "No se ha podido conectar con la fuente remota." -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "Editar Libro" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "Haz clic para añadir portada" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "No se pudo cargar la portada" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "Haz clic para ampliar" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "Ver en Finna" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "Ver en Libris" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "(%(review_count)s reseña)" msgstr[1] "(%(review_count)s reseñas)" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "Agregar descripción" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "Descripción:" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" msgstr[0] "%(count)s edición" msgstr[1] "%(count)s ediciones" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "Has guardado esta edición en:" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "Una edición diferente de este libro está en tu estantería %(shelf_name)s." -#: bookwyrm/templates/book/book.html:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "Tu actividad de lectura" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "Agregar fechas de lectura" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "No tienes ninguna actividad de lectura para este libro." -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "Tus reseñas" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "Tus comentarios" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "Tus citas" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "Temas" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "Lugares" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1234,15 +1264,15 @@ msgstr "Lugares" msgid "Lists" msgstr "Listas" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "Agregar a lista" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "Crear una lista nueva..." -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1265,25 +1295,26 @@ msgid "Copied ISBN!" msgstr "¡ISBN copiado!" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "Número OCLC:" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "ASIN:" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "ASIN Audible:" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "ISFDB ID:" @@ -1294,12 +1325,12 @@ msgid "Goodreads:" msgstr "Goodreads:" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "ID de Finna:" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "ID de Libris:" @@ -1308,12 +1339,12 @@ msgid "Add cover" msgstr "Agregar portada" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "Subir portada:" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "Cargar portada desde URL:" @@ -1378,15 +1409,32 @@ msgstr "Este es un autor nuevo" msgid "Creating a new author: %(name)s" msgstr "Creando un autor nuevo: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "¿Es esta una edición de una obra ya existente?" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "Esta es una obra nueva" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1448,124 +1496,190 @@ msgstr "Ordenar por título:" msgid "Subtitle:" msgstr "Subtítulo:" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "Serie:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "Número de serie:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "Idiomas:" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "Temas:" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "Añadir tema" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "Quitar tema" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "Añadir otro tema" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "Posición:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "Publicación" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "Editorial:" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "Fecha de primera publicación:" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "Fecha de publicación:" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "Autores" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "Quitar %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "Página de autor por %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "Agregar Autores:" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "Añadir autore" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "María López García" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "Añadir otre autore" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "Portada" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "Propiedades físicas" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "Formato:" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "Detalles del formato:" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "Páginas:" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "Identificadores de libro" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "ISBN 13:" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "ISBN 10:" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "ID OpenLibrary:" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "Nombre" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1752,19 +1866,11 @@ msgstr "Publicado el %(date)s" msgid "rated it" msgstr "lo valoró con" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "Series de" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "Libro %(series_number)s" -#: bookwyrm/templates/book/series.html:28 -msgid "Unsorted Book" -msgstr "Libro sin clasificar" - #: 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." @@ -1809,7 +1915,7 @@ msgstr "Código de confirmación:" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "Enviar" @@ -1870,7 +1976,7 @@ msgstr "Puedes negarte en cualquier momento desde Configura #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1964,21 +2070,22 @@ msgid "%(username)s started reading %(username)s ha empezado a leer %(book_title)s." #: bookwyrm/templates/discover/card-header.html:23 +#: bookwyrm/templates/discover/card-header.html:32 #, python-format msgid "%(username)s rated %(book_title)s" msgstr "%(username)s ha valorado %(book_title)s." -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "%(username)s ha escrito una reseña de %(book_title)s." -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "%(username)s ha escrito un comentario en %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "%(username)s ha citado %(book_title)s" @@ -2164,14 +2271,14 @@ msgstr "¡No hay actividad ahora mismo! Sigue a otro usuario para empezar" msgid "Alternatively, you can try enabling more status types" msgstr "Alternativamente, puedes intentar habilitar más tipos de estado" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: bookwyrm/templates/feed/layout.html:14 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" msgstr "Objetivo de lectura de %(year)s" -#: bookwyrm/templates/feed/goal_card.html:18 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "Puedes establecer o cambiar tu objetivo de lectura en cualquier momento desde tu página de perfil" @@ -2459,6 +2566,10 @@ msgstr "Este grupo no tiene listas" msgid "Edit group" msgstr "Editar grupo" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "Buscar para añadir une usuarie" @@ -3697,6 +3808,7 @@ msgid "Search for a book, author, user, or list" msgstr "Buscar un libro, autor, usuario o lista" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "Escanear código de barras" @@ -4309,7 +4421,7 @@ msgstr[0] "Un nuevo informe requiere moderación" msgstr[1] "%(display_count)s nuevos informes requieren moderación" #: bookwyrm/templates/notifications/items/status_preview.html:4 -#: bookwyrm/templates/snippets/status/content_status.html:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "Advertencia de contenido" @@ -4776,7 +4888,7 @@ msgstr "Exportar lista de libros" 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 "Su archivo de exportación CSV incluirá: todos los libros de sus estanterías, libros que ha reseñado y libros con actividad de lectura.
      Use esto para importar desde servicios como Goodreads." -#: bookwyrm/templates/preferences/export.html:20 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "Descargar archivo" @@ -4969,10 +5081,9 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "Estás eliminando esta lectura y sus %(count)s actualizaciones de progreso asociados." #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" -msgstr "Actualizar fechas de lectura de «%(title)s»" +msgid "Update read dates for \"%(title)s\"" +msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 #: bookwyrm/templates/readthrough/readthrough_modal.html:38 @@ -5026,6 +5137,11 @@ msgstr "Editar fechas de lectura" msgid "Delete these read dates" msgstr "Eliminar estas fechas de lectura" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "Actualizar fechas de lectura de «%(title)s»" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5036,41 +5152,33 @@ msgstr "Añadir fechas de lectura de «%(title)s»" msgid "Report" msgstr "Reportar" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "\n" -" Escanear código de barras\n" -" " - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "Solicitando acceso a cámara..." -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "Otorga acceso a la cámara para poder escanear el código de barras de tus libros." -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "No se ha podido acceder a la cámara." -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "Escaneando..." -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "Alinea el código de barras del libro con la cámara." -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "Se ha escaneado el ISBN." -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "Buscando libro:" @@ -5171,13 +5279,13 @@ msgstr "Falso" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 msgid "Start date:" msgstr "Fecha de inicio:" #: bookwyrm/templates/settings/announcements/announcement.html:62 #: bookwyrm/templates/settings/announcements/edit_announcement.html:89 -#: bookwyrm/templates/settings/dashboard/dashboard.html:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "Fecha final:" @@ -5551,7 +5659,7 @@ msgid "Dashboard" msgstr "Tablero" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "Número de usuarios" @@ -5565,31 +5673,31 @@ msgstr "Activos este mes" msgid "Works" msgstr "Obras" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "Actividad de instancia" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "Intervalo:" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "Dias" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "Semanas" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "Actividad de inscripciones de usuarios" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "Actividad de estado" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "Obras creadas" @@ -5901,13 +6009,49 @@ msgid "Unable to save settings" msgstr "No se ha podido guardar la configuración." #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "Desactivar la federación" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6618,10 +6762,6 @@ msgstr "Tareas programadas" msgid "Tasks" msgstr "Tareas" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "Nombre" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "" @@ -7281,10 +7421,6 @@ msgstr "Cita:" msgid "An excerpt from '%(book_title)s'" msgstr "Un extracto de '%(book_title)s'" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "Posición:" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "En la página:" @@ -7297,12 +7433,12 @@ msgstr "Al por ciento:" msgid "to" msgstr "a" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "Tu reseña de '%(book_title)s'" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "Reseña:" @@ -7403,6 +7539,13 @@ msgid_plural "rated %(title)s: %(display_ratin msgstr[0] "valoró %(title)s: %(display_rating)s estrella" msgstr[1] "valoró %(title)s: %(display_rating)s estrellas" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" +msgstr[1] "" + #: 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" @@ -7615,35 +7758,35 @@ msgstr "Terminar de leer" msgid "Show rating" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "Mostrar estado" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "(Página %(page)s" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "%(endpage)s" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "(%(percent)s%%" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr " - %(endpercent)s%%" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "Abrir imagen en una nueva ventana" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "Ocultar estado" @@ -7702,16 +7845,22 @@ msgstr "empezó a leer %(book)s de %(book)s" msgstr "empezó a leer %(book)s" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "reseñó %(book)s de %(author_name)s" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "reseñó a %(book)s" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -7990,15 +8139,23 @@ 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:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/eu_ES/LC_MESSAGES/django.po b/locale/eu_ES/LC_MESSAGES/django.po index 78ef7083d1..0e88105c8f 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: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-06 18:48\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:13\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Basque\n" "Language: eu\n" @@ -107,7 +107,7 @@ msgstr "Liburuaren izenburua" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "Balorazioa" @@ -175,39 +175,43 @@ msgstr "Moderatzaile ezabatzea" msgid "Domain block" msgstr "Domeinu blokeoa" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "Audio-liburua" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "eBook" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "Komikia" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "Azal gogorra" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "Azal biguna" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,19 +465,19 @@ msgstr "%(display_name)s erabiltzailearen %(book_title)s liburuaren iruzkina" msgid "%(display_name)s's quote from %(book_title)s" msgstr "%(display_name)s erabiltzailearen %(book_title)s liburuko aipua" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "%(display_name)s erabiltzailearen %(book_title)s liburuaren kritika" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" msgstr[0] "%(display_name)s erabiltzaileak %(book_title)s liburua baloratu du: %(display_rating).1f izar" msgstr[1] "" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "Kritikak" @@ -489,19 +493,19 @@ msgstr "Aipuak" msgid "Everything else" msgstr "Gainerako guztia" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "Hasierako denbora-lerroa" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "Hasiera" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "Liburuen denbora-lerroa" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -510,91 +514,91 @@ msgstr "Liburuen denbora-lerroa" msgid "Books" msgstr "Liburuak" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "English (Ingelesa)" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "Català (katalana)" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "Deutsch (alemana)" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "Esperantoa" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "Español (espainiera)" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "Euskara" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "Galego (Galiziera)" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "Italiano (Italiera)" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "한국어 (koreera)" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "Suomi (finlandiera)" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "Français (frantses)" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "Lituano (lituaniera)" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "Herbehereak (nederlandera)" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "Norsk (Norvegiera)" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "Polski (poloniera)" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (Brasilgo Portugesa)" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Europako Portugesa)" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "Română (errumaniera)" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "Svenska (suediera)" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "Українська (ukrainera)" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (Txinera soildua)" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (Txinera tradizionala)" @@ -839,7 +843,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -910,57 +914,62 @@ msgstr "Jaiotza:" msgid "Died:" msgstr "Heriotza:" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "Seriea:" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "Kanpoko estekak" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "Wikipedia" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "Webgunea" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "Ikusi ISNI erregistroa" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "Ikus ISFDB webgunean" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "Kargatu datuak" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "OpenLibraryn ikusi" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "Inventairen ikusi" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "LibraryThing-en ikusi" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "Goodreads-en ikusi" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "%(name)s(e)k idatzitako liburuak" @@ -997,8 +1006,8 @@ msgid "Name:" msgstr "Izena:" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "Bereizi balio anitzak komaz." @@ -1035,7 +1044,8 @@ msgid "Openlibrary key:" msgstr "Openlibrary-ren giltza:" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "Inventaire IDa:" @@ -1044,7 +1054,7 @@ msgid "Librarything key:" msgstr "Librarything-ren giltza:" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "Goodreads-ren giltza:" @@ -1057,8 +1067,8 @@ msgid "ISNI:" msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1070,7 +1080,7 @@ msgstr "ISNI:" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1082,10 +1092,10 @@ msgstr "Gorde" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1095,7 +1105,7 @@ msgstr "Gorde" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1112,7 +1122,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "Datuak kargatzean %(source_name)s(e)ra konektatu eta hemen aurkitzen ez diren autore honi buruzko metadatuak arakatuko dira. Dauden datuak ez dira ordezkatuko." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1129,97 +1140,116 @@ msgstr "Berretsi" msgid "Unable to connect to remote source." msgstr "Ezin izan da urruneko edukira konektatu." -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "Editatu liburua" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "Egin klik azala gehitzeko" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "Ezin izan da azala kargatu" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "Egin click handitzeko" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "(berrikuspen %(review_count)s)" msgstr[1] "(%(review_count)s berrikuspen)" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "Gehitu deskribapena" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "Deskribapena:" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" msgstr[0] "Edizio %(count)s" msgstr[1] "%(count)s edizio" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "Edizio hau gorde duzu:" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "Liburu honen edizio desberdinak %(shelf_name)s apalean dituzu." -#: bookwyrm/templates/book/book.html:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "Zure irakurketa jarduera" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "Gehitu irakurketa datak" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "Ez duzu liburu honetarako irakurketa jarduerarik." -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "Zure kritikak" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "Zure iruzkinak" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "Zure aipuak" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "Gaiak" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "Lekuak" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1234,15 +1264,15 @@ msgstr "Lekuak" msgid "Lists" msgstr "Zerrendak" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "Gehitu zerrendara" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1265,25 +1295,26 @@ msgid "Copied ISBN!" msgstr "ISBN-a kopiatu!" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "OCLC zenbakia:" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "ASIN:" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "Audible ASIN:" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "ISFDB ID:" @@ -1294,12 +1325,12 @@ msgid "Goodreads:" msgstr "Goodreads-en giltza:" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1308,12 +1339,12 @@ msgid "Add cover" msgstr "Gehitu azala" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "Kargatu azala:" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "Kargatu azala URLtik:" @@ -1378,15 +1409,32 @@ msgstr "Egile berria da" msgid "Creating a new author: %(name)s" msgstr "Egile berria sortzen: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "Lehendik dagoen lan baten edizioa al da hau?" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "Lan berria da hau" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1448,124 +1496,190 @@ msgstr "Izenburuaren arabera ordenatu:" msgid "Subtitle:" msgstr "Azpititulua:" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "Seriea:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "Serie zenbakia:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "Hizkuntzak:" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "Gaiak:" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "Gehitu gaia" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "Ezabatu gaia" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "Gehitu beste gai bat" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "Posizioa:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "Argitalpena" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "Argitaletxea:" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "Argitaratutako lehen data:" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "Argitaratze data:" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "Egilea(k)" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "Kendu %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "%(name)s egilearen orria" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "Gehitu egilea(k):" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "Gehitu egilea" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "Egilearen Izen-Abizenak" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "Gehitu beste egile bat" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "Azala" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "Ezaugarri fisikoak" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "Formatua:" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "Formatuaren xehetasunak:" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "Orrialdeak:" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "Liburuen identifikatzaileak" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "ISBN 13:" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "ISBN 10:" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "Openlibrary-ren IDa:" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "Izena" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1752,19 +1866,11 @@ msgstr "%(date)s(e)an argitaratua" msgid "rated it" msgstr "baloratu du" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "Seriearen sortzailea: " - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "%(series_number)s. liburua" -#: bookwyrm/templates/book/series.html:28 -msgid "Unsorted Book" -msgstr "Sailkatu gabeko liburua" - #: 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." @@ -1809,7 +1915,7 @@ msgstr "Berrespen kodea:" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "Bidali" @@ -1870,7 +1976,7 @@ msgstr "Edozein unetan ezeztatu dezakezu zure profilaren ez #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1964,21 +2070,22 @@ msgid "%(username)s started reading %(username)s erabiltzailea %(book_title)s irakurtzen hasi da" #: bookwyrm/templates/discover/card-header.html:23 +#: bookwyrm/templates/discover/card-header.html:32 #, python-format msgid "%(username)s rated %(book_title)s" msgstr "%(username)s(e)k %(book_title)s baloratu du" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "%(username)s(e)k %(book_title)s(r)en kritika egin du" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "%(username)s(e)k %(book_title)s(e)ri buruzko iruzkina egin du" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "%(username)s(e)k %(book_title)s(r)en aipua egin du" @@ -2164,14 +2271,14 @@ msgstr "Oraintxe ez dago jarduerarik! Hasteko, saiatu erabiltzaile bat jarraitze msgid "Alternatively, you can try enabling more status types" msgstr "Aukera gisa, estatu mota gehiago gaitzen saia zaitezke" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: bookwyrm/templates/feed/layout.html:14 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" msgstr "%(year)s(e)ko irakurketa helburua" -#: bookwyrm/templates/feed/goal_card.html:18 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "Irakurtzeko helburua edozein unetan ezar edo alda dezakezu zure profileko orrialdean" @@ -2459,6 +2566,10 @@ msgstr "Talde honek ez du zerrendarik" msgid "Edit group" msgstr "Editatu taldea" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "Bilatu erabiltzaile bat gehitzeko" @@ -3697,6 +3808,7 @@ msgid "Search for a book, author, user, or list" msgstr "Bilatu liburu, egile, erabiltzaile edo zerrenda bat" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "Eskaneatu barra-kodea" @@ -4309,7 +4421,7 @@ msgstr[0] "Salaketa berri batek moderatzea behar du" msgstr[1] "%(display_count)s salaketa berrik moderatzea behar dute" #: bookwyrm/templates/notifications/items/status_preview.html:4 -#: bookwyrm/templates/snippets/status/content_status.html:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "Edukiari buruzko abisua" @@ -4776,7 +4888,7 @@ msgstr "Esportatu liburu zerrenda" 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 "Zure CSV esportazio-fitxategiak zure apaletako liburu guztiak, kritikatu dituzun liburuak, eta irakurketa-aktibitatea duten liburuak izango ditu.
      Erabili hau Goodreads bezalako zerbitzuetara inportatzeko." -#: bookwyrm/templates/preferences/export.html:20 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "Deskargatu fitxategia" @@ -4969,10 +5081,9 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "Irakurketa hau eta hari lotutako %(count)s egoera-eguneratzeak ezabatzen ari zara." #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" -msgstr "Eguneratu irakurketa-datak \"%(title)s\"(r)entzat" +msgid "Update read dates for \"%(title)s\"" +msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 #: bookwyrm/templates/readthrough/readthrough_modal.html:38 @@ -5026,6 +5137,11 @@ msgstr "Editatu irakurketa datak" msgid "Delete these read dates" msgstr "Ezabatu irakurketa-data houek" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "Eguneratu irakurketa-datak \"%(title)s\"(r)entzat" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5036,40 +5152,33 @@ msgstr "Gehitu irakurketa-datak \"%(title)s\"(r)entzat" msgid "Report" msgstr "Salatu" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "\n" -"Eskaneatu barra-kodea " - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "Kamera eskatzen..." -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "Eman kamerarako sarbidea liburu baten barra-kodea eskaneatu ahal izateko." -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "Ezin izan da kamara eskuratu" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "Eskaneatzen..." -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "Lerrokatu zure liburuaren barra-kodea kamerarekin." -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "ISBN eskaneatua" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "Liburua bilatzen:" @@ -5170,13 +5279,13 @@ msgstr "Gezurra" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 msgid "Start date:" msgstr "Hasiera data:" #: bookwyrm/templates/settings/announcements/announcement.html:62 #: bookwyrm/templates/settings/announcements/edit_announcement.html:89 -#: bookwyrm/templates/settings/dashboard/dashboard.html:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "Amaiera data:" @@ -5550,7 +5659,7 @@ msgid "Dashboard" msgstr "Arbela" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "Erabiltzaileak guztira" @@ -5564,31 +5673,31 @@ msgstr "Aktibo hilabete honetan" msgid "Works" msgstr "Liburuak" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "Instantziaren aktibitatea" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "Tartea:" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "Egunak" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "Asteak" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "Erabiltzaileen izen-emate aktibitatea" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "Egoeren aktibitatea" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "Sortutako liburuak" @@ -5900,13 +6009,49 @@ msgid "Unable to save settings" msgstr "Ezin izan dira ezarpenak gorde" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6617,10 +6762,6 @@ msgstr "Antolaturiko zereginak" msgid "Tasks" msgstr "Zereginak" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "Izena" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "Celery zeregina" @@ -7280,10 +7421,6 @@ msgstr "Aipua:" msgid "An excerpt from '%(book_title)s'" msgstr "\"%(book_title)s\"(e)ko pasarte bat" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "Posizioa:" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "Orrialdean:" @@ -7296,12 +7433,12 @@ msgstr "Ehunekotan:" msgid "to" msgstr "hona:" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "'%(book_title)s' liburuari buruzko zure kritika" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "Kritika:" @@ -7402,6 +7539,13 @@ msgid_plural "rated %(title)s: %(display_ratin msgstr[0] "%(title)s puntuatu du: izar %(display_rating)s" msgstr[1] "%(title)s puntuatu du: %(display_rating)s izar" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" +msgstr[1] "" + #: 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" @@ -7614,35 +7758,35 @@ msgstr "Bukatu irakurtzen" msgid "Show rating" msgstr "Erakutsi balorazioa" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "Erakutsi egoera" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "(%(page)s. orria" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "%(endpage)s" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "(%%%(percent)s" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr " - %%%(endpercent)s" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "Ireki irudia leiho berrian" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "Ezkutatu egoera" @@ -7701,16 +7845,22 @@ msgstr "erabiltzailea %(author_name)s(r)en %(book)s" msgstr "erabiltzailea %(book)s irakurtzen hasi da" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "(e)k %(author_name)s(r)en %(book)s liburuaren kritika egin du" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "(e)k %(book)s(r)en kritika egin du" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -7989,15 +8139,23 @@ 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:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "erabiltzaile-kontu berri bat" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/fa_IR/LC_MESSAGES/django.po b/locale/fa_IR/LC_MESSAGES/django.po index 6799170a86..5b83ebc3c5 100644 --- a/locale/fa_IR/LC_MESSAGES/django.po +++ b/locale/fa_IR/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-04-16 10:53\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:13\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Persian\n" "Language: fa\n" @@ -107,7 +107,7 @@ msgstr "عنوان کتاب" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "امتیاز" @@ -175,39 +175,43 @@ msgstr "حذف مدیر" msgid "Domain block" msgstr "مسدود کردن دامنه" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "کتاب صوتی" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "کتاب الکترونیکی" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "رمان گرافیکی" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "کتاب جلد سخت" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "کتاب جلد نرم" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "%(value)s به نظر نمی‌رسد یک ISBN باشد" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "%(value)s دارای چک‌کد ISBN صحیح نیست، ما انتظار داشتیم %(check_version)s" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,19 +465,19 @@ msgstr "%(display_name)s's نظر در مورد %(book_title)s" msgid "%(display_name)s's quote from %(book_title)s" msgstr "%(display_name)s's نقل قول از %(book_title)s" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "%(display_name)s's بررسی %(book_title)s" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" msgstr[0] "%(display_name)s به %(book_title)s نمره داد: %(display_rating).1f ستاره" msgstr[1] "%(display_name)s به %(book_title)s نمره داد: %(display_rating).1f ستاره" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "بررسی‌ها" @@ -489,19 +493,19 @@ msgstr "نقل قول‌ها" msgid "Everything else" msgstr "سایر موارد" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "خط زمانی خانه" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "خانه" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "خط زمانی کتاب‌ها" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -510,91 +514,91 @@ msgstr "خط زمانی کتاب‌ها" msgid "Books" msgstr "کتاب‌ها" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "انگلیسی" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "کاتالان (Catalan)" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "آلمانی (German)" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "اسپرانتو (Esperanto)" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "اسپانیایی (Spanish)" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "باسکی (Basque)" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "گالیسی (Galician)" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "ایتالیایی (Italian)" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "کره‌ای (Korean)" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "فنلاندی (Finnish)" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "فرانسوی (French)" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "لیتوانیایی (Lithuanian)" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "هلندی (Dutch)" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "نروژی (Norwegian)" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "لهستانی (Polish)" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "پرتغالی برزیلی (Brazilian Portuguese)" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "پرتغالی اروپایی (Português Europeu)" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "رومانیایی (Română)" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "سوئدی (Svenska)" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "اوکراینی (Українська)" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "چینی ساده (简体中文)" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "چینی سنتی (繁體中文)" @@ -839,7 +843,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -910,57 +914,62 @@ msgstr "تولد:" msgid "Died:" msgstr "مرگ:" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "سری:" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "لینک‌های خارجی" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "ویکی‌پدیا" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "مشاهده در ویکی‌داده" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "وب‌سایت" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "مشاهده رکورد ISNI" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "مشاهده در ISFDB" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "بارگذاری داده" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "مشاهده در OpenLibrary" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "مشاهده در Inventaire" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "مشاهده در LibraryThing" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "مشاهده در Goodreads" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "کتاب‌های %(name)s" @@ -997,8 +1006,8 @@ msgid "Name:" msgstr "نام:" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "برای جدا کردن مقادیر چندگانه از ویرگول استفاده کنید." @@ -1035,7 +1044,8 @@ msgid "Openlibrary key:" msgstr "کلید اوپن‌لایبرری:" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "شناسه اینونر:" @@ -1044,7 +1054,7 @@ msgid "Librarything key:" msgstr "کلید لایبرری‌تینک:" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "کلید گودریڊز:" @@ -1057,8 +1067,8 @@ msgid "ISNI:" msgstr "" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1070,7 +1080,7 @@ msgstr "" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1082,10 +1092,10 @@ msgstr "ذخیره" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1095,7 +1105,7 @@ msgstr "ذخیره" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1112,7 +1122,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "بارگذاری داده‌ها به %(source_name)s متصل خواهد شد و هر گونه متاداده درباره این نویسنده که در اینجا موجود نیست را بررسی خواهد کرد. متاداده‌های موجود جایگزین نخواهند شد." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1129,97 +1140,116 @@ msgstr "تأیید" msgid "Unable to connect to remote source." msgstr "عدم توانایی در اتصال به منبع از راه دور." -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "ویرایش کتاب" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "برای افزودن جلد کلیک کنید" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "بارگذاری جلد ناموفق بود" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "برای بزرگ‌نمایی کلیک کنید" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "مشاهده در فینا" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "مشاهده در لایبریس" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "(%(review_count)s نقد)" msgstr[1] "(%(review_count)s نقدها)" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "افزودن توضیحات" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "توضیحات:" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" msgstr[0] "%(count)s ویرایش" msgstr[1] "%(count)s ویرایش‌ها" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "شما این ویرایش را در قفسه‌تان قرار داده‌اید:" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, 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:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "فعالیت خواندن شما" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "تاریخ‌های خواندن را اضافه کنید" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "شما هیچ فعالیت خواندنی برای این کتاب ندارید." -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "نقدهای شما" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "نظرات شما" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "نقل‌قول‌های شما" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "موضوعات" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "مکان‌ها" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1234,15 +1264,15 @@ msgstr "مکان‌ها" msgid "Lists" msgstr "فهرست‌ها" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "اضافه کردن به فهرست" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "ایجاد فهرست جدید..." -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1265,25 +1295,26 @@ msgid "Copied ISBN!" msgstr "ISBN کپی شد!" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "شماره OCLC:" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "ASIN شنیداری:" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "شناسه ISFDB:" @@ -1294,12 +1325,12 @@ msgid "Goodreads:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "شناسه Finna:" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "شناسه Libris:" @@ -1308,12 +1339,12 @@ msgid "Add cover" msgstr "کاور را اضافه کنید" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "بارگذاری کاور:" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "بارگذاری کاور از URL:" @@ -1378,15 +1409,32 @@ msgstr "این یک نویسنده جدید است" msgid "Creating a new author: %(name)s" msgstr "در حال ایجاد نویسنده جدید: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "آیا این نسخه‌ای از یک اثر موجود است؟" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "این یک اثر جدید است" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1448,124 +1496,190 @@ msgstr "عنوان مرتب‌سازی:" msgid "Subtitle:" msgstr "زیرعنوان:" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "سری:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "شماره سری:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "زبان‌ها:" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "موضوعات:" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "موضوع اضافه کنید" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "موضوع را حذف کنید" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "موضوع دیگری اضافه کنید" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "انتشار" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "ناشر:" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "تاریخ اولین انتشار:" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "تاریخ انتشار:" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "نویسندگان" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "حذف %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "صفحه نویسنده برای %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "نویسندگان را اضافه کنید:" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "نویسنده اضافه کنید" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "جین دو" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "نویسنده دیگری اضافه کنید" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "پوشش" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "ویژگی‌های فیزیکی" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "فرمت:" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "جزئیات فرمت:" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "صفحات:" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "شناسه‌های کتاب" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "شناسه Openlibrary:" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "نام" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1752,19 +1866,11 @@ msgstr "منتشر شده در %(date)s" msgid "rated it" msgstr "آن را ارزیابی کرد" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "مجموعه توسط" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, 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." @@ -1809,7 +1915,7 @@ msgstr "کد تأیید:" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "ارسال" @@ -1870,7 +1976,7 @@ msgstr "شما می توانید هر زمان که بخواهید از %(username)s started reading %(username)s شروع به خواندن کتاب %(book_title)s کرد" #: bookwyrm/templates/discover/card-header.html:23 +#: bookwyrm/templates/discover/card-header.html:32 #, python-format msgid "%(username)s rated %(book_title)s" msgstr "%(username)s به کتاب %(book_title)s امتیاز داد" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "%(username)s نقدی برای %(book_title)s نوشت." -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "%(username)s بر روی %(book_title)s نظری گذاشت." -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "%(username)s از %(book_title)s نقل قول کرد." @@ -2164,14 +2271,14 @@ msgstr "در حال حاضر فعالیتی وجود ندارد! سعی کنید msgid "Alternatively, you can try enabling more status types" msgstr "به جای آن، می‌توانید تلاش کنید تا نوع‌های بیشتری از وضعیت‌ها را فعال کنید" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: 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 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "شما می‌توانید هر زمان هدف خواندن خود را از صفحه پروفایل خود تنظیم یا تغییر دهید" @@ -2459,6 +2566,10 @@ msgstr "این گروه هیچ فهرستی ندارد" msgid "Edit group" msgstr "ویرایش گروه" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "برای افزودن یک کاربر جستجو کنید" @@ -3697,6 +3808,7 @@ msgid "Search for a book, author, user, or list" msgstr "برای یک کتاب، نویسنده، کاربر، یا فهرست جستجو کنید" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "بارکد را اسکن کنید" @@ -4309,7 +4421,7 @@ msgstr[0] "یک گزارش جدید نیاز به تع msgstr[1] "%(display_count)s گزارش جدید نیاز به تعدیل دارند" #: bookwyrm/templates/notifications/items/status_preview.html:4 -#: bookwyrm/templates/snippets/status/content_status.html:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "هشدار محتوا" @@ -4776,7 +4888,7 @@ msgstr "صادر کردن فهرست کتاب" 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 "فایل صادر CSV شما شامل تمام کتاب‌هایی روی قفسه‌های شما، کتاب‌هایی که نقد کرده‌اید و کتاب‌هایی با فعالیت خواندن خواهد شد.
      از این برای درونریزی به سرویسی مانند Goodreads استفاده کنید." -#: bookwyrm/templates/preferences/export.html:20 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "دانلود فایل" @@ -4969,10 +5081,9 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "شما این خواندگی و %(count)s به‌روزرسانی پیشرفت مرتبط آن را حذف می‌کنید." #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" -msgstr "به‌روزرسانی تاریخ‌های خواندن برای \"%(title)s\"" +msgid "Update read dates for \"%(title)s\"" +msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 #: bookwyrm/templates/readthrough/readthrough_modal.html:38 @@ -5026,6 +5137,11 @@ msgstr "ویرایش تاریخ‌های خواندن" msgid "Delete these read dates" msgstr "حذف این تاریخ‌های خواندن" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "به‌روزرسانی تاریخ‌های خواندن برای \"%(title)s\"" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5036,33 +5152,33 @@ msgstr "اضافه کردن تاریخ‌های خواندن برای \"%(ti msgid "Report" msgstr "گزارش" -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "درخواست دوربین..." -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "دسترسی به دوربین را برای اسکن بارکد کتاب اعطا کنید." -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "نمی‌توان به دوربین دسترسی پیدا کرد" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "در حال اسکن..." -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "بارکد کتاب خود را با دوربین تراز کنید." -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "ISBN اسکن شد" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "جستجو برای کتاب:" @@ -5163,13 +5279,13 @@ msgstr "خیر" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 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:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "تاریخ پایان:" @@ -5543,7 +5659,7 @@ msgid "Dashboard" msgstr "داشبورد" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "کل کاربران" @@ -5557,31 +5673,31 @@ msgstr "فعال در این ماه" msgid "Works" msgstr "آثار" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "فعالیت نمونه" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "بازه:" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "روزها" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "هفته‌ها" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "فعالیت ثبت‌نام کاربر" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "فعالیت وضعیت" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "آثار ایجاد شده" @@ -5893,13 +6009,49 @@ msgid "Unable to save settings" msgstr "نمی‌توان تنظیمات را ذخیره کرد" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "غیرفعال کردن فدراسیون" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "مانع تعامل نمونه شما با سرویس‌های فدراسیون دیگر می‌شود. داده‌های موجود از نمونه‌های دیگر همچنان وجود خواهند داشت." +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6610,10 +6762,6 @@ msgstr "وظایف برنامه‌ریزی شده" msgid "Tasks" msgstr "وظایف" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "نام" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "وظیفه Celery" @@ -7273,10 +7421,6 @@ msgstr "" msgid "An excerpt from '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "" @@ -7289,12 +7433,12 @@ msgstr "" msgid "to" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "" @@ -7395,6 +7539,13 @@ msgid_plural "rated %(title)s: %(display_ratin msgstr[0] "" msgstr[1] "" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" +msgstr[1] "" + #: 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" @@ -7607,35 +7758,35 @@ msgstr "" msgid "Show rating" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "" @@ -7694,16 +7845,22 @@ msgstr "" msgid "started reading %(book)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -7982,15 +8139,23 @@ msgid_plural "%(num)d books - by %(user)s" msgstr[0] "" msgstr[1] "" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/fi_FI/LC_MESSAGES/django.po b/locale/fi_FI/LC_MESSAGES/django.po index 6e92bd99ab..17a0660a6b 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: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-06 18:48\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:13\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Finnish\n" "Language: fi\n" @@ -107,7 +107,7 @@ msgstr "Kirjan nimi" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "Arvosana" @@ -175,39 +175,43 @@ msgstr "Moderaattorin poistama" msgid "Domain block" msgstr "Verkkotunnuksen esto" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "Äänikirja" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "E-kirja" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "Sarjakuva" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "Kovakantinen" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "Pehmeäkantinen" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "%(value)s ei näytä olevan ISBN" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "%(value)s ei sisällä oikein olevaa ISBN-tarkistussummaa, odotimme %(check_version)s" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,19 +465,19 @@ msgstr "Käyttäjan %(display_name)s kommentti kirjasta %(book_title)s" msgid "%(display_name)s's quote from %(book_title)s" msgstr "Käyttäjän %(display_name)s lainaus kirjasta %(book_title)s" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "Käyttäjan %(display_name)s arvostelu kirjasta %(book_title)s" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" msgstr[0] "%(display_name)s arvosteli %(book_title)s: %(display_rating).1f tähti" msgstr[1] "%(display_name)s arvosteli %(book_title)s: %(display_rating).1f tähteä" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "Arviot" @@ -489,19 +493,19 @@ msgstr "Lainaukset" msgid "Everything else" msgstr "Muut" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "Oma aikajana" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "Etusivu" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "Kirjavirta" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -510,91 +514,91 @@ msgstr "Kirjavirta" msgid "Books" msgstr "Kirjat" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "English (englanti)" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "Català (katalaani)" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "Deutsch (saksa)" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "Esperanto (esperanto)" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "Español (espanja)" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "Euskara (baski)" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "Galego (galego)" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "Italiano (italia)" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "한국어 (korea)" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "suomi" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "Français (ranska)" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (liettua)" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "Nederlands (hollanti)" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "Norsk (norja)" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "Polski (puola)" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (brasilianportugali)" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (portugali)" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "Română (romania)" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "Svenska (ruotsi)" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "Українська (ukraina)" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (yksinkertaistettu kiina)" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (perinteinen kiina)" @@ -839,7 +843,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -910,57 +914,62 @@ msgstr "Syntynyt:" msgid "Died:" msgstr "Kuollut:" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "Sarja:" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "Linkit muualle" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "Wikipedia" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "Näytä Wikidatassa" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "Verkkosivu" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "Näytä ISNI-tietue" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "Näytä ISFDB:ssä" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "Lataa tiedot" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "Näytä OpenLibraryssa" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "Näytä Inventairessa" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "Näytä LibraryThingissä" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "Näytä Goodreadsissa" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "Tekijän %(name)s kirjat" @@ -997,8 +1006,8 @@ msgid "Name:" msgstr "Nimi:" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "Erota erilliset arvot pilkulla." @@ -1035,7 +1044,8 @@ msgid "Openlibrary key:" msgstr "Openlibrary-avain:" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "Inventaire-tunniste:" @@ -1044,7 +1054,7 @@ msgid "Librarything key:" msgstr "Librarything-avain:" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "Goodreads-avain:" @@ -1057,8 +1067,8 @@ msgid "ISNI:" msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1070,7 +1080,7 @@ msgstr "ISNI:" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1082,10 +1092,10 @@ msgstr "Tallenna" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1095,7 +1105,7 @@ msgstr "Tallenna" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1112,7 +1122,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "Tietoja ladattaessa muodostetaan yhteys lähteeseen %(source_name)s ja sieltä haetaan metatietoja, joita ei vielä ole täällä. Olemassa olevia metatietoja ei korvata uusilla." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1129,97 +1140,116 @@ msgstr "Vahvista" msgid "Unable to connect to remote source." msgstr "Lähteeseen ei saada yhteyttä." -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "Muokkaa kirjaa" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "Lisää kansikuva" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "Kansikuvan lataus epäonnistui" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "Suurenna" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "Näytä Finnassa" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "(%(review_count)s arvio)" msgstr[1] "(%(review_count)s arviota)" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "Lisää kuvaus" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "Kuvaus:" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" msgstr[0] "%(count)s laitos" msgstr[1] "%(count)s laitosta" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "Olet sijoittanut laitoksen hyllyyn:" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "Hyllyssäsi %(shelf_name)s on jo toinen tämän kirjan laitos." -#: bookwyrm/templates/book/book.html:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "Oma lukutoiminta" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "Lisää lukupäivämäärät" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "Ei kirjaan liittyvää lukutoimintaa." -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "Omat arviot" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "Omat kommentit" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "Omat lainaukset" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "Aiheet" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "Paikat" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1234,15 +1264,15 @@ msgstr "Paikat" msgid "Lists" msgstr "Listat" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "Lisää listaan" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1265,25 +1295,26 @@ msgid "Copied ISBN!" msgstr "ISBN kopioitu!" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "OCLC-numero:" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "ASIN:" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "Audible ASIN:" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "ISFDB-tunniste:" @@ -1294,12 +1325,12 @@ msgid "Goodreads:" msgstr "Goodreads:" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "Finna-tunniste:" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1308,12 +1339,12 @@ msgid "Add cover" msgstr "Lisää kansikuva" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "Lataa kansikuva:" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "Ladattavan kansikuvan URL:" @@ -1378,15 +1409,32 @@ msgstr "Uusi tekijä" msgid "Creating a new author: %(name)s" msgstr "Luodaan uusi tekijä: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "Onko tämä aiemmin lisätyn teoksen laitos?" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "Uusi teos" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1448,124 +1496,190 @@ msgstr "Lajittelussa käytettävä nimi:" msgid "Subtitle:" msgstr "Alaotsikko:" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "Sarja:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "Osan numero:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "Kielet:" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "Aiheet:" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "Lisää aihe" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "Poista aihe" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "Lisää uusi aihe" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "Sijainti:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "Julkaisu" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "Kustantaja:" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "Julkaistu ensimmäisen kerran:" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "Julkaisuaika:" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "Tekijät" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "Poista %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "Tekijän %(name)s sivu" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "Lisää tekijät:" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "Lisää tekijä" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "Marras Meikäläinen" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "Yksi tekijä lisää" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "Kansikuva" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "Painoksen ominaisuudet" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "Julkaisumuoto:" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "Lisätietoa julkaisumuodosta:" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "Sivumäärä:" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "Kirjan tunnisteet" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "ISBN 13:" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "ISBN 10:" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "Openlibrary-tunniste:" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "Nimi" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1752,19 +1866,11 @@ msgstr "Julkaistu: %(date)s" msgid "rated it" msgstr "antoi arvosanan" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "Sarja." - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "Osa %(series_number)s" -#: bookwyrm/templates/book/series.html:28 -msgid "Unsorted Book" -msgstr "Lajittelematon kirja" - #: 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." @@ -1809,7 +1915,7 @@ msgstr "Vahvistuskoodi:" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "Lähetä" @@ -1870,7 +1976,7 @@ msgstr "Hakemistosta voi milloin tahansa poistua profiilin #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1964,21 +2070,22 @@ msgid "%(username)s started reading %(username)s alkoi lukea teosta %(book_title)s" #: bookwyrm/templates/discover/card-header.html:23 +#: bookwyrm/templates/discover/card-header.html:32 #, python-format msgid "%(username)s rated %(book_title)s" msgstr "%(username)s arvosteli teoksen %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "%(username)s kirjoitti arvion teoksesta %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "%(username)s kommentoi teosta %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "%(username)s lainasi teosta %(book_title)s" @@ -2164,14 +2271,14 @@ msgstr "Ei tapahtumia. Seuraa muita käyttäjiä" msgid "Alternatively, you can try enabling more status types" msgstr "Voit myös ottaa uusia tilapäivityslajeja käyttöön" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: bookwyrm/templates/feed/layout.html:14 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" msgstr "Lukutavoite vuodelle %(year)s" -#: bookwyrm/templates/feed/goal_card.html:18 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "Lukutavoitteen voi milloin tahansa asettaa vaikka uudelleen oman profiilisivun kautta" @@ -2459,6 +2566,10 @@ msgstr "Ryhmällä ei ole listoja" msgid "Edit group" msgstr "Muokkaa ryhmää" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "Hae lisättävää käyttäjää" @@ -3697,6 +3808,7 @@ msgid "Search for a book, author, user, or list" msgstr "Hae kirjaa, tekijää, käyttäjää tai listaa" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "Skannaa viivakoodi" @@ -4309,7 +4421,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:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "Sisältövaroitus" @@ -4776,7 +4888,7 @@ msgstr "" 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 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "Lataa tiedosto" @@ -4969,10 +5081,9 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "Olet poistamassa lukutapahtumaa ja %(count)s siihen liitettyä etenemispäivitystä." #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" -msgstr "Päivitä teoksen %(title)s lukuajankohtaa" +msgid "Update read dates for \"%(title)s\"" +msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 #: bookwyrm/templates/readthrough/readthrough_modal.html:38 @@ -5026,6 +5137,11 @@ msgstr "Muokkaa lukuajankohtaa" msgid "Delete these read dates" msgstr "Poista lukuajankohta" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "Päivitä teoksen %(title)s lukuajankohtaa" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5036,41 +5152,33 @@ msgstr "Lisää lukuajankohta teokseen %(title)s" msgid "Report" msgstr "Raportoi" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "\n" -" Skannaa viivakoodi\n" -" " - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "Pyydetään kameraa..." -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "Anna lupa käyttää kameraa, jotta viivakoodi voidaan skannata." -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "Kameraa ei löytynyt" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "Skannataan..." -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "Kohdista kirjan viivakoodi kameraan." -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "ISBN skannattu" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "Haetaan kirjaa:" @@ -5171,13 +5279,13 @@ msgstr "Epätosi" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 msgid "Start date:" msgstr "Alkaen:" #: bookwyrm/templates/settings/announcements/announcement.html:62 #: bookwyrm/templates/settings/announcements/edit_announcement.html:89 -#: bookwyrm/templates/settings/dashboard/dashboard.html:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "Päättyen:" @@ -5551,7 +5659,7 @@ msgid "Dashboard" msgstr "Kojelauta" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "Käyttäjiä yhteensä" @@ -5565,31 +5673,31 @@ msgstr "Aktiivisena tässä kuussa" msgid "Works" msgstr "Teoksia" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "Palvelimen aktiivisuus" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "Aikaväli:" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "päivä" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "viikko" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "Rekisteröityneitä käyttäjiä" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "Tilapäivityksiä" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "Luotuja teoksia" @@ -5901,13 +6009,49 @@ msgid "Unable to save settings" msgstr "Asetuksia ei voi tallentaa" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6618,10 +6762,6 @@ msgstr "" msgid "Tasks" msgstr "Tehtävät" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "Nimi" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "" @@ -7281,10 +7421,6 @@ msgstr "Lainaus:" msgid "An excerpt from '%(book_title)s'" msgstr "Lainaus teoksesta ”%(book_title)s”" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "Sijainti:" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "Sivulla:" @@ -7297,12 +7433,12 @@ msgstr "Prosenttikohdassa:" msgid "to" msgstr "–" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "Arviosi teoksesta ”%(book_title)s”" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "Arvio:" @@ -7403,6 +7539,13 @@ msgid_plural "rated %(title)s: %(display_ratin msgstr[0] "arvosteli teoksen %(title)s: %(display_rating)s tähti" msgstr[1] "arvosteli teoksen %(title)s: %(display_rating)s tähteä" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" +msgstr[1] "" + #: 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" @@ -7615,35 +7758,35 @@ msgstr "Luettu kokonaan" msgid "Show rating" msgstr "Näytä arvio" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "Näytä tilapäivitys" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "(Sivu %(page)s" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "%(endpage)s" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "(%(percent)s %%" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr "–%(endpercent)s %%" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "Avaa kuva uudessa ikkunassa" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "Piilota tilapäivitys" @@ -7702,16 +7845,22 @@ msgstr "alkoi lukea teosta %(author_name)s: %(book)s" msgstr "alkoi lukea teosta %(book)s" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "kirjoitti arvion teoksesta %(author_name)s: %(book)s" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "kirjoitti arvion teoksesta %(book)s" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -7990,15 +8139,23 @@ 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:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "uusi käyttäjätili" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/fo_FO/LC_MESSAGES/django.po b/locale/fo_FO/LC_MESSAGES/django.po index c52028601a..b0045d37ef 100644 --- a/locale/fo_FO/LC_MESSAGES/django.po +++ b/locale/fo_FO/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-06 18:49\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:14\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Faroese\n" "Language: fo\n" @@ -107,7 +107,7 @@ msgstr "" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "" @@ -175,39 +175,43 @@ msgstr "" msgid "Domain block" msgstr "" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,19 +465,19 @@ msgstr "" msgid "%(display_name)s's quote from %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" msgstr[0] "" msgstr[1] "" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "" @@ -489,19 +493,19 @@ msgstr "" msgid "Everything else" msgstr "" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -510,91 +514,91 @@ msgstr "" msgid "Books" msgstr "" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "" @@ -839,7 +843,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -910,57 +914,62 @@ msgstr "" msgid "Died:" msgstr "" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "" @@ -997,8 +1006,8 @@ msgid "Name:" msgstr "" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "" @@ -1035,7 +1044,8 @@ msgid "Openlibrary key:" msgstr "" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "" @@ -1044,7 +1054,7 @@ msgid "Librarything key:" msgstr "" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "" @@ -1057,8 +1067,8 @@ msgid "ISNI:" msgstr "" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1070,7 +1080,7 @@ msgstr "" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1082,10 +1092,10 @@ msgstr "" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1095,7 +1105,7 @@ msgstr "" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1112,7 +1122,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "" #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1129,97 +1140,116 @@ msgstr "" msgid "Unable to connect to remote source." msgstr "" -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "" msgstr[1] "" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" msgstr[0] "" msgstr[1] "" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "" -#: bookwyrm/templates/book/book.html:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "" -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1234,15 +1264,15 @@ msgstr "" msgid "Lists" msgstr "" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1265,25 +1295,26 @@ msgid "Copied ISBN!" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "" @@ -1294,12 +1325,12 @@ msgid "Goodreads:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1308,12 +1339,12 @@ msgid "Add cover" msgstr "" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "" @@ -1378,15 +1409,32 @@ msgstr "" msgid "Creating a new author: %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1448,124 +1496,190 @@ msgstr "" msgid "Subtitle:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1752,19 +1866,11 @@ msgstr "" msgid "rated it" msgstr "" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "" -#: 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." @@ -1809,7 +1915,7 @@ msgstr "" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "" @@ -1870,7 +1976,7 @@ msgstr "" #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1964,21 +2070,22 @@ msgid "%(username)s started reading %(username)s rated %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "" @@ -2164,14 +2271,14 @@ msgstr "" msgid "Alternatively, you can try enabling more status types" msgstr "" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: bookwyrm/templates/feed/layout.html:14 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" msgstr "" -#: bookwyrm/templates/feed/goal_card.html:18 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "" @@ -2459,6 +2566,10 @@ msgstr "" msgid "Edit group" msgstr "" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "" @@ -3697,6 +3808,7 @@ msgid "Search for a book, author, user, or list" msgstr "" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "" @@ -4309,7 +4421,7 @@ msgstr[0] "" msgstr[1] "" #: bookwyrm/templates/notifications/items/status_preview.html:4 -#: bookwyrm/templates/snippets/status/content_status.html:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "" @@ -4776,7 +4888,7 @@ msgstr "" 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 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "" @@ -4969,9 +5081,8 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "" #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" +msgid "Update read dates for \"%(title)s\"" msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 @@ -5026,6 +5137,11 @@ msgstr "" msgid "Delete these read dates" msgstr "" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5036,39 +5152,33 @@ msgstr "" msgid "Report" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "" - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "" @@ -5169,13 +5279,13 @@ msgstr "" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 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:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "" @@ -5549,7 +5659,7 @@ msgid "Dashboard" msgstr "" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "" @@ -5563,31 +5673,31 @@ msgstr "" msgid "Works" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "" @@ -5899,13 +6009,49 @@ msgid "Unable to save settings" msgstr "" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6616,10 +6762,6 @@ msgstr "" msgid "Tasks" msgstr "" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "" @@ -7279,10 +7421,6 @@ msgstr "" msgid "An excerpt from '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "" @@ -7295,12 +7433,12 @@ msgstr "" msgid "to" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "" @@ -7401,6 +7539,13 @@ msgid_plural "rated %(title)s: %(display_ratin msgstr[0] "" msgstr[1] "" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" +msgstr[1] "" + #: 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" @@ -7613,35 +7758,35 @@ msgstr "" msgid "Show rating" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "" @@ -7700,16 +7845,22 @@ msgstr "" msgid "started reading %(book)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -7988,15 +8139,23 @@ msgid_plural "%(num)d books - by %(user)s" msgstr[0] "" msgstr[1] "" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/fr_FR/LC_MESSAGES/django.po b/locale/fr_FR/LC_MESSAGES/django.po index 38d47b7741..82df93c7ed 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: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-03-19 07:32\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-26 05:34\n" "Last-Translator: Mouse Reeve \n" "Language-Team: French\n" "Language: fr\n" @@ -107,7 +107,7 @@ msgstr "Titre du livre" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "Note" @@ -175,39 +175,43 @@ msgstr "Suppression par un modérateur" msgid "Domain block" msgstr "Blocage de domaine" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "Livre audio" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "eBook" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "Roman graphique" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "Livre relié" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "Livre broché" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "%(value)s ne ressemble pas à un numéro ISBN" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "%(value)s n'a pas la somme de contrôle ISBN correcte, nous nous attendions à %(check_version)s" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "Ce livre fait déjà partie de cette collection" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,19 +465,19 @@ msgstr "Commentaire de %(display_name)s pour « %(book_title)s »" msgid "%(display_name)s's quote from %(book_title)s" msgstr "Citation de %(display_name)s pour « %(book_title)s »" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "Critique de %(display_name)s pour « %(book_title)s »" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" msgstr[0] "%(display_name)s a noté « %(book_title)s » : %(display_rating).1f étoile" msgstr[1] "%(display_name)s a noté « %(book_title)s » : %(display_rating).1f étoiles" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "Critiques" @@ -489,19 +493,19 @@ msgstr "Citations" msgid "Everything else" msgstr "Tout le reste" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "Mon fil d’actualité" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "Accueil" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "Mon fil d’actualité littéraire" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -510,91 +514,91 @@ msgstr "Mon fil d’actualité littéraire" msgid "Books" msgstr "Livres" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "English" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "Català (Catalan)" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "Deutsch" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "Esperanto (Espéranto)" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "Español" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "Euskara (Basque)" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "Galego (Galicien)" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "Italiano (Italien)" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "한국어 (Coréen)" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "Suomi (Finnois)" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "Français" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (Lituanien)" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "Nederlands (néerlandais)" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "Norsk (Norvégien)" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "Polski (Polonais)" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (Portugais brésilien)" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Portugais européen)" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "Română (Roumain)" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "Svenska (Suédois)" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "Українська (Ukrainien)" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "简化字" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (chinois traditionnel)" @@ -839,7 +843,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -910,57 +914,62 @@ msgstr "Naissance :" msgid "Died:" msgstr "Décès :" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "Série :" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "Liens externes" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "Wikipedia" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "Voir sur Wikidata" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "Site Internet" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "Voir l’enregistrement ISNI" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "Voir sur ISFDB" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "Charger les données" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "Voir sur OpenLibrary" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "Voir sur Inventaire" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "Voir sur LibraryThing" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "Voir sur Goodreads" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "Livres de %(name)s" @@ -997,8 +1006,8 @@ msgid "Name:" msgstr "Nom :" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "Séparez plusieurs valeurs par une virgule." @@ -1035,7 +1044,8 @@ msgid "Openlibrary key:" msgstr "Clé Openlibrary :" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "Identifiant Inventaire :" @@ -1044,7 +1054,7 @@ msgid "Librarything key:" msgstr "Clé Librarything :" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "Clé Goodreads :" @@ -1057,8 +1067,8 @@ msgid "ISNI:" msgstr "ISNI :" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1070,7 +1080,7 @@ msgstr "ISNI :" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1082,10 +1092,10 @@ msgstr "Enregistrer" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1095,7 +1105,7 @@ msgstr "Enregistrer" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1112,7 +1122,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "Le chargement des données se connectera à %(source_name)s et vérifiera les métadonnées de cet auteur ou autrice qui ne sont pas présentes ici. Les métadonnées existantes ne seront pas écrasées." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1129,97 +1140,116 @@ msgstr "Confirmer" msgid "Unable to connect to remote source." msgstr "Impossible de se connecter au serveur distant." -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "Ce livre fait peut-être partie de la série %(series)s." + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "Modifiez-le pour confirmer." + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "Livre %(number)s sur %(title)s" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "Extrait de %(title)s" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "Modifier le livre" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "Cliquez pour ajouter une couverture" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "La couverture n’a pu être chargée" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "Cliquez pour élargir" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "Voir sur Finna" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "Voir sur Libris" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "(%(review_count)s critique)" msgstr[1] "(%(review_count)s critiques)" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "Ajouter une description" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "Description :" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" msgstr[0] "%(count)s édition" msgstr[1] "%(count)s éditions" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "Vous avez rangé cette édition dans :" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "Une édition différente de ce livre existe sur votre étagère %(shelf_name)s." -#: bookwyrm/templates/book/book.html:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "Votre activité de lecture" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "Ajouter des dates de lecture" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "Vous n’avez aucune activité de lecture pour ce livre" -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "Vos critiques" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "Vos commentaires" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "Vos citations" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "Sujets" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "Lieux" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1234,15 +1264,15 @@ msgstr "Lieux" msgid "Lists" msgstr "Listes" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "Ajouter à la liste" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "Créer une liste..." -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1265,25 +1295,26 @@ msgid "Copied ISBN!" msgstr "ISBN copié !" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "Numéro OCLC :" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "ASIN :" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "ASIN Audible:" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "ISFDB ID:" @@ -1294,12 +1325,12 @@ msgid "Goodreads:" msgstr "Goodreads:" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "Finna ID:" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "ID Libris :" @@ -1308,12 +1339,12 @@ msgid "Add cover" msgstr "Ajouter une couverture" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "Charger une couverture :" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "Charger la couverture depuis une URL :" @@ -1378,15 +1409,32 @@ msgstr "Il s’agit d’un nouvel auteur ou d’une nouvelle autrice." msgid "Creating a new author: %(name)s" msgstr "Création d’un nouvel auteur/autrice : %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "Est‑ce l’édition d’un ouvrage existant ?" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "Il s’agit d’un nouvel ouvrage." -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "Êtes-vous sûr qu'il s'agit d'une nouvelle série ? Les séries suivantes ont des titres similaires et le même auteur." + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "Ce livre fait-il partie d'une de ces séries ?" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "Il s'agit d'une nouvelle série" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "Créer une nouvelle série" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1448,124 +1496,190 @@ msgstr "Titre de tri :" msgid "Subtitle:" msgstr "Sous‑titre :" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "Série :" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "Numéro dans la série :" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "Langues :" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "Sujets :" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "Ajouter un sujet" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "Retirer le sujet" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "Ajouter un autre sujet" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "Série" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "Modifier la série" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "Pour modifier les détails d'une série, cliquez sur le nom de celle-ci" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "Emplacement :" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "Supprimer ce livre de %(series_name)s" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "Ajouter une série" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "Titre de la série :" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "Position dans la série :" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "Ce champ s'appelait auparavant « Numéro de série »" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "Publication" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "Éditeur :" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "Première date de parution :" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "Date de parution :" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "Auteurs ou autrices" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "Retirer %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "Page de %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "Ajouter des auteurs ou autrices :" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "Ajouter un auteur ou une autrice" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "Camille Dupont" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "Ajouter un autre auteur ou autrice" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "Couverture" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "Propriétés physiques" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "Format :" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "Détails du format :" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "Pages :" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "Identifiants du livre" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "ISBN 13 :" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "ISBN 10 :" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "Identifiant Openlibrary :" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "Modifier « %(title)s »" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "Modifier « %(name)s »" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "Nom" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "Autre nom" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "Ajouter un autre nom :" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "Ajouter un autre nom" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "ID Wikidata :" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1752,19 +1866,11 @@ msgstr "Publié %(date)s" msgid "rated it" msgstr "l’a noté" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "Séries par" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "Livre %(series_number)s" -#: bookwyrm/templates/book/series.html:28 -msgid "Unsorted Book" -msgstr "Livre hors classement" - #: 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." @@ -1809,7 +1915,7 @@ msgstr "Code de confirmation :" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "Valider" @@ -1870,7 +1976,7 @@ msgstr "Vous pouvez décider de ne plus y figurer à n’importe quel moment dep #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1964,21 +2070,22 @@ msgid "%(username)s started reading %(username)s a commencé %(book_title)s" #: bookwyrm/templates/discover/card-header.html:23 +#: bookwyrm/templates/discover/card-header.html:32 #, python-format msgid "%(username)s rated %(book_title)s" msgstr "%(username)s a noté %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "%(username)s a critiqué %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "%(username)s a commenté %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "%(username)s a cité un passage de %(book_title)s" @@ -2164,14 +2271,14 @@ msgstr "Aucune activité pour l’instant ! Abonnez‑vous à quelqu’un pour msgid "Alternatively, you can try enabling more status types" msgstr "Sinon, vous pouvez essayer d’activer plus de types de statuts" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: bookwyrm/templates/feed/layout.html:14 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" msgstr "Défi lecture pour %(year)s" -#: bookwyrm/templates/feed/goal_card.html:18 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "Vous pouvez définir ou changer votre défi lecture à n’importe quel moment depuis votre profil" @@ -2459,6 +2566,10 @@ msgstr "Ce groupe n'a pas de liste" msgid "Edit group" msgstr "Modifier le groupe" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "Membres du groupe" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "Chercher et ajouter un·e utilisateur·rice" @@ -3697,6 +3808,7 @@ msgid "Search for a book, author, user, or list" msgstr "Rechercher un livre, un auteur, un utilisateur ou une liste" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "Scanner le code-barres" @@ -4309,7 +4421,7 @@ msgstr[0] "Un nouveau signalement a besoin d’être tr msgstr[1] "%(display_count)s nouveaux signalements ont besoin d’être traités" #: bookwyrm/templates/notifications/items/status_preview.html:4 -#: bookwyrm/templates/snippets/status/content_status.html:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "Avertissement sur le contenu" @@ -4776,7 +4888,7 @@ msgstr "Exporter la liste des livres" 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 "Votre fichier d'exportation CSV comprendra tous les livres sur vos étagères, les livres que vous avez examinés et les livres avec activité de lecture.
      Utilisez-le pour importer dans un service comme Goodreads." -#: bookwyrm/templates/preferences/export.html:20 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "Télécharger le fichier" @@ -4969,10 +5081,9 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "Vous avez supprimé ce résumé et ses %(count)s progressions associées." #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" -msgstr "Mettre à jour les dates de lecture pour « %(title)s »" +msgid "Update read dates for \"%(title)s\"" +msgstr "Mettre à jour les dates de lecture pour « %(title)s »" #: bookwyrm/templates/readthrough/readthrough_form.html:10 #: bookwyrm/templates/readthrough/readthrough_modal.html:38 @@ -5026,6 +5137,11 @@ msgstr "Modifier les date de lecture" msgid "Delete these read dates" msgstr "Supprimer ces dates de lecture" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "Mettre à jour les dates de lecture pour « %(title)s »" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5036,41 +5152,33 @@ msgstr "Ajouter des dates de lecture pour « %(title)s »" msgid "Report" msgstr "Signaler" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "\n" -" Scanner le code-barres\n" -" " - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "En attente de la caméra…" -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "Autorisez l’accès à l’appareil photo pour scanner le code‑barres d’un livre." -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "Impossible d’accéder à la caméra" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "Scan en cours…" -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "Alignez le code‑barres de votre livre avec l’appareil photo." -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "ISBN scanné" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "Recherche du livre :" @@ -5171,13 +5279,13 @@ msgstr "Faux" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 msgid "Start date:" msgstr "Date de début :" #: bookwyrm/templates/settings/announcements/announcement.html:62 #: bookwyrm/templates/settings/announcements/edit_announcement.html:89 -#: bookwyrm/templates/settings/dashboard/dashboard.html:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "Date de fin :" @@ -5551,7 +5659,7 @@ msgid "Dashboard" msgstr "Tableau de bord" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "Nombre total d'utilisateurs·rices" @@ -5565,31 +5673,31 @@ msgstr "Actifs ce mois" msgid "Works" msgstr "Œuvres" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "Activité de l'instance" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "Intervalle :" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "Jours" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "Semaines" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "Nouvelles inscriptions" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "Nouveaux statuts" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "Œuvres créées" @@ -5901,13 +6009,49 @@ msgid "Unable to save settings" msgstr "Impossible d’enregistrer les paramètres" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "Exiger des requêtes GET signées" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "Recommandé" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "Empêche les requêtes anonymes provenant d'instances fédérées. Cela correspond à peu près au « mode sécurisé » de Mastodon ou à « AUTHORIZED_FETCH »" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "Empêcher les consultations sans authentification" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "Empêche les utilisateurs anonymes d'accéder à la plupart des pages. Pour bloquer également les requêtes JSON, activez l'option « Exiger des requêtes GET signées »" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "Désactiver la fédération" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "Avertissement" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "Empêche votre instance d'interagir avec d'autres services fédérés. Les données existantes d'autres instances seront toujours présentes." +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "Bloquer les recherches entrantes" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "Non recommandé" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "Empêche les autres serveurs d'effectuer des recherches sur votre instance. Il est fortement recommandé de NE PAS activer ce paramètre." + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6618,10 +6762,6 @@ msgstr "Tâches planifiées" msgid "Tasks" msgstr "Tâches" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "Nom" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "Tâche Celery" @@ -7281,10 +7421,6 @@ msgstr "Citation :" msgid "An excerpt from '%(book_title)s'" msgstr "Un extrait de « %(book_title)s »" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "Emplacement :" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "À la page :" @@ -7297,12 +7433,12 @@ msgstr "Au pourcentage :" msgid "to" msgstr "à" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "Votre critique de « %(book_title)s »" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "Critique :" @@ -7403,6 +7539,13 @@ msgid_plural "rated %(title)s: %(display_ratin msgstr[0] "a noté %(title)s : %(display_rating)s étoile" msgstr[1] "a noté %(title)s : %(display_rating)s étoiles" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "Note : « %(book_title)s » %(display_rating)s étoile %(review_title)s" +msgstr[1] "Note : « %(book_title)s » %(display_rating)s étoiles %(review_title)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" @@ -7615,35 +7758,35 @@ msgstr "Terminer la lecture" msgid "Show rating" msgstr "Voir la note" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "Afficher le statut" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "(Page %(page)s" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "%(endpage)s" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "(%(percent)s%%" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr " - %(endpercent)s%%" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "Ouvrir l’image dans une nouvelle fenêtre" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "Masquer le statut" @@ -7702,16 +7845,22 @@ msgstr "a commencé la lecture de %(book)s par %(book)s" msgstr "a commencé %(book)s" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "a publié une critique de %(book)s par %(author_name)s" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "a critiqué %(book)s" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "note %(book)s" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -7990,15 +8139,23 @@ 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:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "%(title)s (%(subtitle)s)" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "un nouveau compte utilisateur" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "Il existe un autre ouvrage de la série qui a la même valeur" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "Le numéro de la collection doit être unique pour chaque livre" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/ga_IE/LC_MESSAGES/django.po b/locale/ga_IE/LC_MESSAGES/django.po index 4cb07fbcdc..cf03340ca3 100644 --- a/locale/ga_IE/LC_MESSAGES/django.po +++ b/locale/ga_IE/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-06 18:48\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:13\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Irish\n" "Language: ga\n" @@ -107,7 +107,7 @@ msgstr "" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "" @@ -175,39 +175,43 @@ msgstr "" msgid "Domain block" msgstr "" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,12 +465,12 @@ msgstr "" msgid "%(display_name)s's quote from %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" @@ -476,7 +480,7 @@ msgstr[2] "" msgstr[3] "" msgstr[4] "" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "" @@ -492,19 +496,19 @@ msgstr "" msgid "Everything else" msgstr "" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -513,91 +517,91 @@ msgstr "" msgid "Books" msgstr "" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "" @@ -848,7 +852,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -925,57 +929,62 @@ msgstr "" msgid "Died:" msgstr "" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "" @@ -1012,8 +1021,8 @@ msgid "Name:" msgstr "" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "" @@ -1050,7 +1059,8 @@ msgid "Openlibrary key:" msgstr "" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "" @@ -1059,7 +1069,7 @@ msgid "Librarything key:" msgstr "" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "" @@ -1072,8 +1082,8 @@ msgid "ISNI:" msgstr "" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1085,7 +1095,7 @@ msgstr "" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1097,10 +1107,10 @@ msgstr "" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1110,7 +1120,7 @@ msgstr "" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1127,7 +1137,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "" #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1144,31 +1155,50 @@ msgstr "" msgid "Unable to connect to remote source." msgstr "" -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" @@ -1178,17 +1208,17 @@ msgstr[2] "" msgstr[3] "" msgstr[4] "" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" @@ -1198,49 +1228,49 @@ msgstr[2] "" msgstr[3] "" msgstr[4] "" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "" -#: bookwyrm/templates/book/book.html:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "" -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1255,15 +1285,15 @@ msgstr "" msgid "Lists" msgstr "" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1286,25 +1316,26 @@ msgid "Copied ISBN!" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "" @@ -1315,12 +1346,12 @@ msgid "Goodreads:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1329,12 +1360,12 @@ msgid "Add cover" msgstr "" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "" @@ -1399,15 +1430,32 @@ msgstr "" msgid "Creating a new author: %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1469,124 +1517,190 @@ msgstr "" msgid "Subtitle:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1773,19 +1887,11 @@ msgstr "" msgid "rated it" msgstr "" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "" -#: 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." @@ -1830,7 +1936,7 @@ msgstr "" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "" @@ -1891,7 +1997,7 @@ msgstr "" #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1991,21 +2097,22 @@ msgid "%(username)s started reading %(username)s rated %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "" @@ -2191,14 +2298,14 @@ msgstr "" msgid "Alternatively, you can try enabling more status types" msgstr "" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: bookwyrm/templates/feed/layout.html:14 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" msgstr "" -#: bookwyrm/templates/feed/goal_card.html:18 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "" @@ -2486,6 +2593,10 @@ msgstr "" msgid "Edit group" msgstr "" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "" @@ -3739,6 +3850,7 @@ msgid "Search for a book, author, user, or list" msgstr "" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "" @@ -4366,7 +4478,7 @@ msgstr[3] "" msgstr[4] "" #: bookwyrm/templates/notifications/items/status_preview.html:4 -#: bookwyrm/templates/snippets/status/content_status.html:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "" @@ -4836,7 +4948,7 @@ msgstr "" 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 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "" @@ -5029,9 +5141,8 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "" #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" +msgid "Update read dates for \"%(title)s\"" msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 @@ -5086,6 +5197,11 @@ msgstr "" msgid "Delete these read dates" msgstr "" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5096,39 +5212,33 @@ msgstr "" msgid "Report" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "" - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "" @@ -5235,13 +5345,13 @@ msgstr "" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 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:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "" @@ -5615,7 +5725,7 @@ msgid "Dashboard" msgstr "" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "" @@ -5629,31 +5739,31 @@ msgstr "" msgid "Works" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "" @@ -5977,13 +6087,49 @@ msgid "Unable to save settings" msgstr "" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6694,10 +6840,6 @@ msgstr "" msgid "Tasks" msgstr "" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "" @@ -7363,10 +7505,6 @@ msgstr "" msgid "An excerpt from '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "" @@ -7379,12 +7517,12 @@ msgstr "" msgid "to" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "" @@ -7497,6 +7635,16 @@ msgstr[2] "" msgstr[3] "" msgstr[4] "" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" +msgstr[4] "" + #: 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" @@ -7712,35 +7860,35 @@ msgstr "" msgid "Show rating" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "" @@ -7799,16 +7947,22 @@ msgstr "" msgid "started reading %(book)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -8096,15 +8250,23 @@ msgstr[2] "" msgstr[3] "" msgstr[4] "" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/gl_ES/LC_MESSAGES/django.po b/locale/gl_ES/LC_MESSAGES/django.po index 521ef12893..b47af1cce2 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: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-07 03:33\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-26 04:55\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Galician\n" "Language: gl\n" @@ -107,7 +107,7 @@ msgstr "Título do libro" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "Valoración" @@ -175,39 +175,43 @@ msgstr "Eliminado pola moderación" msgid "Domain block" msgstr "Bloqueo de dominio" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "Audiolibro" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "eBook" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "Novela gráfica" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "Tapa dura" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "Libro de bolso" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "%(value)s non semella ser un ISBN" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "%(value)s non ten a suma de comprobación ISBN correcta, agardábase %(check_version)s" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "O libro xa está incluído nesta serie" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,19 +465,19 @@ msgstr "Comentario de %(display_name)s en %(book_title)s" msgid "%(display_name)s's quote from %(book_title)s" msgstr "Cita de %(display_name)s en %(book_title)s" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "Recensión de %(display_name)s en %(book_title)s" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" msgstr[0] "%(display_name)s valorou %(book_title)s: %(display_rating).1f estrela" msgstr[1] "%(display_name)s valorou %(book_title)s: %(display_rating).1f estrelas" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "Recensións" @@ -489,19 +493,19 @@ msgstr "Citas" msgid "Everything else" msgstr "As outras cousas" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "Cronoloxía de Inicio" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "Inicio" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "Cronoloxía de libros" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -510,91 +514,91 @@ msgstr "Cronoloxía de libros" msgid "Books" msgstr "Libros" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "English (Inglés)" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "Català (Catalan)" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "Deutsch (Alemán)" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "Esperanto (Esperanto)" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "Español (Español)" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "Euskara (Éuscaro)" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "Galego (Galego)" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "Italiano (Italiano)" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "한국어 (Coreano)" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "Suomi (Finés)" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "Français (Francés)" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (Lituano)" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "Paises Baixos (Dutch)" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "Norsk (Noruegués)" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "Polski (Polaco)" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (Portugués brasileiro)" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Portugués europeo)" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "Română (Rumanés)" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "Svenska (Sueco)" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "Українська (Ucraíno)" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (Chinés simplificado)" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (Chinés tradicional)" @@ -839,7 +843,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -910,57 +914,62 @@ msgstr "Nacemento:" msgid "Died:" msgstr "Morte:" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "Serie:" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "Ligazóns externas" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "Wikipedia" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "Ver en Wikidata" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "Sitio web" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "Ver rexistro ISNI" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "Ver en ISFDB" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "Cargar datos" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "Ver en OpenLibrary" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "Ver en Inventaire" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "Ver en LibraryThing" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "Ver en Goodreads" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "Libros de %(name)s" @@ -997,8 +1006,8 @@ msgid "Name:" msgstr "Nome:" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "Separa múltiples valores con vírgulas." @@ -1035,7 +1044,8 @@ msgid "Openlibrary key:" msgstr "Clave en Openlibrary:" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "ID en Inventaire:" @@ -1044,7 +1054,7 @@ msgid "Librarything key:" msgstr "Clave en Librarything:" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "Clave en Goodreads:" @@ -1057,8 +1067,8 @@ msgid "ISNI:" msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1070,7 +1080,7 @@ msgstr "ISNI:" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1082,10 +1092,10 @@ msgstr "Gardar" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1095,7 +1105,7 @@ msgstr "Gardar" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1112,7 +1122,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "Ao cargar os datos vas conectar con %(source_name)s e comprobar se existen metadatos desta persoa autora que non están aquí presentes. Non se sobrescribirán os datos existentes." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1129,97 +1140,116 @@ msgstr "Confirmar" msgid "Unable to connect to remote source." msgstr "Non se pode conectar coa fonte remota." -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "Este libro podería ser parte da serie %(series)s." + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "Edítao para confirmar." + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "Libro %(number)s en %(title)s" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "Parte de %(title)s" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "Editar libro" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "Preme para engadir portada" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "Fallou a carga da portada" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "Preme para agrandar" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "Ver en Finna" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "Ver en Libris" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "(%(review_count)s recensión)" msgstr[1] "(%(review_count)s recensións)" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "Engadir descrición" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "Descrición:" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" msgstr[0] "%(count)s edición" msgstr[1] "%(count)s edicións" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "Puxeches esta edición no estante:" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "Hai unha edición diferente deste libro no teu estante %(shelf_name)s." -#: bookwyrm/templates/book/book.html:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "Actividade lectora" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "Engadir datas de lectura" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "Non tes actividade lectora neste libro." -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "As túas recensións" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "Os teus comentarios" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "As túas citas" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "Temas" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "Lugares" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1234,15 +1264,15 @@ msgstr "Lugares" msgid "Lists" msgstr "Listas" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "Engadir á lista" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "Crear nova lista…" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1265,25 +1295,26 @@ msgid "Copied ISBN!" msgstr "ISBN copiado!" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "Número OCLC:" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "ASIN:" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "ASIN Audible:" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "ID ISFDB:" @@ -1294,12 +1325,12 @@ msgid "Goodreads:" msgstr "Goodreads:" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "ID en Finna:" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "ID en Libris:" @@ -1308,12 +1339,12 @@ msgid "Add cover" msgstr "Engadir portada" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "Subir portada:" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "Cargar portada desde URL:" @@ -1378,15 +1409,32 @@ msgstr "Esta é unha nova autora" msgid "Creating a new author: %(name)s" msgstr "Creando nova autora: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "É esta a edición dun traballo existente?" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "Este é un novo traballo" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "Tes certeza de que esta é unha nova serie? As seguintes series teñen un nome parecido e a autoría coincide." + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "Pertence este libro a algunha destas series?" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "Esta é unha nova serie" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "Creando unha nova serie" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1448,124 +1496,190 @@ msgstr "Orde por título:" msgid "Subtitle:" msgstr "Subtítulo:" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "Serie:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "Número da serie:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "Idiomas:" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "Temas:" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "Engadir tema" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "Eliminar tema" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "Engadir outro tema" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "Serie" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "Editar a serie" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "Para editar os detalles dunha serie, fai click no nome da serie" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "Posición:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "Retirar este libro de %(series_name)s" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "Engadir serie" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "Nome da serie:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "Posición na serie:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "Este campo antes tiña o nome de «Número na serie»" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "Publicación" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "Editorial:" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "Data da primeira edición:" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "Data de publicación:" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "Autoría" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "Eliminar %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "Páxina de autora para %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "Engadir autoras:" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "Engadir Autora" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "Xoana Pedre" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "Engade outra Autora" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "Portada" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "Propiedades físicas" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "Formato:" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "Detalles do formato:" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "Páxinas:" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "Identificadores do libro" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "ISBN 13:" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "ISBN 10:" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "ID en Openlibrary:" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "Editar «%(title)s»" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "Editar «%(name)s»" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "Nome" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "Nomes alternativos" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "Engadir un nome alternativo:" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "Engade un nome alternativo" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "ID en Wikidata:" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1752,19 +1866,11 @@ msgstr "Publicado o %(date)s" msgid "rated it" msgstr "valorouno" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "Unha Serie de" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "Libro %(series_number)s" -#: bookwyrm/templates/book/series.html:28 -msgid "Unsorted Book" -msgstr "Libro non ordenado" - #: 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." @@ -1809,7 +1915,7 @@ msgstr "Código de confirmación:" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "Enviar" @@ -1870,7 +1976,7 @@ msgstr "Podes retirar o permiso en calquera momento nos axu #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1964,21 +2070,22 @@ msgid "%(username)s started reading %(username)s comezou a ler %(book_title)s" #: bookwyrm/templates/discover/card-header.html:23 +#: bookwyrm/templates/discover/card-header.html:32 #, python-format msgid "%(username)s rated %(book_title)s" msgstr "%(username)s valorou %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "%(username)s fixo a recensión de %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "%(username)s comentou %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "%(username)s citou %(book_title)s" @@ -2164,14 +2271,14 @@ msgstr "Non hai actividade por agora! Proba a seguir algunha persoa para comezar msgid "Alternatively, you can try enabling more status types" msgstr "De xeito alternativo, podes activar máis tipos de estados" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: bookwyrm/templates/feed/layout.html:14 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" msgstr "%(year)s Obxectivo de lectura" -#: bookwyrm/templates/feed/goal_card.html:18 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "Podes establecer ou cambiar un obxectivo de lectura en calquera momento desde a túa páxina de perfil" @@ -2459,6 +2566,10 @@ msgstr "Este grupo non ten listas" msgid "Edit group" msgstr "Editar grupo" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "Integrantes do grupo" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "Buscar para engadir usuaria" @@ -3697,6 +3808,7 @@ msgid "Search for a book, author, user, or list" msgstr "Buscar por título, autoría, usuarias ou listas" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "Escanear código de barras" @@ -4309,7 +4421,7 @@ msgstr[0] "Nova denuncia pendente de revisión" msgstr[1] "Novas %(display_count)s new denuncias pendentes de revisión" #: bookwyrm/templates/notifications/items/status_preview.html:4 -#: bookwyrm/templates/snippets/status/content_status.html:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "Aviso sobre o contido" @@ -4776,7 +4888,7 @@ msgstr "Exportar Lista de Libros" 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 "O ficheiro CSV de exportación incluirá todos os libros dos teus estantes, libros que recensionaches e libros con actividade lectora.
      Úsao para importalo en servizos como Goodreads." -#: bookwyrm/templates/preferences/export.html:20 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "Descargar ficheiro" @@ -4969,10 +5081,9 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "Vas eliminar o diario de lectura e as súas %(count)s actualizacións de progreso da lectura." #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" -msgstr "Actualizar as datas de lectura para \"%(title)s\"" +msgid "Update read dates for \"%(title)s\"" +msgstr "Actualizar as datas de lectura para «%(title)s»" #: bookwyrm/templates/readthrough/readthrough_form.html:10 #: bookwyrm/templates/readthrough/readthrough_modal.html:38 @@ -5026,6 +5137,11 @@ msgstr "Editar datas da lectura" msgid "Delete these read dates" msgstr "Eliminar estas datas da lectura" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "Actualizar as datas de lectura para \"%(title)s\"" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5036,41 +5152,33 @@ msgstr "Engadir datas de lectura para \"%(title)s\"" msgid "Report" msgstr "Denunciar" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "\n" -" Escanear Código de barras\n" -" " - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "Accedendo á cámara..." -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "Permite o acceso á cámara para escanear o código de barras do libro." -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "Non hai acceso á cámara" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "Escaneando..." -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "Aliña o código de barras do libro coa cámara." -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "ISBN escaneado" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "Buscando o libro:" @@ -5171,13 +5279,13 @@ msgstr "Falso" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 msgid "Start date:" msgstr "Data de inicio:" #: bookwyrm/templates/settings/announcements/announcement.html:62 #: bookwyrm/templates/settings/announcements/edit_announcement.html:89 -#: bookwyrm/templates/settings/dashboard/dashboard.html:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "Data de fin:" @@ -5551,7 +5659,7 @@ msgid "Dashboard" msgstr "Taboleiro" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "Total de usuarias" @@ -5565,31 +5673,31 @@ msgstr "Activas este mes" msgid "Works" msgstr "Traballos" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "Actividade na instancia" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "Intervalo:" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "Días" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "Semanas" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "Rexistros de usuarias" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "Actividade do estado" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "Traballos creados" @@ -5901,13 +6009,49 @@ msgid "Unable to save settings" msgstr "Non se gardaron os axustes" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "Requerir peticións GET asinadas" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "Recomendable" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "Evita solicitudes anónimas desde instancias federadas. É máis ou menos equivalente ao «modo seguro» de Mastodon ou «AUTHORIZED_FETCH»" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "Evitar visualizacións sen autenticación" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "Evita que usuarias anónimas vexan a maioría das páxinas. Para bloquear tamén as solicitudes JSON activa «Requerir peticións GET asinadas»" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "Desactivar a federación" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "Coidado" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "Evita que a túa instancia interactúe con outros servizos federados. Os datos existentes de outras instancias vanse manter." +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "Bloquear búsquedas entrantes" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "Non recomendable" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "Evita que outros servidores fagan búsquedas na túa instancia. Recomendámosche que NON actives esta opción." + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6618,10 +6762,6 @@ msgstr "Programar tarefas" msgid "Tasks" msgstr "Tarefas" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "Nome" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "Tarefa Celery" @@ -7281,10 +7421,6 @@ msgstr "Cita:" msgid "An excerpt from '%(book_title)s'" msgstr "Un extracto de '%(book_title)s'" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "Posición:" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "Na páxina:" @@ -7297,12 +7433,12 @@ msgstr "Na porcentaxe:" msgid "to" msgstr "para" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "A túa recensión de '%(book_title)s'" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "Recensión:" @@ -7403,6 +7539,13 @@ msgid_plural "rated %(title)s: %(display_ratin msgstr[0] "valorado %(title)s: %(display_rating)s estrela" msgstr[1] "valorado %(title)s: %(display_rating)s estrelas" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "Valorou «%(book_title)s» con %(display_rating)s estrela %(review_title)s" +msgstr[1] "Valorou «%(book_title)s» con %(display_rating)s estrelas %(review_title)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" @@ -7615,35 +7758,35 @@ msgstr "Rematar a lectura" msgid "Show rating" msgstr "Mostrar valoración" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "Mostrar estado" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "(Páxina %(page)s" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "%(endpage)s" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "(%(percent)s%%" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr " - %(endpercent)s%%" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "Abrir imaxe en nova xanela" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "Agochar estado" @@ -7702,16 +7845,22 @@ msgstr "comezou a ler %(book)s de %(book)s" msgstr "comezou a ler %(book)s" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "recensionou %(book)s de %(author_name)s" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "recensionou %(book)s" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "valorou %(book)s" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -7990,15 +8139,23 @@ msgid_plural "%(num)d books - by %(user)s" msgstr[0] "%(num)d libro - por %(user)s" msgstr[1] "%(num)d libros - por %(user)s" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "unha nova conta de usuaria" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "Hai outro libro na serie co mesmo valor" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "A posición na serie ten que ser única para cada libro" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/he_IL/LC_MESSAGES/django.po b/locale/he_IL/LC_MESSAGES/django.po index 1a51faa59a..6ab0723429 100644 --- a/locale/he_IL/LC_MESSAGES/django.po +++ b/locale/he_IL/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-06 18:48\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-06-07 19:46\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Hebrew\n" "Language: he\n" @@ -107,7 +107,7 @@ msgstr "כותרת ספר" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "דירוג" @@ -175,39 +175,43 @@ msgstr "מחיקת מגשר" msgid "Domain block" msgstr "חסימת דומיין" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "אודיובוק" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "ספר אלקטרוני" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "נובלה גרפית" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "כריכה קשה" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "כריכה רכה" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -449,33 +453,33 @@ msgstr "" #: bookwyrm/models/status.py:191 #, python-format msgid "%(display_name)s's status" -msgstr "" +msgstr "הסטטוס של %(display_name)s" #: bookwyrm/models/status.py:365 #, python-format msgid "%(display_name)s's comment on %(book_title)s" -msgstr "" +msgstr "התגובה של %(display_name)s על %(book_title)s" #: bookwyrm/models/status.py:416 #, python-format msgid "%(display_name)s's quote from %(book_title)s" -msgstr "" +msgstr "הציטוט של %(display_name)s מתוך %(book_title)s" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" -msgstr "" +msgstr "הביקורת של %(display_name)s על %(book_title)s" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" -msgstr[0] "" +msgstr[0] "%(display_name)s דירג.ה את %(book_title)s: %(display_rating).1f כוכב" msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "ביקורות" @@ -491,19 +495,19 @@ msgstr "ציטוטים" msgid "Everything else" msgstr "כל השאר" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "ציר זמן הבית" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "ראשי" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "ציר זמן הספרים" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -512,91 +516,91 @@ msgstr "ציר זמן הספרים" msgid "Books" msgstr "ספרים" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "אנגלית" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "Català (קטלנית)" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "Deutsch (גרמנית)" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "Esperanto (אספרנטו)" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "Español (ספרדית)" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "Euskara (באסקית)" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "Galego (גליציאנית)" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "Italiano (איטלקית)" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "한국어 (קוריאנית)" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "Suomi (פינית)" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "Français (צרפתית)" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (ליטאית)" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "Nederlands (הולנדית)" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "Norsk (נורווגית)" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "Polski (פולנית)" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (פוטוגזית ברזילאית)" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (פורטוגזית אירופאית)" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "Română (רומנית)" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "Svenska (שוודית)" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "Українська (אוקראינית)" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (סינית מפושטת)" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (סינית מסורתית)" @@ -611,7 +615,7 @@ 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 "" +msgstr "אין לך הרשאה לצפות בעמוד זה או לבצע את הפעולה הזו. רמת הרשאות המשתמש שלך היא %(level)s." #: bookwyrm/templates/403.html:15 msgid "If you think you should have access, please speak to your BookWyrm server administrator." @@ -845,7 +849,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -920,57 +924,62 @@ msgstr "נולד.ה:" msgid "Died:" msgstr "מת.ה:" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "סדרה:" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "קישורים חיצוניים" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "ויקיפדיה" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "אתר" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "צפייה ברשומת ISNI" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "לצפייה ב-ISFDB" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "טען.י מידע" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "צפייה ב-OpenLibrary" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "צפייה ב-Inventaire" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "צפייה ב-LibraryThing" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "צפייה ב-Goodreads" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "ספרים מאת %(name)s" @@ -1007,8 +1016,8 @@ msgid "Name:" msgstr "שם:" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "יש להפריד ערכים מרובים באמצעות פסיקים" @@ -1045,7 +1054,8 @@ msgid "Openlibrary key:" msgstr "מפתח Openlibrary:" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "מזהה Inventaire:" @@ -1054,7 +1064,7 @@ msgid "Librarything key:" msgstr "מפתח Librarything:" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "מפתח Goodreads:" @@ -1067,8 +1077,8 @@ msgid "ISNI:" msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1080,7 +1090,7 @@ msgstr "ISNI:" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1092,10 +1102,10 @@ msgstr "שמירה" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1105,7 +1115,7 @@ msgstr "שמירה" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1122,7 +1132,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "טעינת מידע תוביל לחיבור ל-%(source_name)s ותאתר כל פריט מטא-דאטה שאינו מופיע כאן. מטא-דאטה קיים לא ישוכתב." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1139,31 +1150,50 @@ msgstr "אישור" msgid "Unable to connect to remote source." msgstr "לא ניתן להתחבר למקור מרוחק." -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "ערוך ספר" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "לחץ.י להוספת כריכה" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "טעינת כריכה נכשלה" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "לחץ.י להגדלה" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" @@ -1172,17 +1202,17 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "(%(review_count)s ביקורות)" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "הוספת תיאור" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "תיאור:" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" @@ -1191,49 +1221,49 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "הנחת את המהדורה על מדף:" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, 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:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "פעילות הקריאה שלך" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "הוספת תאריכי קריאה" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "אין פעילות קריאה עבור ספר זה." -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "הביקורות שלך" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "התגובות שלך" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "הציטוטים שלך" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "נושאים" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "מקומות" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1248,15 +1278,15 @@ msgstr "מקומות" msgid "Lists" msgstr "רשימות" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "הוספה לרשימה" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1279,25 +1309,26 @@ msgid "Copied ISBN!" msgstr "ISBN הועתק!" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "מספר OCLC:" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "ASIN:" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "Audible ASIN:" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "ISFDB ID:" @@ -1308,12 +1339,12 @@ msgid "Goodreads:" msgstr "Goodreads:" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1322,12 +1353,12 @@ msgid "Add cover" msgstr "הוספת כריכה" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "העלאת כריכה:" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "טעינת כריכה מכתובת:" @@ -1392,15 +1423,32 @@ msgstr "זהו מחבר/ת חדש/ה" msgid "Creating a new author: %(name)s" msgstr "יוצר מחבר/ת חדש/ה: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "האם זוהי מהדורה של ספר קיים?" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "זו עבודה חדשה" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1462,124 +1510,190 @@ msgstr "מיין כותרת:" msgid "Subtitle:" msgstr "כותרת משנה:" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "סדרה:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "מספר סדרה:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "שפות:" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "נושאים:" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "הוספת נושא" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "הסרת נושא" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "הוסיפו נושא" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "פרסום" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "הוצאה:" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "פורסם לראשונה בתאריך:" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "פורסם בתאריך:" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "מחברים-ות" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "הסר %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "עמוד המחבר-ת של %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "הוסיפו מחברים-ות:" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "הוסיפו מחבר-ת" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "פלוני-ת אלמוני-ת" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "הוספת מחבר/ת נוסף/ת" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "כריכה" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "מאפיינים פיזיים" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "פורמט:" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "פרטי פורמט:" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "עמודים:" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "מזהי ספר" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "ISBN 13:" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "ISBN 10:" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "מזהה Openlibrary:" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1766,19 +1880,11 @@ msgstr "פורסם בתאריך: %(date)s" msgid "rated it" msgstr "דירג/ה" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "סדרה מאת" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "" -#: 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." @@ -1823,7 +1929,7 @@ msgstr "קוד אימות:" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "הגשה" @@ -1884,7 +1990,7 @@ msgstr "" #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1982,21 +2088,22 @@ msgid "%(username)s started reading %(username)s rated %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "" @@ -2182,14 +2289,14 @@ msgstr "אין פעילויות כרגע! נסו לעקוב אחרי משתמש msgid "Alternatively, you can try enabling more status types" msgstr "לחלופין, ניתן להפעיל סוגי סטטוס נוספים" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: 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 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "ניתן לקבוע או לשנות את יעד הקריאה בכל זמן מ->עמוד הפרופיל שלך" @@ -2477,6 +2584,10 @@ msgstr "בקבוצה זו אין רשימות" msgid "Edit group" msgstr "עריכת קבוצה" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "חפש/י כדי להוסיף משתמש" @@ -3725,6 +3836,7 @@ msgid "Search for a book, author, user, or list" msgstr "" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "סרוק/י ברקוד" @@ -4347,7 +4459,7 @@ msgstr[2] "" msgstr[3] "" #: bookwyrm/templates/notifications/items/status_preview.html:4 -#: bookwyrm/templates/snippets/status/content_status.html:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "אזהרת תוכן" @@ -4816,7 +4928,7 @@ msgstr "" 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 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "הורד קובץ" @@ -5009,9 +5121,8 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "" #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" +msgid "Update read dates for \"%(title)s\"" msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 @@ -5066,6 +5177,11 @@ msgstr "" msgid "Delete these read dates" msgstr "" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5076,41 +5192,33 @@ msgstr "" 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 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "מבקש מצלמה..." -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "אפשרו גישה למצלמה כדי לסרוק ברקוד של ספר." -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "לא ניתן היה להשתמש במצלמה" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "סורק..." -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "ישרו את הברקוד אל מול המצלמה." -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "מסת\"ב (ISBN) נסרק" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "מחפש ספר:" @@ -5215,13 +5323,13 @@ msgstr "" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 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:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "" @@ -5595,7 +5703,7 @@ msgid "Dashboard" msgstr "לוח בקרה" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "סך הכל משתמשים" @@ -5609,31 +5717,31 @@ msgstr "" msgid "Works" msgstr "יצירות" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "פעילות בשרת" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "מרווח זמן:" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "ימים" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "שבועות" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "פעילות הרשמה" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "" @@ -5953,13 +6061,49 @@ msgid "Unable to save settings" msgstr "" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6670,10 +6814,6 @@ msgstr "" msgid "Tasks" msgstr "" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "" @@ -7337,10 +7477,6 @@ msgstr "ציטוט:" 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 "" @@ -7353,12 +7489,12 @@ msgstr "" msgid "to" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "" @@ -7467,6 +7603,15 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + #: 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" @@ -7681,35 +7826,35 @@ msgstr "" msgid "Show rating" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "הסתר סטטוס" @@ -7768,16 +7913,22 @@ msgstr "" msgid "started reading %(book)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -8062,15 +8213,23 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "%(num)d ספרים - מאת %(user)s" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/hu_HU/LC_MESSAGES/django.po b/locale/hu_HU/LC_MESSAGES/django.po index 46f3e87039..cb559a9215 100644 --- a/locale/hu_HU/LC_MESSAGES/django.po +++ b/locale/hu_HU/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-06 18:48\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:13\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Hungarian\n" "Language: hu\n" @@ -107,7 +107,7 @@ msgstr "Könyv címe" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "Értékelés" @@ -175,39 +175,43 @@ msgstr "Moderátor által törölve" msgid "Domain block" msgstr "Domain tiltás" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "Hangoskönyv" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "e-Könyv" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "Képregényalbum" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "Keménytáblás" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "Puhatáblás" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,19 +465,19 @@ msgstr "" msgid "%(display_name)s's quote from %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" msgstr[0] "" msgstr[1] "" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "" @@ -489,19 +493,19 @@ msgstr "" msgid "Everything else" msgstr "" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -510,91 +514,91 @@ msgstr "" msgid "Books" msgstr "" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "English (Angol)" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "Català (Katalán)" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "Deutsch (Német)" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "Esperanto (Eszperantó)" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "Español (Spanyol)" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "Euskara (Baszk)" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "Galego (Galiciai)" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "Italiano (Olasz)" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "한국어 (Koreai)" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "Suomi (Finn)" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "Français (Francia)" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (Litván)" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "" @@ -839,7 +843,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -910,57 +914,62 @@ msgstr "" msgid "Died:" msgstr "" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "" @@ -997,8 +1006,8 @@ msgid "Name:" msgstr "" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "" @@ -1035,7 +1044,8 @@ msgid "Openlibrary key:" msgstr "" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "" @@ -1044,7 +1054,7 @@ msgid "Librarything key:" msgstr "" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "" @@ -1057,8 +1067,8 @@ msgid "ISNI:" msgstr "" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1070,7 +1080,7 @@ msgstr "" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1082,10 +1092,10 @@ msgstr "" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1095,7 +1105,7 @@ msgstr "" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1112,7 +1122,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "" #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1129,97 +1140,116 @@ msgstr "" msgid "Unable to connect to remote source." msgstr "" -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "" msgstr[1] "" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" msgstr[0] "" msgstr[1] "" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "" -#: bookwyrm/templates/book/book.html:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "" -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1234,15 +1264,15 @@ msgstr "" msgid "Lists" msgstr "" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1265,25 +1295,26 @@ msgid "Copied ISBN!" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "" @@ -1294,12 +1325,12 @@ msgid "Goodreads:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1308,12 +1339,12 @@ msgid "Add cover" msgstr "" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "" @@ -1378,15 +1409,32 @@ msgstr "" msgid "Creating a new author: %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1448,124 +1496,190 @@ msgstr "" msgid "Subtitle:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1752,19 +1866,11 @@ msgstr "" msgid "rated it" msgstr "" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "" -#: 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." @@ -1809,7 +1915,7 @@ msgstr "" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "" @@ -1870,7 +1976,7 @@ msgstr "" #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1964,21 +2070,22 @@ msgid "%(username)s started reading %(username)s rated %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "" @@ -2164,14 +2271,14 @@ msgstr "" msgid "Alternatively, you can try enabling more status types" msgstr "" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: bookwyrm/templates/feed/layout.html:14 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" msgstr "" -#: bookwyrm/templates/feed/goal_card.html:18 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "" @@ -2459,6 +2566,10 @@ msgstr "" msgid "Edit group" msgstr "" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "" @@ -3697,6 +3808,7 @@ msgid "Search for a book, author, user, or list" msgstr "" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "" @@ -4309,7 +4421,7 @@ msgstr[0] "" msgstr[1] "" #: bookwyrm/templates/notifications/items/status_preview.html:4 -#: bookwyrm/templates/snippets/status/content_status.html:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "" @@ -4776,7 +4888,7 @@ msgstr "" 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 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "" @@ -4969,9 +5081,8 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "" #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" +msgid "Update read dates for \"%(title)s\"" msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 @@ -5026,6 +5137,11 @@ msgstr "" msgid "Delete these read dates" msgstr "" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5036,39 +5152,33 @@ msgstr "" msgid "Report" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "" - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "" @@ -5169,13 +5279,13 @@ msgstr "" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 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:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "" @@ -5549,7 +5659,7 @@ msgid "Dashboard" msgstr "" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "" @@ -5563,31 +5673,31 @@ msgstr "" msgid "Works" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "" @@ -5899,13 +6009,49 @@ msgid "Unable to save settings" msgstr "" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6616,10 +6762,6 @@ msgstr "" msgid "Tasks" msgstr "" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "" @@ -7279,10 +7421,6 @@ msgstr "" msgid "An excerpt from '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "" @@ -7295,12 +7433,12 @@ msgstr "" msgid "to" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "" @@ -7401,6 +7539,13 @@ msgid_plural "rated %(title)s: %(display_ratin msgstr[0] "" msgstr[1] "" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" +msgstr[1] "" + #: 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" @@ -7613,35 +7758,35 @@ msgstr "" msgid "Show rating" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "" @@ -7700,16 +7845,22 @@ msgstr "" msgid "started reading %(book)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -7988,15 +8139,23 @@ msgid_plural "%(num)d books - by %(user)s" msgstr[0] "" msgstr[1] "" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/id_ID/LC_MESSAGES/django.po b/locale/id_ID/LC_MESSAGES/django.po index 08ea9f9a57..527639dff4 100644 --- a/locale/id_ID/LC_MESSAGES/django.po +++ b/locale/id_ID/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-06 18:49\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-06-07 05:49\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Indonesian\n" "Language: id\n" @@ -19,51 +19,51 @@ msgstr "" #: bookwyrm/forms/admin.py:42 msgid "One Day" -msgstr "" +msgstr "Satu Hari" #: bookwyrm/forms/admin.py:43 msgid "One Week" -msgstr "" +msgstr "Satu Minggu" #: bookwyrm/forms/admin.py:44 msgid "One Month" -msgstr "" +msgstr "Satu Bulan" #: bookwyrm/forms/admin.py:45 msgid "Does Not Expire" -msgstr "" +msgstr "Tidak Kedaluwarsa" #: bookwyrm/forms/admin.py:50 msgid "Unlimited" -msgstr "" +msgstr "Tanpa Batas" #: bookwyrm/forms/edit_user.py:100 bookwyrm/views/landing/password.py:117 msgid "Incorrect password" -msgstr "" +msgstr "Sandi salah" #: bookwyrm/forms/edit_user.py:107 bookwyrm/forms/landing.py:93 msgid "Password does not match" -msgstr "" +msgstr "Sandi tidak cocok" #: bookwyrm/forms/edit_user.py:130 msgid "Incorrect Password" -msgstr "" +msgstr "Sandi Tidak Cocok" #: bookwyrm/forms/forms.py:60 msgid "Reading finish date cannot be before start date." -msgstr "" +msgstr "Tanggal selesai baca tidak boleh sebelum tanggal mulai baca." #: bookwyrm/forms/forms.py:65 msgid "Reading stopped date cannot be before start date." -msgstr "" +msgstr "Tangga berhenti baca tidak boleh sebelum tanggal mulai baca." #: bookwyrm/forms/forms.py:73 msgid "Reading stopped date cannot be in the future." -msgstr "" +msgstr "Tanggal berhenti baca tidak boleh pada masa depan." #: bookwyrm/forms/forms.py:80 msgid "Reading finished date cannot be in the future." -msgstr "" +msgstr "Tanggal selesai baca tidak boleh pada masa depan." #: bookwyrm/forms/landing.py:37 msgid "Username or password are incorrect" @@ -79,11 +79,11 @@ msgstr "Pengguna dengan surel ini sudah terdaftar." #: bookwyrm/forms/landing.py:69 msgid "This email address cannot be registered." -msgstr "" +msgstr "Alamat surel ini tidak dapat didaftarkan." #: bookwyrm/forms/landing.py:114 msgid "Password cannot be the same as your current password" -msgstr "" +msgstr "Sandi tidak boleh sama dengan sandi Anda saat ini" #: bookwyrm/forms/landing.py:144 bookwyrm/forms/landing.py:152 msgid "Incorrect code" @@ -91,15 +91,15 @@ msgstr "Kode salah" #: bookwyrm/forms/links.py:34 msgid "This domain is blocked. Please contact your administrator if you think this is an error." -msgstr "" +msgstr "Domain ini diblokir. Silakan hubungi administrator Anda jika memang ada kesalahan." #: bookwyrm/forms/links.py:47 msgid "This link has already been added for this book. If it is not visible, the domain is still pending." -msgstr "" +msgstr "Tautan ini sudah ditambahkan untuk buku ini. Jika tidak terlihat, domain masih tetap ditunda." #: bookwyrm/forms/lists.py:26 msgid "List Order" -msgstr "" +msgstr "Urutan Daftar" #: bookwyrm/forms/lists.py:27 msgid "Book Title" @@ -107,7 +107,7 @@ msgstr "Judul buku" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "Nilai" @@ -117,15 +117,15 @@ msgstr "Urutkan" #: bookwyrm/forms/lists.py:34 msgid "Ascending" -msgstr "" +msgstr "Naik" #: bookwyrm/forms/lists.py:35 msgid "Descending" -msgstr "" +msgstr "Turun" #: bookwyrm/models/announcement.py:12 msgid "Primary" -msgstr "" +msgstr "Utama" #: bookwyrm/models/announcement.py:13 msgid "Success" @@ -134,7 +134,7 @@ msgstr "Berhasil" #: bookwyrm/models/announcement.py:14 #: bookwyrm/templates/settings/invites/manage_invites.html:47 msgid "Link" -msgstr "" +msgstr "Tautan" #: bookwyrm/models/announcement.py:15 msgid "Warning" @@ -142,131 +142,135 @@ msgstr "Peringatan" #: bookwyrm/models/announcement.py:16 msgid "Danger" -msgstr "" +msgstr "Bahaya" #: bookwyrm/models/antispam.py:114 bookwyrm/models/antispam.py:148 msgid "Automatically generated report" -msgstr "" +msgstr "Laporan yang dibuat otomatis" #: bookwyrm/models/base_model.py:19 bookwyrm/models/import_job.py:50 #: bookwyrm/models/job.py:18 bookwyrm/models/link.py:77 #: bookwyrm/templates/import/import_status.html:214 #: bookwyrm/templates/settings/link_domains/link_domains.html:19 msgid "Pending" -msgstr "" +msgstr "Ditunda" #: bookwyrm/models/base_model.py:20 msgid "Self deletion" -msgstr "" +msgstr "Penghapusan mandiri" #: bookwyrm/models/base_model.py:21 msgid "Self deactivation" -msgstr "" +msgstr "Deaktivasi mandiri" #: bookwyrm/models/base_model.py:22 msgid "Moderator suspension" -msgstr "" +msgstr "Penangguhan oleh moderator" #: bookwyrm/models/base_model.py:23 msgid "Moderator deletion" -msgstr "" +msgstr "Penghapusan oleh moderator" #: bookwyrm/models/base_model.py:24 msgid "Domain block" -msgstr "" +msgstr "Blokir domain" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" -msgstr "" +msgstr "Audiobook" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" -msgstr "" +msgstr "Buku-el" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" -msgstr "" +msgstr "Novel grafik" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" -msgstr "" +msgstr "Sampul keras" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" -msgstr "" +msgstr "Sampul tipis" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" -msgstr "" +msgstr "%(value)s tidak tampak seperti ISBN" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" -msgstr "" +msgstr "%(value)s tidak sesuai dengan checksum ISBN, kami mengharapkan %(check_version)s" + +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "Buku sudah ada di serial ini" #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 msgid "Comment" -msgstr "" +msgstr "Komentar" #: bookwyrm/models/bookwyrm_import_job.py:152 #: bookwyrm/templates/import/import_status.html:127 #: bookwyrm/templates/import/manual_review.html:13 #: bookwyrm/templates/snippets/create_status.html:16 msgid "Review" -msgstr "" +msgstr "Ulasan" #: bookwyrm/models/bookwyrm_import_job.py:153 msgid "Quotation" -msgstr "" +msgstr "Kutipan" #: bookwyrm/models/bookwyrm_import_job.py:181 #: bookwyrm/templates/snippets/follow_button.html:24 msgid "Follow" -msgstr "" +msgstr "Ikuti" #: bookwyrm/models/bookwyrm_import_job.py:182 #: 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 "" +msgstr "Blokir" #: bookwyrm/models/bookwyrm_import_job.py:395 msgid "Unknown error importing book" -msgstr "" +msgstr "Eror tidak diketahui saat mengimpor buku" #: bookwyrm/models/bookwyrm_import_job.py:490 msgid "unauthorized" -msgstr "" +msgstr "tidak sah" #: bookwyrm/models/bookwyrm_import_job.py:496 msgid "Unknown error importing book status" -msgstr "" +msgstr "Status eror tidak diketahui saat mengimpor buku" #: bookwyrm/models/bookwyrm_import_job.py:686 #: bookwyrm/models/bookwyrm_import_job.py:711 msgid "connection_error" -msgstr "" +msgstr "connection_error" #: bookwyrm/models/bookwyrm_import_job.py:721 msgid "invalid_relationship" -msgstr "" +msgstr "invalid_relationship" #: bookwyrm/models/bookwyrm_import_job.py:729 msgid "Unkown error importing relationship" -msgstr "" +msgstr "Eror tidak diketahui saat mengimpor hubungan" #: bookwyrm/models/federated_server.py:12 #: bookwyrm/templates/settings/federation/edit_instance.html:55 #: bookwyrm/templates/settings/federation/instance_list.html:22 msgid "Federated" -msgstr "" +msgstr "Terfederasi" #: bookwyrm/models/federated_server.py:13 bookwyrm/models/link.py:76 #: bookwyrm/templates/settings/federation/edit_instance.html:56 @@ -274,26 +278,26 @@ msgstr "" #: bookwyrm/templates/settings/federation/instance_list.html:26 #: bookwyrm/templates/settings/link_domains/link_domains.html:27 msgid "Blocked" -msgstr "" +msgstr "Diblokir" #: bookwyrm/models/fields.py:36 #, python-format msgid "%(value)s is not a valid remote_id" -msgstr "" +msgstr "%(value)s bukan remote_id yang valid" #: bookwyrm/models/fields.py:45 bookwyrm/models/fields.py:54 #, python-format msgid "%(value)s is not a valid username" -msgstr "" +msgstr "%(value)s buka nama pengguna yang valid" #: bookwyrm/models/fields.py:201 bookwyrm/templates/layout.html:129 #: bookwyrm/templates/ostatus/error.html:29 msgid "username" -msgstr "" +msgstr "nama pengguna" #: bookwyrm/models/fields.py:206 msgid "A user with that username already exists." -msgstr "" +msgstr "Pengguna dengan nama tersebut sudah ada." #: bookwyrm/models/fields.py:225 #: bookwyrm/templates/snippets/privacy-icons.html:3 @@ -301,7 +305,7 @@ msgstr "" #: bookwyrm/templates/snippets/privacy_select.html:11 #: bookwyrm/templates/snippets/privacy_select_no_followers.html:11 msgid "Public" -msgstr "" +msgstr "Publik" #: bookwyrm/models/fields.py:226 #: bookwyrm/templates/snippets/privacy-icons.html:7 @@ -309,7 +313,7 @@ msgstr "" #: bookwyrm/templates/snippets/privacy_select.html:14 #: bookwyrm/templates/snippets/privacy_select_no_followers.html:14 msgid "Unlisted" -msgstr "" +msgstr "Tidak terdaftar" #: bookwyrm/models/fields.py:227 #: bookwyrm/templates/snippets/privacy_select.html:17 @@ -318,7 +322,7 @@ msgstr "" #: bookwyrm/templates/user/relationships/followers.html:21 #: bookwyrm/templates/user/relationships/layout.html:11 msgid "Followers" -msgstr "" +msgstr "Pengikut" #: bookwyrm/models/fields.py:228 #: bookwyrm/templates/snippets/create_status/post_options_block.html:6 @@ -327,15 +331,15 @@ msgstr "" #: bookwyrm/templates/snippets/privacy_select.html:20 #: bookwyrm/templates/snippets/privacy_select_no_followers.html:17 msgid "Private" -msgstr "" +msgstr "Privat" #: bookwyrm/models/housekeeping.py:117 msgid "Missing" -msgstr "" +msgstr "Hilang" #: bookwyrm/models/housekeeping.py:118 msgid "Wrong Path" -msgstr "" +msgstr "Jalur Salah" #: bookwyrm/models/import_job.py:51 bookwyrm/models/job.py:19 #: bookwyrm/templates/import/import.html:184 @@ -348,7 +352,7 @@ msgstr "" #: bookwyrm/templates/settings/imports/imports.html:270 #: bookwyrm/templates/snippets/user_active_tag.html:8 msgid "Active" -msgstr "" +msgstr "Aktif" #: bookwyrm/models/import_job.py:52 bookwyrm/models/job.py:20 #: bookwyrm/templates/import/import.html:182 @@ -358,265 +362,265 @@ msgstr "" #: bookwyrm/templates/settings/files.html:160 #: bookwyrm/templates/settings/files.html:342 msgid "Complete" -msgstr "" +msgstr "Selesai" #: bookwyrm/models/import_job.py:53 bookwyrm/models/job.py:21 msgid "Stopped" -msgstr "" +msgstr "Dihentikan" #: bookwyrm/models/import_job.py:87 bookwyrm/models/import_job.py:95 msgid "Import stopped" -msgstr "" +msgstr "Impor dihentikan" #: bookwyrm/models/import_job.py:377 bookwyrm/models/import_job.py:402 msgid "Error loading book" -msgstr "" +msgstr "Eror saat memuat buku" #: bookwyrm/models/import_job.py:386 msgid "Could not find a match for book" -msgstr "" +msgstr "Tidak dapat menemukan buku yang cocok" #: bookwyrm/models/job.py:22 #: bookwyrm/templates/import/user_import_status.html:69 msgid "Failed" -msgstr "" +msgstr "Gagal" #: bookwyrm/models/link.py:56 msgid "Free" -msgstr "" +msgstr "Gratis" #: bookwyrm/models/link.py:57 msgid "Purchasable" -msgstr "" +msgstr "Dapat dibeli" #: bookwyrm/models/link.py:58 msgid "Available for loan" -msgstr "" +msgstr "Dapat dipinjam" #: bookwyrm/models/link.py:75 #: bookwyrm/templates/settings/link_domains/link_domains.html:23 msgid "Approved" -msgstr "" +msgstr "Disetujui" #: bookwyrm/models/report.py:86 msgid "Resolved report" -msgstr "" +msgstr "Laporan diselesaikan" #: bookwyrm/models/report.py:87 msgid "Re-opened report" -msgstr "" +msgstr "Laporan dibuka kembali" #: bookwyrm/models/report.py:88 msgid "Messaged reporter" -msgstr "" +msgstr "Pesan pelapor" #: bookwyrm/models/report.py:89 msgid "Messaged reported user" -msgstr "" +msgstr "Pesan pengguna terlapor" #: bookwyrm/models/report.py:90 msgid "Suspended user" -msgstr "" +msgstr "Pengguna yang ditangguhkan" #: bookwyrm/models/report.py:91 msgid "Un-suspended user" -msgstr "" +msgstr "Pengguna yang batal ditangguhkan" #: bookwyrm/models/report.py:92 msgid "Changed user permission level" -msgstr "" +msgstr "Level hak pengguna yang diubah" #: bookwyrm/models/report.py:93 msgid "Deleted user account" -msgstr "" +msgstr "Akun pengguna yang dihapus" #: bookwyrm/models/report.py:94 msgid "Blocked domain" -msgstr "" +msgstr "Domain yang diblokir" #: bookwyrm/models/report.py:95 msgid "Approved domain" -msgstr "" +msgstr "Domain yang disetujui" #: bookwyrm/models/report.py:96 msgid "Deleted item" -msgstr "" +msgstr "Item yang dihapus" #: bookwyrm/models/session.py:43 msgid "Unknown" -msgstr "" +msgstr "Tidak diketahui" #: bookwyrm/models/status.py:191 #, python-format msgid "%(display_name)s's status" -msgstr "" +msgstr "Status %(display_name)s" #: bookwyrm/models/status.py:365 #, python-format msgid "%(display_name)s's comment on %(book_title)s" -msgstr "" +msgstr "Komentar %(display_name)s di %(book_title)s" #: bookwyrm/models/status.py:416 #, python-format msgid "%(display_name)s's quote from %(book_title)s" -msgstr "" +msgstr "Kutipan %(display_name)s dari %(book_title)s" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" -msgstr "" +msgstr "Ulasan %(display_name)s terhadap %(book_title)s" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" -msgstr[0] "" +msgstr[0] "%(display_name)s menilai %(book_title)s: %(display_rating).1f bintang" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" -msgstr "" +msgstr "Ulasan" #: bookwyrm/models/user.py:41 msgid "Comments" -msgstr "" +msgstr "Komentar" #: bookwyrm/models/user.py:42 bookwyrm/templates/import/import_user.html:154 msgid "Quotations" -msgstr "" +msgstr "Kutipan" #: bookwyrm/models/user.py:43 msgid "Everything else" -msgstr "" +msgstr "Yang lainnya" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" -msgstr "" +msgstr "Linimasa Beranda" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" -msgstr "" +msgstr "Beranda" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" -msgstr "" +msgstr "Linimasa Buku" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:44 #: bookwyrm/templates/user/layout.html:107 msgid "Books" -msgstr "" +msgstr "Buku" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "Bahasa Inggris" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "Català (Bahasa Katalan)" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "Deutsch (Bahasa Jerman)" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "Esperanto (Bahasa Esperanto)" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "Español (Bahasa Spanyol)" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" -msgstr "" +msgstr "Euskara (Basque)" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" -msgstr "" +msgstr "Galego (Galician)" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "Italiano (Bahasa Italia)" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" -msgstr "" +msgstr "한국어 (Korea)" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "Suomi (Bahasa Finlandia)" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "Français (Bahasa Prancis)" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (Bahasa Lithuania)" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "Nederlands (Bahasa Belanda)" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "Norsk (Bahasa Norwegia)" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "Polski (Bahasa Polandia)" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" -msgstr "" +msgstr "Português do Brasil (Portugis Brazil)" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" -msgstr "" +msgstr "Português Europeu (Portugis Eropa)" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" -msgstr "" +msgstr "Română (Rumania)" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" -msgstr "" +msgstr "Svenska (Swedia)" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" -msgstr "" +msgstr "Українська (Ukraina)" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" -msgstr "" +msgstr "简体中文 (Cina Sederhana)" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" -msgstr "" +msgstr "繁體中文 (Cina Tradisional)" #: bookwyrm/templates/403.html:5 msgid "Oh no!" -msgstr "" +msgstr "Oh tidak!" #: bookwyrm/templates/403.html:9 bookwyrm/templates/landing/invite.html:21 msgid "Permission Denied" -msgstr "" +msgstr "Izin Ditolak" #: 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 "" +msgstr "Anda tidak memiliki izin untuk melihat halaman ini atau melakukan hal ini. Level izin pengguna Anda adalah %(level)s." #: bookwyrm/templates/403.html:15 msgid "If you think you should have access, please speak to your BookWyrm server administrator." -msgstr "" +msgstr "Jika Anda pikir Anda harus memiliki akses, silakan sampaikan ke administrator server BookWyrm Anda." #: bookwyrm/templates/404.html:4 bookwyrm/templates/404.html:8 msgid "Not Found" -msgstr "" +msgstr "Tidak Ditemukan" #: bookwyrm/templates/404.html:9 msgid "The page you requested doesn't seem to exist!" @@ -624,15 +628,15 @@ msgstr "Laman tidak ditemukan" #: bookwyrm/templates/413.html:4 bookwyrm/templates/413.html:8 msgid "File too large" -msgstr "" +msgstr "Berkas terlalu besar" #: bookwyrm/templates/413.html:9 msgid "The file you are uploading is too large." -msgstr "" +msgstr "Berkas yang Anda unggah terlalu besar." #: bookwyrm/templates/413.html:11 msgid "You you can try using a smaller file, or ask your BookWyrm server administrator to increase the DATA_UPLOAD_MAX_MEMORY_SIZE setting." -msgstr "" +msgstr "Anda dapat mencoba dengan ukuran kecil, atau tanyakan ke administrator server BookWyrm Anda untuk meningkatkan pengaturan DATA_UPLOAD_MAX_MEMORY_SIZE." #: bookwyrm/templates/500.html:4 msgid "Oops!" @@ -644,7 +648,7 @@ msgstr "Galat server" #: bookwyrm/templates/500.html:9 msgid "Something went wrong! Sorry about that." -msgstr "" +msgstr "Ada yang salah! Mohon maaf." #: bookwyrm/templates/about/about.html:9 #: bookwyrm/templates/about/layout.html:35 @@ -660,400 +664,406 @@ msgstr "Selamat datang di %(site_name)s!" #: bookwyrm/templates/about/about.html:26 #, 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 adalah bagian BookWyrm, jaringan independen, berbasis komunitas untuk pembaca. Anda pun dapat berinteraksi lancar dengan pengguna di mana saja di jaringan BookWyrm, komunitas ini unik." #: bookwyrm/templates/about/about.html:47 #, 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 adalah buku yang paling disukai %(site_name)s, dengan rata-rata nilai %(rating)s dari 5." #: bookwyrm/templates/about/about.html:66 #, python-format msgid "More %(site_name)s users want to read %(title)s than any other book." -msgstr "" +msgstr "Lebih banyak pengguna %(site_name)s ingin membaca %(title)s dari pada buku lainnya." #: bookwyrm/templates/about/about.html:85 #, python-format msgid "%(title)s has the most divisive ratings of any book on %(site_name)s." -msgstr "" +msgstr "%(title)s memiliki nilai paling kontroversial dibandingkan buku manapun di %(site_name)s." #: bookwyrm/templates/about/about.html:96 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 "Lacak pembacaan Anda, ngobrol tentang buku, tulis ulasan, atau temukan bacaan lainnya. Akan selalu bebas iklan, anti-korporasi, dan berorientasi komunitas, BookWyrm adalah perangkat lunak yang diolah manusia, derancang untuk tetap kecil dan personal. Jika Anda memiliki permintaan fitur, laporan bug, atau impian, hubungi kami dan buat Anda didengar." #: bookwyrm/templates/about/about.html:107 msgid "Meet your admins" -msgstr "" +msgstr "Sapa admin Anda" #: bookwyrm/templates/about/about.html:110 #, 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 "" +msgstr "Moderator dan administrator %(site_name)s menjaga situs tetap berjalan, dan menjaga kode etik, serta merespon ketika pengguna melaporkan spam serta perilaku buruk." #: bookwyrm/templates/about/about.html:124 msgid "Moderator" -msgstr "" +msgstr "Moderator" #: bookwyrm/templates/about/about.html:126 bookwyrm/templates/user_menu.html:62 msgid "Admin" -msgstr "" +msgstr "Admin" #: bookwyrm/templates/about/about.html:142 #: 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 "" +msgstr "Kirim pesan langsung" #: 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 "" +msgstr "Kode Etik" #: 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 "" +msgstr "Impressum" #: bookwyrm/templates/about/layout.html:11 msgid "Active users:" -msgstr "" +msgstr "Pengguna aktif:" #: bookwyrm/templates/about/layout.html:15 msgid "Statuses posted:" -msgstr "" +msgstr "Status diposting:" #: bookwyrm/templates/about/layout.html:19 #: bookwyrm/templates/setup/config.html:68 msgid "Software version:" -msgstr "" +msgstr "Versi perangkat lunak:" #: 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 "" +msgstr "Tentang %(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 "" +msgstr "Kebijakan Privasi" #: bookwyrm/templates/annual_summary/layout.html:7 #: bookwyrm/templates/feed/summary_card.html:8 #, python-format msgid "%(year)s in the books" -msgstr "" +msgstr "%(year)s dalam buku" #: bookwyrm/templates/annual_summary/layout.html:43 #, python-format msgid "%(year)s in the books" -msgstr "" +msgstr "%(year)s dalam buku" #: bookwyrm/templates/annual_summary/layout.html:47 #, python-format msgid "%(display_name)s’s year of reading" -msgstr "" +msgstr "Tahun bacaan %(display_name)s" #: bookwyrm/templates/annual_summary/layout.html:53 msgid "Share this page" -msgstr "" +msgstr "Bagikan halaman ini" #: bookwyrm/templates/annual_summary/layout.html:67 msgid "Copy address" -msgstr "" +msgstr "Salin alamat" #: bookwyrm/templates/annual_summary/layout.html:68 #: bookwyrm/templates/lists/list.html:277 msgid "Copied!" -msgstr "" +msgstr "Disalin!" #: bookwyrm/templates/annual_summary/layout.html:77 msgid "Sharing status: public with key" -msgstr "" +msgstr "Status berbagi: publik dengan kunci" #: bookwyrm/templates/annual_summary/layout.html:78 msgid "The page can be seen by anyone with the complete address." -msgstr "" +msgstr "Halaman ini dapat dilihat siapa saja dengan alamat lengkap." #: bookwyrm/templates/annual_summary/layout.html:83 msgid "Make page private" -msgstr "" +msgstr "Buat halaman pribadi" #: bookwyrm/templates/annual_summary/layout.html:89 msgid "Sharing status: private" -msgstr "" +msgstr "Status berbagi: pribadi" #: bookwyrm/templates/annual_summary/layout.html:90 msgid "The page is private, only you can see it." -msgstr "" +msgstr "Halaman ini pribadi, hanya Anda yang dapat melihatnya." #: bookwyrm/templates/annual_summary/layout.html:95 msgid "Make page public" -msgstr "" +msgstr "Buat halaman publik" #: 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 "" +msgstr "Saat menjadikan halaman Anda sebagai pribadi, kunci lama tidak akan memberi akses ke halaman ini lagi. Kunci baru akan dibuat lagi saat ia dijadikan publik." #: bookwyrm/templates/annual_summary/layout.html:112 #, python-format msgid "Sadly %(display_name)s didn’t finish any books in %(year)s" -msgstr "" +msgstr "Sayangnya %(display_name)s tidak menyelesaikan buku apapun pada %(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] "" +msgstr[0] "Pada %(year)s, %(display_name)s membaca %(books_total)s buku
      dengan total halaman %(pages_total)s!" #: bookwyrm/templates/annual_summary/layout.html:124 msgid "That’s great!" -msgstr "" +msgstr "Hebat!" #: bookwyrm/templates/annual_summary/layout.html:128 #, python-format msgid "That makes an average of %(pages)s pages per book." -msgstr "" +msgstr "Itu sekitar rata-rata %(pages)s halaman per buku." #: 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] "" +msgstr[0] "(Tidak ada data halaman tersedia untuk %(no_page_number)s buku)" #: bookwyrm/templates/annual_summary/layout.html:150 msgid "Their shortest read this year…" -msgstr "" +msgstr "Bacaan terpendek tahun ini…" #: 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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 msgid "by" -msgstr "" +msgstr "oleh" #: bookwyrm/templates/annual_summary/layout.html:163 #: bookwyrm/templates/annual_summary/layout.html:184 #, python-format msgid "%(pages)s pages" -msgstr "" +msgstr "%(pages)s halaman" #: bookwyrm/templates/annual_summary/layout.html:171 msgid "…and the longest" -msgstr "" +msgstr "…dan yang terpanjang" #: 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] "" +msgstr[0] "%(display_name)s menarget membaca %(goal)s buku pada %(year)s,
      dan sudah mencapai %(goal_percent)s%% dari target tersebut" #: bookwyrm/templates/annual_summary/layout.html:211 msgid "Way to go!" -msgstr "" +msgstr "Bagus sekali!" #: 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 memberi nilai %(ratings_total)s,
      rata-rata nilainya adalah %(rating_average)s" #: bookwyrm/templates/annual_summary/layout.html:240 msgid "Their best rated review" -msgstr "" +msgstr "Nilai ulasan terbaik mereka" #: bookwyrm/templates/annual_summary/layout.html:253 #, python-format msgid "Their rating: %(rating)s" -msgstr "" +msgstr "Nilainya: %(rating)s" #: bookwyrm/templates/annual_summary/layout.html:270 #, python-format msgid "All the books %(display_name)s read in %(year)s" -msgstr "" +msgstr "Semua buku yang dibaca %(display_name)s tahun %(year)s" #: bookwyrm/templates/author/author.html:19 #: bookwyrm/templates/author/author.html:20 msgid "Edit Author" -msgstr "" +msgstr "Edit Penulis" #: bookwyrm/templates/author/author.html:36 msgid "Author details" -msgstr "" +msgstr "Rincian penulis" #: bookwyrm/templates/author/author.html:40 #: bookwyrm/templates/author/edit_author.html:42 msgid "Aliases:" -msgstr "" +msgstr "Alias:" #: bookwyrm/templates/author/author.html:49 msgid "Born:" -msgstr "" +msgstr "Lahir:" #: bookwyrm/templates/author/author.html:56 msgid "Died:" -msgstr "" +msgstr "Meninggal:" + +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "Serial:" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" -msgstr "" +msgstr "Tautan eksternal" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" -msgstr "" +msgstr "Wikipedia" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" -msgstr "" +msgstr "Lihat di Wikidata" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" -msgstr "" +msgstr "Situs web" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" -msgstr "" +msgstr "Lihat data ISNI" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" -msgstr "" +msgstr "Lihat di ISFDB" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" -msgstr "" +msgstr "Muat data" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" -msgstr "" +msgstr "Lihat di OpenLibrary" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" -msgstr "" +msgstr "Lihat di Inventaire" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" -msgstr "" +msgstr "Lihat di LibraryThing" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" -msgstr "" +msgstr "Lihat di Goodreads" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" -msgstr "" +msgstr "Buku oleh %(name)s" #: bookwyrm/templates/author/edit_author.html:5 msgid "Edit Author:" -msgstr "" +msgstr "Edit Penulis:" #: bookwyrm/templates/author/edit_author.html:13 #: bookwyrm/templates/book/edit/edit_book.html:25 msgid "Added:" -msgstr "" +msgstr "Ditambahkan:" #: bookwyrm/templates/author/edit_author.html:14 #: bookwyrm/templates/book/edit/edit_book.html:28 msgid "Updated:" -msgstr "" +msgstr "Diperbarui:" #: bookwyrm/templates/author/edit_author.html:16 #: bookwyrm/templates/book/edit/edit_book.html:32 msgid "Last edited by:" -msgstr "" +msgstr "Diedit terakhir oleh:" #: bookwyrm/templates/author/edit_author.html:33 #: bookwyrm/templates/book/edit/edit_book_form.html:21 msgid "Metadata" -msgstr "" +msgstr "Metadata" #: 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 "" +msgstr "Nama:" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." -msgstr "" +msgstr "Pisahkan banyak nilai dengan koma." #: bookwyrm/templates/author/edit_author.html:50 msgid "Bio:" -msgstr "" +msgstr "Bio:" #: bookwyrm/templates/author/edit_author.html:56 msgid "Wikipedia link:" -msgstr "" +msgstr "Tautan Wikipedia:" #: bookwyrm/templates/author/edit_author.html:58 msgid "Wikidata:" -msgstr "" +msgstr "Wikidata:" #: bookwyrm/templates/author/edit_author.html:62 msgid "Website:" -msgstr "" +msgstr "Situs web:" #: bookwyrm/templates/author/edit_author.html:67 msgid "Birth date:" -msgstr "" +msgstr "Tanggal lahir:" #: bookwyrm/templates/author/edit_author.html:74 msgid "Death date:" -msgstr "" +msgstr "Tanggal meninggal:" #: bookwyrm/templates/author/edit_author.html:81 msgid "Author Identifiers" -msgstr "" +msgstr "Pengidentifikasi Penulis" #: bookwyrm/templates/author/edit_author.html:83 msgid "Openlibrary key:" -msgstr "" +msgstr "Kunci Openlibrary:" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" -msgstr "" +msgstr "ID Inventaire:" #: bookwyrm/templates/author/edit_author.html:97 msgid "Librarything key:" -msgstr "" +msgstr "Kunci Librarything:" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" -msgstr "" +msgstr "Kunci Goodreads:" #: bookwyrm/templates/author/edit_author.html:111 msgid "ISFDB:" -msgstr "" +msgstr "ISFDB:" #: bookwyrm/templates/author/edit_author.html:118 msgid "ISNI:" -msgstr "" +msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1065,7 +1075,7 @@ msgstr "" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1073,14 +1083,14 @@ msgstr "" #: bookwyrm/templates/shelf/form.html:25 #: bookwyrm/templates/snippets/reading_modals/layout.html:18 msgid "Save" -msgstr "" +msgstr "Simpan" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1090,7 +1100,7 @@ msgstr "" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1099,15 +1109,16 @@ msgstr "" #: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:22 #: bookwyrm/templates/snippets/report_modal.html:52 msgid "Cancel" -msgstr "" +msgstr "Batal" #: 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 "" +msgstr "Memuat data akan menyambungkan ke %(source_name)s dan memeriksa matadata manapun tentang penulis yang tidak ditampilkan di sini. Metadata yang sudah ada tidak akan ditimpa." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1118,101 +1129,120 @@ msgstr "" #: bookwyrm/templates/settings/users/force_password_reset.html:55 #: bookwyrm/templates/snippets/remove_from_group_button.html:17 msgid "Confirm" -msgstr "" +msgstr "Konfirmasi" #: bookwyrm/templates/book/book.html:24 msgid "Unable to connect to remote source." +msgstr "Tidak dapat terkoneksi dengan sumber jarak jauh." + +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "Buku ini mungkin bagian dari serial %(series)s." + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "Edit ini untuk mengonfirmasi." + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" msgstr "" -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" msgstr[0] "" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "" -#: bookwyrm/templates/book/book.html:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "" -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1227,15 +1257,15 @@ msgstr "" msgid "Lists" msgstr "" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1258,25 +1288,26 @@ msgid "Copied ISBN!" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "" @@ -1287,12 +1318,12 @@ msgid "Goodreads:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1301,12 +1332,12 @@ msgid "Add cover" msgstr "" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "" @@ -1371,15 +1402,32 @@ msgstr "" msgid "Creating a new author: %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1441,124 +1489,190 @@ msgstr "" msgid "Subtitle:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1745,19 +1859,11 @@ msgstr "" msgid "rated it" msgstr "" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "" -#: 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." @@ -1802,7 +1908,7 @@ msgstr "" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "" @@ -1863,7 +1969,7 @@ msgstr "" #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1955,21 +2061,22 @@ msgid "%(username)s started reading %(username)s rated %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "" @@ -2155,14 +2262,14 @@ msgstr "" msgid "Alternatively, you can try enabling more status types" msgstr "" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: bookwyrm/templates/feed/layout.html:14 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" msgstr "" -#: bookwyrm/templates/feed/goal_card.html:18 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "" @@ -2450,6 +2557,10 @@ msgstr "" msgid "Edit group" msgstr "" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "" @@ -3683,6 +3794,7 @@ msgid "Search for a book, author, user, or list" msgstr "" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "" @@ -4290,7 +4402,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:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "" @@ -4756,7 +4868,7 @@ msgstr "" 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 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "" @@ -4949,9 +5061,8 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "" #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" +msgid "Update read dates for \"%(title)s\"" msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 @@ -5006,6 +5117,11 @@ msgstr "" msgid "Delete these read dates" msgstr "" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5016,39 +5132,33 @@ msgstr "" msgid "Report" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "" - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "" @@ -5147,13 +5257,13 @@ msgstr "" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 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:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "" @@ -5527,7 +5637,7 @@ msgid "Dashboard" msgstr "" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "" @@ -5541,31 +5651,31 @@ msgstr "" msgid "Works" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "" @@ -5873,13 +5983,49 @@ msgid "Unable to save settings" msgstr "" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6590,10 +6736,6 @@ msgstr "" msgid "Tasks" msgstr "" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "" @@ -7251,10 +7393,6 @@ msgstr "" msgid "An excerpt from '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "" @@ -7267,12 +7405,12 @@ msgstr "" msgid "to" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "" @@ -7369,6 +7507,12 @@ msgid "rated %(title)s: %(display_rating)s sta msgid_plural "rated %(title)s: %(display_rating)s stars" msgstr[0] "" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" + #: 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" @@ -7580,35 +7724,35 @@ msgstr "" msgid "Show rating" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "" @@ -7667,16 +7811,22 @@ msgstr "" msgid "started reading %(book)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -7952,15 +8102,23 @@ msgid "%(num)d book - by %(user)s" msgid_plural "%(num)d books - by %(user)s" msgstr[0] "" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/it_IT/LC_MESSAGES/django.po b/locale/it_IT/LC_MESSAGES/django.po index d25fef1fb0..43829b2830 100644 --- a/locale/it_IT/LC_MESSAGES/django.po +++ b/locale/it_IT/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-06 18:48\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:13\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Italian\n" "Language: it\n" @@ -107,7 +107,7 @@ msgstr "Titolo del libro" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "Valutazione" @@ -175,39 +175,43 @@ msgstr "Cancellazione del moderatore" msgid "Domain block" msgstr "Blocco del dominio" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "Audiolibro" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "eBook" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "Graphic novel" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "Copertina rigida" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "Brossura" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "“%(value)s” non rispetta il formato previsto per un ISBN" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "“%(value)s” non ha un codice di controllo ISBN corretto; valore atteso: %(check_version)s" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,19 +465,19 @@ msgstr "Commento di %(display_name)ssu %(book_title)s" msgid "%(display_name)s's quote from %(book_title)s" msgstr "Citazione di %(display_name)sda %(book_title)s" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "Recensione di %(display_name)sdi %(book_title)s" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" msgstr[0] "%(display_name)s ha valutato %(book_title)s: %(display_rating).1f stella" msgstr[1] "%(display_name)s ha valutato %(book_title)s: %(display_rating).1f stelle" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "Recensioni" @@ -489,19 +493,19 @@ msgstr "Citazioni" msgid "Everything else" msgstr "Tutto il resto" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "La tua timeline" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "Home" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "Timeline dei libri" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -510,91 +514,91 @@ msgstr "Timeline dei libri" msgid "Books" msgstr "Libri" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "English (Inglese)" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "Català (catalano)" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "Deutsch (Tedesco)" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "Esperanto (Esperanto)" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "Español (Spagnolo)" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "Euskara (Basque)" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "Galego (Galiziano)" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "Italiano (Italiano)" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "한국어 (Coreano)" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "Suomi (Finlandese)" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "Français (Francese)" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (Lituano)" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "Nederlands (Olandese)" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "Norsk (Norvegese)" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "Polski (Polacco)" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (Portoghese Brasiliano)" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Portoghese europeo)" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "Rumeno (Romanian)" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "Svenska (Svedese)" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "Українська (ucraino)" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (Cinese Semplificato)" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (Cinese Tradizionale)" @@ -839,7 +843,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -910,57 +914,62 @@ msgstr "Nascita:" msgid "Died:" msgstr "Morte:" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "Serie:" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "Collegamenti esterni" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "Wikipedia" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "Vedi su Wikidata" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "Sito web" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "Visualizza record ISNI" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "Vedi su ISFDB" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "Carica dati" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "Visualizza su OpenLibrary" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "Visualizza su Inventaire" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "Visualizza su LibraryThing" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "Visualizza su Goodreads" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "Libri di %(name)s" @@ -997,8 +1006,8 @@ msgid "Name:" msgstr "Nome:" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "Separa valori multipli con la virgola (,)" @@ -1035,7 +1044,8 @@ msgid "Openlibrary key:" msgstr "Chiave OpenLibrary:" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "Inventaire ID:" @@ -1044,7 +1054,7 @@ msgid "Librarything key:" msgstr "Chiave Librarything:" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "Chiave Goodreads:" @@ -1057,8 +1067,8 @@ msgid "ISNI:" msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1070,7 +1080,7 @@ msgstr "ISNI:" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1082,10 +1092,10 @@ msgstr "Salva" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1095,7 +1105,7 @@ msgstr "Salva" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1112,7 +1122,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "Il caricamento dei dati si connetterà a %(source_name)s e verificherà la presenza di eventuali metadata su questo autore non presenti qui. I metadata esistenti non verranno sovrascritti." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1129,97 +1140,116 @@ msgstr "Conferma" msgid "Unable to connect to remote source." msgstr "Impossibile connettersi alla sorgente remota." -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "Modifica libro" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "Clicca per aggiungere una copertina" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "Impossibile caricare la copertina" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "Clicca per ingrandire" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "Visualizza su Finna" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "(%(review_count)s recensione)" msgstr[1] "(%(review_count)s recensioni)" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "Aggiungi descrizione" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "Descrizione:" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" msgstr[0] "%(count)s edizione" msgstr[1] "%(count)s edizioni" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "Hai salvato questa edizione in:" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "Un’a edizione diversa di questo libro si trova nella tua libreria %(shelf_name)s." -#: bookwyrm/templates/book/book.html:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "Le tue attività di lettura" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "Aggiungi data di lettura" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "Non hai alcuna attività di lettura per questo libro." -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "Le tue recensioni" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "I tuoi commenti" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "Le tue citazioni" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "Argomenti" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "Luoghi" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1234,15 +1264,15 @@ msgstr "Luoghi" msgid "Lists" msgstr "Liste" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "Aggiungi all'elenco" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1265,25 +1295,26 @@ msgid "Copied ISBN!" msgstr "ISBN copiato!" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "Numero OCLC:" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "ASIN:" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "Audible ASIN:" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "ISFDB ID:" @@ -1294,12 +1325,12 @@ msgid "Goodreads:" msgstr "Goodreads:" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "Finna ID:" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1308,12 +1339,12 @@ msgid "Add cover" msgstr "Aggiungi copertina" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "Carica la copertina:" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "Carica la copertina dall'URL:" @@ -1378,15 +1409,32 @@ msgstr "Questo è un nuovo autore" msgid "Creating a new author: %(name)s" msgstr "Creazione di un nuovo autore: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "È un'edizione di un'opera esistente?" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "Si tratta di un nuovo lavoro" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1448,124 +1496,190 @@ msgstr "Ordina per titolo:" msgid "Subtitle:" msgstr "Sottotitolo:" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "Serie:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "Numero nella serie:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "Lingue:" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "Argomenti:" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "Aggiungi argomento" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "Rimuovi argomento" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "Aggiungi argomento" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "Posizione:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "Data di pubblicazione" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "Editore:" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "Prima data di pubblicazione:" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "Data di pubblicazione:" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "Autori" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "Rimuovi %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "Pagina autore per %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "Aggiungi Autori:" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "Aggiungi Autore" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "Jane Doe" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "Aggiungi un altro autore" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "Copertina" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "Caratteristiche" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "Formato:" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "Dettagli del formato:" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "Pagine:" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "Identificativi del Libro" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "ISBN 13:" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "ISBN 10:" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "OpenLibrary ID:" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "Nome" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1752,19 +1866,11 @@ msgstr "Pubblicato il %(date)s" msgid "rated it" msgstr "Valuta" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "Serie di" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "Libro %(series_number)s" -#: bookwyrm/templates/book/series.html:28 -msgid "Unsorted Book" -msgstr "Libro non ordinato" - #: 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." @@ -1809,7 +1915,7 @@ msgstr "Codice di conferma:" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "Invia" @@ -1870,7 +1976,7 @@ msgstr "Puoi cancellare in qualsiasi momento nelle impostazioni del tuo %(username)s started reading %(username)s ha iniziato a leggere %(book_title)s" #: bookwyrm/templates/discover/card-header.html:23 +#: bookwyrm/templates/discover/card-header.html:32 #, python-format msgid "%(username)s rated %(book_title)s" msgstr "%(username)s ha valutato %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "%(username)s ha recensito %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "%(username)s ha commentato %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "%(username)s ha citato %(book_title)s" @@ -2164,14 +2271,14 @@ msgstr "Non ci sono attività in questo momento! Prova a seguire qualcuno per in msgid "Alternatively, you can try enabling more status types" msgstr "In alternativa, puoi provare ad abilitare più tipi di stato" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: bookwyrm/templates/feed/layout.html:14 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" msgstr "Obiettivo di Lettura del %(year)s" -#: bookwyrm/templates/feed/goal_card.html:18 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "Puoi impostare o modificare il tuo obiettivo di lettura in qualsiasi momento dalla tua pagina del profilo" @@ -2459,6 +2566,10 @@ msgstr "Questo gruppo non ha alcuna lista" msgid "Edit group" msgstr "Modifica gruppo" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "Cerca o aggiungi utente" @@ -3701,6 +3812,7 @@ msgid "Search for a book, author, user, or list" msgstr "Cerca un libro, autore, utente o lista" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "Scansiona codice a barre" @@ -4313,7 +4425,7 @@ msgstr[0] "Un nuovo report necessita di moderazione" msgstr[1] "%(display_count)s nuovi report necessitano di moderazione" #: bookwyrm/templates/notifications/items/status_preview.html:4 -#: bookwyrm/templates/snippets/status/content_status.html:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "Avviso sul contenuto" @@ -4780,7 +4892,7 @@ msgstr "Esporta Elenco Libri" 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 "Il tuo file di esportazione CSV includerà tutti i libri sugli scaffali, libri che hai recensito e libri con attività di lettura.
      Usalo per importare in un servizio come Goodreads." -#: bookwyrm/templates/preferences/export.html:20 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "Scarica il file" @@ -4973,10 +5085,9 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "Stai eliminando questa lettura e i suoi %(count)s aggiornamenti di avanzamento associati." #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" -msgstr "Aggiorna date di lettura per \"%(title)s\"" +msgid "Update read dates for \"%(title)s\"" +msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 #: bookwyrm/templates/readthrough/readthrough_modal.html:38 @@ -5030,6 +5141,11 @@ msgstr "Modifica data di lettura" msgid "Delete these read dates" msgstr "Elimina queste date di lettura" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "Aggiorna date di lettura per \"%(title)s\"" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5040,41 +5156,33 @@ msgstr "Aggiungi date di lettura per \"%(title)s\"" msgid "Report" msgstr "Report" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "\n" -" Scansiona codice a barre\n" -" " - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "Richiesta fotocamera..." -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "Concedi l'accesso alla fotocamera per scansionare il codice a barre di un libro." -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "Impossibile accedere alla fotocamera" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "Ricerca in corso..." -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "Allinea il codice a barre del tuo libro con la fotocamera." -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "ISBN scansionato" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "Ricerca libro:" @@ -5175,13 +5283,13 @@ msgstr "Falso" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 msgid "Start date:" msgstr "Data d'inizio:" #: bookwyrm/templates/settings/announcements/announcement.html:62 #: bookwyrm/templates/settings/announcements/edit_announcement.html:89 -#: bookwyrm/templates/settings/dashboard/dashboard.html:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "Data di fine:" @@ -5555,7 +5663,7 @@ msgid "Dashboard" msgstr "Dashboard" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "Totale utenti" @@ -5569,31 +5677,31 @@ msgstr "Attivo questo mese" msgid "Works" msgstr "Lavori" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "Attività di Istanza" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "Intervallo:" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "Giorni" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "Settimane" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "Attività di registrazione dell'utente" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "Attività di stato" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "Opere create" @@ -5905,13 +6013,49 @@ msgid "Unable to save settings" msgstr "Impossibile salvare le impostazioni" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "Disabilita federazione" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6622,10 +6766,6 @@ msgstr "Attività pianificate" msgid "Tasks" msgstr "Attività" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "Nome" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "Task Celery" @@ -7285,10 +7425,6 @@ msgstr "Citazione:" msgid "An excerpt from '%(book_title)s'" msgstr "Un estratto da '%(book_title)s'" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "Posizione:" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "Alla pagina:" @@ -7301,12 +7437,12 @@ msgstr "Alla percentuale:" msgid "to" msgstr "a" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "La tua recensione di '%(book_title)s'" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "Recensione:" @@ -7407,6 +7543,13 @@ msgid_plural "rated %(title)s: %(display_ratin msgstr[0] "ha valutato %(title)s: %(display_rating)s stella" msgstr[1] "ha valutato %(title)s: %(display_rating)s stelle" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" +msgstr[1] "" + #: 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" @@ -7619,35 +7762,35 @@ msgstr "Finito di leggere" msgid "Show rating" msgstr "Mostra valutazione" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "Mostra stato" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "(Pagina %(page)s" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "%(endpage)s" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "(%(percent)s%%" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr " - %(endpercent)s%%" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "Apri immagine in una nuova finestra" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "Nascondi lo stato" @@ -7706,16 +7849,22 @@ msgstr "ha iniziato a leggere %(book)s di %(book)s" msgstr "hai iniziato a leggere %(book)s" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "ha recensito %(book)s di %(author_name)s" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "ha recensito %(book)s" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -7994,15 +8143,23 @@ msgid_plural "%(num)d books - by %(user)s" msgstr[0] "%(num)d libro - di %(user)s" msgstr[1] "%(num)d libri - di %(user)s" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "un nuovo utente registrato" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/ja_JP/LC_MESSAGES/django.po b/locale/ja_JP/LC_MESSAGES/django.po index 7df83660bb..847db323c9 100644 --- a/locale/ja_JP/LC_MESSAGES/django.po +++ b/locale/ja_JP/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-06 18:48\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:13\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Japanese\n" "Language: ja\n" @@ -107,7 +107,7 @@ msgstr "本のタイトル" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "評価" @@ -175,39 +175,43 @@ msgstr "モデレーターによる削除" msgid "Domain block" msgstr "ドメインブロック" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "オーディオブック" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "電子書籍" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "グラフィックノベル" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "ハードカバー" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "ペーパーバック" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,18 +465,18 @@ msgstr "" msgid "%(display_name)s's quote from %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" msgstr[0] "" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "レビュー" @@ -488,19 +492,19 @@ msgstr "引用" msgid "Everything else" msgstr "他のすべて" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "ホームタイムライン" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "ホーム" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "本のタイムライン" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -509,91 +513,91 @@ msgstr "本のタイムライン" msgid "Books" msgstr "本" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "English (英語)" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "Català(カタルーニャ語)" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "Deutsch (ドイツ語)" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "Esperanto (エスペラント)" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "Español (スペイン語)" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "Euskara (バスク語)" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "Galego (ガリシア語)" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "Italiano (イタリア語)" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "Suomi (フィンランド語)" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "Français (フランス語)" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (リトアニア語)" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "Nederlands (オランダ語)" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "Norsk (ノルウェー語)" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "Polski (ポーランド語)" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil(ブラジルポルトガル語)" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (ヨーロッパポルトガル語)" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "Română (ルーマニア語)" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "スウェーデン語 (Swedish)" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (簡体字中国語)" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (繁体字中国語)" @@ -836,7 +840,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -905,57 +909,62 @@ msgstr "出生日:" msgid "Died:" msgstr "逝去日:" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "シリーズ:" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "外部リンク" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "Wikipedia" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "ウェブサイト" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "ISNIレコードを表示" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "ISFDBで表示" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "データを読み込む" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "OpenLibraryで表示" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "Inventaireで表示" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "LibraryThingで表示" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "Goodreadsで表示" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "%(name)s による本" @@ -992,8 +1001,8 @@ msgid "Name:" msgstr "名前:" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "複数ある場合はコンマで区切ってください。" @@ -1030,7 +1039,8 @@ msgid "Openlibrary key:" msgstr "Openlibrary キー:" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "InventaireのID:" @@ -1039,7 +1049,7 @@ msgid "Librarything key:" msgstr "Librarythingのキー:" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "Goodreadsのキー:" @@ -1052,8 +1062,8 @@ msgid "ISNI:" msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1065,7 +1075,7 @@ msgstr "ISNI:" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1077,10 +1087,10 @@ msgstr "保存" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1090,7 +1100,7 @@ msgstr "保存" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1107,7 +1117,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "データのロードでは、 %(source_name)s に接続し、この著者に関するここにないメタデータを取得します。既存のメタデータは上書きされません。" #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1124,95 +1135,114 @@ msgstr "確認" msgid "Unable to connect to remote source." msgstr "リモートの情報源に接続できませんでした。" -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "本を編集" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "クリックしてカバーを追加" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "カバーを読み込めませんでした" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "クリックして拡大" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "(%(review_count)s 件のレビュー)" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "説明を追加" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "概要:" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" msgstr[0] "%(count)s 個の版" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "次の本棚に既に追加されています:" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, 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:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "あなたの読書活動" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "読了日を追加" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "あなたはこの本の読書活動をしていません。" -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "あなたのレビュー" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "あなたのコメント" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "あなたの引用" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "テーマ" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "場所" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1227,15 +1257,15 @@ msgstr "場所" msgid "Lists" msgstr "リスト" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "リストに追加" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1258,25 +1288,26 @@ msgid "Copied ISBN!" msgstr "ISBNをコピーしました!" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "OCLCナンバー:" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "ASIN:" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "Audible ASIN:" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "ISFDB ID:" @@ -1287,12 +1318,12 @@ msgid "Goodreads:" msgstr "Goodreads:" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1301,12 +1332,12 @@ msgid "Add cover" msgstr "カバー画像を追加" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "カバー画像をアップロード:" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "" @@ -1371,15 +1402,32 @@ msgstr "これは新しい著者です" msgid "Creating a new author: %(name)s" msgstr "新しい著者を作成: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "これは既存の作品の版ですか?" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "これは新しい作品です" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1441,124 +1489,190 @@ msgstr "" msgid "Subtitle:" msgstr "サブタイトル:" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "シリーズ:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "シリーズ番号:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "言語:" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "テーマ:" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "テーマを追加する" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "テーマを削除する" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "別のテーマを追加する" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "引用元:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "出版" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "出版社:" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "初版の出版日:" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "出版日:" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "著者" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "%(name)s を削除" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "%(name)sの著者ページ" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "著者を加える:" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "著者を加える" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "Jane Doe" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "別の著者を加える" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "カバー" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "物理的なプロパティ" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "フォーマット:" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "フォーマットの詳細:" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "ページ数:" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "書籍識別子" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "ISBN 13:" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "ISBN 10:" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "OpenlibraryのID:" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1745,19 +1859,11 @@ msgstr "出版日: %(date)s" msgid "rated it" msgstr "評価" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "" -#: 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." @@ -1802,7 +1908,7 @@ msgstr "確認用コード:" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "送信" @@ -1863,7 +1969,7 @@ msgstr "プロフィ─ル設定 で、いつでもデ #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1955,21 +2061,22 @@ msgid "%(username)s started reading %(username)s rated %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "%(username)sさんが%(book_title)sをレビューしました" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "" @@ -2155,14 +2262,14 @@ msgstr "現在アクティビティはありません!ユーザーをフォロ msgid "Alternatively, you can try enabling more status types" msgstr "または、他のステータスタイプを有効にしてみてください" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: 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 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "プロフィールページから、読書目標をいつでも設定または変更できます。" @@ -2450,6 +2557,10 @@ msgstr "このグループにはリストがありません" msgid "Edit group" msgstr "グループを編集" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "追加するユーザーを検索" @@ -3683,6 +3794,7 @@ msgid "Search for a book, author, user, or list" msgstr "" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "バーコードをスキャン" @@ -4290,7 +4402,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:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "CW" @@ -4756,7 +4868,7 @@ msgstr "" 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 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "ファイルをダウンロード" @@ -4949,10 +5061,9 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "" #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" -msgstr "\"%(title)s\"の読書日を更新" +msgid "Update read dates for \"%(title)s\"" +msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 #: bookwyrm/templates/readthrough/readthrough_modal.html:38 @@ -5006,6 +5117,11 @@ msgstr "読書日を編集" msgid "Delete these read dates" msgstr "これらの読書日を削除" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "\"%(title)s\"の読書日を更新" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5016,41 +5132,33 @@ msgstr "\"%(title)s\"の読書日を追加" 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 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "カメラへのアクセスを要求しています..." -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "カメラに対して、本のバーコードをスキャンするためのアクセスを許可してください。" -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "カメラにアクセスできませんでした" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "読み込み中..." -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "本のバーコードをカメラに合わせてください。" -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "ISBNをスキャンしました" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "本を検索:" @@ -5149,13 +5257,13 @@ msgstr "" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 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:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "" @@ -5529,7 +5637,7 @@ msgid "Dashboard" msgstr "ダッシュボード" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "合計ユーザー" @@ -5543,31 +5651,31 @@ msgstr "" msgid "Works" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "インスタンスのアクティビティ" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "" @@ -5875,13 +5983,49 @@ msgid "Unable to save settings" msgstr "設定を保存できません" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6592,10 +6736,6 @@ msgstr "" msgid "Tasks" msgstr "" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "" @@ -7253,10 +7393,6 @@ msgstr "引用:" msgid "An excerpt from '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "引用元:" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "ページ:" @@ -7269,12 +7405,12 @@ msgstr "パーセント:" msgid "to" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "'%(book_title)s' のレビュー" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "レビュー:" @@ -7371,6 +7507,12 @@ msgid "rated %(title)s: %(display_rating)s sta msgid_plural "rated %(title)s: %(display_rating)s stars" msgstr[0] "さんは%(title)sを評価しました: %(display_rating)s stars" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" + #: 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" @@ -7582,35 +7724,35 @@ msgstr "" msgid "Show rating" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "画像を新しいウィンドウで開く" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "ステータスを非表示" @@ -7669,16 +7811,22 @@ msgstr "" msgid "started reading %(book)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "さんが、 %(author_name)s著の%(book)s をレビューしました" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "さんが %(book)s をレビューしました" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -7954,15 +8102,23 @@ msgid "%(num)d book - by %(user)s" msgid_plural "%(num)d books - by %(user)s" msgstr[0] "" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/ko_KR/LC_MESSAGES/django.po b/locale/ko_KR/LC_MESSAGES/django.po index a842b78079..97a40599ea 100644 --- a/locale/ko_KR/LC_MESSAGES/django.po +++ b/locale/ko_KR/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-06 18:48\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:13\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Korean\n" "Language: ko\n" @@ -107,7 +107,7 @@ msgstr "책제목" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "별점" @@ -175,39 +175,43 @@ msgstr "중재자가 삭제" msgid "Domain block" msgstr "도메인 차단" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "오디오북" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "전자책" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "만화" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "양장제본" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "무선제본" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,18 +465,18 @@ msgstr "" msgid "%(display_name)s's quote from %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" msgstr[0] "" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "서평" @@ -488,19 +492,19 @@ msgstr "인용구" msgid "Everything else" msgstr "그 밖의 것들" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "홈 타임라인" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "홈" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "도서 타임라임" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -509,91 +513,91 @@ msgstr "도서 타임라임" msgid "Books" msgstr "도서" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "English" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "Català (Catalan)" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "Deutsch (German)" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "Esperanto (Esperanto)" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "Español (Spanish)" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "Euskara (Basque)" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "Galego (Galician)" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "Italiano (Italian)" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "한국어 (Korean)" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "Suomi (Finnish)" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "Français (French)" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (Lithuanian)" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "네덜란드 (Dutch)" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "Norsk (Norwegian)" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "Polski (Polish)" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (Brazilian Portuguese)" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (European Portuguese)" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "Română (Romanian)" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "Svenska (Swedish)" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "Українська (우크라이나)" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (Simplified Chinese)" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (Traditional Chinese)" @@ -836,7 +840,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -905,57 +909,62 @@ msgstr "출생:" msgid "Died:" msgstr "사망:" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "총서" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "외부 링크" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "위키백과" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "웹사이트" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "ISNI 레코드 보기" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "ISFDB에서 보기" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "데이터 불러오기" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "OpenLibrary 자료 보기" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "Inventaire 자료 보기" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "LibraryThing 자료 보기" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "Goodreads 자료 보기" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "" @@ -992,8 +1001,8 @@ msgid "Name:" msgstr "이름:" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "쉼표로 값을 구분합니다." @@ -1030,7 +1039,8 @@ msgid "Openlibrary key:" msgstr "Openlibrary key:" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "Inventaire ID:" @@ -1039,7 +1049,7 @@ msgid "Librarything key:" msgstr "Librarything key:" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "Goodreads key:" @@ -1052,8 +1062,8 @@ msgid "ISNI:" msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1065,7 +1075,7 @@ msgstr "ISNI:" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1077,10 +1087,10 @@ msgstr "저장" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1090,7 +1100,7 @@ msgstr "저장" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1107,7 +1117,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "" #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1124,95 +1135,114 @@ msgstr "확정" msgid "Unable to connect to remote source." msgstr "" -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "책 수정" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "클릭하여 표지 추가" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "표지 불러오기 실패" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "확대하려면 클릭" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "설명 추가" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "설명:" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" msgstr[0] "%(count)s개의 판" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "책 꽂아둔 곳:" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "" -#: bookwyrm/templates/book/book.html:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "내 독서 활동" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "읽은 날짜 추가" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "이 책에 관한 독서 활동이 없어요." -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "내 서평" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "내 코멘트" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "내 인용" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "화제" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "장소" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1227,15 +1257,15 @@ msgstr "장소" msgid "Lists" msgstr "목록" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "목록에 추가" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1258,25 +1288,26 @@ msgid "Copied ISBN!" msgstr "ISBN 복사!" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "OCLC Number:" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "ASIN:" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "Audible ASIN:" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "ISFDB ID:" @@ -1287,12 +1318,12 @@ msgid "Goodreads:" msgstr "Goodreads:" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1301,12 +1332,12 @@ msgid "Add cover" msgstr "표지 추가" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "표지 올려두기" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "URL에서 책표지 불러오기" @@ -1371,15 +1402,32 @@ msgstr "새로운 저자" msgid "Creating a new author: %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "이미 등록된 작품의 다른 판일까요?" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "새 작품" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1441,124 +1489,190 @@ msgstr "책제목 정렬:" msgid "Subtitle:" msgstr "부제목" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "총서" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "총서편차:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "언어:" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "화제:" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "화제 추가" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "화제 제거" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "그 밖의 화제 추가" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "출판물" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "발행처:" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "최초 발행일:" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "발행일:" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "저자" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "%(name)s 제거" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "저자 추가:" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "저자 추가" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "신원 미상" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "그 밖의 저자 추가" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "표지" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "제본 정보" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "포맷:" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "포맷 상세:" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "쪽 수:" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "책 식별자" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "ISBN 13:" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "ISBN 10:" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "OpenLibrary ID:" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1745,19 +1859,11 @@ msgstr " 발행일: %(date)s" msgid "rated it" msgstr "별점" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "시리즈" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, 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." @@ -1802,7 +1908,7 @@ msgstr "확인 코드" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "제출" @@ -1863,7 +1969,7 @@ msgstr "" #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1955,21 +2061,22 @@ msgid "%(username)s started reading %(username)s rated %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "%(username)s 독자의 %(book_title)s 서평" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "%(username)s 독자의 %(book_title)s 주석" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "%(username)s 독자의 %(book_title)s 인용" @@ -2155,14 +2262,14 @@ msgstr "" msgid "Alternatively, you can try enabling more status types" msgstr "" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: 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 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "" @@ -2450,6 +2557,10 @@ msgstr "이 그룹에는 목록이 없습니다." msgid "Edit group" msgstr "그룹 편집" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "검색하여 이용자 추가하기" @@ -3683,6 +3794,7 @@ msgid "Search for a book, author, user, or list" msgstr "" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "바코드 스캔하기" @@ -4290,7 +4402,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:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "내용 경고" @@ -4756,7 +4868,7 @@ msgstr "도서 목록 내보내기" 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 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "파일 다운로드" @@ -4949,9 +5061,8 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "" #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" +msgid "Update read dates for \"%(title)s\"" msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 @@ -5006,6 +5117,11 @@ msgstr "읽은 날짜 편집" msgid "Delete these read dates" msgstr "이 읽은 날짜 지우기" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5016,41 +5132,33 @@ msgstr "" 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 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "카메로 요청하는 중…" -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "카메라에 접근할 수 없음" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "스캔 중" -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "ISBN 스캠 마침" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "" @@ -5149,13 +5257,13 @@ msgstr "거짓" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 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:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "종료일:" @@ -5529,7 +5637,7 @@ msgid "Dashboard" msgstr "대시보드" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "전체 이용자" @@ -5543,31 +5651,31 @@ msgstr "이번 달 활동 수" msgid "Works" msgstr "작품 수" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "간격:" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "이용자 가입 활동" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "기록 활동" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "등록된 작품" @@ -5875,13 +5983,49 @@ msgid "Unable to save settings" msgstr "설정을 저장할 수 없음" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6592,10 +6736,6 @@ msgstr "" msgid "Tasks" msgstr "" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "" @@ -7253,10 +7393,6 @@ msgstr "인용:" msgid "An excerpt from '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "" @@ -7269,12 +7405,12 @@ msgstr "퍼센트:" msgid "to" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "서평:" @@ -7371,6 +7507,12 @@ msgid "rated %(title)s: %(display_rating)s sta msgid_plural "rated %(title)s: %(display_rating)s stars" msgstr[0] "님이 %(title)s에 남긴 별점: %(display_rating)s" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" + #: 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" @@ -7582,35 +7724,35 @@ msgstr "읽기 마침" msgid "Show rating" msgstr "별점 보기" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "기록 보기" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "숨기기" @@ -7669,16 +7811,22 @@ msgstr "" msgid "started reading %(book)s" msgstr "독자가 읽기 시작한 %(book)s" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -7954,15 +8102,23 @@ msgid "%(num)d book - by %(user)s" msgid_plural "%(num)d books - by %(user)s" msgstr[0] "" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/lt_LT/LC_MESSAGES/django.po b/locale/lt_LT/LC_MESSAGES/django.po index f0d0ef693b..1375151abd 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: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-06 18:48\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:13\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Lithuanian\n" "Language: lt\n" @@ -107,7 +107,7 @@ msgstr "Knygos antraštė" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "Įvertinimas" @@ -175,39 +175,43 @@ msgstr "Moderatorius ištrynė" msgid "Domain block" msgstr "Blokuoti pagal domeną" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "Audioknyga" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "Elektroninė knyga" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "Grafinė novelė" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "Knyga kietais viršeliais" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "Knyga minkštais viršeliais" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "„%(value)s“ neatrodo kaip ISBN kodas" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "Kode „%(value)s“ ISBN kontrolinis skaitmuo klaidingas – tikėtasi „%(check_version)s“" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,12 +465,12 @@ msgstr "%(display_name)s – knygos „%(book_title)s“ komentaras" msgid "%(display_name)s's quote from %(book_title)s" msgstr "%(display_name)s – knygos „%(book_title)s“ citata" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "%(display_name)s – knygos „%(book_title)s“ apžvalga" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" @@ -475,7 +479,7 @@ msgstr[1] "%(display_name)s įvertino knygą „%(book_title)s“ %(display_rati msgstr[2] "%(display_name)s įvertino knygą „%(book_title)s“ %(display_rating).1f žvaigždučių" msgstr[3] "%(display_name)s įvertino knygą „%(book_title)s“ %(display_rating).1f žvaigždučių" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "Apžvalgos" @@ -491,19 +495,19 @@ msgstr "Citatos" msgid "Everything else" msgstr "Visa kita" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "Pagrindinė siena" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "Pagrindinis" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "Knygų siena" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -512,91 +516,91 @@ msgstr "Knygų siena" msgid "Books" msgstr "Knygos" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "English (Anglų)" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "Català (kataloniečių)" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "Deutsch (Vokiečių)" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "Esperanto (Esperanto)" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "Español (Ispanų)" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "Euskara (Baskų kalba)" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "Galego (galisų)" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "Italų (Italian)" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "한국어 (korėjiečių)" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "Suomi (suomių)" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "Français (Prancūzų)" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "Nederlands (Olandų)" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "Norvegų (Norwegian)" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "Polski (lenkų)" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português brasileiro (Brazilijos portugalų)" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Europos portugalų)" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "Română (rumunų)" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "Svenska (Švedų)" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "Українська (Ukrainiečių)" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (Supaprastinta kinų)" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (Tradicinė kinų)" @@ -845,7 +849,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -920,57 +924,62 @@ msgstr "Gimęs:" msgid "Died:" msgstr "Mirė:" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "Serija:" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "Išorinės nuorodos" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "Wikipedia" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "Žiūrėti „Wikidata“ įrašą" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "Tinklapis" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "Peržiūrėti ISNI įrašą" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "Žiūrėti per ISFDB" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "Įkelti duomenis" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "Žiūrėti „OpenLibrary“" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "Žiūrėti „Inventaire“" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "Žiūrėti „LibraryThing“" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "Žiūrėti „Goodreads“" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "%(name)s knygos" @@ -1007,8 +1016,8 @@ msgid "Name:" msgstr "Vardas:" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "Reikšmes atskirkite kableliais." @@ -1045,7 +1054,8 @@ msgid "Openlibrary key:" msgstr "„Openlibrary“ raktas:" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "„Inventaire“ ID:" @@ -1054,7 +1064,7 @@ msgid "Librarything key:" msgstr "„Librarything“ raktas:" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "„Goodreads“ raktas:" @@ -1067,8 +1077,8 @@ msgid "ISNI:" msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1080,7 +1090,7 @@ msgstr "ISNI:" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1092,10 +1102,10 @@ msgstr "Išsaugoti" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1105,7 +1115,7 @@ msgstr "Išsaugoti" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1122,7 +1132,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "Duomenų įkėlimas prisijungs prie %(source_name)s ir patikrins ar nėra naujos informacijos. Esantys metaduomenys nebus perrašomi." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1139,31 +1150,50 @@ msgstr "Patvirtinti" msgid "Unable to connect to remote source." msgstr "Nepavyksta prisijungti prie nuotolinio šaltinio." -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "Redaguoti knygą" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "Spausti, kad pridėti viršelį" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "Nepavyko įkelti viršelio" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "Spustelėkite padidinti" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "Žiūrėti „Finna“ įrašą" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" @@ -1172,17 +1202,17 @@ msgstr[1] "(%(review_count)s atsiliepimai)" msgstr[2] "(%(review_count)s atsiliepimų)" msgstr[3] "(%(review_count)s atsiliepimai)" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "Pridėti aprašymą" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "Aprašymas:" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" @@ -1191,49 +1221,49 @@ msgstr[1] "%(count)s leidimai" msgstr[2] "%(count)s leidimai" msgstr[3] "%(count)s leidimai" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "Šis leidimas įdėtas į:" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "kitas šios knygos leidimas yra jūsų %(shelf_name)s lentynoje." -#: bookwyrm/templates/book/book.html:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "Jūsų skaitymo veikla" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "Pridėti skaitymo datas" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "Šios knygos neskaitote." -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "Tavo atsiliepimai" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "Tavo komentarai" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "Jūsų citatos" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "Temos" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "Vietos" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1248,15 +1278,15 @@ msgstr "Vietos" msgid "Lists" msgstr "Sąrašai" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "Pridėti prie sąrašo" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1279,25 +1309,26 @@ msgid "Copied ISBN!" msgstr "ISBN kodas nukopijuotas!" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "OCLC numeris:" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "ASIN:" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "Įgarsintos knygos ASIN:" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "ISFDB ID:" @@ -1308,12 +1339,12 @@ msgid "Goodreads:" msgstr "Goodreads:" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "Finna ID:" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1322,12 +1353,12 @@ msgid "Add cover" msgstr "Pridėti viršelį" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "Įkelti viršelį:" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "Įkelti viršelį iš URL:" @@ -1392,15 +1423,32 @@ msgstr "Tai naujas autorius" msgid "Creating a new author: %(name)s" msgstr "Kuriamas naujas autorius: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "Ar tai egzistuojančio darbo leidimas?" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "Tai naujas darbas" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1462,124 +1510,190 @@ msgstr "Pavadinimas rikiavimo tikslais:" msgid "Subtitle:" msgstr "Paantraštė:" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "Serija:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "Serijos numeris:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "Kalbos:" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "Temos:" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "Pridėti temą" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "Pašalinti temą" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "Pridėti kitą temą" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "Pozicija:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "Leidimas" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "Leidėjas:" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "Pirmoji publikavimo data:" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "Publikavimo data:" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "Autoriai" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "Pašalinti %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "Autoriaus puslapis %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "Pridėti autorius:" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "Pridėti autorių" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "Jonas Jonaitė" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "Pridėti dar vieną autorių" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "Viršelis" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "Fizinės savybės" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "Formatas:" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "Informacija apie formatą:" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "Puslapiai:" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "Knygos identifikatoriai" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "ISBN 13:" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "ISBN 10:" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "„Openlibrary“ ID:" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "Pavadinimas" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1766,19 +1880,11 @@ msgstr "Publikuota %(date)s" msgid "rated it" msgstr "įvertino" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "Serijos autorius" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "%(series_number)s knyga" -#: bookwyrm/templates/book/series.html:28 -msgid "Unsorted Book" -msgstr "Nesurūšiuota knyga" - #: 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." @@ -1823,7 +1929,7 @@ msgstr "Patvirtinimo kodas:" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "Siųsti" @@ -1884,7 +1990,7 @@ msgstr "Tai galite visada atšaukti paskyros nustatymuose.< #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1982,21 +2088,22 @@ msgid "%(username)s started reading %(username)s pradėjo skaityti %(book_title)s" #: bookwyrm/templates/discover/card-header.html:23 +#: bookwyrm/templates/discover/card-header.html:32 #, python-format msgid "%(username)s rated %(book_title)s" msgstr "%(username)s įvertino %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "%(username)s apžvelgė %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "%(username)s pakomentavo prie knygos %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "%(username)s citavo %(book_title)s" @@ -2182,14 +2289,14 @@ msgstr "Šiuo metu įrašų nėra. Norėdami matyti, sekite narį." msgid "Alternatively, you can try enabling more status types" msgstr "Taip pat galite pasirinkti daugiau būsenos tipų" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: bookwyrm/templates/feed/layout.html:14 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" msgstr "%(year)s skaitymo tikslas" -#: bookwyrm/templates/feed/goal_card.html:18 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "Bet kuriuo metu galite pakeisti savo skaitymo tikslą savo paskyros puslapyje" @@ -2477,6 +2584,10 @@ msgstr "Šioje grupėje nėra sąrašų" msgid "Edit group" msgstr "Redaguoti grupę" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "Ieškokite, kad pridėtumėte naudotoją" @@ -3725,6 +3836,7 @@ msgid "Search for a book, author, user, or list" msgstr "Ieškoti knygos, autoriaus, naudotojo ar sąrašo" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "Skenuoti brūkšninį kodą" @@ -4347,7 +4459,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:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "Įspėjimas dėl turinio" @@ -4816,7 +4928,7 @@ msgstr "Eksportuoti knygų sąrašą" 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 "Į eksportuotą CSV failą bus įtrauktos visos knygos jūsų lentynose, visos apžvelgtos knygos bei skaitytos knygos.
      Šį failą galite importuoti į tokias tarnybas, kaip antai „Goodreads“." -#: bookwyrm/templates/preferences/export.html:20 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "Parsisiųsti failą" @@ -5009,10 +5121,9 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "Trinate tai, kas perskaityta ir %(count)s susietų progreso naujinių." #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" -msgstr "Atnaujinkite knygos „%(title)s“ skaitymo datas" +msgid "Update read dates for \"%(title)s\"" +msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 #: bookwyrm/templates/readthrough/readthrough_modal.html:38 @@ -5066,6 +5177,11 @@ msgstr "Redaguoti skaitymo datas" msgid "Delete these read dates" msgstr "Ištrinti šias skaitymo datas" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "Atnaujinkite knygos „%(title)s“ skaitymo datas" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5076,41 +5192,33 @@ msgstr "Pridėkite knygos „%(title)s“ skaitymo datas" msgid "Report" msgstr "Pranešti" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "\n" -" Nuskaityti barkodą\n" -" " - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "Reikia kameros..." -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "Suteikite prieigą prie kameros, kad galėtumėte nuskaityti knygos barkodą." -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "Nepavyko pasiekti kameros" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "Skenuojama..." -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "Kamerą laikykite virš barkodo." -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "ISBN nuskaitytas" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "Ieškoma knygos:" @@ -5215,13 +5323,13 @@ msgstr "Netiesa" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 msgid "Start date:" msgstr "Pradžios data:" #: bookwyrm/templates/settings/announcements/announcement.html:62 #: bookwyrm/templates/settings/announcements/edit_announcement.html:89 -#: bookwyrm/templates/settings/dashboard/dashboard.html:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "Pabaigos data:" @@ -5595,7 +5703,7 @@ msgid "Dashboard" msgstr "Suvestinė" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "Iš viso naudotojų" @@ -5609,31 +5717,31 @@ msgstr "Aktyvūs šį mėnesį" msgid "Works" msgstr "Darbai" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "Serverio statistika" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "Intervalas:" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "Dienos" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "Savaitės" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "Naudotojo prisijungimo veikla" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "Būsenos" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "Darbai sukurti" @@ -5953,13 +6061,49 @@ msgid "Unable to save settings" msgstr "Nepavyko išsaugoti nustatymų" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6670,10 +6814,6 @@ msgstr "Planinės užduotys" msgid "Tasks" msgstr "Užduotys" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "Pavadinimas" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "„Celery“ užduotis" @@ -7337,10 +7477,6 @@ msgstr "Citata:" msgid "An excerpt from '%(book_title)s'" msgstr "Ištrauka iš „%(book_title)s“" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "Pozicija:" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "Puslapyje:" @@ -7353,12 +7489,12 @@ msgstr "Proc.:" msgid "to" msgstr "į" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "Jūsų apžvalga apie „%(book_title)s“" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "Atsiliepimas:" @@ -7467,6 +7603,15 @@ msgstr[1] "įvertinta %(title)s: %(display_rat msgstr[2] "įvertinta %(title)s: %(display_rating)s žvaigždutėmis" msgstr[3] "įvertinta %(title)s: %(display_rating)s žvaigždutėmis" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + #: 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" @@ -7681,35 +7826,35 @@ msgstr "Baigti skaityti" msgid "Show rating" msgstr "Rodyti įvertinimą" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "Rodyti būseną" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "(Psl. %(page)s" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "%(endpage)s" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "(%(percent)s%%" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr " - %(endpercent)s%%" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "Atidaryti paveikslėlį naujame lange" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "Slėpti būseną" @@ -7768,16 +7913,22 @@ msgstr "pradėjo skaityti %(author_name)s knygą msgid "started reading %(book)s" msgstr "pradėjo skaityti %(book)s" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "apžvelgė autoriaus %(author_name)s knygą %(book)s" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "apžvelgė %(book)s" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -8062,15 +8213,23 @@ 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:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "nauja naudotojo paskyra" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/nl_NL/LC_MESSAGES/django.po b/locale/nl_NL/LC_MESSAGES/django.po index f94558f175..66a46fecc1 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: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-24 10:23\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-24 19:01\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Dutch\n" "Language: nl\n" @@ -107,7 +107,7 @@ msgstr "Boektitel" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "Beoordeling" @@ -175,39 +175,43 @@ msgstr "Verwijdering moderator" msgid "Domain block" msgstr "Domeinblokkade" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "Luisterboek" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "E-book" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "Striproman" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "Harde kaft" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "Zachte kaft" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "%(value)s lijkt niet op een ISBN" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "%(value)s heeft niet de juiste ISBN controlesom, we verwachten %(check_version)s" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,19 +465,19 @@ msgstr "%(display_name)s's reactie op %(book_title)s" msgid "%(display_name)s's quote from %(book_title)s" msgstr "%(display_name)s's citaat van %(book_title)s" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "%(display_name)s's beoordeling van %(book_title)s" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" msgstr[0] "%(display_name)s beoordeelde %(book_title)s: %(display_rating).1f ster" msgstr[1] "%(display_name)s beoordeelde %(book_title)s: %(display_rating).1f sterren" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "Recensies" @@ -489,19 +493,19 @@ msgstr "Quotes" msgid "Everything else" msgstr "Overig" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "Tijdlijnen" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "Start" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "Boeken tijdlijn" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -510,91 +514,91 @@ msgstr "Boeken tijdlijn" msgid "Books" msgstr "Boeken" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "Engels (English)" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "Català (Catalaans)" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "Duits (Deutsch)" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "Esperanto (Esperanto)" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "Spaans (Español)" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "Euskara (Baskisch)" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "Galego (Galicisch)" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "Italiano (Italiaans)" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "한국어 (Koreaans)" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "Suomi (Fins)" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "Frans (Français)" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (Litouws)" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "Nederlands" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "Norsk (Noors)" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "Polski (Pools)" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (Braziliaans-Portugees)" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Europeaans Portugees)" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "Română (Roemeens)" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "Svenska (Zweeds)" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "Українська (Oekraïens)" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (Vereenvoudigd Chinees)" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "简体中文 (Traditioneel Chinees)" @@ -839,7 +843,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -910,57 +914,62 @@ msgstr "Geboren:" msgid "Died:" msgstr "Overleden:" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "Reeks:" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "Externe links" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "Wikipedia" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "Bekijk op Wikidata" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "Website" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "ISNI vermelding bekijken" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "Bekijk op ISFDB" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "Gegevens laden" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "Bekijk op OpenLibrary" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "Bekijk op Inventaire" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "Bekijk op LibraryThing" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "Bekijk op Goodreads" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "Boeken door %(name)s" @@ -997,8 +1006,8 @@ msgid "Name:" msgstr "Naam:" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "Meerdere waardes scheiden met komma's." @@ -1035,7 +1044,8 @@ msgid "Openlibrary key:" msgstr "Openlibrary sleutel:" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "Inventaire ID:" @@ -1044,7 +1054,7 @@ msgid "Librarything key:" msgstr "Librarything sleutel:" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "Goodreads-ID:" @@ -1057,8 +1067,8 @@ msgid "ISNI:" msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1070,7 +1080,7 @@ msgstr "ISNI:" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1082,10 +1092,10 @@ msgstr "Opslaan" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1095,7 +1105,7 @@ msgstr "Opslaan" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1112,7 +1122,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "Bij het laden van gegevens wordt verbinding gemaakt met %(source_name)s en controleren op metadata over deze auteur die hier niet aanwezig zijn. Bestaande gegevens worden niet overschreven." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1129,97 +1140,116 @@ msgstr "Bevestigen" msgid "Unable to connect to remote source." msgstr "Verbinden met externe bron niet mogelijk." -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "Boek bewerken" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "Klik om omslag toe te voegen" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "Omslag laden mislukt" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "Klik om te vergroten" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "Bekijk op Finna" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "Bekijk op Libris" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "(%(review_count)s recensie)" msgstr[1] "(%(review_count)s recensies)" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "Beschrijving toevoegen" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "Beschrijving:" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" msgstr[0] "%(count)s editie" msgstr[1] "%(count)s edities" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "Je hebt deze editie op de plank gezet in:" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "Een andere editie van dit boek staat op je %(shelf_name)s plank." -#: bookwyrm/templates/book/book.html:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "Jouw leesactiviteit" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "Leesdata toevoegen" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "Je hebt geen leesactiviteit voor dit boek." -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "Je recensies" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "Jouw opmerkingen" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "Jouw citaten" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "Onderwerpen" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "Plaatsen" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1234,15 +1264,15 @@ msgstr "Plaatsen" msgid "Lists" msgstr "Lijsten" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "Toevoegen aan lijst" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "Nieuwe lijst aanmaken..." -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1265,25 +1295,26 @@ msgid "Copied ISBN!" msgstr "ISBN gekopieerd!" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "OCLC Nummer:" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "ASIN:" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "Audible ASIN:" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "ISFDB ID:" @@ -1294,12 +1325,12 @@ msgid "Goodreads:" msgstr "Goodreads:" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "Finna-ID:" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "Libris-ID:" @@ -1308,12 +1339,12 @@ msgid "Add cover" msgstr "Omslag toevoegen" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "Upload Omslag:" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "Omslag laden vanuit URL:" @@ -1378,15 +1409,32 @@ msgstr "Dit is een nieuwe auteur" msgid "Creating a new author: %(name)s" msgstr "Nieuwe auteur aanmaken: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "Is dit een editie van een bestaand werk?" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "Dit is een nieuw werk" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1448,124 +1496,190 @@ msgstr "Titel voor sortering:" msgid "Subtitle:" msgstr "Ondertitel:" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "Reeks:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "Reeksnummer:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "Talen:" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "Onderwerpen:" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "Onderwerpen toevoegen" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "Onderwerp verwijderen" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "Nog een onderwerp toevoegen" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "Reeks" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "Positie:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "Uitgave" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "Uitgever:" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "Eerste publicatiedatum:" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "Publicatiedatum:" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "Auteurs" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "Verwijder %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "Auteurspagina voor %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "Auteurs toevoegen:" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "Auteur toevoegen" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "Pietje Puk" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "Nog een auteur toevoegen" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "Omslag" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "Fysieke eigenschappen" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "Formaat:" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "Formaatdetails:" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "Pagina's:" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "Boek ID's" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "ISBN 13:" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "ISBN 10:" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "Openlibrary ID:" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "Naam" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1752,19 +1866,11 @@ msgstr "Gepubliceerd %(date)s" msgid "rated it" msgstr "beoordeelde het" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "Reeksen van" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "Boek %(series_number)s" -#: bookwyrm/templates/book/series.html:28 -msgid "Unsorted Book" -msgstr "Ongecategoriseerd boek" - #: 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." @@ -1809,7 +1915,7 @@ msgstr "Bevestigingscode:" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "Versturen" @@ -1870,7 +1976,7 @@ msgstr "Je kunt je op elk moment afmelden in je profielinst #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1964,21 +2070,22 @@ msgid "%(username)s started reading %(username)s begon %(book_title)s te lezen" #: bookwyrm/templates/discover/card-header.html:23 +#: bookwyrm/templates/discover/card-header.html:32 #, python-format msgid "%(username)s rated %(book_title)s" msgstr "%(username)s heeft %(book_title)s beoordeeld" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "%(username)s heeft %(book_title)s gerecenseerd" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "%(username)s heeft een opmerking geplaatst op %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "%(username)s heeft %(book_title)s geciteerd" @@ -2164,14 +2271,14 @@ msgstr "Er zijn op dit moment geen activiteiten! Probeer een gebruiker te volgen msgid "Alternatively, you can try enabling more status types" msgstr "Als alternatief kun je proberen om meer statustypen in te schakelen" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: bookwyrm/templates/feed/layout.html:14 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" msgstr "%(year)s Leesdoel" -#: bookwyrm/templates/feed/goal_card.html:18 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "Je kunt je leesdoel altijd vanuit je profielpagina instellen of wijzigen" @@ -2459,6 +2566,10 @@ msgstr "Deze groep heeft geen lijsten" msgid "Edit group" msgstr "Groep bewerken" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "Zoek om een gebruiker toe te voegen" @@ -3697,6 +3808,7 @@ msgid "Search for a book, author, user, or list" msgstr "Zoeken naar een boek, auteur, gebruiker of lijst" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "Scan streepjescode" @@ -4309,7 +4421,7 @@ msgstr[0] "Een nieuwe melding moet gemodereerd worden" msgstr[1] "%(display_count)s nieuwe meldingen moeten worden gemodereerd" #: bookwyrm/templates/notifications/items/status_preview.html:4 -#: bookwyrm/templates/snippets/status/content_status.html:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "Inhoudswaarschuwing" @@ -4776,7 +4888,7 @@ msgstr "Exporteer boekenlijst" 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 "Je CSV-exportbestand bevat alle boeken op je planken, boeken die je hebt beoordeeld en boeken met leesactiviteit.
      Gebruik dit om te importeren in een service zoals Goodreads." -#: bookwyrm/templates/preferences/export.html:20 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "Download bestand" @@ -4969,10 +5081,9 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "Je verwijdert deze leesvoortgang en de %(count)s bijbehorende voortgangsupdates." #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" -msgstr "Bewerk leesdatums voor \"%(title)s\"" +msgid "Update read dates for \"%(title)s\"" +msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 #: bookwyrm/templates/readthrough/readthrough_modal.html:38 @@ -5026,6 +5137,11 @@ msgstr "Leesdatums bewerken" msgid "Delete these read dates" msgstr "Deze leesdatums verwijderen" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "Bewerk leesdatums voor \"%(title)s\"" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5036,41 +5152,33 @@ msgstr "Voeg leesdatums toe voor \"%(title)s\"" msgid "Report" msgstr "Melden" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "\n" -" Scan streepjescode\n" -" " - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "Camera aanvragen..." -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "Geef toegang tot de camera om de streepjescode van een boek te scannen." -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "Geen toegang tot camera" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "Scannen..." -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "Leg de streepjescode van je boek gelijk met de camera." -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "ISBN gescand" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "Boek zoeken:" @@ -5171,13 +5279,13 @@ msgstr "Onwaar" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 msgid "Start date:" msgstr "Begindatum:" #: bookwyrm/templates/settings/announcements/announcement.html:62 #: bookwyrm/templates/settings/announcements/edit_announcement.html:89 -#: bookwyrm/templates/settings/dashboard/dashboard.html:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "Einddatum:" @@ -5551,7 +5659,7 @@ msgid "Dashboard" msgstr "Dashboard" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "Totaal aantal gebruikers" @@ -5565,31 +5673,31 @@ msgstr "Actief deze maand" msgid "Works" msgstr "Werken" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "Instance activiteit" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "Interval:" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "Dagen" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "Weken" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "Nieuwe registraties" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "Statusactiviteit" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "Werken aangemaakt" @@ -5901,13 +6009,49 @@ msgid "Unable to save settings" msgstr "Instellingen opslaan mislukt" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "Aanbevolen" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "Federatie uitschakelen" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "Opgelet" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "Stopt de interactie van jouw instantie met andere federatieve diensten. Bestaande data uit andere diensten blijft zichtbaar." +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "Niet aanbevolen" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6618,10 +6762,6 @@ msgstr "Geplande taken" msgid "Tasks" msgstr "Taken" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "Naam" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "Selderij taak" @@ -7281,10 +7421,6 @@ msgstr "Citaat:" msgid "An excerpt from '%(book_title)s'" msgstr "Een uittreksel uit '%(book_title)s'" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "Positie:" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "Op pagina:" @@ -7297,12 +7433,12 @@ msgstr "Bij percentage:" msgid "to" msgstr "tot" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "Jouw recensie van '%(book_title)s'" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "Recensie:" @@ -7403,6 +7539,13 @@ msgid_plural "rated %(title)s: %(display_ratin msgstr[0] "beoordeelde %(title)s: %(display_rating)s ster" msgstr[1] "beoordeelde %(title)s: %(display_rating)s sterren" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" +msgstr[1] "" + #: 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" @@ -7615,35 +7758,35 @@ msgstr "Uitgelezen" msgid "Show rating" msgstr "Beoordeling weergeven" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "Toon status" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "(Pagina %(page)s" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "%(endpage)s" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "(%(percent)s%%" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr " - %(endpercent)s%%" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "Afbeelding in nieuw venster openen" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "Status verbergen" @@ -7702,16 +7845,22 @@ msgstr "begon met het lezen van %(book)s door %(book)s" msgstr "begonnen met lezen van %(book)s" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "heeft %(book)s door %(author_name)s gerecenseerd" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "recensie geschreven voor %(book)s" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -7990,15 +8139,23 @@ 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:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "een nieuwe gebruikersaccount" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/no_NO/LC_MESSAGES/django.po b/locale/no_NO/LC_MESSAGES/django.po index eea8124d9f..00536a384e 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: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-06 18:48\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:13\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Norwegian\n" "Language: no\n" @@ -107,7 +107,7 @@ msgstr "Boktittel" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "Vurdering" @@ -175,39 +175,43 @@ msgstr "Moderatør sletting" msgid "Domain block" msgstr "Domeneblokkering" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "Lydbok" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "e-bok" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "Tegneserie" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "Innbundet" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "Paperback" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "%(value)s ser ikke ut som en ISBN" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "%(value)s har ikke riktig ISBN sjekksum, vi forventet %(check_version)s" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,19 +465,19 @@ msgstr "%(display_name)s sin kommentar på %(book_title)s" msgid "%(display_name)s's quote from %(book_title)s" msgstr "%(display_name)s sitt sitat fra %(book_title)s" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "%(display_name)s sin omtale av %(book_title)s" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" msgstr[0] "%(display_name)s vurderte %(book_title)s: %(display_rating).1f stjerne" msgstr[1] "%(display_name)s vurderte %(book_title)s: %(display_rating).1f stjerner" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "Omtaler" @@ -489,19 +493,19 @@ msgstr "Sitater" msgid "Everything else" msgstr "Andre ting" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "Lokal tidslinje" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "Hjem" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "Boktidslinja" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -510,91 +514,91 @@ msgstr "Boktidslinja" msgid "Books" msgstr "Bøker" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "English (Engelsk)" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "Català (katalansk)" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "Deutsch (Tysk)" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "Esperanto (Esperanto)" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "Español (Spansk)" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "Euskara (Baskisk)" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "Galego (Gallisk)" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "Italiano (Italiensk)" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "한국어 (koreansk)" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "Suomi (finsk)" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "Français (Fransk)" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (Litauisk)" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "Nederlands (nederlandsk)" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "Norsk (Norsk)" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "Polski (Polsk)" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português - Brasil (Brasiliansk portugisisk)" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Europeisk Portugisisk)" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "Română (romansk)" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "Svenska (Svensk)" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "Українська (ukrainsk)" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (Forenklet kinesisk)" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (Tradisjonelt kinesisk)" @@ -839,7 +843,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -910,57 +914,62 @@ msgstr "Født:" msgid "Died:" msgstr "Død:" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "Serie:" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "Eksterne lenker" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "Wikipedia" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "Vis på Wikidata" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "Nettside" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "Vis ISNI-oppføring" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "Vis på ISFDB" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "Last inn data" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "Vis på OpenLibrary" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "Vis på Inventaire" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "Vis på LibraryThing" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "Vis på Goodreads" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "Bøker av %(name)s" @@ -997,8 +1006,8 @@ msgid "Name:" msgstr "Navn:" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "Adskill flere verdier med komma." @@ -1035,7 +1044,8 @@ msgid "Openlibrary key:" msgstr "Openlibrary nøkkel:" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "Inventaire ID:" @@ -1044,7 +1054,7 @@ msgid "Librarything key:" msgstr "Librarything nøkkel:" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "Goodreads nøkkel:" @@ -1057,8 +1067,8 @@ msgid "ISNI:" msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1070,7 +1080,7 @@ msgstr "ISNI:" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1082,10 +1092,10 @@ msgstr "Lagre" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1095,7 +1105,7 @@ msgstr "Lagre" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1112,7 +1122,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "Laster inn data kobler til %(source_name)s og finner metadata om denne forfatteren som enda ikke finnes her. Eksisterende metadata vil ikke bli overskrevet." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1129,97 +1140,116 @@ msgstr "Bekreft" msgid "Unable to connect to remote source." msgstr "Kunne ikke koble til ekstern kilde." -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "Rediger bok" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "Klikk for å legge til omslag" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "Klarte ikke å laste inn omslag" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "Klikk for å forstørre" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "Se på Finna" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "(%(review_count)s anmeldelse)" msgstr[1] "(%(review_count)s anmeldelser)" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "Legg til beskrivelse" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "Beskrivelse:" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" msgstr[0] "%(count)s utgave" msgstr[1] "%(count)s utgaver" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "Du har lagt denne utgaven i hylla:" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "En annen utgave av denne boken ligger i hylla %(shelf_name)s." -#: bookwyrm/templates/book/book.html:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "Din leseaktivitet" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "Legg til lesedatoer" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "Du har ikke lagt inn leseaktivitet for denne boka." -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "Dine omtaler" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "Dine kommentarer" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "Dine sitater" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "Emner" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "Steder" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1234,15 +1264,15 @@ msgstr "Steder" msgid "Lists" msgstr "Lister" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "Legg til i liste" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1265,25 +1295,26 @@ msgid "Copied ISBN!" msgstr "Kopierte ISBN!" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "OCLC Nummer:" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "ASIN:" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "Audible ASIN:" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "ISFDB ID:" @@ -1294,12 +1325,12 @@ msgid "Goodreads:" msgstr "Goodreads:" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "Finna ID:" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1308,12 +1339,12 @@ msgid "Add cover" msgstr "Legg til et omslag" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "Last opp omslag:" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "Last inn omslag fra hyperlenke:" @@ -1378,15 +1409,32 @@ msgstr "Dette er en ny forfatter" msgid "Creating a new author: %(name)s" msgstr "Oppretter en ny forfatter: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "Er dette en utgave av et eksisterende verk?" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "Dette er et nytt verk" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1448,124 +1496,190 @@ msgstr "Sorter etter tittel:" msgid "Subtitle:" msgstr "Undertittel:" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "Serie:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "Serienummer:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "Språk:" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "Emner:" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "Legg til emne" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "Fjern emne" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "Legg til et emne" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "Plassering:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "Publikasjon" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "Forlag:" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "Først utgitt:" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "Publiseringsdato:" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "Forfattere" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "Fjern %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "Forfatterside for %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "Legg til forfattere:" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "Legg til forfatter" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "Kari Nordmann" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "Legg til enda en forfatter" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "Omslag" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "Fysiske egenskaper" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "Format:" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "Formatdetaljer:" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "Sider:" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "Boknøkler" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "ISBN 13:" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "ISBN 10:" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "Openlibrary nøkkel:" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "Navn" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1752,19 +1866,11 @@ msgstr "Utgitt %(date)s" msgid "rated it" msgstr "vurderte den" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "En serie av" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "Bok %(series_number)s" -#: bookwyrm/templates/book/series.html:28 -msgid "Unsorted Book" -msgstr "Usortert bok" - #: 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." @@ -1809,7 +1915,7 @@ msgstr "Bekreftelseskode:" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "Send inn" @@ -1870,7 +1976,7 @@ msgstr "Du kan når som helst melde deg ut på profilinnsti #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1964,21 +2070,22 @@ msgid "%(username)s started reading %(username)s har begynt å lese %(book_title)s" #: bookwyrm/templates/discover/card-header.html:23 +#: bookwyrm/templates/discover/card-header.html:32 #, python-format msgid "%(username)s rated %(book_title)s" msgstr "%(username)s vurderte %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "%(username)s anmeldte %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "%(username)s la inn en kommentar på %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "%(username)s siterte %(book_title)s" @@ -2164,14 +2271,14 @@ msgstr "Det er ingen aktiviteter akkurat nå! Prøv å følge en bruker for å k msgid "Alternatively, you can try enabling more status types" msgstr "Eller, du kan prøve å aktivere flere statustyper" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: bookwyrm/templates/feed/layout.html:14 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" msgstr "%(year)s lesemål" -#: bookwyrm/templates/feed/goal_card.html:18 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "Du kan sette eller endre lesemål når som helst fra profilsida di" @@ -2459,6 +2566,10 @@ msgstr "Denne gruppa har ingen lister" msgid "Edit group" msgstr "Rediger gruppe" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "Søk for å legge til et medlem" @@ -3697,6 +3808,7 @@ msgid "Search for a book, author, user, or list" msgstr "Søk etter bok, forfatter, bruker eller liste" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "Les strekkode" @@ -4309,7 +4421,7 @@ msgstr[0] "En ny rapport trenger moderering" msgstr[1] "%(display_count)s nye rapporter trenger moderering" #: bookwyrm/templates/notifications/items/status_preview.html:4 -#: bookwyrm/templates/snippets/status/content_status.html:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "Varsel om følsomt innhold" @@ -4776,7 +4888,7 @@ msgstr "Eksporter bokliste" 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 "Din CSV-eksportfil vil inkludere alle bøker på dine hyller, bøker du har omtalt, og bøker med leseaktivitet.
      Bruk dette til å importere til en tjeneste som Goodreads." -#: bookwyrm/templates/preferences/export.html:20 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "Last ned fil" @@ -4969,10 +5081,9 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "Du sletter denne gjennomlesninga og %(count)s tilknyttede fremdriftsoppdateringer." #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" -msgstr "Oppdatér lesedatoer for \"%(title)s\"" +msgid "Update read dates for \"%(title)s\"" +msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 #: bookwyrm/templates/readthrough/readthrough_modal.html:38 @@ -5026,6 +5137,11 @@ msgstr "Rediger lesedatoer" msgid "Delete these read dates" msgstr "Slett disse lesedatoene" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "Oppdatér lesedatoer for \"%(title)s\"" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5036,41 +5152,33 @@ msgstr "Legg til lesedatoer for \"%(title)s\"" msgid "Report" msgstr "Rapport" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "\n" -" Les strekkode\n" -" " - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "Ber om kamera..." -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "Gi tilgang til kameraet for å lese en strekkode." -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "Fikk ikke tilgang til kamera" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "Skanner..." -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "Juster bokens strekkode med kamera." -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "ISBN ble skannet" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "Søker etter bok:" @@ -5171,13 +5279,13 @@ msgstr "Usant" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 msgid "Start date:" msgstr "Startdato:" #: bookwyrm/templates/settings/announcements/announcement.html:62 #: bookwyrm/templates/settings/announcements/edit_announcement.html:89 -#: bookwyrm/templates/settings/dashboard/dashboard.html:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "Sluttdato:" @@ -5551,7 +5659,7 @@ msgid "Dashboard" msgstr "Kontrollpanel" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "Totalt antall brukere" @@ -5565,31 +5673,31 @@ msgstr "Aktive denne måneden" msgid "Works" msgstr "Verker" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "Instansaktivitet" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "Intervall:" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "Dager" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "Uker" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "Brukerregistreringsaktivitet" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "Statusaktivitet" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "Verker laget" @@ -5901,13 +6009,49 @@ msgid "Unable to save settings" msgstr "Kunne ikke lagre innstillinger" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6618,10 +6762,6 @@ msgstr "Planlagte oppgaver" msgid "Tasks" msgstr "Oppgaver" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "Navn" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "Celery-oppgave" @@ -7281,10 +7421,6 @@ msgstr "Sitat:" msgid "An excerpt from '%(book_title)s'" msgstr "En utdrag fra '%(book_title)s'" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "Plassering:" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "På side:" @@ -7297,12 +7433,12 @@ msgstr "Ved prosent:" msgid "to" msgstr "til" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "Din omtale av '%(book_title)s" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "Omtale:" @@ -7403,6 +7539,13 @@ msgid_plural "rated %(title)s: %(display_ratin msgstr[0] "vurderte %(title)s til: %(display_rating)s stjerne" msgstr[1] "vurderte %(title)s til: %(display_rating)s stjerner" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" +msgstr[1] "" + #: 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" @@ -7615,35 +7758,35 @@ msgstr "Fullfør lesing" msgid "Show rating" msgstr "Vis vurdering" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "Vis status" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "(side %(page)s" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "%(endpage)s" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "(%(percent)s%%" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr " - %(endpercent)s%%" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "Åpne bilde i nytt vindu" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "Skjul status" @@ -7702,16 +7845,22 @@ msgstr "begynte å lese %(book)s av %(book)s" msgstr "begynte å lese %(book)s" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "anmeldte %(book)s av %(author_name)s" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "omtalte %(book)s" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -7990,15 +8139,23 @@ msgid_plural "%(num)d books - by %(user)s" msgstr[0] "%(num)d bok – av %(user)s" msgstr[1] "%(num)d bøker – av %(user)s" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "en ny brukerkonto" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/pl_PL/LC_MESSAGES/django.po b/locale/pl_PL/LC_MESSAGES/django.po index 05a28f00cb..a6200e0171 100644 --- a/locale/pl_PL/LC_MESSAGES/django.po +++ b/locale/pl_PL/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-06 18:48\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:13\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Polish\n" "Language: pl\n" @@ -107,7 +107,7 @@ msgstr "Tytuł książki" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "Ocena" @@ -175,39 +175,43 @@ msgstr "Usunięte przez moderatora" msgid "Domain block" msgstr "Blokada domeny" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "Audiobook" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "eBook" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "Powieść ilustrowana" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "Twarda oprawa" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "Miękka oprawa" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,12 +465,12 @@ msgstr "%(display_name)s komentuje %(book_title)s" msgid "%(display_name)s's quote from %(book_title)s" msgstr "%(display_name)s cytuje %(book_title)s" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "%(display_name)s ocenia %(book_title)s" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" @@ -475,7 +479,7 @@ msgstr[1] "%(display_name)s ocenia %(book_title)s: %(display_rating).1f gwiazdki msgstr[2] "%(display_name)s ocenia %(book_title)s: %(display_rating).1f gwiazdek" msgstr[3] "%(display_name)s ocenia %(book_title)s: %(display_rating).1f gwiazdek" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "Oceny" @@ -491,19 +495,19 @@ msgstr "Cytaty" msgid "Everything else" msgstr "Wszystko inne" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "Strona główna" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "Start" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "Oś czasu książek" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -512,91 +516,91 @@ msgstr "Oś czasu książek" msgid "Books" msgstr "Książki" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "English (Angielski)" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "Català (kataloński)" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "Deutsch (niemiecki)" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "Esperanto (esperanto)" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "Español (hiszpański)" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "Euskara (baskijski)" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "Galego (galicyjski)" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "Italiano (włoski)" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "한국어 (koreański)" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "Suomi (fiński)" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "Français (francuski)" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (litewski)" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "Nederlands (holenderski)" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "Norsk (norweski)" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "polski" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (portugalski — Brazylia)" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (portugalski — Portugalia)" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "Română (rumuński)" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "Svenska (szwedzki)" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "Українська (ukraiński)" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (chiński — uproszczony)" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (chiński — tradycyjny)" @@ -845,7 +849,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -920,57 +924,62 @@ msgstr "Data urodzenia:" msgid "Died:" msgstr "Data śmierci:" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "Seria:" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "Zewnętrzne odnośniki" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "Wikipedia" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "Pokaż na Wikidata" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "Strona WWW" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "Zobacz wpis ISNI" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "Zobacz na ISFDB" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "Wczytaj dane" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "Pokaż na OpenLibrary" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "Pokaż na Inventaire" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "Pokaż na LibraryThing" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "Pokaż na Goodreads" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "Książki autorstwa %(name)s" @@ -1007,8 +1016,8 @@ msgid "Name:" msgstr "Nazwa:" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "Oddziel kilka wartości przecinkami." @@ -1045,7 +1054,8 @@ msgid "Openlibrary key:" msgstr "Klucz Openlibrary:" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "ID Inventaire:" @@ -1054,7 +1064,7 @@ msgid "Librarything key:" msgstr "Klucz Librarything:" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "Klucz Goodreads:" @@ -1067,8 +1077,8 @@ msgid "ISNI:" msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1080,7 +1090,7 @@ msgstr "ISNI:" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1092,10 +1102,10 @@ msgstr "Zapisz" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1105,7 +1115,7 @@ msgstr "Zapisz" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1122,7 +1132,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "Wczytanie danych spowoduje połączenie z %(source_name)s i sprawdzenie jakichkolwiek metadanych o tym autorze, które nie są tutaj obecne. Istniejące metadane nie zostaną zastąpione." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1139,31 +1150,50 @@ msgstr "Zatwierdź" msgid "Unable to connect to remote source." msgstr "Błąd połączenia ze zdalnym źródłem." -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "Edytuj książkę" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "Naciśnij, aby dodać okładkę" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "Błąd wczytywania okładki" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "Naciśnij, aby powiększyć" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" @@ -1172,17 +1202,17 @@ msgstr[1] "(%(review_count)s opinie)" msgstr[2] "(%(review_count)s opinii)" msgstr[3] "(%(review_count)s opinii)" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "Dodaj opis" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "Opis:" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" @@ -1191,49 +1221,49 @@ msgstr[1] "%(count)s edycje" msgstr[2] "%(count)s edycji" msgstr[3] "%(count)s edycji" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "Ta edycja została odłożona do:" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "Inna edycja tej książki znajduje się już na Twojej półce %(shelf_name)s." -#: bookwyrm/templates/book/book.html:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "Twoja aktywność czytania" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "Dodaj daty czytania" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "Nie masz żadnej aktywności czytania dla tej książki." -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "Twoje opinie" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "Twoje komentarze" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "Twoje cytaty" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "Tematy" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "Miejsca" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1248,15 +1278,15 @@ msgstr "Miejsca" msgid "Lists" msgstr "Listy" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "Dodaj do listy" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1279,25 +1309,26 @@ msgid "Copied ISBN!" msgstr "Skopiowano ISBN!" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "Numer OCLC:" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "ASIN:" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "Dźwiękowy ASIN:" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "ID ISFDB:" @@ -1308,12 +1339,12 @@ msgid "Goodreads:" msgstr "Goodreads:" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "ID Finna:" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1322,12 +1353,12 @@ msgid "Add cover" msgstr "Dodaj okładkę" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "Prześlij okładkę:" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "Wczytaj okładkę z adresu URL:" @@ -1392,15 +1423,32 @@ msgstr "To jest nowy autor" msgid "Creating a new author: %(name)s" msgstr "Tworzenie nowego autora: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "Czy to jest edycja istniejącego dzieła?" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "To jest nowe dzieło" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1462,124 +1510,190 @@ msgstr "Sortuj Według Tytułu:" msgid "Subtitle:" msgstr "Podtytuł:" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "Seria:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "Numer serii:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "Języki:" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "Tematy:" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "Dodaj temat" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "Usuń temat" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "Dodaj inny temat" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "Pozycja:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "Publikacja" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "Wydawca:" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "Data pierwszej publikacji:" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "Data publikacji:" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "Autorzy" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "Usuń %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "Strona autora dla %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "Dodaj autorów:" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "Dodaj autora" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "Jan Kowalski" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "Dodaj kolejnego autora" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "Okładka" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "Właściwości fizyczne" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "Format:" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "Szczegóły formatu:" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "Strony:" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "Identyfikatory książki" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "ISBN 13:" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "ISBN 10:" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "ID Openlibrary:" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1766,19 +1880,11 @@ msgstr "Opublikowane %(date)s" msgid "rated it" msgstr "ocenia to" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "Seria autorstwa" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "Książka %(series_number)s" -#: bookwyrm/templates/book/series.html:28 -msgid "Unsorted Book" -msgstr "Niesortowana książka" - #: 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." @@ -1823,7 +1929,7 @@ msgstr "Kod potwierdzający:" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "Prześlij" @@ -1884,7 +1990,7 @@ msgstr "Możesz zrezygnować w dowolnym momencie poprzez us #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1982,21 +2088,22 @@ msgid "%(username)s started reading %(username)s rozpoczyna czytanie %(book_title)s" #: bookwyrm/templates/discover/card-header.html:23 +#: bookwyrm/templates/discover/card-header.html:32 #, python-format msgid "%(username)s rated %(book_title)s" msgstr "%(username)s ocenia %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "%(username)s recenzuje %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "%(username)s komentuje %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "%(username)s cytuje %(book_title)s" @@ -2182,14 +2289,14 @@ msgstr "Brak aktywności na ten moment! Na początek, zacznij obserwować użytk msgid "Alternatively, you can try enabling more status types" msgstr "Możesz również aktywować więcej typów statusów" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: bookwyrm/templates/feed/layout.html:14 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" msgstr "Cel czytania na rok %(year)s" -#: bookwyrm/templates/feed/goal_card.html:18 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "Możesz ustawić lub zmienić swój cel czytania w dowolnej chwili przez swoją stronę profilu" @@ -2477,6 +2584,10 @@ msgstr "Ta grupa nie posiada list" msgid "Edit group" msgstr "Edytuj grupę" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "Wyszukaj, aby dodać użytkownika" @@ -3725,6 +3836,7 @@ msgid "Search for a book, author, user, or list" msgstr "Szukaj książek, autorów, użytkowników lub list" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "Skanuj kod kreskowy" @@ -4347,7 +4459,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:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "Ostrzeżenie o treści" @@ -4816,7 +4928,7 @@ msgstr "Eksportuj listę książek" 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 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "Pobierz plik" @@ -5009,10 +5121,9 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "" #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" -msgstr "Aktualizuj daty czytania dla \"%(title)s\"" +msgid "Update read dates for \"%(title)s\"" +msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 #: bookwyrm/templates/readthrough/readthrough_modal.html:38 @@ -5066,6 +5177,11 @@ msgstr "Edytuj daty czytania" msgid "Delete these read dates" msgstr "Usuń te daty czytania" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "Aktualizuj daty czytania dla \"%(title)s\"" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5076,41 +5192,33 @@ msgstr "Dodaj daty czytania dla \"%(title)s\"" msgid "Report" msgstr "Zgłoś" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "\n" -" Skanuj kod kreskowy\n" -" " - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "Uruchamianie aparatu..." -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "Udziel dostęp do aparatu, aby zeskanować kod kreskowy książki." -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "Nie można uruchomić aparatu" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "Skanowanie..." -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "Umieść kod kreskowy książki przez aparatem." -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "Zeskanowano ISBN" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "Wyszukiwanie książki:" @@ -5215,13 +5323,13 @@ msgstr "Nie" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 msgid "Start date:" msgstr "Data rozpoczęcia:" #: bookwyrm/templates/settings/announcements/announcement.html:62 #: bookwyrm/templates/settings/announcements/edit_announcement.html:89 -#: bookwyrm/templates/settings/dashboard/dashboard.html:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "Data zakończenia:" @@ -5595,7 +5703,7 @@ msgid "Dashboard" msgstr "Panel" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "Użytkowników w sumie" @@ -5609,31 +5717,31 @@ msgstr "Aktywnych w tym miesiącu" msgid "Works" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "Aktywność instancji" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "Częstotliwość:" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "Dni" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "Tygodnie" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "" @@ -5953,13 +6061,49 @@ msgid "Unable to save settings" msgstr "Błąd zapisywania ustawień" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6670,10 +6814,6 @@ msgstr "" msgid "Tasks" msgstr "" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "" @@ -7337,10 +7477,6 @@ msgstr "Cytat:" msgid "An excerpt from '%(book_title)s'" msgstr "Fragment z '%(book_title)s'" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "Pozycja:" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "Na stronie:" @@ -7353,12 +7489,12 @@ msgstr "" msgid "to" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "Twoja recenzja '%(book_title)s'" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "Recenzja:" @@ -7467,6 +7603,15 @@ msgstr[1] "ocenia %(title)s: %(display_rating) msgstr[2] "ocenia %(title)s: %(display_rating)s gwiazdek" msgstr[3] "ocenia %(title)s: %(display_rating)s gwiazdek" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + #: 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" @@ -7681,35 +7826,35 @@ msgstr "Ukończ czytanie" msgid "Show rating" msgstr "Pokaż ocenę" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "Pokaż status" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "(Strona %(page)s" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "%(endpage)s" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "(%(percent)s %%" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr " - %(endpercent)s %%" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "Otwórz obraz w nowym oknie" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "Ukryj status" @@ -7768,16 +7913,22 @@ msgstr "rozpoczyna czytanie %(book)s autorstwa %(book)s" msgstr "rozpoczyna czytanie %(book)s" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "recenzuje %(book)s autorstwa %(author_name)s" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "recenzuje %(book)s" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -8062,15 +8213,23 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/pt_BR/LC_MESSAGES/django.po b/locale/pt_BR/LC_MESSAGES/django.po index a10a002218..95d779f65c 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: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-06 18:48\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:13\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Portuguese, Brazilian\n" "Language: pt\n" @@ -107,7 +107,7 @@ msgstr "Título do livro" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "Avaliação" @@ -175,39 +175,43 @@ msgstr "Exclusão de moderador" msgid "Domain block" msgstr "Bloqueio de domínio" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "Audiolivro" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "e-book" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "Graphic novel" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "Capa dura" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "Capa mole" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,19 +465,19 @@ msgstr "Comentário de %(display_name)s em %(book_title)s" msgid "%(display_name)s's quote from %(book_title)s" msgstr "Citação de %(display_name)s em %(book_title)s" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "Resenha de %(display_name)s de %(book_title)s" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" msgstr[0] "%(display_name)s avaliou %(book_title)s: %(display_rating).1f estrela" msgstr[1] "%(display_name)s avaliou %(book_title)s: %(display_rating).1f estrelas" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "Resenhas" @@ -489,19 +493,19 @@ msgstr "Citações" msgid "Everything else" msgstr "Todo o resto" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "Linha do tempo" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "Página inicial" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "Linha do tempo dos livros" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -510,91 +514,91 @@ msgstr "Linha do tempo dos livros" msgid "Books" msgstr "Livros" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "English (Inglês)" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "Català (Catalão)" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "Deutsch (Alemão)" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "Esperanto (Esperanto)" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "Español (Espanhol)" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "Euskara (Basco)" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "Galego (Galego)" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "Italiano (Italiano)" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "한국어 (Coreano)" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "Suomi (Finlandês)" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "Français (Francês)" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (Lituano)" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "Holandês (Alemão)" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "Norsk (Norueguês)" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "Polski (Polonês)" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (Português do Brasil)" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Português Europeu)" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "Română (Romeno)" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "Svenska (Sueco)" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "Українська (Ucraniano)" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (Chinês simplificado)" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (Chinês tradicional)" @@ -839,7 +843,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -910,57 +914,62 @@ msgstr "Nascimento:" msgid "Died:" msgstr "Morte:" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "Série:" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "Links externos" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "Wikipédia" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "Website" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "Ver registro ISNI" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "Veja no ISFDB" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "Carregar informações" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "Ver na OpenLibrary" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "Ver no Inventaire" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "Ver no LibraryThing" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "Ver no Goodreads" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "Livros de %(name)s" @@ -997,8 +1006,8 @@ msgid "Name:" msgstr "Nome:" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "Separe com vírgulas." @@ -1035,7 +1044,8 @@ msgid "Openlibrary key:" msgstr "Chave Openlibrary:" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "ID Inventaire:" @@ -1044,7 +1054,7 @@ msgid "Librarything key:" msgstr "Chave Librarything:" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "Chave Goodreads:" @@ -1057,8 +1067,8 @@ msgid "ISNI:" msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1070,7 +1080,7 @@ msgstr "ISNI:" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1082,10 +1092,10 @@ msgstr "Salvar" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1095,7 +1105,7 @@ msgstr "Salvar" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1112,7 +1122,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "Para carregar informações nos conectaremos a %(source_name)s e buscaremos metadados que ainda não temos sobre este/a autor/a. Metadados já existentes não serão substituídos." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1129,97 +1140,116 @@ msgstr "Confirmar" msgid "Unable to connect to remote source." msgstr "Não conseguimos nos conectar à fonte remota." -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "Editar livro" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "Clique para adicionar uma capa" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "Erro ao carregar capa" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "Clique para aumentar" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "(%(review_count)s resenha)" msgstr[1] "(%(review_count)s resenhas)" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "Adicionar descrição" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "Descrição:" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" msgstr[0] "%(count)s edição" msgstr[1] "%(count)s edições" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "Você colocou esta edição na estante em:" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "Uma edição diferente deste livro está em sua estante %(shelf_name)s." -#: bookwyrm/templates/book/book.html:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "Andamento da sua leitura" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "Adicionar registro de leitura" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "Você ainda não registrou sua leitura." -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "Suas resenhas" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "Seus comentários" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "Suas citações" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "Assuntos" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "Lugares" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1234,15 +1264,15 @@ msgstr "Lugares" msgid "Lists" msgstr "Listas" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "Adicionar à lista" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1265,25 +1295,26 @@ msgid "Copied ISBN!" msgstr "ISBN copiado!" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "Número OCLC:" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "ASIN:" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "Audible ASIN:" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "ISFDB ID:" @@ -1294,12 +1325,12 @@ msgid "Goodreads:" msgstr "Goodreads:" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1308,12 +1339,12 @@ msgid "Add cover" msgstr "Adicionar capa" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "Enviar capa:" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "Subir capa desde URL:" @@ -1378,15 +1409,32 @@ msgstr "É um/a novo/a autor/a" msgid "Creating a new author: %(name)s" msgstr "Criando um/a novo/a autor/a: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "É uma edição de uma obra já registrada?" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "É uma nova obra" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1448,124 +1496,190 @@ msgstr "Organizar título:" msgid "Subtitle:" msgstr "Subtítulo:" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "Série:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "Número na série:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "Idiomas:" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "Assuntos:" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "Adicionar assunto" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "Excluir assunto" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "Adicionar outro assunto" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "Posição:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "Publicação" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "Editora:" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "Data da primeira publicação:" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "Data de publicação:" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "Autores/as" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "Remover %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "Página de autor/a de %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "Adicionar autores/as:" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "Adicionar autor/a" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "Fulana" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "Adicionar outro/a autor/a" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "Capa" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "Propriedades físicas" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "Formato:" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "Detalhes do formato:" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "Páginas:" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "Identificadores do livro" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "ISBN 13:" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "ISBN 10:" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "Openlibrary ID:" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1752,19 +1866,11 @@ msgstr "Publicado em %(date)s" msgid "rated it" msgstr "avaliou este livro" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "Séries de" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "Livro %(series_number)s" -#: bookwyrm/templates/book/series.html:28 -msgid "Unsorted Book" -msgstr "Livro não ordenado" - #: 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." @@ -1809,7 +1915,7 @@ msgstr "Código de confirmação:" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "Enviar" @@ -1870,7 +1976,7 @@ msgstr "Você pode desabilitar esta opção a qualquer momento em suas %(username)s started reading %(username)s começou a ler %(book_title)s" #: bookwyrm/templates/discover/card-header.html:23 +#: bookwyrm/templates/discover/card-header.html:32 #, python-format msgid "%(username)s rated %(book_title)s" msgstr "%(username)s avaliou %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "%(username)s resenhou %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "%(username)s comentou %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "%(username)s citou %(book_title)s" @@ -2164,14 +2271,14 @@ msgstr "Não há nenhuma atividade! Tente seguir um usuário para começar" msgid "Alternatively, you can try enabling more status types" msgstr "Uma outra opção é habilitar mais tipos de publicação" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: bookwyrm/templates/feed/layout.html:14 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" msgstr "Meta de leitura para %(year)s" -#: bookwyrm/templates/feed/goal_card.html:18 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "Você pode definir ou alterar sua meta de leitura a qualquer momento em sua página de perfil" @@ -2459,6 +2566,10 @@ msgstr "Este grupo não tem listas" msgid "Edit group" msgstr "Editar grupo" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "Pesquisar usuário para adicionar" @@ -3697,6 +3808,7 @@ msgid "Search for a book, author, user, or list" msgstr "" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "Escanear código de barras" @@ -4309,7 +4421,7 @@ msgstr[0] "" msgstr[1] "" #: bookwyrm/templates/notifications/items/status_preview.html:4 -#: bookwyrm/templates/snippets/status/content_status.html:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "Aviso de conteúdo" @@ -4776,7 +4888,7 @@ msgstr "" 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 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "" @@ -4969,10 +5081,9 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "Você está excluindo este registro de leitura e as %(count)s atualizações de andamento associadas." #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" -msgstr "Atualizar datas de leitura de \"%(title)s\"" +msgid "Update read dates for \"%(title)s\"" +msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 #: bookwyrm/templates/readthrough/readthrough_modal.html:38 @@ -5026,6 +5137,11 @@ msgstr "Editar registro de leitura" msgid "Delete these read dates" msgstr "Excluir estas datas de leitura" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "Atualizar datas de leitura de \"%(title)s\"" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5036,41 +5152,33 @@ msgstr "Adicionar datas de leitura de \"%(title)s\"" msgid "Report" msgstr "Denunciar" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "\n" -" Escanear código de barras\n" -" " - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "Solicitando a câmera..." -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "Dê acesso à câmera para escanearmos o código de barras do livro." -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "Não conseguimos acessar a câmera" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "Escaneando..." -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "Alinhe o código de barras do livro com a câmera." -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "ISBN escaneado" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "Pesquisando livro:" @@ -5171,13 +5279,13 @@ msgstr "Falso" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 msgid "Start date:" msgstr "Data de início:" #: bookwyrm/templates/settings/announcements/announcement.html:62 #: bookwyrm/templates/settings/announcements/edit_announcement.html:89 -#: bookwyrm/templates/settings/dashboard/dashboard.html:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "Data final:" @@ -5551,7 +5659,7 @@ msgid "Dashboard" msgstr "Painel" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "Total de usuários" @@ -5565,31 +5673,31 @@ msgstr "Ativo neste mês" msgid "Works" msgstr "Obras" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "Atividade da instância" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "Intervalo:" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "Dias" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "Semanas" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "Novos usuários" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "Publicações" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "Obras criadas" @@ -5901,13 +6009,49 @@ msgid "Unable to save settings" msgstr "Configurações não salvas" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6618,10 +6762,6 @@ msgstr "" msgid "Tasks" msgstr "" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "" @@ -7281,10 +7421,6 @@ msgstr "Citação:" msgid "An excerpt from '%(book_title)s'" msgstr "Um trecho de '%(book_title)s'" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "Posição:" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "Na página:" @@ -7297,12 +7433,12 @@ msgstr "Na porcentagem:" msgid "to" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "Sua resenha de '%(book_title)s'" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "Resenha:" @@ -7403,6 +7539,13 @@ msgid_plural "rated %(title)s: %(display_ratin msgstr[0] "avaliou %(title)s: %(display_rating)s estrela" msgstr[1] "avaliou %(title)s: %(display_rating)s estrelas" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" +msgstr[1] "" + #: 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" @@ -7615,35 +7758,35 @@ msgstr "Terminar de ler" msgid "Show rating" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "Mostrar publicação" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "Abrir imagem em nova janela" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "Esconder publicação" @@ -7702,16 +7845,22 @@ msgstr "começou a ler %(book)s de %(book)s" msgstr "começou a ler %(book)s" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "resenhou %(book)s de %(author_name)s" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "resenhou %(book)s" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -7990,15 +8139,23 @@ msgid_plural "%(num)d books - by %(user)s" msgstr[0] "" msgstr[1] "" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/pt_PT/LC_MESSAGES/django.po b/locale/pt_PT/LC_MESSAGES/django.po index efe2ab23b2..f8f7b46d00 100644 --- a/locale/pt_PT/LC_MESSAGES/django.po +++ b/locale/pt_PT/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-04-12 09:05\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:13\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Portuguese\n" "Language: pt\n" @@ -107,7 +107,7 @@ msgstr "Título do livro" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "Classificação" @@ -175,39 +175,43 @@ msgstr "Exclusão do moderador" msgid "Domain block" msgstr "Bloqueio de domínio" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "Livro-áudio" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "eBook" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "Novela gráfica" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "Capa dura" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "Capa mole" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "%(value)s não parece ser um ISBN" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "%(value)s Não tem a verificação do ISBN correta%(check_version)s" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,19 +465,19 @@ msgstr "%(display_name)s comentou em %(book_title)s" msgid "%(display_name)s's quote from %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" msgstr[0] "" msgstr[1] "" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "Criticas" @@ -489,19 +493,19 @@ msgstr "Citações" msgid "Everything else" msgstr "Tudo o resto" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "Cronograma Inicial" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "Início" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "Cronograma de Livros" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -510,91 +514,91 @@ msgstr "Cronograma de Livros" msgid "Books" msgstr "Livros" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "Inglês" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "Català (catalão)" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "Deutsch (Alemão)" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "Esperanto (Esperanto)" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "Español (Espanhol)" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "Euskara (Basco)" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "Galego (Galician)" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "Italiano (Italiano)" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "Suomi (finlandês)" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "Français (Francês)" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (lituano)" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "Holanda (Holanda)" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "Norsk (Norueguês)" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "Polski (Polaco)" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (Português brasileiro)" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "Português (Português Europeu)" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "Română (Romeno)" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "Svenska (sueco)" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "Українська (ucraniano)" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (Chinês simplificado)" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (Chinês tradicional)" @@ -839,7 +843,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -910,57 +914,62 @@ msgstr "Nascido a:" msgid "Died:" msgstr "Morreu em:" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "Séries:" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "Links externos" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "Wikipédia" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "Ver no Wikidata" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "Página Web" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "Ver registro do ISNI" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "Ver no ISFDB" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "Carregar dados" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "Ver na OpenLibrary" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "Ver no Inventaire" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "Ver na LibraryThing" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "Ver na Goodreads" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "Livros por %(name)s" @@ -997,8 +1006,8 @@ msgid "Name:" msgstr "Nome:" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "Separe vários valores com vírgulas." @@ -1035,7 +1044,8 @@ msgid "Openlibrary key:" msgstr "Chave da Openlibrary:" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "ID do Inventaire:" @@ -1044,7 +1054,7 @@ msgid "Librarything key:" msgstr "Chave do Librarything:" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "Chave do Goodreads:" @@ -1057,8 +1067,8 @@ msgid "ISNI:" msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1070,7 +1080,7 @@ msgstr "ISNI:" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1082,10 +1092,10 @@ msgstr "Salvar" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1095,7 +1105,7 @@ msgstr "Salvar" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1112,7 +1122,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "Carregar os dados irá conectar a %(source_name)s e verificar se há metadados sobre este autor que não estão aqui presentes. Os metadados existentes não serão substituídos." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1129,97 +1140,116 @@ msgstr "Confirmar" msgid "Unable to connect to remote source." msgstr "Não foi possível conectar à fonte remota." -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "Editar Livro" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "Clica para adicionar capa" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "Não foi possível carregar a capa" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "Clica para ampliar" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "(%(review_count)s crítica)" msgstr[1] "(%(review_count)s criticas)" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "Adicionar uma descrição" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "Descrição:" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" msgstr[0] "%(count)s edição" msgstr[1] "%(count)s edições" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "Tu arquivaste esta edição em:" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "Uma edição diferente deste livro está na tua prateleira %(shelf_name)s." -#: bookwyrm/templates/book/book.html:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "A tua atividade de leitura" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "Adicionar datas de leitura" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "Não tem nenhuma atividade de leitura para este livro." -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "As tuas criticas" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "Os teus comentários" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "As tuas citações" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "Temas/Áreas" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "Lugares" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1234,15 +1264,15 @@ msgstr "Lugares" msgid "Lists" msgstr "Listas" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "Adicionar à lista" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1265,25 +1295,26 @@ msgid "Copied ISBN!" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "Número OCLC:" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "ASIN:" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "Audível ASEM:" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "ISFDB ID:" @@ -1294,12 +1325,12 @@ msgid "Goodreads:" msgstr "Goodreads:" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1308,12 +1339,12 @@ msgid "Add cover" msgstr "Adicionar uma capa" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "Carregar uma capa:" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "" @@ -1378,15 +1409,32 @@ msgstr "Este é um novo autor" msgid "Creating a new author: %(name)s" msgstr "Criar um novo autor: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "Esta é uma edição de um trabalho existente?" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "Este é um novo trabalho" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1448,124 +1496,190 @@ msgstr "" msgid "Subtitle:" msgstr "Subtítulo:" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "Séries:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "Número da série:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "Idiomas:" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "Assuntos:" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "Adicionar um assunto" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "Remover o assunto" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "Adicionar outro assunto" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "Posição:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "Publicação" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "Editora:" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "Primeira data de publicação:" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "Data de publicação:" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "Autor(es/as)" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "Remover %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "Página de autor do %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "Adicionar Autor(es/as):" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "Adicionar Autor(a)" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "Joana Sem-nome" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "Adicionar outro autor(a)" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "Capa" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "Propriedades físicas" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "Formato:" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "Detalhes do formato:" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "Páginas:" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "Identificadores de Livros" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "ISBN 13:" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "ISBN 10:" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "ID da Openlibrary:" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1752,19 +1866,11 @@ msgstr "Publicado em %(date)s" msgid "rated it" msgstr "avalia-o" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "Série por" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "Livro %(series_number)s" -#: bookwyrm/templates/book/series.html:28 -msgid "Unsorted Book" -msgstr "Livro não organizado" - #: 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." @@ -1809,7 +1915,7 @@ msgstr "Código de confirmação:" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "Submeter" @@ -1870,7 +1976,7 @@ msgstr "Tu poderás optar por sair a qualquer momento nas tuas configurações d #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1964,21 +2070,22 @@ msgid "%(username)s started reading %(username)s começou a ler %(book_title)s" #: bookwyrm/templates/discover/card-header.html:23 +#: bookwyrm/templates/discover/card-header.html:32 #, python-format msgid "%(username)s rated %(book_title)s" msgstr "%(username)s avaliou %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "%(username)s avaliou o %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "%(username)s comentou em %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "%(username)s citou %(book_title)s" @@ -2164,14 +2271,14 @@ msgstr "Não existem atividades agora! Experimenta seguir um utilizador para com msgid "Alternatively, you can try enabling more status types" msgstr "Alternativamente, podes tentar ativar mais tipos de estado" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: bookwyrm/templates/feed/layout.html:14 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" msgstr "Objetivo de leitura de %(year)s" -#: bookwyrm/templates/feed/goal_card.html:18 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "Podes definir ou alterar a tua meta de leitura a qualquer momento a partir da tua página de perfil" @@ -2459,6 +2566,10 @@ msgstr "Este grupo não tem listas" msgid "Edit group" msgstr "Editar grupo" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "Procura para adicionares um utilizador" @@ -3697,6 +3808,7 @@ msgid "Search for a book, author, user, or list" msgstr "Procurar por um livro, autor, utilizador, ou lista" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "Ler código de barras" @@ -4309,7 +4421,7 @@ msgstr[0] "" msgstr[1] "%(display_count)s novos domínio do link precisam de moderação" #: bookwyrm/templates/notifications/items/status_preview.html:4 -#: bookwyrm/templates/snippets/status/content_status.html:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "Aviso de Conteúdo" @@ -4776,7 +4888,7 @@ msgstr "" 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 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "Descarregar ficheiro" @@ -4969,10 +5081,9 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "Estás a apagar esta leitura e suas atualizações de progresso %(count)s associadas." #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" -msgstr "Atualizar datas de leitura para \"%(title)s\"" +msgid "Update read dates for \"%(title)s\"" +msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 #: bookwyrm/templates/readthrough/readthrough_modal.html:38 @@ -5026,6 +5137,11 @@ msgstr "Editar datas de leitura" msgid "Delete these read dates" msgstr "Excluir estas datas de leitura" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "Atualizar datas de leitura para \"%(title)s\"" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5036,41 +5152,33 @@ msgstr "Adicionar datas de leitura para \"%(title)s\"" msgid "Report" msgstr "Denunciar" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "\n" -" Leia o código de barras\n" -" " - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "Solicitando câmera..." -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "Conceder acesso à câmara para fazer scan ao código de barras do livro." -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "Não foi possível aceder a câmara" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "Fazendo scan..." -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "Alinha o código de barras do livro com a câmara." -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "ISBN digitalizado" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "Pesquisando pelo livro:" @@ -5171,13 +5279,13 @@ msgstr "Falso" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 msgid "Start date:" msgstr "Data de início:" #: bookwyrm/templates/settings/announcements/announcement.html:62 #: bookwyrm/templates/settings/announcements/edit_announcement.html:89 -#: bookwyrm/templates/settings/dashboard/dashboard.html:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "Data de conclusão:" @@ -5551,7 +5659,7 @@ msgid "Dashboard" msgstr "Painel de controlo" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "Total de utilizadores" @@ -5565,31 +5673,31 @@ msgstr "Atividade este mês" msgid "Works" msgstr "Obras" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "Atividade do domínio" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "Intervalo:" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "Dias" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "Semanas" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "Atividade de inscrição do utilizador" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "Atividade de estado" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "Obras criadas" @@ -5901,13 +6009,49 @@ msgid "Unable to save settings" msgstr "Não é possível guardar as configurações" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6618,10 +6762,6 @@ msgstr "" msgid "Tasks" msgstr "" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "" @@ -7281,10 +7421,6 @@ msgstr "Citação:" msgid "An excerpt from '%(book_title)s'" msgstr "Um excerto de '%(book_title)s'" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "Posição:" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "Na página:" @@ -7297,12 +7433,12 @@ msgstr "Na percentagem:" msgid "to" msgstr "para" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "A tua critica de '%(book_title)s'" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "Critica:" @@ -7403,6 +7539,13 @@ msgid_plural "rated %(title)s: %(display_ratin msgstr[0] "avaliado %(title)s: %(display_rating)s estrela" msgstr[1] "avaliado %(title)s: %(display_rating)s estrelas" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" +msgstr[1] "" + #: 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" @@ -7615,35 +7758,35 @@ msgstr "Terminar leitura" msgid "Show rating" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "Mostrar o estado" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "(Página %(page)s" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "%(endpage)s" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "(%(percent)s%%" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr " - %(endpercent)s%%" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "Abrir imagem numa nova janela" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "Ocultar estado" @@ -7702,16 +7845,22 @@ msgstr "começou a ler %(book)s por %(book)s" msgstr "começou a ler %(book)s" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "avaliou %(book)s de %(author_name)s" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "criticou %(book)s" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -7990,15 +8139,23 @@ msgid_plural "%(num)d books - by %(user)s" msgstr[0] "" msgstr[1] "" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/ro_RO/LC_MESSAGES/django.po b/locale/ro_RO/LC_MESSAGES/django.po index 9445472667..87d04ad8c4 100644 --- a/locale/ro_RO/LC_MESSAGES/django.po +++ b/locale/ro_RO/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-06 18:48\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:12\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Romanian\n" "Language: ro\n" @@ -107,7 +107,7 @@ msgstr "Titlul cărții" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "Rating" @@ -175,39 +175,43 @@ msgstr "Șters de moderator" msgid "Domain block" msgstr "Blocat de domeniu" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "Carte audio" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "Carte digitală" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "Roman grafic" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "Copertă dură" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "Broșură" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,12 +465,12 @@ msgstr "Comentariul lui %(display_name)s despre %(book_title)s" msgid "%(display_name)s's quote from %(book_title)s" msgstr "Citatul lui %(display_name)s despre %(book_title)s" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "Recenzia lui %(display_name)s despre %(book_title)s" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" @@ -474,7 +478,7 @@ msgstr[0] "%(display_name)s a făcut recenzie la %(book_title)s: %(display_ratin msgstr[1] "" msgstr[2] "%(display_name)s a făcut recenzie la %(book_title)s: %(display_rating).1f stele" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "Recenzii" @@ -490,19 +494,19 @@ msgstr "Citate" msgid "Everything else" msgstr "Orice altceva" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "Friză cronologică principală" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "Acasă" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "Friză cronologică de cărți" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -511,91 +515,91 @@ msgstr "Friză cronologică de cărți" msgid "Books" msgstr "Cărți" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "English (engleză)" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "Català (catalană)" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "Deutsch (germană)" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "Español (spaniolă)" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "Galego (galiciană)" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "Italiano (italiană)" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "Suomi (finlandeză)" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "Français (franceză)" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (lituaniană)" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "Norsk (norvegiană)" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (portugheză braziliană)" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (portugheză europeană)" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "Română (română)" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "Svenska (suedeză)" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (chineză simplificată)" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (chineză tradițională)" @@ -842,7 +846,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -915,57 +919,62 @@ msgstr "Născut:" msgid "Died:" msgstr "Mort:" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "Serie:" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "Legături externe" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "Wikipedia" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "Vizualizați intrarea ISNI" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "Încărcați date" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "Vizualizați în OpenLibrary" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "Vizualizați în Inventaire" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "Vizualizați în LibraryThing" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "Vizualizați în Goodreads" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "Cărți de %(name)s" @@ -1002,8 +1011,8 @@ msgid "Name:" msgstr "Nume:" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "Separați valori multiple prin virgulă." @@ -1040,7 +1049,8 @@ msgid "Openlibrary key:" msgstr "Cheie OpenLibrary:" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "ID Inventaire:" @@ -1049,7 +1059,7 @@ msgid "Librarything key:" msgstr "Cheie LibraryThing:" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "Cheie GoodReads:" @@ -1062,8 +1072,8 @@ msgid "ISNI:" msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1075,7 +1085,7 @@ msgstr "ISNI:" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1087,10 +1097,10 @@ msgstr "Salvați" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1100,7 +1110,7 @@ msgstr "Salvați" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1117,7 +1127,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "Încărcatul de date se va conecta la %(source_name)s și verifica orice metadate despre autor care nu sunt prezente aici. Metadatele existente nu vor fi suprascrise." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1134,31 +1145,50 @@ msgstr "Confirmați" msgid "Unable to connect to remote source." msgstr "Nu s-a putut stabili conexiunea la distanță." -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "Editați carte" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "Adăugați o copertă" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "Eșec la încărcarea coperții" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "Clic pentru a mări" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" @@ -1166,17 +1196,17 @@ msgstr[0] "(%(review_count)s recenzie)" msgstr[1] "" msgstr[2] "(%(review_count)s recenzii)" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "Adăugați o descriere" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "Descriere:" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" @@ -1184,49 +1214,49 @@ msgstr[0] "%(count)s ediție" msgstr[1] "" msgstr[2] "%(count)s ediții" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "Ați pus această ediție pe raftul:" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "O ediție diferită a acestei cărți este pe %(shelf_name)s raftul vostru." -#: bookwyrm/templates/book/book.html:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "Activitatea dvs. de lectură" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "Adăugați date de lectură" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "Nu aveți nicio activitate de lectură pentru această carte." -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "Recenziile dvs." -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "Comentariile dvs." -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "Citatele dvs." -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "Subiecte" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "Locuri" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1241,15 +1271,15 @@ msgstr "Locuri" msgid "Lists" msgstr "Liste" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "Adăugați la listă" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1272,25 +1302,26 @@ msgid "Copied ISBN!" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "Număr OCLC:" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "ASIN:" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "" @@ -1301,12 +1332,12 @@ msgid "Goodreads:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1315,12 +1346,12 @@ msgid "Add cover" msgstr "Adăugați copertă" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "Încărcați copertă:" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "" @@ -1385,15 +1416,32 @@ msgstr "Acesta este un autor nou" msgid "Creating a new author: %(name)s" msgstr "Creați un autor nou: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "Este această o ediție a unei opere existente?" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "Aceasta este o operă nouă" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1455,124 +1503,190 @@ msgstr "" msgid "Subtitle:" msgstr "Subtitlu:" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "Serie:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "Numărul din serie:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "Limbi:" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "Subiecte:" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "Adăugați subiect" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "Înlăturați subiect" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "Adăugați un alt subiect" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "Poziție:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "Publicație" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "Editor:" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "Prima dată de publicare:" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "Data de publicare:" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "Autori" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "Înlăturați %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "Pagina de autori pentru %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "Adăugați autori:" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "Adaugă autor" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "Necunoscut" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "Adăugați un alt autor" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "Copertă" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "Proprietăți fizice" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "Format:" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "Detalii de format:" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "Pagini:" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "Date de identificare ale cărții" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "ISBN 13:" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "ISBN 10:" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "ID OpenLibrary:" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1759,19 +1873,11 @@ msgstr "Publicat în %(date)s" msgid "rated it" msgstr "a evaluat-o" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "" -#: 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." @@ -1816,7 +1922,7 @@ msgstr "Cod de confirmare:" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "Trimiteți" @@ -1877,7 +1983,7 @@ msgstr "Puteți să vă dezabonați în orice moment în se #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1973,21 +2079,22 @@ msgid "%(username)s started reading %(username)s a început să citească %(book_title)s" #: bookwyrm/templates/discover/card-header.html:23 +#: bookwyrm/templates/discover/card-header.html:32 #, python-format msgid "%(username)s rated %(book_title)s" msgstr "%(username)s a evaluat %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "%(username)s a revizuit %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "%(username)s a comentat despre %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "%(username)s a citat %(book_title)s" @@ -2173,14 +2280,14 @@ msgstr "Nu există nicio activitate momentan! Încercați să urmăriți un util msgid "Alternatively, you can try enabling more status types" msgstr "Alternativ, puteți încerca să activați mai multe tipuri de statusuri" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: bookwyrm/templates/feed/layout.html:14 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" msgstr "Obiectivul de lectură din %(year)s" -#: bookwyrm/templates/feed/goal_card.html:18 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "Puteți alege sau schimba obiectul dvs. de lectură oricând folosind pagina dvs. de profil" @@ -2468,6 +2575,10 @@ msgstr "Acest grup nu are nicio listă" msgid "Edit group" msgstr "Editați grupul" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "Căutați pentru a adăuga un utilizator" @@ -3711,6 +3822,7 @@ msgid "Search for a book, author, user, or list" msgstr "" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "Scanați codul de bare" @@ -4328,7 +4440,7 @@ msgstr[1] "" msgstr[2] "%(display_count)s noi rapoarte au nevoie de moderare" #: bookwyrm/templates/notifications/items/status_preview.html:4 -#: bookwyrm/templates/snippets/status/content_status.html:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "Avertisment de conținut" @@ -4796,7 +4908,7 @@ msgstr "" 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 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "Descărcați fișierul" @@ -4989,10 +5101,9 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "Sunteți pe cale de a șterge acest rezumat și %(count)s actualizări asociate progresului." #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" -msgstr "Actualizați datele de lectură pentru „%(title)s”" +msgid "Update read dates for \"%(title)s\"" +msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 #: bookwyrm/templates/readthrough/readthrough_modal.html:38 @@ -5046,6 +5157,11 @@ msgstr "Editați datele de lectură" msgid "Delete these read dates" msgstr "Ștergeți aceste date de lectură" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "Actualizați datele de lectură pentru „%(title)s”" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5056,40 +5172,33 @@ msgstr "Adăugați date de lectură pentru „%(title)s”" msgid "Report" msgstr "Raportați" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "\n" -"Scanați codul de bare " - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "În așteptarea camerei foto..." -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "Acordați acces camerei foto pentru a scana codul de bare al cărții." -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "Camera foto nu a putut fi accesată" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "Se scanează..." -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "Poziționați codul de bare al cărții în fața camerei foto." -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "Cod ISBN scanat" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "Căutați o carte:" @@ -5192,13 +5301,13 @@ msgstr "Fals" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 msgid "Start date:" msgstr "Data de început:" #: bookwyrm/templates/settings/announcements/announcement.html:62 #: bookwyrm/templates/settings/announcements/edit_announcement.html:89 -#: bookwyrm/templates/settings/dashboard/dashboard.html:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "Data de sfârșit:" @@ -5572,7 +5681,7 @@ msgid "Dashboard" msgstr "Tablou de bord" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "Număr total de utilizatori" @@ -5586,31 +5695,31 @@ msgstr "Activi această lună" msgid "Works" msgstr "Opere" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "Activitatea instanței" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "Interval:" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "Zile" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "Săptămâni" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "Activitate de înscriere a utilizatorilor" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "Activitate stare" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "Opere create" @@ -5926,13 +6035,49 @@ msgid "Unable to save settings" msgstr "Incapabil de a salva setările" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6643,10 +6788,6 @@ msgstr "" msgid "Tasks" msgstr "" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "" @@ -7308,10 +7449,6 @@ msgstr "Citat:" msgid "An excerpt from '%(book_title)s'" msgstr "Un extras din „%(book_title)s”" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "Poziție:" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "Pe pagină:" @@ -7324,12 +7461,12 @@ msgstr "Procent:" msgid "to" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "Recenzia dvs. pentru „%(book_title)s”" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "Recenzie:" @@ -7434,6 +7571,14 @@ msgstr[0] "a evaluat %(title)s: %(display_rati msgstr[1] "" msgstr[2] "a evaluat %(title)s: %(display_rating)s stele" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + #: 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" @@ -7647,35 +7792,35 @@ msgstr "Terminați de citit" msgid "Show rating" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "Arătați stare" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "Deshideți imaginea într-o fereastră nouă" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "Ascundeți starea" @@ -7734,16 +7879,22 @@ msgstr "a început să citească %(book)s de %(book)s" msgstr "a început să citească %(book)s" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "a evaluat %(book)s de %(author_name)s" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "a evaluat %(book)s" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -8025,15 +8176,23 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/ru_RU/LC_MESSAGES/django.po b/locale/ru_RU/LC_MESSAGES/django.po index d8c21672a4..c7705874da 100644 --- a/locale/ru_RU/LC_MESSAGES/django.po +++ b/locale/ru_RU/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-06 18:48\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-06-08 03:17\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Russian\n" "Language: ru\n" @@ -19,7 +19,7 @@ msgstr "" #: bookwyrm/forms/admin.py:42 msgid "One Day" -msgstr "Один День" +msgstr "Один день" #: bookwyrm/forms/admin.py:43 msgid "One Week" @@ -99,7 +99,7 @@ msgstr "" #: bookwyrm/forms/lists.py:26 msgid "List Order" -msgstr "Список по-порядку" +msgstr "По порядку" #: bookwyrm/forms/lists.py:27 msgid "Book Title" @@ -107,7 +107,7 @@ msgstr "Название книги" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "Оценка" @@ -121,7 +121,7 @@ msgstr "По возрастанию" #: bookwyrm/forms/lists.py:35 msgid "Descending" -msgstr "По убавынию" +msgstr "По убыванию" #: bookwyrm/models/announcement.py:12 msgid "Primary" @@ -175,55 +175,59 @@ msgstr "Удаление модератора" msgid "Domain block" msgstr "Доменная блокировка" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "Аудиокнига" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "Электронная книга" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "Графический роман" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "Твёрдая обложка" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "Мягкая обложка" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 msgid "Comment" -msgstr "" +msgstr "Комментарий" #: bookwyrm/models/bookwyrm_import_job.py:152 #: bookwyrm/templates/import/import_status.html:127 #: bookwyrm/templates/import/manual_review.html:13 #: bookwyrm/templates/snippets/create_status.html:16 msgid "Review" -msgstr "" +msgstr "Рецензия" #: bookwyrm/models/bookwyrm_import_job.py:153 msgid "Quotation" -msgstr "" +msgstr "Цитата" #: bookwyrm/models/bookwyrm_import_job.py:181 #: bookwyrm/templates/snippets/follow_button.html:24 @@ -461,23 +465,23 @@ msgstr "" msgid "%(display_name)s's quote from %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "%(display_name)s оценил(а) %(book_title)s: %(display_rating).1f звезда" +msgstr[1] "%(display_name)s оценил(а) %(book_title)s: %(display_rating).1f звезды" +msgstr[2] "%(display_name)s оценил(а) %(book_title)s: %(display_rating).1f звёзд" msgstr[3] "" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" -msgstr "Отзывы" +msgstr "Рецензии" #: bookwyrm/models/user.py:41 msgid "Comments" @@ -491,19 +495,19 @@ msgstr "Цитаты" msgid "Everything else" msgstr "Всё остальное" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" -msgstr "Главная Лента времени" +msgstr "Главная лента" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "Главная" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "Хронология книг" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -512,91 +516,91 @@ msgstr "Хронология книг" msgid "Books" msgstr "Книги" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "English (Английский)" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "Català (Каталанский)" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "Deutsch (немецкий)" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "Esperanto (Эсперанто)" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "Español (испанский)" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "Euskara (Баскский)" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "Galego (Галицкий)" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "Italiano (Итальянский)" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "한국어 (Корейский)" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "Suomi (Финский)" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "Français (французский)" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (литовский)" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "Нидерланды (голландский)" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "Norsk (норвежский)" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "Polski (Польский)" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (Бразильский Португальский)" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Европейский Португальский)" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "Română (румынский)" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "Svenska (Шведский)" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "Українська (Украинский)" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (упрощенный китайский)" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (Традиционный китайский)" @@ -845,7 +849,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -901,7 +905,7 @@ msgstr "" #: bookwyrm/templates/author/author.html:19 #: bookwyrm/templates/author/author.html:20 msgid "Edit Author" -msgstr "Изменить имя автора" +msgstr "Редактировать автора" #: bookwyrm/templates/author/author.html:36 msgid "Author details" @@ -910,7 +914,7 @@ msgstr "Об авторе" #: bookwyrm/templates/author/author.html:40 #: bookwyrm/templates/author/edit_author.html:42 msgid "Aliases:" -msgstr "Алиасы:" +msgstr "Псевдонимы:" #: bookwyrm/templates/author/author.html:49 msgid "Born:" @@ -920,57 +924,62 @@ msgstr "Дата рождения:" msgid "Died:" msgstr "Дата смерти:" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "Цикл:" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "Внешние ссылки" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "Википедия" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" -msgstr "" +msgstr "Посмотреть на Wikidata" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "Сайт" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "Просмотреть запись ISNI" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" -msgstr "" +msgstr "Посмотреть на ISFDB" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "Загрузить данные" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" -msgstr "Просмотреть на OpenLibrary" +msgstr "Посмотреть на OpenLibrary" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "Посмотреть на Inventaire" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "Посмотреть на LibraryThing" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "Посмотреть на Goodreads" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "Книги по %(name)s" @@ -987,12 +996,12 @@ msgstr "Добавлено:" #: bookwyrm/templates/author/edit_author.html:14 #: bookwyrm/templates/book/edit/edit_book.html:28 msgid "Updated:" -msgstr "Обновленно:" +msgstr "Обновлено:" #: bookwyrm/templates/author/edit_author.html:16 #: bookwyrm/templates/book/edit/edit_book.html:32 msgid "Last edited by:" -msgstr "Последним редактировал:" +msgstr "Отредактировано:" #: bookwyrm/templates/author/edit_author.html:33 #: bookwyrm/templates/book/edit/edit_book_form.html:21 @@ -1007,8 +1016,8 @@ msgid "Name:" msgstr "Название:" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "Разделите несколько значений запятыми." @@ -1022,11 +1031,11 @@ msgstr "Ссылка на Википедию:" #: bookwyrm/templates/author/edit_author.html:58 msgid "Wikidata:" -msgstr "" +msgstr "Wikidata:" #: bookwyrm/templates/author/edit_author.html:62 msgid "Website:" -msgstr "" +msgstr "Сайт:" #: bookwyrm/templates/author/edit_author.html:67 msgid "Birth date:" @@ -1045,30 +1054,31 @@ msgid "Openlibrary key:" msgstr "Ключ OpenLibrary:" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" -msgstr "Идентификатор библио-сети Inventaire.io:" +msgstr "Inventaire ID:" #: bookwyrm/templates/author/edit_author.html:97 msgid "Librarything key:" msgstr "Ключ для Librarything:" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "Goodreads ключ:" #: bookwyrm/templates/author/edit_author.html:111 msgid "ISFDB:" -msgstr "" +msgstr "ISFDB:" #: bookwyrm/templates/author/edit_author.html:118 msgid "ISNI:" msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1080,7 +1090,7 @@ msgstr "ISNI:" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1092,10 +1102,10 @@ msgstr "Сохранить" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1105,7 +1115,7 @@ msgstr "Сохранить" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1122,7 +1132,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "" #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1139,101 +1150,120 @@ msgstr "Подтвердите" msgid "Unable to connect to remote source." msgstr "Не удается подключиться к удаленному источнику." -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "Эта книга может входить в цикл %(series)s." + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "Отредактируйте страницу, чтобы подтвердить это." + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "Книга %(number)s в %(title)s" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "Редактировать книгу" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "Добавить обложку" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "Ошибка загрузки обложки" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "Нажмите, чтобы увеличить" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" -msgstr "" +msgstr "Посмотреть на Finna" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" -msgstr "" +msgstr "Посмотреть на Libris" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" -msgstr[0] "(Обзоров: %(review_count)s)" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "(%(review_count)s рецензия)" +msgstr[1] "(%(review_count)s рецензии)" +msgstr[2] "(%(review_count)s рецензий)" msgstr[3] "" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "Добавить описание" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "Описание:" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" -msgstr[0] "%(count)s редакция" -msgstr[1] "%(count)s" -msgstr[2] "" +msgstr[0] "%(count)s издание" +msgstr[1] "%(count)s издания" +msgstr[2] "%(count)s изданий" msgstr[3] "" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "Вы отложили это издание в:" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, 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:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "Ваша активность по чтению" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "Добавить даты прочтения" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "У вас нет активности по чтению для этой книги." -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" -msgstr "Ваши отзывы" +msgstr "Мои рецензии" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "Ваши комментарии" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" -msgstr "Ваши цитаты" +msgstr "Мои цитаты" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "Жанры" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "Места" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1246,17 +1276,17 @@ msgstr "Места" #: bookwyrm/templates/settings/celery.html:77 #: bookwyrm/templates/user/layout.html:101 bookwyrm/templates/user/lists.html:6 msgid "Lists" -msgstr "Списки" +msgstr "Подборки" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "Добавить в список" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." -msgstr "" +msgstr "Создать список..." -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1279,28 +1309,29 @@ msgid "Copied ISBN!" msgstr "ISBN скопирован!" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "OCLC номер:" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "ASIN (Стандартный идентификационный номер Amazon):" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" -msgstr "" +msgstr "ISFDB ID:" #: bookwyrm/templates/book/book_identifiers.html:51 #: bookwyrm/templates/rss/edition.html:10 @@ -1308,28 +1339,28 @@ msgid "Goodreads:" msgstr "Goodreads:" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" -msgstr "" +msgstr "Finna ID:" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" -msgstr "" +msgstr "Libris ID:" #: 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:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "Загрузить свою обложку:" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" -msgstr "" +msgstr "Загрузить обложку по ссылке:" #: bookwyrm/templates/book/cover_show_modal.html:6 msgid "Book cover preview" @@ -1392,15 +1423,32 @@ msgstr "Это новый автор" msgid "Creating a new author: %(name)s" msgstr "Создание нового автора: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "Является ли это изданием существующей работы?" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "Это новая работа" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1462,124 +1510,190 @@ msgstr "Сортировка по названию:" msgid "Subtitle:" msgstr "Подзаголовок:" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "Серии:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "Номер серии:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "Языки:" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "Жанры:" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "Добавить жанр" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "Удалить жанр" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "Добавить ещё жанр" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "Цикл" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "Изменить цикл" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "Добавить цикл" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "Название цикла:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "Публикация" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "Издатель:" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "Дата первой публикации:" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "Дата публикации:" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "Авторы" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "Убрать %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "Страница автора для %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "Добавить авторов:" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "Добавить автора" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "Джейн До" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "Добавить другого автора" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "Обложка" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "Физические свойства" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "Формат:" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "Детали формата:" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" -msgstr "Страницы:" +msgstr "Страниц:" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "Идентификаторы книги" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "ISBN 13:" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "ISBN 10:" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "Идентификатор OpenLibrary:" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "Изменить «%(title)s»" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "Изменить «%(name)s»" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "Название" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "Добавить альтернативное название:" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "Добавить альтернативное название" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "Wikidata ID:" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1614,7 +1728,7 @@ msgstr "Поиск редакций" #: bookwyrm/templates/book/file_links/add_link_modal.html:6 msgid "Add file link" -msgstr "" +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." @@ -1712,7 +1826,7 @@ msgstr "" #: bookwyrm/templates/book/file_links/links.html:9 msgid "Get a copy" -msgstr "" +msgstr "Получить копию" #: bookwyrm/templates/book/file_links/links.html:47 msgid "No links available" @@ -1766,18 +1880,10 @@ msgstr "Опубликовано %(date)s" msgid "rated it" msgstr "оценил(а) на" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" -msgstr "" - -#: bookwyrm/templates/book/series.html:28 -msgid "Unsorted Book" -msgstr "" +msgstr "Книга %(series_number)s" #: bookwyrm/templates/book/sync_modal.html:15 #, python-format @@ -1786,15 +1892,15 @@ msgstr "" #: bookwyrm/templates/compose.html:7 bookwyrm/templates/compose.html:21 msgid "Edit review" -msgstr "" +msgstr "Редактировать рецензию" #: bookwyrm/templates/compose.html:9 bookwyrm/templates/compose.html:23 msgid "Edit quote" -msgstr "" +msgstr "Редактировать цитату" #: bookwyrm/templates/compose.html:11 bookwyrm/templates/compose.html:25 msgid "Edit comment" -msgstr "" +msgstr "Редактировать комментарий" #: bookwyrm/templates/compose.html:13 bookwyrm/templates/compose.html:27 msgid "Edit status" @@ -1823,7 +1929,7 @@ msgstr "Код подтверждения:" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "Отправить" @@ -1867,15 +1973,15 @@ msgstr "Федеративное сообщество" #: bookwyrm/templates/directory/directory.html:9 #: bookwyrm/templates/user_menu.html:34 msgid "Directory" -msgstr "Каталог" +msgstr "Каталог профилей" #: bookwyrm/templates/directory/directory.html:17 msgid "Make your profile discoverable to other BookWyrm users." -msgstr "Сделайте свой профиль обнаруживаемым для других пользователей BookWyrm." +msgstr "Сделайте свой профиль заметным для других пользователей BookWyrm." #: bookwyrm/templates/directory/directory.html:21 msgid "Join Directory" -msgstr "Войти в каталог" +msgstr "Присоединиться к Народу" #: bookwyrm/templates/directory/directory.html:24 #, python-format @@ -1884,7 +1990,7 @@ msgstr "" #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1939,7 +2045,7 @@ msgstr "" #: bookwyrm/templates/directory/user_card.html:61 msgid "last active" -msgstr "" +msgstr "последняя активность" #: bookwyrm/templates/directory/user_connection_filter.html:5 #: bookwyrm/templates/import/user_troubleshoot.html:65 @@ -1960,7 +2066,7 @@ msgstr "" #: bookwyrm/templates/directory/user_type_filter.html:8 msgid "BookWyrm users" -msgstr "" +msgstr "Пользователи BookWyrm" #: bookwyrm/templates/directory/user_type_filter.html:12 msgid "All known users" @@ -1974,7 +2080,7 @@ msgstr "%(username)s хочет прочитать #: bookwyrm/templates/discover/card-header.html:13 #, python-format msgid "%(username)s finished reading %(book_title)s" -msgstr "" +msgstr "%(username)s дочитал(а) %(book_title)s" #: bookwyrm/templates/discover/card-header.html:18 #, python-format @@ -1982,21 +2088,22 @@ msgid "%(username)s started reading %(username)s rated %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" -msgstr "" +msgstr "%(username)s прокомментировал(а) %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "%(username)s процитировал %(book_title)s" @@ -2005,12 +2112,12 @@ msgstr "%(username)s процитировал profile page" msgstr "" @@ -2202,7 +2309,7 @@ msgstr "" #: bookwyrm/templates/guided_tour/home.html:127 #: bookwyrm/templates/layout.html:94 msgid "Your Books" -msgstr "Ваши книги" +msgstr "Мои Книги" #: bookwyrm/templates/feed/suggested_books.html:10 msgid "There are no books here right now! Try searching for a book to get started" @@ -2227,7 +2334,7 @@ msgstr "" #: bookwyrm/templates/feed/suggested_users.html:14 msgid "View directory" -msgstr "" +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!" @@ -2245,7 +2352,7 @@ msgstr "" #: bookwyrm/templates/get_started/book_preview.html:7 msgid "Add to your books" -msgstr "" +msgstr "Добавить к моим книгам" #: bookwyrm/templates/get_started/book_preview.html:10 #: bookwyrm/templates/shelf/shelf.html:93 bookwyrm/templates/user/user.html:46 @@ -2445,11 +2552,11 @@ msgstr "Удалить" #: bookwyrm/templates/groups/edit_form.html:5 msgid "Edit Group" -msgstr "Править группу" +msgstr "Редактировать группу" #: bookwyrm/templates/groups/form.html:8 msgid "Group Name:" -msgstr "Имя группы:" +msgstr "Название группы:" #: bookwyrm/templates/groups/form.html:12 msgid "Group Description:" @@ -2467,7 +2574,7 @@ msgstr "Члены этой группы могут создавать кури #: bookwyrm/templates/lists/create_form.html:5 #: bookwyrm/templates/lists/lists.html:20 msgid "Create List" -msgstr "Создать список" +msgstr "Создать Подборку" #: bookwyrm/templates/groups/group.html:39 msgid "This group has no lists" @@ -2477,6 +2584,10 @@ msgstr "В этой группе нет списков" msgid "Edit group" msgstr "Править группу" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "Участники группы" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "" @@ -2547,7 +2658,7 @@ msgstr "" #: bookwyrm/templates/guided_tour/user_groups.html:19 #: bookwyrm/templates/guided_tour/user_profile.html:19 msgid "End Tour" -msgstr "" +msgstr "Завершить Тур" #: bookwyrm/templates/guided_tour/book.html:26 #: bookwyrm/templates/guided_tour/book.html:50 @@ -2596,7 +2707,7 @@ msgstr "" #: bookwyrm/templates/guided_tour/user_profile.html:118 #: bookwyrm/templates/snippets/pagination.html:30 msgid "Next" -msgstr "Следующая" +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." @@ -2620,7 +2731,7 @@ msgstr "" #: bookwyrm/templates/guided_tour/book.html:80 msgid "Other editions" -msgstr "" +msgstr "Другие издания" #: bookwyrm/templates/guided_tour/book.html:102 msgid "You can post a review, comment, or quote here." @@ -2692,7 +2803,7 @@ msgstr "" #: bookwyrm/templates/guided_tour/user_groups.html:116 #: bookwyrm/templates/guided_tour/user_profile.html:141 msgid "Ok" -msgstr "" +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." @@ -2728,11 +2839,11 @@ 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 "" +msgstr "Поздравляем, вы завершили тур! Теперь вы знаете основы, но вам ещё предстоит многое открыть для себя самостоятельно. Приятного чтения!" #: bookwyrm/templates/guided_tour/group.html:115 msgid "End tour" -msgstr "" +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?" @@ -2742,16 +2853,16 @@ msgstr "" #: bookwyrm/templates/guided_tour/home.html:39 #: bookwyrm/templates/snippets/footer.html:20 msgid "Guided Tour" -msgstr "" +msgstr "Тур по сайту" #: bookwyrm/templates/guided_tour/home.html:25 #: bookwyrm/templates/two_factor_auth/two_factor_prompt.html:36 msgid "No thanks" -msgstr "" +msgstr "Нет, спасибо" #: bookwyrm/templates/guided_tour/home.html:33 msgid "Yes please!" -msgstr "" +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" @@ -2771,7 +2882,7 @@ msgstr "" #: bookwyrm/templates/guided_tour/home.html:80 msgid "Barcode reader" -msgstr "" +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!" @@ -2779,7 +2890,7 @@ msgstr "" #: bookwyrm/templates/guided_tour/home.html:103 msgid "Navigation Bar" -msgstr "" +msgstr "Панель навигации" #: bookwyrm/templates/guided_tour/home.html:126 msgid "Books on your reading status shelves will be shown here." @@ -2791,7 +2902,7 @@ msgstr "" #: bookwyrm/templates/guided_tour/home.html:152 msgid "Timelines" -msgstr "" +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!" @@ -2815,7 +2926,7 @@ msgstr "" #: bookwyrm/templates/guided_tour/home.html:201 msgid "Profile and settings menu" -msgstr "" +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." @@ -2827,16 +2938,16 @@ msgstr "" #: bookwyrm/templates/guided_tour/lists.html:34 msgid "Let's see how to create a new list." -msgstr "" +msgstr "Давайте посмотрим, как создать подборку." #: bookwyrm/templates/guided_tour/lists.html:34 msgid "Click the Create List button, then Next to continue the tour" -msgstr "" +msgstr "Нажмите кнопку Создать Подборку, а затем Далее, чтобы продолжить тур" #: bookwyrm/templates/guided_tour/lists.html:35 #: bookwyrm/templates/guided_tour/lists.html:59 msgid "Creating a new list" -msgstr "" +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." @@ -2864,7 +2975,7 @@ msgstr "" #: bookwyrm/templates/guided_tour/lists.html:129 msgid "Next: Groups" -msgstr "" +msgstr "Далее: Группы" #: bookwyrm/templates/guided_tour/lists.html:143 msgid "Take me there" @@ -2922,7 +3033,7 @@ msgstr "" #: bookwyrm/templates/guided_tour/user_books.html:11 #: bookwyrm/templates/user/books_header.html:4 msgid "Your books" -msgstr "" +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." @@ -2969,11 +3080,11 @@ msgstr "Группы" #: bookwyrm/templates/guided_tour/user_groups.html:31 msgid "Let's create a new group!" -msgstr "" +msgstr "Давайте создадим группу!" #: bookwyrm/templates/guided_tour/user_groups.html:31 msgid "Click the Create group button, then Next to continue the tour" -msgstr "" +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!" @@ -2981,7 +3092,7 @@ msgstr "" #: bookwyrm/templates/guided_tour/user_groups.html:56 msgid "Creating a group" -msgstr "" +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." @@ -2989,7 +3100,7 @@ msgstr "" #: bookwyrm/templates/guided_tour/user_groups.html:79 msgid "Group visibility" -msgstr "" +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." @@ -3001,7 +3112,7 @@ msgstr "" #: bookwyrm/templates/guided_tour/user_groups.html:103 msgid "Save your group" -msgstr "" +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." @@ -3010,7 +3121,7 @@ msgstr "" #: bookwyrm/templates/guided_tour/user_profile.html:11 #: bookwyrm/templates/user/layout.html:20 bookwyrm/templates/user/user.html:14 msgid "User Profile" -msgstr "" +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!" @@ -3023,7 +3134,7 @@ 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 "" +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." @@ -3096,31 +3207,31 @@ msgstr "Источник данных:" #: bookwyrm/templates/import/import.html:58 msgid "Goodreads (CSV)" -msgstr "" +msgstr "Goodreads (CSV)" #: bookwyrm/templates/import/import.html:61 msgid "Storygraph (CSV)" -msgstr "" +msgstr "Storygraph (CSV)" #: bookwyrm/templates/import/import.html:64 msgid "LibraryThing (TSV)" -msgstr "" +msgstr "LibraryThing (TSV)" #: bookwyrm/templates/import/import.html:67 msgid "OpenLibrary (CSV)" -msgstr "" +msgstr "OpenLibrary (CSV)" #: bookwyrm/templates/import/import.html:70 msgid "OpenReads (CSV)" -msgstr "" +msgstr "OpenReads (CSV)" #: bookwyrm/templates/import/import.html:73 msgid "Calibre (CSV)" -msgstr "" +msgstr "Calibre (CSV)" #: bookwyrm/templates/import/import.html:76 msgid "BookWyrm (CSV)" -msgstr "" +msgstr "BookWyrm (CSV)" #: bookwyrm/templates/import/import.html:82 msgid "You can download your Goodreads data from the Import/Export page of your Goodreads account." @@ -3277,7 +3388,7 @@ msgstr "ISBN" #: bookwyrm/templates/import/import_status.html:117 msgid "Openlibrary key" -msgstr "" +msgstr "Ключ OpenLibrary" #: bookwyrm/templates/import/import_status.html:121 #: bookwyrm/templates/shelf/shelf.html:157 @@ -3294,7 +3405,7 @@ msgstr "Полка" #: bookwyrm/templates/import/user_troubleshoot.html:59 #: bookwyrm/templates/settings/link_domains/link_table.html:9 msgid "Book" -msgstr "" +msgstr "Книга" #: bookwyrm/templates/import/import_status.html:142 msgid "Import preview unavailable." @@ -3356,7 +3467,7 @@ msgstr "" #: bookwyrm/templates/import/import_user.html:56 msgid "Step 1:" -msgstr "" +msgstr "Шаг 1:" #: bookwyrm/templates/import/import_user.html:58 msgid "Select an export file generated from another BookWyrm account. The file format should be .tar.gz." @@ -3364,7 +3475,7 @@ msgstr "" #: bookwyrm/templates/import/import_user.html:73 msgid "Step 2:" -msgstr "" +msgstr "Шаг 2:" #: bookwyrm/templates/import/import_user.html:75 msgid "Deselect any checkboxes for data you do not wish to include in your import." @@ -3376,7 +3487,7 @@ msgstr "" #: bookwyrm/templates/user/relationships/followers.html:18 #: bookwyrm/templates/user/relationships/following.html:18 msgid "User profile" -msgstr "" +msgstr "Профиль пользователя" #: bookwyrm/templates/import/import_user.html:89 msgid "Overwrites display name, summary, and avatar" @@ -3412,7 +3523,7 @@ msgstr "" #: bookwyrm/templates/import/import_user.html:116 msgid "Your timezone" -msgstr "" +msgstr "Ваш часовой пояс" #: bookwyrm/templates/import/import_user.html:119 msgid "Your default post privacy setting" @@ -3438,12 +3549,12 @@ msgstr "" #: bookwyrm/templates/import/import_user.html:145 #: bookwyrm/templates/preferences/export-user.html:24 msgid "Shelves" -msgstr "" +msgstr "Полки" #: bookwyrm/templates/import/import_user.html:148 #: bookwyrm/templates/preferences/export-user.html:25 msgid "Reading history" -msgstr "" +msgstr "История чтения" #: bookwyrm/templates/import/import_user.html:151 #: bookwyrm/templates/preferences/export-user.html:26 @@ -3460,7 +3571,7 @@ msgstr "" #: bookwyrm/templates/import/import_user.html:163 msgid "Saved lists" -msgstr "" +msgstr "Сохранённые Подборки" #: bookwyrm/templates/import/manual_review.html:5 #: bookwyrm/templates/import/troubleshoot.html:4 @@ -3609,7 +3720,7 @@ msgstr "Подтвердить пароль:" #: bookwyrm/templates/landing/login.html:50 #: bookwyrm/templates/landing/reactivate.html:43 msgid "Create an Account" -msgstr "" +msgstr "Создать учётную запись" #: bookwyrm/templates/landing/invite.html:22 msgid "Sorry! This invite code is no longer valid." @@ -3625,7 +3736,7 @@ msgstr "Децентрализовано" #: bookwyrm/templates/landing/layout.html:23 msgid "Friendly" -msgstr "" +msgstr "Дружелюбный" #: bookwyrm/templates/landing/layout.html:29 msgid "Anti-Corporate" @@ -3725,6 +3836,7 @@ msgid "Search for a book, author, user, or list" msgstr "" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "Сканировать штрих-код" @@ -3738,7 +3850,7 @@ msgstr "пароль" #: bookwyrm/templates/layout.html:136 msgid "Show/Hide password" -msgstr "" +msgstr "Показать/Скрыть пароль" #: bookwyrm/templates/layout.html:150 msgid "Join" @@ -3886,7 +3998,7 @@ msgstr "" #: bookwyrm/templates/lists/form.html:105 msgid "You don't have any Groups yet!" -msgstr "" +msgstr "У вас пока нет групп!" #: bookwyrm/templates/lists/form.html:107 msgid "Create a Group" @@ -3923,16 +4035,16 @@ msgstr "" #: bookwyrm/templates/lists/list.html:104 msgid "Edit notes" -msgstr "" +msgstr "Редактировать примечание" #: bookwyrm/templates/lists/list.html:119 msgid "Add notes" -msgstr "" +msgstr "Добавить примечание" #: bookwyrm/templates/lists/list.html:131 #, python-format msgid "Added by %(username)s" -msgstr "" +msgstr "Добавлено %(username)s" #: bookwyrm/templates/lists/list.html:146 msgid "List position" @@ -3943,13 +4055,13 @@ msgstr "" #: bookwyrm/templates/settings/connectors/update.html:27 #: bookwyrm/templates/settings/link_domains/edit_domain_modal.html:23 msgid "Set" -msgstr "" +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 "" +msgstr "Убрать" #: bookwyrm/templates/lists/list.html:181 #: bookwyrm/templates/lists/list.html:198 @@ -3974,7 +4086,7 @@ msgstr "поиск" #: bookwyrm/templates/lists/list.html:224 msgid "Clear search" -msgstr "" +msgstr "Очистить поиск" #: bookwyrm/templates/lists/list.html:229 #, python-format @@ -4000,19 +4112,19 @@ msgstr "" #: bookwyrm/templates/lists/list_items.html:50 msgid "No lists found." -msgstr "Списки не нашлись." +msgstr "Подборок не найдено." #: bookwyrm/templates/lists/lists.html:14 bookwyrm/templates/user/lists.html:14 msgid "Your Lists" -msgstr "Ваши списки" +msgstr "Мои Подборки" #: bookwyrm/templates/lists/lists.html:36 msgid "All Lists" -msgstr "Все списки" +msgstr "Все Подборки" #: bookwyrm/templates/lists/lists.html:40 msgid "Saved Lists" -msgstr "Сохранённые списки" +msgstr "Сохранённые Подборки" #: bookwyrm/templates/moved.html:27 #, python-format @@ -4347,7 +4459,7 @@ msgstr[2] "" msgstr[3] "" #: bookwyrm/templates/notifications/items/status_preview.html:4 -#: bookwyrm/templates/snippets/status/content_status.html:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "" @@ -4378,11 +4490,11 @@ msgstr "" #: bookwyrm/templates/notifications/notifications_page.html:19 msgid "Delete notifications" -msgstr "" +msgstr "Удалить уведомления" #: bookwyrm/templates/notifications/notifications_page.html:31 msgid "All" -msgstr "" +msgstr "Все" #: bookwyrm/templates/notifications/notifications_page.html:35 msgid "Mentions" @@ -4624,7 +4736,7 @@ msgstr "" #: bookwyrm/templates/preferences/edit_user.html:7 #: bookwyrm/templates/preferences/layout.html:15 msgid "Edit Profile" -msgstr "" +msgstr "Изменить Профиль" #: bookwyrm/templates/preferences/edit_user.html:12 #: bookwyrm/templates/preferences/edit_user.html:25 @@ -4639,12 +4751,12 @@ msgstr "Профиль" #: bookwyrm/templates/settings/site.html:89 #: bookwyrm/templates/setup/config.html:85 msgid "Display" -msgstr "" +msgstr "Видимость" #: bookwyrm/templates/preferences/edit_user.html:14 #: bookwyrm/templates/preferences/edit_user.html:118 msgid "Privacy" -msgstr "" +msgstr "Приватность" #: bookwyrm/templates/preferences/edit_user.html:69 msgid "Show reading goal prompt in feed" @@ -4652,7 +4764,7 @@ msgstr "" #: bookwyrm/templates/preferences/edit_user.html:75 msgid "Show ratings" -msgstr "" +msgstr "Показать оценки" #: bookwyrm/templates/preferences/edit_user.html:81 msgid "Show suggested users" @@ -4685,7 +4797,7 @@ msgstr "Скрыть подписчиков и подписки в профил #: bookwyrm/templates/preferences/edit_user.html:134 msgid "Default post privacy:" -msgstr "" +msgstr "Приватность поста по умолчанию:" #: bookwyrm/templates/preferences/edit_user.html:142 #, python-format @@ -4816,13 +4928,13 @@ msgstr "" 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 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "Загрузить файл" #: bookwyrm/templates/preferences/layout.html:11 msgid "Account" -msgstr "" +msgstr "Учётная запись" #: bookwyrm/templates/preferences/layout.html:24 msgid "Security Settings" @@ -4961,19 +5073,19 @@ msgstr "" #: bookwyrm/templates/preferences/security.html:129 msgid "Web Browser" -msgstr "" +msgstr "Браузер" #: bookwyrm/templates/preferences/security.html:129 msgid "Browser" -msgstr "" +msgstr "Браузер" #: bookwyrm/templates/preferences/security.html:143 msgid "You" -msgstr "" +msgstr "Вы" #: bookwyrm/templates/preferences/security.html:147 msgid "Log Out" -msgstr "" +msgstr "Выйти" #: bookwyrm/templates/preferences/security.html:161 msgid "Currently your logged-in sessions are unable to be displayed." @@ -5009,9 +5121,8 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "" #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" +msgid "Update read dates for \"%(title)s\"" msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 @@ -5066,6 +5177,11 @@ msgstr "" msgid "Delete these read dates" msgstr "" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5076,41 +5192,33 @@ msgstr "" 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 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "Запрос камеры..." -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "Предоставьте доступ к камере для сканирования штрих-кода книги." -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "Не удалось получить доступ к камере" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "Сканирую..." -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "Соедините штрих-код вашей книги с камерой." -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "ISBN просканирован" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "Искать книгу:" @@ -5135,7 +5243,7 @@ msgstr "" #: bookwyrm/templates/search/book.html:89 msgid "Import book" -msgstr "" +msgstr "Импортировать книгу" #: bookwyrm/templates/search/book.html:113 msgid "Load results from other catalogues" @@ -5166,7 +5274,7 @@ msgstr "" #: bookwyrm/templates/settings/users/user_admin.html:5 #: bookwyrm/templates/settings/users/user_admin.html:12 msgid "Users" -msgstr "" +msgstr "Пользователи" #: bookwyrm/templates/search/layout.html:63 #, python-format @@ -5215,13 +5323,13 @@ msgstr "" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 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:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "" @@ -5447,7 +5555,7 @@ msgstr "Предлагаемые пользователи" #: bookwyrm/templates/settings/invites/manage_invite_requests.html:43 #: bookwyrm/templates/settings/users/email_filter.html:5 msgid "Email" -msgstr "" +msgstr "Электронная почта" #: bookwyrm/templates/settings/celery.html:89 msgid "Misc" @@ -5534,7 +5642,7 @@ msgstr "" #: bookwyrm/templates/settings/connectors/available.html:32 msgid "Create new connector" -msgstr "" +msgstr "Создать коннектор" #: bookwyrm/templates/settings/connectors/connector.html:35 #: bookwyrm/templates/settings/connectors/update.html:33 @@ -5555,7 +5663,7 @@ msgstr "" #: bookwyrm/templates/settings/connectors/connectors.html:4 #: bookwyrm/templates/settings/connectors/connectors.html:6 msgid "Connector Settings" -msgstr "" +msgstr "Настройки коннектора" #: bookwyrm/templates/settings/connectors/connectors.html:11 msgid "Connectors are sources of data about books and authors." @@ -5595,7 +5703,7 @@ msgid "Dashboard" msgstr "" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "" @@ -5609,31 +5717,31 @@ msgstr "" msgid "Works" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "Дни" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "Недели" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "" @@ -5953,13 +6061,49 @@ msgid "Unable to save settings" msgstr "" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6670,10 +6814,6 @@ msgstr "" msgid "Tasks" msgstr "" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "" @@ -6921,7 +7061,7 @@ msgstr "Удаленные пользователи" #: bookwyrm/templates/settings/users/user_admin.html:44 #: bookwyrm/templates/settings/users/username_filter.html:5 msgid "Username" -msgstr "" +msgstr "Имя пользователя" #: bookwyrm/templates/settings/users/user_admin.html:48 msgid "Date Added" @@ -6929,7 +7069,7 @@ msgstr "" #: bookwyrm/templates/settings/users/user_admin.html:52 msgid "Last Active" -msgstr "" +msgstr "Последняя активность" #: bookwyrm/templates/settings/users/user_admin.html:61 msgid "Remote instance" @@ -7251,7 +7391,7 @@ msgstr[3] "" #: bookwyrm/templates/snippets/book_cover.html:63 msgid "No cover" -msgstr "" +msgstr "Без обложки" #: bookwyrm/templates/snippets/book_titleby.html:11 #, python-format @@ -7266,7 +7406,7 @@ msgstr "Продвинуть" #: bookwyrm/templates/snippets/boost_button.html:33 #: bookwyrm/templates/snippets/boost_button.html:34 msgid "Un-boost" -msgstr "" +msgstr "Задвинуть" #: bookwyrm/templates/snippets/create_status.html:36 msgid "Quote" @@ -7326,7 +7466,7 @@ msgstr "Комментарий:" #: bookwyrm/templates/snippets/create_status/post_options_block.html:21 msgid "Post" -msgstr "" +msgstr "Опубликовать" #: bookwyrm/templates/snippets/create_status/quotation.html:16 msgid "Quote:" @@ -7337,10 +7477,6 @@ msgstr "Цитата:" msgid "An excerpt from '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "" @@ -7353,24 +7489,24 @@ msgstr "" msgid "to" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "Отзыв:" #: bookwyrm/templates/snippets/fav_button.html:16 #: bookwyrm/templates/snippets/fav_button.html:17 msgid "Like" -msgstr "Лайк" +msgstr "Любо" #: bookwyrm/templates/snippets/fav_button.html:30 #: bookwyrm/templates/snippets/fav_button.html:31 msgid "Un-like" -msgstr "Снять лайк" +msgstr "Уже не любо" #: bookwyrm/templates/snippets/filters_panel/filters_panel.html:5 msgid "Filters" @@ -7428,15 +7564,15 @@ msgstr "Исходный код BookWyrm находится в свободно #: bookwyrm/templates/snippets/form_rate_stars.html:20 #: bookwyrm/templates/snippets/stars.html:38 msgid "No rating" -msgstr "" +msgstr "Без оценки" #: bookwyrm/templates/snippets/form_rate_stars.html:28 #, python-format msgid "%(half_rating)s star" msgid_plural "%(half_rating)s stars" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "%(half_rating)s звезда" +msgstr[1] "%(half_rating)s звезды" +msgstr[2] "%(half_rating)s звёзд" msgstr[3] "" #: bookwyrm/templates/snippets/form_rate_stars.html:64 @@ -7444,42 +7580,51 @@ msgstr[3] "" #, python-format msgid "%(rating)s star" msgid_plural "%(rating)s stars" -msgstr[0] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "%(rating)s звезда" +msgstr[1] "%(rating)s звезды" +msgstr[2] "%(rating)s звёзд" msgstr[3] "" #: 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] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "поставил(а) цель прочитать %(counter)s книгу в %(year)s" +msgstr[1] "поставил(а) цель прочитать %(counter)s книги в %(year)s" +msgstr[2] "поставил(а) цель прочитать %(counter)s книг в %(year)s" msgstr[3] "" #: 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] "" -msgstr[1] "" -msgstr[2] "" +msgstr[0] "оценил(а) %(title)s: %(display_rating)s звезда" +msgstr[1] "оценил(а) %(title)s: %(display_rating)s звезды" +msgstr[2] "оценил(а) %(title)s: %(display_rating)s звёзд" +msgstr[3] "" + +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(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] "" #: 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] "" -msgstr[1] "" -msgstr[2] "" +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] "" #: bookwyrm/templates/snippets/generated_status/review_pure_name.html:12 #, python-format msgid "Review of \"%(book_title)s\": %(review_title)s" -msgstr "" +msgstr "Рецензия на «%(book_title)s»: %(review_title)s" #: bookwyrm/templates/snippets/goal_form.html:4 #, python-format @@ -7492,7 +7637,7 @@ msgstr "" #: bookwyrm/templates/snippets/goal_form.html:21 msgid "books" -msgstr "" +msgstr "книги" #: bookwyrm/templates/snippets/goal_form.html:26 msgid "Goal privacy:" @@ -7643,19 +7788,19 @@ msgstr "Подробнее об этой жалобе:" #: bookwyrm/templates/snippets/shelf_selector.html:7 msgid "Move book" -msgstr "" +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 "" +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 "" +msgstr "Хочу прочитать" #: bookwyrm/templates/snippets/shelf_selector.html:81 #: bookwyrm/templates/snippets/shelf_selector.html:95 @@ -7671,7 +7816,7 @@ 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 "Остановка чтения" +msgstr "Остановить чтение" #: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:40 msgid "Finish reading" @@ -7679,54 +7824,54 @@ msgstr "" #: bookwyrm/templates/snippets/stars.html:13 msgid "Show rating" -msgstr "" +msgstr "Показать оценку" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "" #: bookwyrm/templates/snippets/status/header.html:45 #, python-format msgid "edited %(date)s" -msgstr "" +msgstr "изменено %(date)s" #: bookwyrm/templates/snippets/status/headers/comment.html:8 #, python-format msgid "commented on %(book)s by %(author_name)s" -msgstr "" +msgstr "прокомментировал(а) %(book)s от %(author_name)s" #: bookwyrm/templates/snippets/status/headers/comment.html:15 #, python-format msgid "commented on %(book)s" -msgstr "" +msgstr "прокомментировал(а) %(book)s" #: bookwyrm/templates/snippets/status/headers/note.html:8 #, python-format @@ -7736,27 +7881,27 @@ msgstr "" #: bookwyrm/templates/snippets/status/headers/quotation.html:8 #, python-format msgid "quoted %(book)s by %(author_name)s" -msgstr "" +msgstr "процитировал(а) %(book)s от %(author_name)s" #: bookwyrm/templates/snippets/status/headers/quotation.html:15 #, python-format msgid "quoted %(book)s" -msgstr "" +msgstr "процитировал(а) %(book)s" #: bookwyrm/templates/snippets/status/headers/rating.html:3 #, python-format msgid "rated %(book)s:" -msgstr "" +msgstr "оценил(а) %(book)s:" #: bookwyrm/templates/snippets/status/headers/read.html:10 #, python-format msgid "finished reading %(book)s by %(author_name)s" -msgstr "" +msgstr "дочитал(а) %(book)s от %(author_name)s" #: bookwyrm/templates/snippets/status/headers/read.html:17 #, python-format msgid "finished reading %(book)s" -msgstr "" +msgstr "дочитал(а) %(book)s" #: bookwyrm/templates/snippets/status/headers/reading.html:10 #, python-format @@ -7768,16 +7913,22 @@ msgstr "" msgid "started reading %(book)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(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" @@ -7801,7 +7952,7 @@ msgstr "хочет прочитать %(book)s" #: bookwyrm/templates/snippets/status/layout.html:24 #: bookwyrm/templates/snippets/status/status_options.html:17 msgid "Delete status" -msgstr "" +msgstr "Удалить статус" #: bookwyrm/templates/snippets/status/layout.html:57 #: bookwyrm/templates/snippets/status/layout.html:58 @@ -7815,7 +7966,7 @@ msgstr "" #: bookwyrm/templates/snippets/status/status.html:10 msgid "boosted" -msgstr "" +msgstr "продвинул(а)" #: bookwyrm/templates/snippets/status/status_options.html:7 #: bookwyrm/templates/snippets/user_options.html:7 @@ -7905,12 +8056,12 @@ msgstr "" #: bookwyrm/templates/user/groups.html:14 msgid "Your Groups" -msgstr "Ваши Группы" +msgstr "Мои группы" #: bookwyrm/templates/user/groups.html:16 #, python-format msgid "Groups: %(username)s" -msgstr "" +msgstr "Группы: %(username)s" #: bookwyrm/templates/user/layout.html:59 msgid "Follow Requests" @@ -7920,7 +8071,7 @@ msgstr "" #: bookwyrm/templates/user/reviews_comments.html:6 #: bookwyrm/templates/user/reviews_comments.html:12 msgid "Reviews and Comments" -msgstr "" +msgstr "Рецензии и Комментарии" #: bookwyrm/templates/user/lists.html:16 #, python-format @@ -7960,7 +8111,7 @@ msgstr "" #: bookwyrm/templates/user/user.html:20 msgid "Edit profile" -msgstr "" +msgstr "Изменить профиль" #: bookwyrm/templates/user/user.html:29 msgid "Federation is currently disabled, so you will not be able to interact with this user." @@ -7998,15 +8149,15 @@ msgstr "" #: bookwyrm/templates/user/user.html:118 msgid "Reviews only" -msgstr "" +msgstr "Только Рецензии" #: bookwyrm/templates/user/user.html:123 msgid "Quotes only" -msgstr "" +msgstr "Только цитаты" #: bookwyrm/templates/user/user.html:128 msgid "Comments only" -msgstr "" +msgstr "Только комментарии" #: bookwyrm/templates/user/user.html:144 msgid "No activities yet!" @@ -8062,15 +8213,23 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/sk_SK/LC_MESSAGES/django.po b/locale/sk_SK/LC_MESSAGES/django.po index 1afd3524fe..a786b3f22d 100644 --- a/locale/sk_SK/LC_MESSAGES/django.po +++ b/locale/sk_SK/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-03-03 19:41\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:13\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Slovak\n" "Language: sk\n" @@ -107,7 +107,7 @@ msgstr "Názov knihy" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "Hodnotenie" @@ -175,39 +175,43 @@ msgstr "Vymazanie moderátorom" msgid "Domain block" msgstr "Blokovanie domény" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "Audiokniha" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "eKniha" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "Tvrdá väzba" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "Brožovaná väzba" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "%(value)s nevyzerá ako ISBN" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,12 +465,12 @@ msgstr "%(display_name)s komentár ku %(book_title)s" msgid "%(display_name)s's quote from %(book_title)s" msgstr "%(display_name)s citácia z %(book_title)s" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "%(display_name)s recenzia knihy %(book_title)s" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" @@ -475,7 +479,7 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "Recenzie" @@ -491,19 +495,19 @@ msgstr "Citácie" msgid "Everything else" msgstr "Všetko ostatné" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "Domáca časová os" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "Domov" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "Časová os kníh" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -512,91 +516,91 @@ msgstr "Časová os kníh" msgid "Books" msgstr "Knihy" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "Angličtina" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "Nemecky" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "Španielsky" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "Taliansky" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "Kórejsky" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "Fínsky" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "Francúzky" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "Dánsky" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "Nórsky" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "Poľsky" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "Rumunsky" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "Švédsky" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "Ukrajinsky" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "Klasická čínština" @@ -845,7 +849,7 @@ msgstr "Ich najkratšie čítanie tohto roku…" #: 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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -920,57 +924,62 @@ msgstr "Narodený/á:" msgid "Died:" msgstr "Úmrtie:" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "Séria:" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "Externé odkazy" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "Wikipédia" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "Zobraziť na Wikipédii" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "Webstránka" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "Zobraziť ISNI záznam" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "Zobraziť na ISFDB" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "Načítať dáta" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "Zobraziť na OpenLibrary" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "Zobraziť na Inventaire" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "Zobraziť na LibraryThing" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "Zobraziť na Goodreads" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "Knihy od %(name)s" @@ -1007,8 +1016,8 @@ msgid "Name:" msgstr "Meno:" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "Oddeľte viacero položiek čiarkami." @@ -1045,7 +1054,8 @@ msgid "Openlibrary key:" msgstr "" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "" @@ -1054,7 +1064,7 @@ msgid "Librarything key:" msgstr "" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "Goodreads kľúč:" @@ -1067,8 +1077,8 @@ msgid "ISNI:" msgstr "" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1080,7 +1090,7 @@ msgstr "" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1092,10 +1102,10 @@ msgstr "Uložiť" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1105,7 +1115,7 @@ msgstr "Uložiť" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1122,7 +1132,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "" #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1139,31 +1150,50 @@ msgstr "Potvrdiť" msgid "Unable to connect to remote source." msgstr "" -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "Upraviť knihu" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "Kliknite pre pridanie obalu" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "Nepodarilo sa načítať obal" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "Kliknite pre zväčšenie" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" @@ -1172,17 +1202,17 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "Pridať popis" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "Popis:" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" @@ -1191,49 +1221,49 @@ msgstr[1] "%(count)s edícií" msgstr[2] "%(count)s edícií" msgstr[3] "%(count)s edície" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "Túto edíciu ste dali do knihovníčky:" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "" -#: bookwyrm/templates/book/book.html:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "Vaša čitateľská aktivita" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "Pridať dátumy čítania" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "Nemáte žiadnu čítaciu činnosť pre túto knihu." -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "Vaše recenzie" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "Vaše komentáre" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "Vaše citácie" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "Témy" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "Miesta" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1248,15 +1278,15 @@ msgstr "Miesta" msgid "Lists" msgstr "Zoznamy" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "Pridať do zoznamu" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1279,25 +1309,26 @@ msgid "Copied ISBN!" msgstr "ISBN skopírované!" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "" @@ -1308,12 +1339,12 @@ msgid "Goodreads:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1322,12 +1353,12 @@ msgid "Add cover" msgstr "Pridať obálku" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "Nahrať obálku:" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "Načítať obálku z URL adresy:" @@ -1392,15 +1423,32 @@ msgstr "Toto je nový autor" msgid "Creating a new author: %(name)s" msgstr "Vytváranie nového autora: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "Je toto edícia existujúceho diela?" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "Toto je nové dielo" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1462,124 +1510,190 @@ msgstr "" msgid "Subtitle:" msgstr "Podtitulok:" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "Séria:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "Čislo série:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "Jazyky:" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "Tematické okruhy:" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "Pridať tematický okruh" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "Odstrániť tématický okruh" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "Pridať ďalší tématický okruh" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "Vydanie" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "Vydavateľ:" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "Dátum prvého vydania:" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "Dátum vydania:" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "Autori" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "Odobrať %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "Autorova stránka pre %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "Pridať autorov:" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "Pridať autora" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "Pridať ďalšieho autora" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "Obal" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "Fyzické vlastnosti" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "Formát:" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "Podrobnosti formátu:" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "Strán:" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "Identifikátory knihy" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1766,19 +1880,11 @@ msgstr "Vydaná %(date)s" msgid "rated it" msgstr "ohodnotil/a ju" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "Séria od" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "Kniha %(series_number)s" -#: bookwyrm/templates/book/series.html:28 -msgid "Unsorted Book" -msgstr "Nezaradená kniha" - #: 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." @@ -1823,7 +1929,7 @@ msgstr "Potvrdzujúci kód:" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "Odoslať" @@ -1884,7 +1990,7 @@ msgstr "" #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1982,21 +2088,22 @@ msgid "%(username)s started reading %(username)s rated %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "" @@ -2182,14 +2289,14 @@ msgstr "Práve teraz tu niesu žiadne činnosti! Pre začiatok skúste nasledova msgid "Alternatively, you can try enabling more status types" msgstr "" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: bookwyrm/templates/feed/layout.html:14 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" msgstr "Čitateľský cieľ %(year)s" -#: bookwyrm/templates/feed/goal_card.html:18 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "Môžete nastaviť, alebo zmeniť váš čitateľský cieľ hocikedy zo svojho profilu" @@ -2477,6 +2584,10 @@ msgstr "Táto skupina nemá zoznamy" msgid "Edit group" msgstr "Upraviť skupinu" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "Hľadať pre pridanie užívateľa" @@ -3725,6 +3836,7 @@ msgid "Search for a book, author, user, or list" msgstr "" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "" @@ -4347,7 +4459,7 @@ msgstr[2] "" msgstr[3] "" #: bookwyrm/templates/notifications/items/status_preview.html:4 -#: bookwyrm/templates/snippets/status/content_status.html:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "" @@ -4816,7 +4928,7 @@ msgstr "" 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 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "" @@ -5009,9 +5121,8 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "" #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" +msgid "Update read dates for \"%(title)s\"" msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 @@ -5066,6 +5177,11 @@ msgstr "" msgid "Delete these read dates" msgstr "" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5076,39 +5192,33 @@ msgstr "" msgid "Report" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "" - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "" @@ -5213,13 +5323,13 @@ msgstr "" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 msgid "Start date:" msgstr "Počiatočný dátum:" #: bookwyrm/templates/settings/announcements/announcement.html:62 #: bookwyrm/templates/settings/announcements/edit_announcement.html:89 -#: bookwyrm/templates/settings/dashboard/dashboard.html:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "Konečný dátum:" @@ -5593,7 +5703,7 @@ msgid "Dashboard" msgstr "" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "Užívateľov celkom" @@ -5607,31 +5717,31 @@ msgstr "Aktívni tento mesiac" msgid "Works" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "Aktivita instancie" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "Dni" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "Týždne" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "Aktivita príspevkov" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "Vytvorených diel" @@ -5951,13 +6061,49 @@ msgid "Unable to save settings" msgstr "Nemožno nastavenia uložiť" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6668,10 +6814,6 @@ msgstr "" msgid "Tasks" msgstr "" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "" @@ -7335,10 +7477,6 @@ msgstr "" msgid "An excerpt from '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "" @@ -7351,12 +7489,12 @@ msgstr "" msgid "to" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "" @@ -7465,6 +7603,15 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + #: 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" @@ -7679,35 +7826,35 @@ msgstr "" msgid "Show rating" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "" @@ -7766,16 +7913,22 @@ msgstr "" msgid "started reading %(book)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -8060,15 +8213,23 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/sl_SI/LC_MESSAGES/django.po b/locale/sl_SI/LC_MESSAGES/django.po index 1cf43397d2..9f3bf86e39 100644 --- a/locale/sl_SI/LC_MESSAGES/django.po +++ b/locale/sl_SI/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-06 18:48\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:13\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Slovenian\n" "Language: sl\n" @@ -107,7 +107,7 @@ msgstr "Naslov knjige" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "Ocena" @@ -175,39 +175,43 @@ msgstr "Moderatorjev izbris" msgid "Domain block" msgstr "Blokirana domena" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "Zvočna knjiga" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "e-knjiga" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "Risoroman" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "Trda vezava" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "Mehka vezava" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,12 +465,12 @@ msgstr "" msgid "%(display_name)s's quote from %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" @@ -475,7 +479,7 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "Recenzije" @@ -491,19 +495,19 @@ msgstr "Citati" msgid "Everything else" msgstr "Vse ostalo" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "Domača časovnica" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "Domov" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "Knjižna časovnica" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -512,91 +516,91 @@ msgstr "Knjižna časovnica" msgid "Books" msgstr "Knjige" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "angleški (English)" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "katalonski (Catalan)" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "nemški (German)" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "španski (Spanish)" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "galicijski (Galician)" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "italijanski (Italian)" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "finski (Finnish)" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "francoski (French)" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "litovski (Lithuanian)" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "norveški (Norwegian)" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "polski (Polish)" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "portugalski, brazilski (Brazilian Portuguese)" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "portugalski, evropski (European Portuguese)" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "romunski (Romanian)" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "švedski (Swedish)" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "kitajski, poenostavljen (Simplified Chinese)" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "kitajski, tradicionalen (Traditional Chinese)" @@ -845,7 +849,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -920,57 +924,62 @@ msgstr "" msgid "Died:" msgstr "" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "Wikipedija" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "Poglej ISNI zapis" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "" @@ -1007,8 +1016,8 @@ msgid "Name:" msgstr "" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "" @@ -1045,7 +1054,8 @@ msgid "Openlibrary key:" msgstr "" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "" @@ -1054,7 +1064,7 @@ msgid "Librarything key:" msgstr "" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "" @@ -1067,8 +1077,8 @@ msgid "ISNI:" msgstr "" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1080,7 +1090,7 @@ msgstr "" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1092,10 +1102,10 @@ msgstr "" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1105,7 +1115,7 @@ msgstr "" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1122,7 +1132,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "" #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1139,31 +1150,50 @@ msgstr "" msgid "Unable to connect to remote source." msgstr "" -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" @@ -1172,17 +1202,17 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" @@ -1191,49 +1221,49 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "" -#: bookwyrm/templates/book/book.html:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "" -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1248,15 +1278,15 @@ msgstr "" msgid "Lists" msgstr "" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1279,25 +1309,26 @@ msgid "Copied ISBN!" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "" @@ -1308,12 +1339,12 @@ msgid "Goodreads:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1322,12 +1353,12 @@ msgid "Add cover" msgstr "" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "" @@ -1392,15 +1423,32 @@ msgstr "" msgid "Creating a new author: %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1462,124 +1510,190 @@ msgstr "" msgid "Subtitle:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1766,19 +1880,11 @@ msgstr "" msgid "rated it" msgstr "" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "" -#: 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." @@ -1823,7 +1929,7 @@ msgstr "" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "" @@ -1884,7 +1990,7 @@ msgstr "" #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1982,21 +2088,22 @@ msgid "%(username)s started reading %(username)s rated %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "" @@ -2182,14 +2289,14 @@ msgstr "" msgid "Alternatively, you can try enabling more status types" msgstr "" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: bookwyrm/templates/feed/layout.html:14 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" msgstr "" -#: bookwyrm/templates/feed/goal_card.html:18 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "" @@ -2477,6 +2584,10 @@ msgstr "" msgid "Edit group" msgstr "" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "" @@ -3725,6 +3836,7 @@ msgid "Search for a book, author, user, or list" msgstr "" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "" @@ -4347,7 +4459,7 @@ msgstr[2] "" msgstr[3] "" #: bookwyrm/templates/notifications/items/status_preview.html:4 -#: bookwyrm/templates/snippets/status/content_status.html:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "" @@ -4816,7 +4928,7 @@ msgstr "" 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 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "" @@ -5009,9 +5121,8 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "" #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" +msgid "Update read dates for \"%(title)s\"" msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 @@ -5066,6 +5177,11 @@ msgstr "" msgid "Delete these read dates" msgstr "" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5076,39 +5192,33 @@ msgstr "" msgid "Report" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "" - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "" @@ -5213,13 +5323,13 @@ msgstr "" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 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:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "" @@ -5593,7 +5703,7 @@ msgid "Dashboard" msgstr "" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "" @@ -5607,31 +5717,31 @@ msgstr "" msgid "Works" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "" @@ -5951,13 +6061,49 @@ msgid "Unable to save settings" msgstr "" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6668,10 +6814,6 @@ msgstr "" msgid "Tasks" msgstr "" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "" @@ -7335,10 +7477,6 @@ msgstr "" msgid "An excerpt from '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "" @@ -7351,12 +7489,12 @@ msgstr "" msgid "to" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "" @@ -7465,6 +7603,15 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + #: 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" @@ -7679,35 +7826,35 @@ msgstr "" msgid "Show rating" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "" @@ -7766,16 +7913,22 @@ msgstr "" msgid "started reading %(book)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -8060,15 +8213,23 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/sr_SP/LC_MESSAGES/django.po b/locale/sr_SP/LC_MESSAGES/django.po index 8c0cb22ca6..7c05d72a9a 100644 --- a/locale/sr_SP/LC_MESSAGES/django.po +++ b/locale/sr_SP/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-06 18:48\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:13\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Serbian (Cyrillic)\n" "Language: sr\n" @@ -107,7 +107,7 @@ msgstr "" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "" @@ -175,39 +175,43 @@ msgstr "" msgid "Domain block" msgstr "" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,12 +465,12 @@ msgstr "" msgid "%(display_name)s's quote from %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" @@ -474,7 +478,7 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "" @@ -490,19 +494,19 @@ msgstr "" msgid "Everything else" msgstr "" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -511,91 +515,91 @@ msgstr "" msgid "Books" msgstr "" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "" @@ -842,7 +846,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -915,57 +919,62 @@ msgstr "" msgid "Died:" msgstr "" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "" @@ -1002,8 +1011,8 @@ msgid "Name:" msgstr "" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "" @@ -1040,7 +1049,8 @@ msgid "Openlibrary key:" msgstr "" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "" @@ -1049,7 +1059,7 @@ msgid "Librarything key:" msgstr "" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "" @@ -1062,8 +1072,8 @@ msgid "ISNI:" msgstr "" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1075,7 +1085,7 @@ msgstr "" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1087,10 +1097,10 @@ msgstr "" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1100,7 +1110,7 @@ msgstr "" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1117,7 +1127,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "" #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1134,31 +1145,50 @@ msgstr "" msgid "Unable to connect to remote source." msgstr "" -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" @@ -1166,17 +1196,17 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" @@ -1184,49 +1214,49 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "" -#: bookwyrm/templates/book/book.html:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "" -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1241,15 +1271,15 @@ msgstr "" msgid "Lists" msgstr "" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1272,25 +1302,26 @@ msgid "Copied ISBN!" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "" @@ -1301,12 +1332,12 @@ msgid "Goodreads:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1315,12 +1346,12 @@ msgid "Add cover" msgstr "" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "" @@ -1385,15 +1416,32 @@ msgstr "" msgid "Creating a new author: %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1455,124 +1503,190 @@ msgstr "" msgid "Subtitle:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1759,19 +1873,11 @@ msgstr "" msgid "rated it" msgstr "" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "" -#: 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." @@ -1816,7 +1922,7 @@ msgstr "" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "" @@ -1877,7 +1983,7 @@ msgstr "" #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1973,21 +2079,22 @@ msgid "%(username)s started reading %(username)s rated %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "" @@ -2173,14 +2280,14 @@ msgstr "" msgid "Alternatively, you can try enabling more status types" msgstr "" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: bookwyrm/templates/feed/layout.html:14 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" msgstr "" -#: bookwyrm/templates/feed/goal_card.html:18 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "" @@ -2468,6 +2575,10 @@ msgstr "" msgid "Edit group" msgstr "" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "" @@ -3711,6 +3822,7 @@ msgid "Search for a book, author, user, or list" msgstr "" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "" @@ -4328,7 +4440,7 @@ msgstr[1] "" msgstr[2] "" #: bookwyrm/templates/notifications/items/status_preview.html:4 -#: bookwyrm/templates/snippets/status/content_status.html:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "" @@ -4796,7 +4908,7 @@ msgstr "" 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 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "" @@ -4989,9 +5101,8 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "" #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" +msgid "Update read dates for \"%(title)s\"" msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 @@ -5046,6 +5157,11 @@ msgstr "" msgid "Delete these read dates" msgstr "" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5056,39 +5172,33 @@ msgstr "" msgid "Report" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "" - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "" @@ -5191,13 +5301,13 @@ msgstr "" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 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:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "" @@ -5571,7 +5681,7 @@ msgid "Dashboard" msgstr "" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "" @@ -5585,31 +5695,31 @@ msgstr "" msgid "Works" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "" @@ -5925,13 +6035,49 @@ msgid "Unable to save settings" msgstr "" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6642,10 +6788,6 @@ msgstr "" msgid "Tasks" msgstr "" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "" @@ -7307,10 +7449,6 @@ msgstr "" msgid "An excerpt from '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "" @@ -7323,12 +7461,12 @@ msgstr "" msgid "to" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "" @@ -7433,6 +7571,14 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" + #: 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" @@ -7646,35 +7792,35 @@ msgstr "" msgid "Show rating" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "" @@ -7733,16 +7879,22 @@ msgstr "" msgid "started reading %(book)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -8024,15 +8176,23 @@ msgstr[0] "" msgstr[1] "" msgstr[2] "" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/sv_SE/LC_MESSAGES/django.po b/locale/sv_SE/LC_MESSAGES/django.po index 1d1ca1337d..1a6962c33a 100644 --- a/locale/sv_SE/LC_MESSAGES/django.po +++ b/locale/sv_SE/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-06 18:48\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:13\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Swedish\n" "Language: sv\n" @@ -107,7 +107,7 @@ msgstr "Bokens titel" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "Recension" @@ -175,39 +175,43 @@ msgstr "Borttagning av moderator" msgid "Domain block" msgstr "Domänblockering" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "Ljudbok" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "E-bok" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "Grafisk novell" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "Inbunden" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "Pocketbok" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,19 +465,19 @@ msgstr "%(display_name)ss kommentar på %(book_title)s" msgid "%(display_name)s's quote from %(book_title)s" msgstr "%(display_name)ss citat från %(book_title)s" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "%(display_name)ss recension av %(book_title)s" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" msgstr[0] "%(display_name)s betygsatte %(book_title)s: %(display_rating).1f stjärna" msgstr[1] "%(display_name)s betygsatte %(book_title)s: %(display_rating).1f stjärnor" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "Recensioner" @@ -489,19 +493,19 @@ msgstr "Citat" msgid "Everything else" msgstr "Allt annat" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "Tidslinje för Hem" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "Hem" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "Tidslinjer för böcker" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -510,91 +514,91 @@ msgstr "Tidslinjer för böcker" msgid "Books" msgstr "Böcker" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "Engelska" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "Català (katalanska)" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "Tyska (Tysk)" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "Esperanto (Esperanto)" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "Spanska (Spansk)" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "Euskara (Baskiska)" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "Galego (Gallisk)" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "Italienska (Italiensk)" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "한국어 (koreanska)" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "Finland (Finska)" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "Franska (Fransk)" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "Litauiska (Litauisk)" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "Nederländerna (Holländska)" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "Norska (Norska)" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "Polski (polska)" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português d Brasil (Brasiliansk Portugisiska)" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Europeisk Portugisiska)" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "Rumänien (Rumänska)" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "Svenska (Svenska)" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "Українська (ukrainska)" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (Förenklad Kinesiska)" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (Traditionell Kinesiska)" @@ -839,7 +843,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -910,57 +914,62 @@ msgstr "Född:" msgid "Died:" msgstr "Dog:" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "Serie:" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "Externa länkar" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "Wikipedia" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "Webbplats" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "Visa ISNI-samling" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "Visa på ISFDB" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "Ladda data" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "Visa i OpenLibrary" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "Visa i Inventaire" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "Visa i LibraryThing" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "Visa i Goodreads" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "Böcker av %(name)s" @@ -997,8 +1006,8 @@ msgid "Name:" msgstr "Namn:" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "Separera flera värden med kommatecken." @@ -1035,7 +1044,8 @@ msgid "Openlibrary key:" msgstr "Nyckel för Openlibrary:" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "Inventarie-ID:" @@ -1044,7 +1054,7 @@ msgid "Librarything key:" msgstr "Librarything-nyckel:" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "Goodreads-nyckel:" @@ -1057,8 +1067,8 @@ msgid "ISNI:" msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1070,7 +1080,7 @@ msgstr "ISNI:" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1082,10 +1092,10 @@ msgstr "Spara" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1095,7 +1105,7 @@ msgstr "Spara" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1112,7 +1122,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "Att ladda in data kommer att ansluta till %(source_name)s och kontrollera eventuella metadata om den här författaren som inte finns här. Befintliga metadata kommer inte att skrivas över." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1129,97 +1140,116 @@ msgstr "Bekräfta" msgid "Unable to connect to remote source." msgstr "Kunde inte ansluta till fjärrkälla." -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "Redigera bok" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "Klicka för att lägga till omslag" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "Misslyckades med att ladda omslaget" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "Klicka för att förstora" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "(%(review_count)s recension)" msgstr[1] "(%(review_count)s recensioner)" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "Lägg till beskrivning" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "Beskrivning:" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" msgstr[0] "%(count)s utgåva" msgstr[1] "%(count)s utgåvor" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "Du har lagt den här utgåvan i hylla:" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "En annorlunda utgåva av den här boken finns i din %(shelf_name)s hylla." -#: bookwyrm/templates/book/book.html:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "Din läsningsaktivitet" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "Lägg till läsdatum" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "Du har ingen läsaktivitet för den här boken." -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "Dina recensioner" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "Dina kommentarer" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "Dina citat" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "Ämnen" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "Platser" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1234,15 +1264,15 @@ msgstr "Platser" msgid "Lists" msgstr "Listor" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "Lägg till i listan" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1265,25 +1295,26 @@ msgid "Copied ISBN!" msgstr "Kopierade ISBN!" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "OCLC-nummer:" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "ASIN:" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "Audible-ASIN:" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "ISFDB-ID:" @@ -1294,12 +1325,12 @@ msgid "Goodreads:" msgstr "Goodreads:" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1308,12 +1339,12 @@ msgid "Add cover" msgstr "Lägg till omslag" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "Ladda upp omslag:" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "" @@ -1378,15 +1409,32 @@ msgstr "Det här är en ny författare" msgid "Creating a new author: %(name)s" msgstr "Skapar en ny författare: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "Är det här en version av ett redan befintligt verk?" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "Det här är ett nytt verk" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1448,124 +1496,190 @@ msgstr "Sortera titel:" msgid "Subtitle:" msgstr "Undertitel:" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "Serie:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "Serienummer:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "Språk:" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "Ämnen:" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "Lägg till ämne" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "Ta bort ämne" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "Lägg till ett annat ämne" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "Plats:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "Publikation" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "Utgivare:" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "Första publiceringsdatum:" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "Publiceringsdatum:" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "Författare" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "Ta bort %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "Författarsida för %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "Lägg till författare:" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "Lägg till författare" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "Jane Doe" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "Lägg till en annan författare" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "Omslag" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "Fysiska egenskaper" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "Format:" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "Formatets detaljer:" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "Sidor:" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "Bok-identifierare" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "ISBN 13:" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "ISBN 10:" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "Openlibrary-ID:" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "Namn" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1752,19 +1866,11 @@ msgstr "Publicerades %(date)s" msgid "rated it" msgstr "betygsatte den" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "Serier av" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "Bok %(series_number)s" -#: bookwyrm/templates/book/series.html:28 -msgid "Unsorted Book" -msgstr "Osorterad bok" - #: 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." @@ -1809,7 +1915,7 @@ msgstr "Bekräftelsekod:" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "Skicka in" @@ -1870,7 +1976,7 @@ msgstr "Du kan säga upp när som helst i din profils inst #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1964,21 +2070,22 @@ msgid "%(username)s started reading %(username)s började läsa %(book_title)s" #: bookwyrm/templates/discover/card-header.html:23 +#: bookwyrm/templates/discover/card-header.html:32 #, python-format msgid "%(username)s rated %(book_title)s" msgstr "%(username)sbetygsatte%(book_title)s" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "%(username)s recenserade %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "%(username)s kommenterade på %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "%(username)s citerade %(book_title)s" @@ -2164,14 +2271,14 @@ msgstr "Det finns inga aktiviteter just nu! Försök att följa en användare f msgid "Alternatively, you can try enabling more status types" msgstr "Alternativt så kan du prova att aktivera fler status-typer" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: bookwyrm/templates/feed/layout.html:14 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" msgstr "%(year)s läsmål" -#: bookwyrm/templates/feed/goal_card.html:18 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "Du kan ställa in eller ändra ditt läsmål när som helst från din profilsida" @@ -2459,6 +2566,10 @@ msgstr "Den här gruppen har inga listor" msgid "Edit group" msgstr "Redigera grupp" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "Sök för att lägga till en användare" @@ -3697,6 +3808,7 @@ msgid "Search for a book, author, user, or list" msgstr "Sök efter en bok, författare, användare eller lista" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "Skanna streckkod" @@ -4309,7 +4421,7 @@ msgstr[0] "En ny rapport behöver moderering" msgstr[1] "%(display_count)s nya rapporter behöver moderering" #: bookwyrm/templates/notifications/items/status_preview.html:4 -#: bookwyrm/templates/snippets/status/content_status.html:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "Innehållsvarning" @@ -4776,7 +4888,7 @@ msgstr "" 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 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "Ladda ner fil" @@ -4969,10 +5081,9 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "Du tar bort den här genomläsningen och dess %(count)s associerade förloppsuppdateringar." #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" -msgstr "Uppdatera läsdatum för \"%(title)s\"" +msgid "Update read dates for \"%(title)s\"" +msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 #: bookwyrm/templates/readthrough/readthrough_modal.html:38 @@ -5026,6 +5137,11 @@ msgstr "Redigera läsdatum" msgid "Delete these read dates" msgstr "Ta bort de här läsdatumen" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "Uppdatera läsdatum för \"%(title)s\"" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5036,41 +5152,33 @@ msgstr "Lägg till läs-datum för \"%(title)s\"" msgid "Report" msgstr "Rapport" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "\n" -"Skanna streckkod\n" -" " - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "Begär kamera..." -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "Bevilja åtkomst till kameran för att skanna en boks streckkod." -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "Kunde inte komma åt kameran" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "Skannar..." -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "Justera din boks streckkod med kameran." -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "ISBN skannades" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "Söker efter bok:" @@ -5171,13 +5279,13 @@ msgstr "Falskt" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 msgid "Start date:" msgstr "Startdatum:" #: bookwyrm/templates/settings/announcements/announcement.html:62 #: bookwyrm/templates/settings/announcements/edit_announcement.html:89 -#: bookwyrm/templates/settings/dashboard/dashboard.html:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "Slutdatum:" @@ -5551,7 +5659,7 @@ msgid "Dashboard" msgstr "Översiktspanel" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "Totalt antal användare" @@ -5565,31 +5673,31 @@ msgstr "Aktiva den här månaden" msgid "Works" msgstr "Verk" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "Instansaktivitet" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "Intervall:" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "Dagar" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "Veckor" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "Användarens registreringsaktivitet" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "Statusaktivitet" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "Skapade verk" @@ -5901,13 +6009,49 @@ msgid "Unable to save settings" msgstr "Det gick inte att spara inställningarna" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6618,10 +6762,6 @@ msgstr "Schemalagda uppgifter" msgid "Tasks" msgstr "Uppgifter" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "Namn" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "" @@ -7281,10 +7421,6 @@ msgstr "Citat:" msgid "An excerpt from '%(book_title)s'" msgstr "Ett utdrag från '%(book_title)s'" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "Plats:" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "På sidan:" @@ -7297,12 +7433,12 @@ msgstr "Vid procent:" msgid "to" msgstr "till" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "Din recension av '%(book_title)s'" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "Recension:" @@ -7403,6 +7539,13 @@ msgid_plural "rated %(title)s: %(display_ratin msgstr[0] "betygsatte %(title)s: %(display_rating)s stjärna" msgstr[1] "betygsatte %(title)s: %(display_rating)s stjärnor" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" +msgstr[1] "" + #: 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" @@ -7615,35 +7758,35 @@ msgstr "Sluta läs" msgid "Show rating" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "Visa status" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "(Sida %(page)s" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "%(endpage)s" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "(%(percent)s%%" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr " - %(endpercent)s%%" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "Öppna bild i nytt fönster" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "Göm status" @@ -7702,16 +7845,22 @@ msgstr "började läsa %(book)s av %(book)s" msgstr "började läsa %(book)s" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "recenserade %(book)s av %(author_name)s" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "recenserade %(book)s" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -7990,15 +8139,23 @@ msgid_plural "%(num)d books - by %(user)s" msgstr[0] "%(num)d bok - av %(user)s" msgstr[1] "%(num)d böcker - av %(user)s" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "ett nytt användarkonto" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/tr_TR/LC_MESSAGES/django.po b/locale/tr_TR/LC_MESSAGES/django.po index 57131a6cae..4db55f2354 100644 --- a/locale/tr_TR/LC_MESSAGES/django.po +++ b/locale/tr_TR/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-05-03 00:39\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:13\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Turkish\n" "Language: tr\n" @@ -107,7 +107,7 @@ msgstr "Kitap Adı" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "Değerlendirme" @@ -175,39 +175,43 @@ msgstr "Moderatörün silinmesi" msgid "Domain block" msgstr "Alan adı engellemesi" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "Sesli kitap" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "e-Kitap" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "Grafik Roman" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "Ciltli" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "Ciltsiz" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "%(value)s bir ISBN gibi görünmüyor" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "%(value)s geçerli bir ISBN kontrol toplamına sahip değil, beklenen: %(check_version)s" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,19 +465,19 @@ msgstr "%(display_name)s kullanıcısının %(book_title)s yorumu" msgid "%(display_name)s's quote from %(book_title)s" msgstr "%(display_name)s kullanıcısının %(book_title)s alıntısı" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "%(display_name)s kullanıcısının %(book_title)s incelemesi" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" msgstr[0] "%(display_name)s %(book_title)s kitabına %(display_rating).1f yıldız verdi" msgstr[1] "%(display_name)s %(book_title)s kitabına %(display_rating).1f yıldız verdi" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "İncelemeler" @@ -489,19 +493,19 @@ msgstr "Alıntılar" msgid "Everything else" msgstr "Diğer" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "Akış" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "Ana Sayfa" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "Kitap Akışı" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -510,91 +514,91 @@ msgstr "Kitap Akışı" msgid "Books" msgstr "Kitaplar" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "İngilizce" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "Català (Katalanca)" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "Deutsch (Almanca)" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "Esperanto (Esperanto)" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "Español (İspanyolca)" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "Euskara (Baskça)" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "Galego (Galiçyaca)" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "Italiano (İtalyanca)" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "한국어 (Korece)" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "Suomi (Fince)" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "Français (Fransızca)" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (Litovca)" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "Nederlands (Felemenkçe)" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "Norsk (Norveççe)" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "Polski (Lehçe)" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (Brezilya Portekizcesi)" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Avrupa Portekizcesi)" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "Română (Rumence)" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "Svenska (İsveççe)" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "Українська (Ukraynaca)" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (Basitleştirilmiş Çince)" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (Geleneksel Çince)" @@ -839,7 +843,7 @@ msgstr "Bu yıl okudukları en kı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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -910,57 +914,62 @@ msgstr "Doğum:" msgid "Died:" msgstr "Ölüm:" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "Dizi:" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "Harici bağlantılar" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "Vikipedi" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "Vikiveri'de görüntüle" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "Web sitesi" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "ISNI kaydını gör" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "ISFDB'de gör" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "Veri yükle" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "OpenLibrary'de aç" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "Inventaire'de görüntüle" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "LibraryThing'de görüntüle" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "Goodreads'te Görüntüle" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "%(name)s kitapları" @@ -997,8 +1006,8 @@ msgid "Name:" msgstr "İsim:" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "Birden fazla değeri virgülle ayırın." @@ -1035,7 +1044,8 @@ msgid "Openlibrary key:" msgstr "Openlibrary anahtarı:" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "Inventaire hesabı:" @@ -1044,7 +1054,7 @@ msgid "Librarything key:" msgstr "Librarything anahtarı:" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "Goodreads anahtarı:" @@ -1057,8 +1067,8 @@ msgid "ISNI:" msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1070,7 +1080,7 @@ msgstr "ISNI:" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1082,10 +1092,10 @@ msgstr "Kaydet" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1095,7 +1105,7 @@ msgstr "Kaydet" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1112,7 +1122,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "" #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1129,97 +1140,116 @@ msgstr "Onayla" msgid "Unable to connect to remote source." msgstr "Uzaktaki kaynağa bağlanılamıyor." -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "Kitabı Düzenle" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "Kapak eklemek için tıklayın" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "Kapak yüklemesi başarısız" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "Büyütmek için tıkla" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "" msgstr[1] "(%(review_count)s incelemeler)" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "Açıklama Ekle" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "Açıklama:" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" msgstr[0] "%(count)s baskı" msgstr[1] "%(count)s baskılar" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "Bu baskıyı rafa kaldırdınız:" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "" -#: bookwyrm/templates/book/book.html:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "Okuma etkinliğiniz" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "Okuma tarihlerini ekleyin" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "Bu kitap için herhangi bir okuma etkinliğiniz yok." -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "Değerlendirmelerin" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "Yorumların" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "Alıntıların" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "Konular" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "Yerler" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1234,15 +1264,15 @@ msgstr "Yerler" msgid "Lists" msgstr "Listeler" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "Listeye ekle" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1265,25 +1295,26 @@ msgid "Copied ISBN!" msgstr "ISBN kopyalandı!" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "OCLC Sayısı:" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "ASIN:" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "Sesli ASIN:" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "ISFDB ID:" @@ -1294,12 +1325,12 @@ msgid "Goodreads:" msgstr "Goodreads:" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "Finna hesabı:" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1308,12 +1339,12 @@ msgid "Add cover" msgstr "Kapak resmi ekle" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "Kapak resmi yükle:" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "URL ile kapak resmi yükle:" @@ -1378,15 +1409,32 @@ msgstr "Bu yeni bir yazar" msgid "Creating a new author: %(name)s" msgstr "Yeni yazar oluşturuluyor: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "Bu zaten olan bir kitabın yeni bir edisyonu mu?" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "Bu yeni bir kitap" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1448,124 +1496,190 @@ msgstr "Başlığı sırala:" msgid "Subtitle:" msgstr "Alt başlık:" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "Dizi:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "Seri numarası:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "Diller:" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "Konular:" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "Konu ekle" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "Konu kaldır" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "Başka Konu Ekle" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "Pozisyon:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "Yayın" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "Yayıncı:" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "İlk yayınlanma tarihi:" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "Yayınlanma tarihi:" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "Yazarlar" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "%(name)s kaldır" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "%(name)s yazar sayfası" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "Yazarlar Ekle:" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "Yazar Ekle" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "Anonim" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "Başka Yazar Ekle" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "Kapak" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "Fiziksel Özellikler" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "Biçim:" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "Format detayları:" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "Sayfalar:" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "Kitap Tanıtıcıları" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "ISBN 13:" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "ISBN 10:" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "Openlibrary hesabı:" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "İsim" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1752,19 +1866,11 @@ msgstr "Yayınlanma tarihi%(date)s:" msgid "rated it" msgstr "oylandı" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "Seriler" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "Kitap %(series_number)s" -#: bookwyrm/templates/book/series.html:28 -msgid "Unsorted Book" -msgstr "Sıralanmamış Kitap" - #: 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." @@ -1809,7 +1915,7 @@ msgstr "Doğrulama kodu:" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "Gönder" @@ -1870,7 +1976,7 @@ msgstr "Profil ayarlarından istediğin zaman vazgeçeb #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1964,21 +2070,22 @@ msgid "%(username)s started reading %(username)s okumaya başladı %(book_title)s" #: bookwyrm/templates/discover/card-header.html:23 +#: bookwyrm/templates/discover/card-header.html:32 #, python-format msgid "%(username)s rated %(book_title)s" msgstr "%(username)s oy verdi %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "%(username)s inceledi %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "%(username)s yorum yaptı %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "%(username)s alıntı yaptı %(book_title)s" @@ -2164,14 +2271,14 @@ msgstr "Şu anda herhangi bir etkinlik yok! Başlamak için bir kullanıcıyı t msgid "Alternatively, you can try enabling more status types" msgstr "Alternatif olarak, daha fazla durum türünü etkinleştirmeyi deneyebilirsin" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: bookwyrm/templates/feed/layout.html:14 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" msgstr "%(year)s okuma hedefi" -#: bookwyrm/templates/feed/goal_card.html:18 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "Okuma hedefini profil sayfandan istediğiniz zaman belirleyebilir veya değiştirebilirsin" @@ -2459,6 +2566,10 @@ msgstr "Bu grubun listesi yok" msgid "Edit group" msgstr "Grubu düzenle" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "Kullanıcı eklemek için ara" @@ -3697,6 +3808,7 @@ msgid "Search for a book, author, user, or list" msgstr "" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "" @@ -4309,7 +4421,7 @@ msgstr[0] "Yeni bir rapor moderasyon bekliyor" msgstr[1] "%(display_count)s yeni rapor moderasyon bekliyor" #: bookwyrm/templates/notifications/items/status_preview.html:4 -#: bookwyrm/templates/snippets/status/content_status.html:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "İçerik uyarısı" @@ -4776,7 +4888,7 @@ msgstr "" 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 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "" @@ -4969,9 +5081,8 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "" #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" +msgid "Update read dates for \"%(title)s\"" msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 @@ -5026,6 +5137,11 @@ msgstr "Okuma tarihlerini ekleyin" msgid "Delete these read dates" msgstr "Bu okuma tarihlerini sil" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5036,40 +5152,33 @@ msgstr "\"%(title)s\" için okuma tarihleri ekle" msgid "Report" msgstr "Bildir" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "\n" -"Barkod Tara " - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "Kamera izni talep ediliyor..." -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "Bir kitabın barkodunu taramak için kameraya erişim izni verin." -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "Kameraya erişilemedi" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "Taranıyor..." -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "Kitabınızın barkodunu kamera ile hizalayın." -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "ISBN tarandı" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "Kitap aranıyor:" @@ -5170,13 +5279,13 @@ msgstr "" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 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:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "" @@ -5550,7 +5659,7 @@ msgid "Dashboard" msgstr "Kontrol Paneli" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "Toplam kullanıcı sayısı" @@ -5564,31 +5673,31 @@ msgstr "Bu ay aktif" msgid "Works" msgstr "Çalışmalar" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "Sunucu Etkinliği" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "Aralık:" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "Günler" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "Haftalar" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "Kullanıcı kayıt etkinliği" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "Durum etkinliği" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "Oluşturulanlar" @@ -5900,13 +6009,49 @@ msgid "Unable to save settings" msgstr "Ayarlar kaydedilemiyor" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "Federasyonu devre dışı bırak" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "Sunucunuzun diğer federe hizmetler etkileşime girmesini engeller. Diğer örneklerden gelen mevcut veriler var olmaya devam edecektir." +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6617,10 +6762,6 @@ msgstr "Planlanmış görevler" msgid "Tasks" msgstr "Görevler" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "İsim" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "Celery görevi" @@ -7280,10 +7421,6 @@ msgstr "Alıntı:" msgid "An excerpt from '%(book_title)s'" msgstr "'%(book_title)s' eserinden bir alıntı" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "Pozisyon:" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "Sayfada:" @@ -7296,12 +7433,12 @@ msgstr "Yüzdede:" msgid "to" msgstr "şu" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "'%(book_title)s' hakkındaki incelemeniz" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "İnceleme:" @@ -7402,6 +7539,13 @@ msgid_plural "rated %(title)s: %(display_ratin msgstr[0] "%(title)s eserine %(display_rating)s yıldız puanı verdi" msgstr[1] "%(title)s eserine %(display_rating)s yıldız puanı verdi" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" +msgstr[1] "" + #: 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" @@ -7614,35 +7758,35 @@ msgstr "Okumayı bitir" msgid "Show rating" msgstr "Puanlamayı göster" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "Durumu göster" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "(Sayfa %(page)s" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "%(endpage)s" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "(%(percent)s%%" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr " - %(endpercent)s%%" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "Görseli yeni pencerede aç" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "Durumu gizle" @@ -7701,16 +7845,22 @@ msgstr "%(author_name)s yazarına ait %(book)s" msgstr "%(book)s kitabını okumaya başladı" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "%(author_name)s yazarına ait %(book)s kitabını inceledi" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "%(book)s kitabını inceledi" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -7989,15 +8139,23 @@ msgid_plural "%(num)d books - by %(user)s" msgstr[0] "%(num)d kitap - %(user)s tarafından" msgstr[1] "%(num)d kitaplar - %(user)s tarafından" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "yeni bir kullanıcı hesabı" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/uk_UA/LC_MESSAGES/django.po b/locale/uk_UA/LC_MESSAGES/django.po index ddb8cee917..5690a46a4d 100644 --- a/locale/uk_UA/LC_MESSAGES/django.po +++ b/locale/uk_UA/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-06 18:48\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:13\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Ukrainian\n" "Language: uk\n" @@ -107,7 +107,7 @@ msgstr "Назвою книги" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "Рейтингом" @@ -175,39 +175,43 @@ msgstr "Видалення модератором" msgid "Domain block" msgstr "Домен заблоковано" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "Аудіокнига" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "Електронна книга" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "Графічний роман" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "Тверда обкладинка" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "М'яка обкладинка" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,12 +465,12 @@ msgstr "" msgid "%(display_name)s's quote from %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" @@ -475,7 +479,7 @@ msgstr[1] "" msgstr[2] "" msgstr[3] "" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "Рецензії" @@ -491,19 +495,19 @@ msgstr "Цитати" msgid "Everything else" msgstr "Все інше" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "Головна Стрічка" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "Головна" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "Книжкова Стрічка" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -512,91 +516,91 @@ msgstr "Книжкова Стрічка" msgid "Books" msgstr "Книги" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "Англійська" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "Català (Каталонська)" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "Deutsch (Німецька)" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "Esperanto (Есперанто)" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "Español (Іспанська)" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "Euskara (Баскська)" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "Galego (Галісійська)" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "Italiano (Італійська)" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "Suomi (Фінська)" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "Français (Французька)" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (Литовська)" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "Nederlands (Нідерландська)" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "Norsk (Норвезька)" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "Polski (Польська)" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (Бразильська португальська)" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (Європейська португальська)" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "Română (Румунська)" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "Svenska (Шведська)" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "Українська (Ukrainian)" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (Спрощена китайська)" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (Традиційна китайська)" @@ -845,7 +849,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -920,57 +924,62 @@ msgstr "Дата народження:" msgid "Died:" msgstr "Дата смерті:" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "Серії:" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "Зовнішні посилання" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "Вікіпедія" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "Вебсайт" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "Переглянути запис ISNI" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "Переглянути на ISFDB" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "Завантажити данні" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "Переглянути на OpenLibrary" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "Переглянути на Inventaire" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "Переглянути на LibraryThing" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "Переглянути на Goodreads" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "Книги за авторством %(name)s" @@ -1007,8 +1016,8 @@ msgid "Name:" msgstr "Ім'я:" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "Якщо значень багато, розділіть їх комами." @@ -1045,7 +1054,8 @@ msgid "Openlibrary key:" msgstr "Ключ Openlibrary:" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "Inventaire ID:" @@ -1054,7 +1064,7 @@ msgid "Librarything key:" msgstr "Ключ Librarything:" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "Ключ Goodreads:" @@ -1067,8 +1077,8 @@ msgid "ISNI:" msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1080,7 +1090,7 @@ msgstr "ISNI:" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1092,10 +1102,10 @@ msgstr "Зберегти" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1105,7 +1115,7 @@ msgstr "Зберегти" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1122,7 +1132,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "Процес завантаження даних з'єднається з %(source_name)s та перевірить наявність метаданих про цього автора, яких тут немає. Наявні метадані не буде перезаписано." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1139,31 +1150,50 @@ msgstr "Підтвердити" msgid "Unable to connect to remote source." msgstr "Не вдалося під'єднатися до віддаленого джерела." -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "Редагувати Книгу" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "Натисніть, щоб додати обкладинку" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "Не вдалося завантажити обкладинку" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "Натисніть для збільшення" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" @@ -1172,17 +1202,17 @@ msgstr[1] "(%(review_count)s рецензії)" msgstr[2] "(%(review_count)s рецензій)" msgstr[3] "(%(review_count)s рецензій)" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "Додати Опис" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "Опис:" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" @@ -1191,49 +1221,49 @@ msgstr[1] "%(count)s видання" msgstr[2] "%(count)s видань" msgstr[3] "%(count)s видань" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "Ви відклали це видання на полицю:" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, 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:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "Ваша читацька активність" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "Додати дати коли прочитано" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "Ви не маєте жодної читацької активності для цієї книги." -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "Ваші відгуки" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "Ваші коментарі" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "Ваші цитати" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "Теми" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "Місця" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1248,15 +1278,15 @@ msgstr "Місця" msgid "Lists" msgstr "Списки" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "Додати до списку" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1279,25 +1309,26 @@ msgid "Copied ISBN!" msgstr "ISBN скопійовано!" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "Номер OCLC:" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "ASIN:" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "Audible ASIN:" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "ISFDB ID:" @@ -1308,12 +1339,12 @@ msgid "Goodreads:" msgstr "Goodreads:" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1322,12 +1353,12 @@ msgid "Add cover" msgstr "Додати обкладинку" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "Завантажити обкладинку:" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "Завантажити обкладинку з посилання:" @@ -1392,15 +1423,32 @@ msgstr "Це новий автор" msgid "Creating a new author: %(name)s" msgstr "Створення нового автора: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "Це видання вже існуючого твору?" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "Це новий твір" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1462,124 +1510,190 @@ msgstr "Назва Для Сортування:" msgid "Subtitle:" msgstr "Підзаголовок:" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "Серії:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "Номер серії:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "Мови:" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "Теми:" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "Додати тему" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "Видалити тему" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "Додати іншу тему" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "Місце у книзі:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "Видання" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "Видавець:" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "Дата першого видання:" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "Дата видання:" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "Автори" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "Видалити %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "Сторінка автора для %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "Додати авторів:" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "Додати автора" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "Ілона Павлюк" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "Додати іншого автора" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "Обкладинка" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "Фізичні властивості" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "Формат:" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "Деталі формату:" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "Сторінок:" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "Ідентифікатори книги" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "ISBN 13:" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "ISBN 10:" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "Openlibrary ID:" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1766,19 +1880,11 @@ msgstr "Видано %(date)s" msgid "rated it" msgstr "оцінив у" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "Серія від" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, 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." @@ -1823,7 +1929,7 @@ msgstr "Код підтвердження:" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "Надіслати" @@ -1884,7 +1990,7 @@ msgstr "Ви можете від'єднатися будь-коли в наст #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1982,21 +2088,22 @@ msgid "%(username)s started reading %(username)s почав(-ла) читати %(book_title)s" #: bookwyrm/templates/discover/card-header.html:23 +#: bookwyrm/templates/discover/card-header.html:32 #, python-format msgid "%(username)s rated %(book_title)s" msgstr "%(username)s оцінив(-ла) %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "%(username)s рецензував(-ла) %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "%(username)s прокоментував(-ла) %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "%(username)s процитував(-ла) %(book_title)s" @@ -2182,14 +2289,14 @@ msgstr "Немає жодних активностей! Для початку, msgid "Alternatively, you can try enabling more status types" msgstr "Або, ви можете спробувати увімкнути більше типів постів" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: 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 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "Ви можете задати або змінити ціль читання у будь-який час на сторінці профілю " @@ -2477,6 +2584,10 @@ msgstr "Ця група не має списків" msgid "Edit group" msgstr "Редагувати групу" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "Пошук, щоб додати користувача" @@ -3725,6 +3836,7 @@ msgid "Search for a book, author, user, or list" msgstr "" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "Сканувати Штрих-код" @@ -4347,7 +4459,7 @@ 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 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "Попередження про вміст" @@ -4816,7 +4928,7 @@ msgstr "" 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 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "" @@ -5009,9 +5121,8 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "" #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" +msgid "Update read dates for \"%(title)s\"" msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 @@ -5066,6 +5177,11 @@ msgstr "" msgid "Delete these read dates" msgstr "" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5076,41 +5192,33 @@ msgstr "" 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 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "Запитуємо камеру..." -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "Сканування..." -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "ISBN відскановано" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "" @@ -5215,13 +5323,13 @@ msgstr "" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 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:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "" @@ -5595,7 +5703,7 @@ msgid "Dashboard" msgstr "Панель керування" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "Всього користувачів" @@ -5609,31 +5717,31 @@ msgstr "Активних у цьому місяці" msgid "Works" msgstr "Творів" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "Активність Інстансу" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "Інтервал:" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "Дні" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "Тижні" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "Активність по реєстраціях" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "Активність по статусах" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "Творів створено" @@ -5953,13 +6061,49 @@ msgid "Unable to save settings" msgstr "Не вдалося зберегти налаштування" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6670,10 +6814,6 @@ msgstr "" msgid "Tasks" msgstr "" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "" @@ -7337,10 +7477,6 @@ msgstr "Цитата:" 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 "Сторінка:" @@ -7353,12 +7489,12 @@ msgstr "Відсоток:" msgid "to" msgstr "по" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "Ваша рецензія на '%(book_title)s'" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "Рецензія:" @@ -7467,6 +7603,15 @@ msgstr[1] "оцінив(-ла) %(title)s: %(di msgstr[2] "оцінив(-ла) %(title)s: %(display_rating)s зірок" msgstr[3] "оцінив(-ла) %(title)s: %(display_rating)s зірок" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" +msgstr[1] "" +msgstr[2] "" +msgstr[3] "" + #: 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" @@ -7681,35 +7826,35 @@ msgstr "Відмітити прочитаним" msgid "Show rating" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "Переглянути статус" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "(Сторінка %(page)s" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "%(endpage)s" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "(%(percent)s%%" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr " - %(endpercent)s%%" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "Відкрити зображення в новому вікні" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "Приховати статус" @@ -7768,16 +7913,22 @@ msgstr "почав(-ла) читати %(book)s в msgid "started reading %(book)s" msgstr "почав(-ла) читати %(book)s" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "залишив(-ла) рецензію на %(book)s від %(author_name)s" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "залишив(-ла) рецензію на %(book)s" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -8062,15 +8213,23 @@ msgstr[1] "%(num)d книги – від %(user)s" msgstr[2] "%(num)d книг – від %(user)s" msgstr[3] "%(num)d книг – від %(user)s" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/vi_VN/LC_MESSAGES/django.po b/locale/vi_VN/LC_MESSAGES/django.po index 6e92729f9b..3666b7b7d8 100644 --- a/locale/vi_VN/LC_MESSAGES/django.po +++ b/locale/vi_VN/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-06 18:48\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:13\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Vietnamese\n" "Language: vi\n" @@ -107,7 +107,7 @@ msgstr "" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "" @@ -175,39 +175,43 @@ msgstr "" msgid "Domain block" msgstr "" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,18 +465,18 @@ msgstr "" msgid "%(display_name)s's quote from %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" msgstr[0] "" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "" @@ -488,19 +492,19 @@ msgstr "" msgid "Everything else" msgstr "" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -509,91 +513,91 @@ msgstr "" msgid "Books" msgstr "" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "" @@ -836,7 +840,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -905,57 +909,62 @@ msgstr "" msgid "Died:" msgstr "" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "" @@ -992,8 +1001,8 @@ msgid "Name:" msgstr "" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "" @@ -1030,7 +1039,8 @@ msgid "Openlibrary key:" msgstr "" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "" @@ -1039,7 +1049,7 @@ msgid "Librarything key:" msgstr "" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "" @@ -1052,8 +1062,8 @@ msgid "ISNI:" msgstr "" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1065,7 +1075,7 @@ msgstr "" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1077,10 +1087,10 @@ msgstr "" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1090,7 +1100,7 @@ msgstr "" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1107,7 +1117,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "" #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1124,95 +1135,114 @@ msgstr "" msgid "Unable to connect to remote source." msgstr "" -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" msgstr[0] "" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "" -#: bookwyrm/templates/book/book.html:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "" -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1227,15 +1257,15 @@ msgstr "" msgid "Lists" msgstr "" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1258,25 +1288,26 @@ msgid "Copied ISBN!" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "" @@ -1287,12 +1318,12 @@ msgid "Goodreads:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1301,12 +1332,12 @@ msgid "Add cover" msgstr "" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "" @@ -1371,15 +1402,32 @@ msgstr "" msgid "Creating a new author: %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1441,124 +1489,190 @@ msgstr "" msgid "Subtitle:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1745,19 +1859,11 @@ msgstr "" msgid "rated it" msgstr "" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "" -#: 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." @@ -1802,7 +1908,7 @@ msgstr "" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "" @@ -1863,7 +1969,7 @@ msgstr "" #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1955,21 +2061,22 @@ msgid "%(username)s started reading %(username)s rated %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "" @@ -2155,14 +2262,14 @@ msgstr "" msgid "Alternatively, you can try enabling more status types" msgstr "" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: bookwyrm/templates/feed/layout.html:14 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" msgstr "" -#: bookwyrm/templates/feed/goal_card.html:18 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "" @@ -2450,6 +2557,10 @@ msgstr "" msgid "Edit group" msgstr "" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "" @@ -3683,6 +3794,7 @@ msgid "Search for a book, author, user, or list" msgstr "" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "" @@ -4290,7 +4402,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:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "" @@ -4756,7 +4868,7 @@ msgstr "" 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 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "" @@ -4949,9 +5061,8 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "" #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" +msgid "Update read dates for \"%(title)s\"" msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 @@ -5006,6 +5117,11 @@ msgstr "" msgid "Delete these read dates" msgstr "" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5016,39 +5132,33 @@ msgstr "" msgid "Report" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "" - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "" @@ -5147,13 +5257,13 @@ msgstr "" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 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:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "" @@ -5527,7 +5637,7 @@ msgid "Dashboard" msgstr "" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "" @@ -5541,31 +5651,31 @@ msgstr "" msgid "Works" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "" @@ -5873,13 +5983,49 @@ msgid "Unable to save settings" msgstr "" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6590,10 +6736,6 @@ msgstr "" msgid "Tasks" msgstr "" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "" @@ -7251,10 +7393,6 @@ msgstr "" msgid "An excerpt from '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "" @@ -7267,12 +7405,12 @@ msgstr "" msgid "to" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "" @@ -7369,6 +7507,12 @@ msgid "rated %(title)s: %(display_rating)s sta msgid_plural "rated %(title)s: %(display_rating)s stars" msgstr[0] "" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" + #: 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" @@ -7580,35 +7724,35 @@ msgstr "" msgid "Show rating" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "" @@ -7667,16 +7811,22 @@ msgstr "" msgid "started reading %(book)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -7952,15 +8102,23 @@ msgid "%(num)d book - by %(user)s" msgid_plural "%(num)d books - by %(user)s" msgstr[0] "" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/yi_DE/LC_MESSAGES/django.po b/locale/yi_DE/LC_MESSAGES/django.po index 5147c2f5c8..496fc19d30 100644 --- a/locale/yi_DE/LC_MESSAGES/django.po +++ b/locale/yi_DE/LC_MESSAGES/django.po @@ -2,8 +2,8 @@ msgid "" msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-03-14 18:38\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:13\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Yiddish\n" "Language: yi\n" @@ -107,7 +107,7 @@ msgstr "בוכטיטל" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "שאַצונג" @@ -175,39 +175,43 @@ msgstr "שליש אָפּמעקונג" msgid "Domain block" msgstr "שטח־חרם" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "אױדיאָבוך" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "ע־בוך" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "גראַפֿישער ראָמאַן" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "באַטאָװלט" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "בראָשירט" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "%(value)s זעט נישט אױס װי אַן ISBN" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "%(value)s האָט נישט דער ריכטיקער ISBN טשעקסום, האָבם מיר דערװאַרטן אױף %(check_version)s" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,19 +465,19 @@ msgstr "%(display_name)sס קאָמענטאַר װעגן %(book_title)s" msgid "%(display_name)s's quote from %(book_title)s" msgstr "%(display_name)sס ציטאַט פֿון %(book_title)s" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "%(display_name)sס רעצענזיע פֿון %(book_title)s" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" msgstr[0] "%(display_name)s האָט געשאַצט %(book_title)s: %(display_rating).1f שטערן" msgstr[1] "%(display_name)s האָט געשאַצט %(book_title)s: %(display_rating).1f שטערן" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "רעצענזיעס" @@ -489,19 +493,19 @@ msgstr "ציטאַטן" msgid "Everything else" msgstr "איבעריקע" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "הײם־כראָנאָלאָגיע" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "הײם" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "ביכער־כראָנאָלאָגיע" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -510,91 +514,91 @@ msgstr "ביכער־כראָנאָלאָגיע" msgid "Books" msgstr "ביכער" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "English (ענגליש)" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "Català (קאַטאַלאַניש)" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "Deutsch (דײַטש)" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "Esperanto (עספּעראַנטאָ)" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "Español (שפּאַניש)" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "Euskara (באַסקיש)" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "Galego (גאַליסיש)" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "Italiano (איטאַליעניש)" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "한국어 (קאָרעניש)" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "Suomi (פֿיניש)" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "Français (פֿראַנצײזיש)" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (ליטװיש)" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "Nederlands (האָלענדיש)" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "Norsk (נאָרװעגיש)" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "Polski (פּױליש)" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (בראַזיליאַנער פּאָרטוגעזיש)" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (אײראָפּעיש פּאָרטוגעזיש)" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "Română (רומעניש)" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "Svenska (שװעדיש)" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "Українська (אוקראַיִניש)" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文 (פֿאַרפּשוטערן כינעזיש)" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文 (טראַדיציאָנעל כינעזיש)" @@ -839,7 +843,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -910,57 +914,62 @@ msgstr "געבױרן׃" msgid "Died:" msgstr "געשטאָרבן׃" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "סעריע:" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "דרױסנדיקע פֿאַרבינדונגען" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "װיקיפּעדיע" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "אָנקוקן אױפֿ װיקידאַטן" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "װעבזײַטל" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "אָנקוקן ISNI רעקאָרד" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "אָנקוקן אױף ISFDB" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "אַרײַנלאָדן דאַטן" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "אָנקוקן אױף OpenLibrary" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "אָנקוקן אױף Inventaire" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "אָנקוקן אױף LibraryThing" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "אָנקוקן אױף Goodreads" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "ביכער פֿון %(name)s" @@ -997,8 +1006,8 @@ msgid "Name:" msgstr "נאָמען׃" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "זונדערט אָפּ פֿאַרשידענע גרײסן מיט קאָמעס׃" @@ -1035,7 +1044,8 @@ msgid "Openlibrary key:" msgstr "Openlibrary שליסל׃" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "Inventaire ID:" @@ -1044,7 +1054,7 @@ msgid "Librarything key:" msgstr "Librarything שליסל׃" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "Goodreads שליסל׃" @@ -1057,8 +1067,8 @@ msgid "ISNI:" msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1070,7 +1080,7 @@ msgstr "ISNI:" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1082,10 +1092,10 @@ msgstr "אױפֿהיטן" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1095,7 +1105,7 @@ msgstr "אױפֿהיטן" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1112,7 +1122,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "אַרײַנלאָדן דאַטן װעט פֿאַרבינדן מיט %(source_name)s און זוכן װעסער מעטאַדאַטן װעגן דעם מחבר װאָס איז נאָך נישט דאָ. איציקע מעטאַדאַטן װעט נישט איבערגעשריבן װערן." #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1129,97 +1140,116 @@ msgstr "באַשטעטיקן" msgid "Unable to connect to remote source." msgstr "נישט געקענט פֿאַרבינדן זיך מיט װײַטן קװאַל." -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "רעדאַקטירן בוך" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "גיב אַ קװעטש צו שטעלן צו אַ טאָװל" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "נישט געקענט אַרײַנלאָדן טאָװל" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "גיב אַ קװעטש צו פֿאַרגרעסערן" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "זען אױף Finna" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "אָנקוקן אױף Libris" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "(%(review_count)s רעצענזיע)" msgstr[1] "(%(review_count)s רעצענזיעס)" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "צוגעבן באַשרײַבן" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "באַשרײַבונג:" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" msgstr[0] "%(count)s אױסגאַבע" msgstr[1] "%(count)s אױסגאַבעס" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "האָסט געשטעלט דאָס אױסגאַבע אױף:" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, 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:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "דײַנע לײען־טוענישן" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "צוגעבן לײען־דאַטעס" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "האָסט נישט קײן לײען־טוענישן פֿאַר דעם בוך." -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "דײַנע רעצענזיעס" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "דײַנע קאָמענטאַרן" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "דײַנע ציטאַטן" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "טעמעס" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "פּלאַצן" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1234,15 +1264,15 @@ msgstr "פּלאַצן" msgid "Lists" msgstr "רשימות" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "צושטעלן אױף דער רשימה" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "מאַכן אַ נײַע רשימה..." -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1265,25 +1295,26 @@ msgid "Copied ISBN!" msgstr "ISBN קאָפּירט!" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "OCLC-צאָל:" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "ASIN:" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "Audible ASIN:" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "ISFDB-אידענטיפֿיקאַציע:" @@ -1294,12 +1325,12 @@ msgid "Goodreads:" msgstr "Goodreads:" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "Finna ID:" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "Libris-ID:" @@ -1308,12 +1339,12 @@ msgid "Add cover" msgstr "צושטעלן טאָװל" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "אַרױפֿלאָדן טאָװל:" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "אַרײַנלאָדן טאָװל פֿון URL:" @@ -1378,15 +1409,32 @@ msgstr "דאָס איז אַ נײַע(ר) מחבר" msgid "Creating a new author: %(name)s" msgstr "שאַפֿנדיק אַ נײַע(ם) מחבר׃ %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "איז דאָס אַן אױסגאַבע פֿון אַ װערק װאָס איז שױן פֿאַראַנען?" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "דאָס איז אַ נײַ װערק" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1448,124 +1496,190 @@ msgstr "סאָרטירן־טיטל:" msgid "Subtitle:" msgstr "אונטערטיטל:" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "סעריע:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "סעריע־נומער:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "שפּראַכן:" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "טעמעס:" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "צוגעבן טעמע" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "אַראָפּנעמען טעמע" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "צוגעבן נאָך אַ טעמע" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "אױסגאַבע" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "פֿאַרלעגער:" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "ערשטע אַרױסגעבן־דאַטע:" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "אַרױסגעבן־דאַטע:" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "מחברים" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "אַראָפּנעמען %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "מחבר־בלאַט פֿון %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "צוגעבן מחברים:" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "צוגעבן מחבר" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "פּלוניסטע־אַלמוני" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "צוגעבן נאָך אַ מחבר" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "טאָװל" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "פֿיזישע אײגנקײַטן" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "פֿאָרמאַט:" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "פֿאָרמאַט־פּרטים:" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "זײַטלעך:" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "בוך־אידענטיפֿיצירערס" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "ISBN 13:" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "ISBN 10:" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "Openlibrary ID:" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1752,19 +1866,11 @@ msgstr "אַרױסגעגעבן %(date)s" msgid "rated it" msgstr "האָט עס געשאַצט" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "סעריע פֿון" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, 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." @@ -1809,7 +1915,7 @@ msgstr "" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "" @@ -1870,7 +1976,7 @@ msgstr "" #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1964,21 +2070,22 @@ msgid "%(username)s started reading %(username)s rated %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "" @@ -2164,14 +2271,14 @@ msgstr "" msgid "Alternatively, you can try enabling more status types" msgstr "" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: bookwyrm/templates/feed/layout.html:14 #: bookwyrm/templates/user/goal_form.html:6 #, python-format msgid "%(year)s Reading Goal" msgstr "" -#: bookwyrm/templates/feed/goal_card.html:18 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "" @@ -2459,6 +2566,10 @@ msgstr "" msgid "Edit group" msgstr "" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "" @@ -3697,6 +3808,7 @@ msgid "Search for a book, author, user, or list" msgstr "" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "" @@ -4309,7 +4421,7 @@ msgstr[0] "" msgstr[1] "" #: bookwyrm/templates/notifications/items/status_preview.html:4 -#: bookwyrm/templates/snippets/status/content_status.html:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "" @@ -4776,7 +4888,7 @@ msgstr "" 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 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "" @@ -4969,9 +5081,8 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "" #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" +msgid "Update read dates for \"%(title)s\"" msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 @@ -5026,6 +5137,11 @@ msgstr "" msgid "Delete these read dates" msgstr "" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5036,39 +5152,33 @@ msgstr "" msgid "Report" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "" - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "" @@ -5169,13 +5279,13 @@ msgstr "" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 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:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "" @@ -5549,7 +5659,7 @@ msgid "Dashboard" msgstr "" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "" @@ -5563,31 +5673,31 @@ msgstr "" msgid "Works" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "" @@ -5899,13 +6009,49 @@ msgid "Unable to save settings" msgstr "" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6616,10 +6762,6 @@ msgstr "" msgid "Tasks" msgstr "" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "" @@ -7279,10 +7421,6 @@ msgstr "" msgid "An excerpt from '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "" @@ -7295,12 +7433,12 @@ msgstr "" msgid "to" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "" @@ -7401,6 +7539,13 @@ msgid_plural "rated %(title)s: %(display_ratin msgstr[0] "" msgstr[1] "" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" +msgstr[1] "" + #: 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" @@ -7613,35 +7758,35 @@ msgstr "" msgid "Show rating" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "" @@ -7700,16 +7845,22 @@ msgstr "" msgid "started reading %(book)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -7988,15 +8139,23 @@ msgid_plural "%(num)d books - by %(user)s" msgstr[0] "" msgstr[1] "" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/zh_Hans/LC_MESSAGES/django.po b/locale/zh_Hans/LC_MESSAGES/django.po index 6432515e4c..5572d8aa37 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: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-06 18:48\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:13\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Chinese Simplified\n" "Language: zh\n" @@ -107,7 +107,7 @@ msgstr "书名" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "评价" @@ -175,39 +175,43 @@ msgstr "仲裁员删除" msgid "Domain block" msgstr "域名屏蔽" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "有声书籍" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "电子书" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "图像小说" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "精装" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "平装" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,18 +465,18 @@ msgstr "" msgid "%(display_name)s's quote from %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" msgstr[0] "" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "书评" @@ -488,19 +492,19 @@ msgstr "引用" msgid "Everything else" msgstr "所有其它内容" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "主页时间线" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "主页" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "书目时间线" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -509,91 +513,91 @@ msgstr "书目时间线" msgid "Books" msgstr "书目" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "English(英语)" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "Català (加泰罗尼亚语)" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "Deutsch(德语)" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "Esperanto (世界语)" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "Español(西班牙语)" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "Euskara (巴斯克语)" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "Galego(加利西亚语)" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "Italiano(意大利语)" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "한국어 (韩语)" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "Suomi (Finnish/芬兰语)" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "Français(法语)" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių(立陶宛语)" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "Nederlands (荷兰语)" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "Norsk(挪威语)" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "Polski (波兰语)" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil(巴西葡萄牙语)" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu(欧洲葡萄牙语)" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "Română (罗马尼亚语)" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "Svenska(瑞典语)" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "Українська (乌克兰语)" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "简体中文" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文(繁体中文)" @@ -836,7 +840,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -905,57 +909,62 @@ msgstr "出生:" msgid "Died:" msgstr "逝世:" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "系列:" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "外部链接" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "维基百科" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "网站" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "查看 ISNI 记录" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "在 ISFDB 查看" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "加载数据" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "在 OpenLibrary 查看" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "在 Inventaire 查看" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "在 LibraryThing 查看" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "在 Goodreads 查看" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "%(name)s 所著的书" @@ -992,8 +1001,8 @@ msgid "Name:" msgstr "名称:" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "请用英文逗号(,)分隔多个值。" @@ -1030,7 +1039,8 @@ msgid "Openlibrary key:" msgstr "Openlibrary key:" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "Inventaire ID:" @@ -1039,7 +1049,7 @@ msgid "Librarything key:" msgstr "Librarything key:" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "Goodreads key:" @@ -1052,8 +1062,8 @@ msgid "ISNI:" msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1065,7 +1075,7 @@ msgstr "ISNI:" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1077,10 +1087,10 @@ msgstr "保存" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1090,7 +1100,7 @@ msgstr "保存" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1107,7 +1117,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "加载数据会连接到 %(source_name)s 并检查这里还没有记录的与作者相关的元数据。现存的元数据不会被覆盖。" #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1124,95 +1135,114 @@ msgstr "确认" msgid "Unable to connect to remote source." msgstr "无法联系远程资源。" -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "编辑书目" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "点击添加封面" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "加载封面失败" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "点击放大" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "(%(review_count)s 则书评)" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "添加描述" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "描述:" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" msgstr[0] "%(count)s 版次" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "此版本已在你的书架上:" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, 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:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "你的阅读活动" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "添加阅读日期" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "你还没有任何这本书的阅读活动。" -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "你的书评" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "你的评论" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "你的引用" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "主题" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "地点" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1227,15 +1257,15 @@ msgstr "地点" msgid "Lists" msgstr "列表" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "添加到列表" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1258,25 +1288,26 @@ msgid "Copied ISBN!" msgstr "已复制 ISBN!" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "OCLC 号:" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "ASIN:" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "Audible ASIN:" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "ISFDB ID:" @@ -1287,12 +1318,12 @@ msgid "Goodreads:" msgstr "Goodreads:" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1301,12 +1332,12 @@ msgid "Add cover" msgstr "添加封面" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "上传封面:" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "从 URL 加载封面:" @@ -1371,15 +1402,32 @@ msgstr "这是一位新的作者" msgid "Creating a new author: %(name)s" msgstr "正在创建新的作者: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "这是已存在的作品的一个版本吗?" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "这是一个新的作品。" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1441,124 +1489,190 @@ msgstr "" msgid "Subtitle:" msgstr "副标题:" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "系列:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "系列编号:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "语言:" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "主题:" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "添加主题" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "移除主题" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "添加新用户" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "位置:" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "出版" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "出版社:" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "初版时间:" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "出版时间:" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "作者" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "移除 %(name)s" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "%(name)s 的作者页面" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "添加作者:" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "添加作者" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "张三" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "添加其他作者" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "封面" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "实体性质" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "格式:" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "装订细节:" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "页数:" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "书目标识号" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "ISBN 13:" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "ISBN 10:" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "Openlibrary ID:" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1745,19 +1859,11 @@ msgstr "于 %(date)s 出版" msgid "rated it" msgstr "评价了" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "" -#: 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." @@ -1802,7 +1908,7 @@ msgstr "确认代码:" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "提交" @@ -1863,7 +1969,7 @@ msgstr "你可以在任何时候从你的 个人资料设 #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1955,21 +2061,22 @@ msgid "%(username)s started reading %(username)s 开始阅读 %(book_title)s" #: bookwyrm/templates/discover/card-header.html:23 +#: bookwyrm/templates/discover/card-header.html:32 #, python-format msgid "%(username)s rated %(book_title)s" msgstr "%(username)s%(book_title)s 留下了评分" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "%(username)s 已评价 %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "%(username)s 评论了 %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "%(username)s 引用了 %(book_title)s" @@ -2155,14 +2262,14 @@ msgstr "现在还没有任何活动!尝试从关注一个用户开始吧" msgid "Alternatively, you can try enabling more status types" msgstr "或者,您可以尝试启用更多的状态种类" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: 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 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "你可以在任何时候从你的个人资料页面 中设置或改变你的阅读目标" @@ -2450,6 +2557,10 @@ msgstr "这个群组没有任何列表" msgid "Edit group" msgstr "编辑群组" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "搜索或添加用户" @@ -3683,6 +3794,7 @@ msgid "Search for a book, author, user, or list" msgstr "" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "扫描条形码" @@ -4290,7 +4402,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:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "内容警告" @@ -4756,7 +4868,7 @@ msgstr "导出书单" 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 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "下载文件" @@ -4949,10 +5061,9 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "你正要删除这篇阅读经过以及与之相关的 %(count)s 次进度更新。" #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" -msgstr "更新 “%(title)s” 的阅读日期" +msgid "Update read dates for \"%(title)s\"" +msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 #: bookwyrm/templates/readthrough/readthrough_modal.html:38 @@ -5006,6 +5117,11 @@ msgstr "编辑阅读日期" msgid "Delete these read dates" msgstr "删除这些阅读日期" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "更新 “%(title)s” 的阅读日期" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5016,41 +5132,33 @@ msgstr "添加 “%(title)s” 的阅读日期" 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 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "正在启用摄像头..." -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "允许访问相机以扫描书条码。" -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "无法使用摄像头" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "正在扫描..." -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "使您的书条码与相机对齐。" -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "ISBN 扫描" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "搜索书目:" @@ -5149,13 +5257,13 @@ msgstr "否" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 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:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "结束日期:" @@ -5529,7 +5637,7 @@ msgid "Dashboard" msgstr "仪表盘" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "用户总数" @@ -5543,31 +5651,31 @@ msgstr "今月活跃" msgid "Works" msgstr "作品" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "实例活动" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "区段:" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "天" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "周" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "用户注册活动" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "状态动态" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "创建的作品" @@ -5875,13 +5983,49 @@ msgid "Unable to save settings" msgstr "无法保存设置" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6592,10 +6736,6 @@ msgstr "" msgid "Tasks" msgstr "" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "" @@ -7253,10 +7393,6 @@ msgstr "引用:" 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 "页码:" @@ -7269,12 +7405,12 @@ msgstr "百分比:" msgid "to" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "你对《%(book_title)s》的书评" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "书评:" @@ -7371,6 +7507,12 @@ msgid "rated %(title)s: %(display_rating)s sta msgid_plural "rated %(title)s: %(display_rating)s stars" msgstr[0] "为 %(title)s 打了分: %(display_rating)s 星" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" + #: 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" @@ -7582,35 +7724,35 @@ msgstr "完成阅读" msgid "Show rating" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "显示状态" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "在新窗口中打开图像" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "隐藏状态" @@ -7669,16 +7811,22 @@ msgstr "开始阅读 %(author_name)s%(book)s" msgstr "开始阅读 %(book)s" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "写了 %(author_name)s%(book)s 的书评" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "为 %(book)s 撰写了书评" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -7954,15 +8102,23 @@ 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:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "%(title)s:%(subtitle)s" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" diff --git a/locale/zh_Hant/LC_MESSAGES/django.po b/locale/zh_Hant/LC_MESSAGES/django.po index 27cbc7c81e..6a759a68ee 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: 2026-02-06 17:47+0000\n" -"PO-Revision-Date: 2026-02-06 18:48\n" +"POT-Creation-Date: 2026-05-23 18:40+0000\n" +"PO-Revision-Date: 2026-05-23 19:13\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Chinese Traditional\n" "Language: zh\n" @@ -107,7 +107,7 @@ msgstr "書名" #: bookwyrm/forms/lists.py:28 bookwyrm/templates/shelf/shelf.html:164 #: bookwyrm/templates/shelf/shelf.html:196 -#: bookwyrm/templates/snippets/create_status/review.html:32 +#: bookwyrm/templates/snippets/create_status/review.html:31 msgid "Rating" msgstr "評價" @@ -175,39 +175,43 @@ msgstr "" msgid "Domain block" msgstr "" -#: bookwyrm/models/book.py:500 +#: bookwyrm/models/book.py:532 msgid "Audiobook" msgstr "有聲書" -#: bookwyrm/models/book.py:501 +#: bookwyrm/models/book.py:533 msgid "eBook" msgstr "電子書" -#: bookwyrm/models/book.py:502 +#: bookwyrm/models/book.py:534 msgid "Graphic novel" msgstr "圖像小說" -#: bookwyrm/models/book.py:503 +#: bookwyrm/models/book.py:535 msgid "Hardcover" msgstr "精裝書" -#: bookwyrm/models/book.py:504 +#: bookwyrm/models/book.py:536 msgid "Paperback" msgstr "平裝書" -#: bookwyrm/models/book.py:513 bookwyrm/models/book.py:520 -#: bookwyrm/models/book.py:526 bookwyrm/models/book.py:531 -#: bookwyrm/models/book.py:536 bookwyrm/models/book.py:554 -#: bookwyrm/models/book.py:560 bookwyrm/models/book.py:565 +#: bookwyrm/models/book.py:545 bookwyrm/models/book.py:552 +#: bookwyrm/models/book.py:558 bookwyrm/models/book.py:563 +#: bookwyrm/models/book.py:568 bookwyrm/models/book.py:586 +#: bookwyrm/models/book.py:592 bookwyrm/models/book.py:597 #, python-format msgid "%(value)s doesn't look like an ISBN" msgstr "" -#: bookwyrm/models/book.py:542 bookwyrm/models/book.py:582 +#: bookwyrm/models/book.py:574 bookwyrm/models/book.py:614 #, python-format msgid "%(value)s doesn't have correct ISBN checksum, we expected %(check_version)s" msgstr "" +#: bookwyrm/models/book.py:797 +msgid "Book is already in this series" +msgstr "" + #: bookwyrm/models/bookwyrm_import_job.py:151 bookwyrm/models/report.py:85 #: bookwyrm/templates/settings/reports/report.html:115 #: bookwyrm/templates/snippets/create_status.html:26 @@ -461,18 +465,18 @@ msgstr "" msgid "%(display_name)s's quote from %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:452 +#: bookwyrm/models/status.py:456 #, python-format msgid "%(display_name)s's review of %(book_title)s" msgstr "" -#: bookwyrm/models/status.py:484 +#: bookwyrm/models/status.py:488 #, python-format msgid "%(display_name)s rated %(book_title)s: %(display_rating).1f star" msgid_plural "%(display_name)s rated %(book_title)s: %(display_rating).1f stars" msgstr[0] "" -#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:343 +#: bookwyrm/models/user.py:40 bookwyrm/templates/book/book.html:359 msgid "Reviews" msgstr "書評" @@ -488,19 +492,19 @@ msgstr "引用" msgid "Everything else" msgstr "所有其他內容" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home Timeline" msgstr "主頁時間線" -#: bookwyrm/settings.py:236 +#: bookwyrm/settings.py:245 msgid "Home" msgstr "主頁" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 msgid "Books Timeline" msgstr "書目時間線" -#: bookwyrm/settings.py:237 +#: bookwyrm/settings.py:246 #: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/import/user_import_status.html:73 #: bookwyrm/templates/search/layout.html:22 @@ -509,91 +513,91 @@ msgstr "書目時間線" msgid "Books" msgstr "書目" -#: bookwyrm/settings.py:316 +#: bookwyrm/settings.py:325 msgid "English" msgstr "English(英語)" -#: bookwyrm/settings.py:317 +#: bookwyrm/settings.py:326 msgid "Català (Catalan)" msgstr "Català (加泰羅尼亞語)" -#: bookwyrm/settings.py:318 +#: bookwyrm/settings.py:327 msgid "Deutsch (German)" msgstr "Deutsch(德語)" -#: bookwyrm/settings.py:319 +#: bookwyrm/settings.py:328 msgid "Esperanto (Esperanto)" msgstr "Esperanto (世界語)" -#: bookwyrm/settings.py:320 +#: bookwyrm/settings.py:329 msgid "Español (Spanish)" msgstr "Español(西班牙語)" -#: bookwyrm/settings.py:321 +#: bookwyrm/settings.py:330 msgid "Euskara (Basque)" msgstr "Euskara (巴斯克語)" -#: bookwyrm/settings.py:322 +#: bookwyrm/settings.py:331 msgid "Galego (Galician)" msgstr "Galego (加利西亞語)" -#: bookwyrm/settings.py:323 +#: bookwyrm/settings.py:332 msgid "Italiano (Italian)" msgstr "Italiano (意大利語)" -#: bookwyrm/settings.py:324 +#: bookwyrm/settings.py:333 msgid "한국어 (Korean)" msgstr "" -#: bookwyrm/settings.py:325 +#: bookwyrm/settings.py:334 msgid "Suomi (Finnish)" msgstr "Suomi (芬蘭語)" -#: bookwyrm/settings.py:326 +#: bookwyrm/settings.py:335 msgid "Français (French)" msgstr "Français(法語)" -#: bookwyrm/settings.py:327 +#: bookwyrm/settings.py:336 msgid "Lietuvių (Lithuanian)" msgstr "Lietuvių (立陶宛語)" -#: bookwyrm/settings.py:328 +#: bookwyrm/settings.py:337 msgid "Nederlands (Dutch)" msgstr "Nederlands (荷蘭語)" -#: bookwyrm/settings.py:329 +#: bookwyrm/settings.py:338 msgid "Norsk (Norwegian)" msgstr "Norsk (挪威語)" -#: bookwyrm/settings.py:330 +#: bookwyrm/settings.py:339 msgid "Polski (Polish)" msgstr "Polski (波蘭語)" -#: bookwyrm/settings.py:331 +#: bookwyrm/settings.py:340 msgid "Português do Brasil (Brazilian Portuguese)" msgstr "Português do Brasil (巴西葡萄牙語)" -#: bookwyrm/settings.py:332 +#: bookwyrm/settings.py:341 msgid "Português Europeu (European Portuguese)" msgstr "Português Europeu (歐洲葡萄牙語)" -#: bookwyrm/settings.py:333 +#: bookwyrm/settings.py:342 msgid "Română (Romanian)" msgstr "Română (羅馬尼亞語)" -#: bookwyrm/settings.py:334 +#: bookwyrm/settings.py:343 msgid "Svenska (Swedish)" msgstr "Svenska (瑞典語)" -#: bookwyrm/settings.py:335 +#: bookwyrm/settings.py:344 msgid "Українська (Ukrainian)" msgstr "" -#: bookwyrm/settings.py:336 +#: bookwyrm/settings.py:345 msgid "简体中文 (Simplified Chinese)" msgstr "簡體中文" -#: bookwyrm/settings.py:337 +#: bookwyrm/settings.py:346 msgid "繁體中文 (Traditional Chinese)" msgstr "繁體中文" @@ -836,7 +840,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:73 +#: bookwyrm/templates/book/book.html:89 bookwyrm/templates/book/series.html:21 #: bookwyrm/templates/discover/large-book.html:22 #: bookwyrm/templates/landing/large-book.html:26 #: bookwyrm/templates/landing/small-book.html:18 @@ -905,57 +909,62 @@ msgstr "出生:" msgid "Died:" msgstr "逝世:" -#: bookwyrm/templates/author/author.html:66 +#: bookwyrm/templates/author/author.html:63 +msgid "Series:" +msgstr "系列:" + +#: bookwyrm/templates/author/author.html:78 +#: bookwyrm/templates/book/series.html:41 msgid "External links" msgstr "外部連結" -#: bookwyrm/templates/author/author.html:71 +#: bookwyrm/templates/author/author.html:83 msgid "Wikipedia" msgstr "維基百科" -#: bookwyrm/templates/author/author.html:79 +#: bookwyrm/templates/author/author.html:91 msgid "View on Wikidata" msgstr "" -#: bookwyrm/templates/author/author.html:87 +#: bookwyrm/templates/author/author.html:99 msgid "Website" msgstr "網站" -#: bookwyrm/templates/author/author.html:95 +#: bookwyrm/templates/author/author.html:107 msgid "View ISNI record" msgstr "查看 ISNI 記錄" -#: bookwyrm/templates/author/author.html:103 -#: bookwyrm/templates/book/book.html:183 +#: bookwyrm/templates/author/author.html:115 +#: bookwyrm/templates/book/book.html:199 msgid "View on ISFDB" msgstr "在 ISFDB 查看" -#: bookwyrm/templates/author/author.html:108 +#: bookwyrm/templates/author/author.html:120 #: bookwyrm/templates/author/sync_modal.html:5 -#: bookwyrm/templates/book/book.html:150 +#: bookwyrm/templates/book/book.html:166 #: bookwyrm/templates/book/sync_modal.html:5 msgid "Load data" msgstr "載入資料" -#: bookwyrm/templates/author/author.html:112 -#: bookwyrm/templates/book/book.html:154 +#: bookwyrm/templates/author/author.html:124 +#: bookwyrm/templates/book/book.html:170 msgid "View on OpenLibrary" msgstr "在 OpenLibrary 檢視" -#: bookwyrm/templates/author/author.html:127 -#: bookwyrm/templates/book/book.html:168 +#: bookwyrm/templates/author/author.html:139 +#: bookwyrm/templates/book/book.html:184 msgid "View on Inventaire" msgstr "在 Inventaire 檢視" -#: bookwyrm/templates/author/author.html:143 +#: bookwyrm/templates/author/author.html:155 msgid "View on LibraryThing" msgstr "在 LibraryThing 查看" -#: bookwyrm/templates/author/author.html:151 +#: bookwyrm/templates/author/author.html:163 msgid "View on Goodreads" msgstr "在 Goodreads 查看" -#: bookwyrm/templates/author/author.html:166 +#: bookwyrm/templates/author/author.html:178 #, python-format msgid "Books by %(name)s" msgstr "%(name)s 所著的書" @@ -992,8 +1001,8 @@ msgid "Name:" msgstr "名稱:" #: bookwyrm/templates/author/edit_author.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:91 -#: bookwyrm/templates/book/edit/edit_book_form.html:161 +#: bookwyrm/templates/book/edit/edit_book_form.html:68 +#: bookwyrm/templates/book/edit/edit_book_form.html:211 msgid "Separate multiple values with commas." msgstr "請用逗號(,)分隔多個值。" @@ -1030,7 +1039,8 @@ msgid "Openlibrary key:" msgstr "Openlibrary key:" #: bookwyrm/templates/author/edit_author.html:90 -#: bookwyrm/templates/book/edit/edit_book_form.html:336 +#: bookwyrm/templates/book/edit/edit_book_form.html:386 +#: bookwyrm/templates/book/edit/edit_series.html:54 msgid "Inventaire ID:" msgstr "Inventaire ID:" @@ -1039,7 +1049,7 @@ msgid "Librarything key:" msgstr "Librarything key:" #: bookwyrm/templates/author/edit_author.html:104 -#: bookwyrm/templates/book/edit/edit_book_form.html:345 +#: bookwyrm/templates/book/edit/edit_book_form.html:395 msgid "Goodreads key:" msgstr "Goodreads key:" @@ -1052,8 +1062,8 @@ msgid "ISNI:" msgstr "ISNI:" #: bookwyrm/templates/author/edit_author.html:128 -#: bookwyrm/templates/book/book.html:256 -#: bookwyrm/templates/book/edit/edit_book.html:150 +#: bookwyrm/templates/book/book.html:272 +#: bookwyrm/templates/book/edit/edit_book.html:186 #: 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 @@ -1065,7 +1075,7 @@ msgstr "ISNI:" #: 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/federation/settings.html:45 +#: bookwyrm/templates/settings/federation/settings.html:78 #: bookwyrm/templates/settings/registration.html:96 #: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/site.html:144 @@ -1077,10 +1087,10 @@ msgstr "儲存" #: bookwyrm/templates/author/edit_author.html:129 #: bookwyrm/templates/author/sync_modal.html:23 -#: bookwyrm/templates/book/book.html:257 +#: bookwyrm/templates/book/book.html:273 #: 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/edit/edit_book.html:188 +#: bookwyrm/templates/book/edit/edit_book.html:191 #: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/verification_modal.html:26 #: bookwyrm/templates/book/sync_modal.html:23 @@ -1090,7 +1100,7 @@ msgstr "儲存" #: 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/search/barcode_modal.html:41 #: bookwyrm/templates/settings/federation/instance.html:106 #: bookwyrm/templates/settings/files.html:193 #: bookwyrm/templates/settings/files.html:354 @@ -1107,7 +1117,8 @@ msgid "Loading data will connect to %(source_name)s and check f msgstr "" #: bookwyrm/templates/author/sync_modal.html:24 -#: bookwyrm/templates/book/edit/edit_book.html:137 +#: bookwyrm/templates/book/edit/edit_book.html:173 +#: bookwyrm/templates/book/edit/edit_series.html:84 #: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/landing/force_password_reset.html:94 @@ -1124,95 +1135,114 @@ msgstr "確認" msgid "Unable to connect to remote source." msgstr "無法連接到遠程數據源。" -#: bookwyrm/templates/book/book.html:81 bookwyrm/templates/book/book.html:82 +#: bookwyrm/templates/book/book.html:52 +#, python-format +msgid "This book might be part of the %(series)s series." +msgstr "" + +#: bookwyrm/templates/book/book.html:56 +msgid "Edit it to confirm." +msgstr "" + +#: bookwyrm/templates/book/book.html:69 +#, python-format +msgid "Book %(number)s in %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:75 +#, python-format +msgid "Part of %(title)s" +msgstr "" + +#: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" msgstr "編輯書目" -#: bookwyrm/templates/book/book.html:107 bookwyrm/templates/book/book.html:110 +#: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" msgstr "點擊添加封面" -#: bookwyrm/templates/book/book.html:116 +#: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" msgstr "載入封面失敗" -#: bookwyrm/templates/book/book.html:127 +#: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" msgstr "點擊放大" -#: bookwyrm/templates/book/book.html:190 +#: bookwyrm/templates/book/book.html:206 msgid "View on Finna" msgstr "" -#: bookwyrm/templates/book/book.html:205 +#: bookwyrm/templates/book/book.html:221 msgid "View on Libris" msgstr "" -#: bookwyrm/templates/book/book.html:229 +#: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "(%(review_count)s 則書評)" -#: bookwyrm/templates/book/book.html:245 +#: bookwyrm/templates/book/book.html:261 msgid "Add Description" msgstr "新增描述" -#: bookwyrm/templates/book/book.html:252 +#: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "描述:" -#: bookwyrm/templates/book/book.html:268 +#: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" msgstr[0] "%(count)s 版次" -#: bookwyrm/templates/book/book.html:282 +#: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" msgstr "此版本已在你的書架上:" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:313 #, 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:308 +#: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" msgstr "你的閱讀活動" -#: bookwyrm/templates/book/book.html:314 +#: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" msgstr "新增閱讀日期" -#: bookwyrm/templates/book/book.html:322 +#: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." msgstr "你還未閱讀這本書。" -#: bookwyrm/templates/book/book.html:348 +#: bookwyrm/templates/book/book.html:364 msgid "Your reviews" msgstr "你的書評" -#: bookwyrm/templates/book/book.html:354 +#: bookwyrm/templates/book/book.html:370 msgid "Your comments" msgstr "你的評論" -#: bookwyrm/templates/book/book.html:360 +#: bookwyrm/templates/book/book.html:376 msgid "Your quotes" msgstr "你的引用" -#: bookwyrm/templates/book/book.html:396 +#: bookwyrm/templates/book/book.html:412 msgid "Subjects" msgstr "主題" -#: bookwyrm/templates/book/book.html:408 +#: bookwyrm/templates/book/book.html:424 msgid "Places" msgstr "地點" -#: bookwyrm/templates/book/book.html:419 +#: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/user_books.html:102 @@ -1227,15 +1257,15 @@ msgstr "地點" msgid "Lists" msgstr "列表" -#: bookwyrm/templates/book/book.html:431 +#: bookwyrm/templates/book/book.html:447 msgid "Add to list" msgstr "新增到列表" -#: bookwyrm/templates/book/book.html:438 +#: bookwyrm/templates/book/book.html:454 msgid "Create new list..." msgstr "" -#: bookwyrm/templates/book/book.html:442 +#: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/list.html:255 @@ -1258,25 +1288,26 @@ msgid "Copied ISBN!" msgstr "已複製ISBN!" #: bookwyrm/templates/book/book_identifiers.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:354 +#: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" msgstr "OCLC 號:" #: bookwyrm/templates/book/book_identifiers.html:30 -#: bookwyrm/templates/book/edit/edit_book_form.html:363 +#: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" msgstr "ASIN:" #: bookwyrm/templates/book/book_identifiers.html:37 -#: bookwyrm/templates/book/edit/edit_book_form.html:372 +#: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" msgstr "Audible ASIN:" #: bookwyrm/templates/book/book_identifiers.html:44 -#: bookwyrm/templates/book/edit/edit_book_form.html:381 +#: bookwyrm/templates/book/edit/edit_book_form.html:431 +#: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" msgstr "ISFDB ID:" @@ -1287,12 +1318,12 @@ msgid "Goodreads:" msgstr "Goodreads:" #: bookwyrm/templates/book/book_identifiers.html:58 -#: bookwyrm/templates/book/edit/edit_book_form.html:390 +#: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:65 -#: bookwyrm/templates/book/edit/edit_book_form.html:399 +#: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" msgstr "" @@ -1301,12 +1332,12 @@ msgid "Add cover" msgstr "新增封面" #: bookwyrm/templates/book/cover_add_modal.html:17 -#: bookwyrm/templates/book/edit/edit_book_form.html:246 +#: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" msgstr "上載封面:" #: bookwyrm/templates/book/cover_add_modal.html:23 -#: bookwyrm/templates/book/edit/edit_book_form.html:252 +#: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" msgstr "" @@ -1371,15 +1402,32 @@ msgstr "這是一位新的作者" msgid "Creating a new author: %(name)s" msgstr "正在建立新的作者: %(name)s" -#: bookwyrm/templates/book/edit/edit_book.html:122 +#: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" msgstr "這是已存在的作品的另一個版本嗎?" -#: bookwyrm/templates/book/edit/edit_book.html:130 +#: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" msgstr "這是一個新的作品。" -#: bookwyrm/templates/book/edit/edit_book.html:139 +#: bookwyrm/templates/book/edit/edit_book.html:142 +msgid "Are you sure this is a new series? The following series have similar names and a matching author." +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:148 +msgid "Is this book part of one of these series?" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:160 +msgid "This is a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:165 +msgid "Creating a new series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book.html:175 +#: bookwyrm/templates/book/edit/edit_series.html:86 #: bookwyrm/templates/feed/status.html:17 #: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:68 @@ -1441,124 +1489,190 @@ msgstr "" msgid "Subtitle:" msgstr "副標題:" -#: bookwyrm/templates/book/edit/edit_book_form.html:66 -msgid "Series:" -msgstr "系列:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:76 -msgid "Series number:" -msgstr "系列編號:" - -#: bookwyrm/templates/book/edit/edit_book_form.html:87 +#: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" msgstr "語言:" -#: bookwyrm/templates/book/edit/edit_book_form.html:99 +#: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" msgstr "主旨:" -#: bookwyrm/templates/book/edit/edit_book_form.html:103 +#: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" msgstr "新增主旨" -#: bookwyrm/templates/book/edit/edit_book_form.html:121 +#: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" msgstr "移除主旨" -#: bookwyrm/templates/book/edit/edit_book_form.html:144 +#: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" msgstr "新增另一個主旨" -#: bookwyrm/templates/book/edit/edit_book_form.html:152 +#: bookwyrm/templates/book/edit/edit_book_form.html:130 +msgid "Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:138 +#: bookwyrm/templates/book/series.html:12 +#: bookwyrm/templates/book/series.html:13 +msgid "Edit Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:141 +msgid "To edit details of a series itself, click the series name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:150 +#: bookwyrm/templates/snippets/create_status/quotation.html:31 +msgid "Position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:164 +#, python-format +msgid "Remove this book from %(series_name)s" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:175 +msgid "Add Series" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:178 +msgid "Series name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:186 +#: bookwyrm/templates/book/edit/edit_series.html:75 +msgid "Series position:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:189 +msgid "This field was previously called \"Series number\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" msgstr "出版品" -#: bookwyrm/templates/book/edit/edit_book_form.html:157 +#: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" msgstr "出版社:" -#: bookwyrm/templates/book/edit/edit_book_form.html:169 +#: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" msgstr "初版時間:" -#: bookwyrm/templates/book/edit/edit_book_form.html:177 +#: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" msgstr "出版時間:" -#: bookwyrm/templates/book/edit/edit_book_form.html:188 +#: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" msgstr "作者" -#: bookwyrm/templates/book/edit/edit_book_form.html:199 +#: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" msgstr "" -#: bookwyrm/templates/book/edit/edit_book_form.html:202 +#: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" msgstr "%(name)s 的作者頁面" -#: bookwyrm/templates/book/edit/edit_book_form.html:210 +#: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" msgstr "新增作者:" -#: bookwyrm/templates/book/edit/edit_book_form.html:213 -#: bookwyrm/templates/book/edit/edit_book_form.html:216 +#: bookwyrm/templates/book/edit/edit_book_form.html:263 +#: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" msgstr "新增作者" -#: bookwyrm/templates/book/edit/edit_book_form.html:214 -#: bookwyrm/templates/book/edit/edit_book_form.html:217 +#: bookwyrm/templates/book/edit/edit_book_form.html:264 +#: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" msgstr "陳大文" -#: bookwyrm/templates/book/edit/edit_book_form.html:223 +#: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" msgstr "新增其他作者" -#: bookwyrm/templates/book/edit/edit_book_form.html:233 +#: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" msgstr "封面" -#: bookwyrm/templates/book/edit/edit_book_form.html:265 +#: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" msgstr "實體性質" -#: bookwyrm/templates/book/edit/edit_book_form.html:272 +#: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" msgstr "格式:" -#: bookwyrm/templates/book/edit/edit_book_form.html:282 +#: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" msgstr "裝訂詳情:" -#: bookwyrm/templates/book/edit/edit_book_form.html:293 +#: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" msgstr "頁數:" -#: bookwyrm/templates/book/edit/edit_book_form.html:304 +#: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" msgstr "書目標識號" -#: bookwyrm/templates/book/edit/edit_book_form.html:309 +#: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" msgstr "ISBN 13:" -#: bookwyrm/templates/book/edit/edit_book_form.html:318 +#: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" msgstr "ISBN 10:" -#: bookwyrm/templates/book/edit/edit_book_form.html:327 +#: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" msgstr "Openlibrary ID:" +#: bookwyrm/templates/book/edit/edit_series.html:9 +#, python-format +msgid "Edit \"%(title)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:20 +#, python-format +msgid "Edit \"%(name)s\"" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:30 +#: bookwyrm/templates/settings/schedules.html:22 +msgid "Name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:36 +#: bookwyrm/templates/book/series.html:29 +msgid "Alternative names" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:39 +#: bookwyrm/templates/book/edit/edit_series.html:42 +msgid "Add Alternative name:" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:48 +msgid "Add an Alternative name" +msgstr "" + +#: bookwyrm/templates/book/edit/edit_series.html:57 +msgid "Wikidata ID:" +msgstr "" + #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" @@ -1745,19 +1859,11 @@ msgstr "於 %(date)s 出版" msgid "rated it" msgstr "評價了" -#: bookwyrm/templates/book/series.html:11 -msgid "Series by" -msgstr "" - -#: bookwyrm/templates/book/series.html:28 +#: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" msgstr "" -#: 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." @@ -1802,7 +1908,7 @@ msgstr "" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 -#: bookwyrm/templates/settings/dashboard/dashboard.html:107 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #: bookwyrm/templates/snippets/report_modal.html:53 msgid "Submit" msgstr "提交" @@ -1863,7 +1969,7 @@ msgstr "你可以在任何時候從你的 使用者資料 #: bookwyrm/templates/directory/directory.html:29 #: bookwyrm/templates/directory/directory.html:31 -#: bookwyrm/templates/feed/goal_card.html:17 +#: bookwyrm/templates/feed/goal_card.html:19 #: bookwyrm/templates/feed/summary_card.html:12 #: bookwyrm/templates/feed/summary_card.html:14 #: bookwyrm/templates/snippets/announcement.html:31 @@ -1955,21 +2061,22 @@ msgid "%(username)s started reading %(username)s rated %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:27 +#: bookwyrm/templates/discover/card-header.html:28 #, python-format msgid "%(username)s reviewed %(book_title)s" msgstr "%(username)s 已評論 %(book_title)s" -#: bookwyrm/templates/discover/card-header.html:31 +#: bookwyrm/templates/discover/card-header.html:37 #, python-format msgid "%(username)s commented on %(book_title)s" msgstr "" -#: bookwyrm/templates/discover/card-header.html:35 +#: bookwyrm/templates/discover/card-header.html:41 #, python-format msgid "%(username)s quoted %(book_title)s" msgstr "" @@ -2155,14 +2262,14 @@ msgstr "現在還沒有任何活動!嘗試著從關注一個使用者開始吧 msgid "Alternatively, you can try enabling more status types" msgstr "" -#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/goal_card.html:8 #: 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 +#: bookwyrm/templates/feed/goal_card.html:20 #, python-format msgid "You can set or change your reading goal any time from your profile page" msgstr "你可以在任何時候從你的使用者資料頁面 中設定或改變你的閱讀目標" @@ -2450,6 +2557,10 @@ msgstr "" msgid "Edit group" msgstr "" +#: bookwyrm/templates/groups/members.html:6 +msgid "Group Members" +msgstr "" + #: bookwyrm/templates/groups/members.html:11 msgid "Search to add a user" msgstr "" @@ -3683,6 +3794,7 @@ msgid "Search for a book, author, user, or list" msgstr "" #: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/search/barcode_modal.html:5 msgid "Scan Barcode" msgstr "" @@ -4290,7 +4402,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:62 +#: bookwyrm/templates/snippets/status/content_status.html:64 msgid "Content warning" msgstr "" @@ -4756,7 +4868,7 @@ msgstr "" 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 +#: bookwyrm/templates/preferences/export.html:19 msgid "Download file" msgstr "" @@ -4949,9 +5061,8 @@ msgid "You are deleting this readthrough and its %(count)s associated progress u msgstr "你正要刪除這篇閱讀經過以及與之相關的 %(count)s 次進度更新。" #: bookwyrm/templates/readthrough/readthrough.html:6 -#: bookwyrm/templates/readthrough/readthrough_modal.html:8 #, python-format -msgid "Update read dates for \"%(title)s\"" +msgid "Update read dates for \"%(title)s\"" msgstr "" #: bookwyrm/templates/readthrough/readthrough_form.html:10 @@ -5006,6 +5117,11 @@ msgstr "編輯閱讀日期" msgid "Delete these read dates" msgstr "刪除這些閱讀日期" +#: bookwyrm/templates/readthrough/readthrough_modal.html:8 +#, python-format +msgid "Update read dates for \"%(title)s\"" +msgstr "" + #: bookwyrm/templates/readthrough/readthrough_modal.html:12 #, python-format msgid "Add read dates for \"%(title)s\"" @@ -5016,39 +5132,33 @@ msgstr "" msgid "Report" msgstr "舉報" -#: bookwyrm/templates/search/barcode_modal.html:5 -msgid "\n" -" Scan Barcode\n" -" " -msgstr "" - -#: bookwyrm/templates/search/barcode_modal.html:21 +#: bookwyrm/templates/search/barcode_modal.html:19 msgid "Requesting camera..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:22 +#: bookwyrm/templates/search/barcode_modal.html:20 msgid "Grant access to the camera to scan a book's barcode." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:27 +#: bookwyrm/templates/search/barcode_modal.html:25 msgid "Could not access camera" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:31 +#: bookwyrm/templates/search/barcode_modal.html:29 msgctxt "barcode scanner" msgid "Scanning..." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:32 +#: bookwyrm/templates/search/barcode_modal.html:30 msgid "Align your book's barcode with the camera." msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:36 +#: bookwyrm/templates/search/barcode_modal.html:34 msgctxt "barcode scanner" msgid "ISBN scanned" msgstr "" -#: bookwyrm/templates/search/barcode_modal.html:37 +#: bookwyrm/templates/search/barcode_modal.html:35 msgctxt "followed by ISBN" msgid "Searching for book:" msgstr "" @@ -5147,13 +5257,13 @@ msgstr "否" #: bookwyrm/templates/settings/announcements/announcement.html:57 #: bookwyrm/templates/settings/announcements/edit_announcement.html:79 -#: bookwyrm/templates/settings/dashboard/dashboard.html:85 +#: bookwyrm/templates/settings/dashboard/dashboard.html:84 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:91 +#: bookwyrm/templates/settings/dashboard/dashboard.html:90 msgid "End date:" msgstr "結束日期:" @@ -5527,7 +5637,7 @@ msgid "Dashboard" msgstr "" #: bookwyrm/templates/settings/dashboard/dashboard.html:15 -#: bookwyrm/templates/settings/dashboard/dashboard.html:114 +#: bookwyrm/templates/settings/dashboard/dashboard.html:113 msgid "Total users" msgstr "" @@ -5541,31 +5651,31 @@ msgstr "" msgid "Works" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:79 +#: bookwyrm/templates/settings/dashboard/dashboard.html:78 msgid "Instance Activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:97 +#: bookwyrm/templates/settings/dashboard/dashboard.html:96 msgid "Interval:" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:101 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "Days" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:102 +#: bookwyrm/templates/settings/dashboard/dashboard.html:101 msgid "Weeks" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:120 +#: bookwyrm/templates/settings/dashboard/dashboard.html:119 msgid "User signup activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:126 +#: bookwyrm/templates/settings/dashboard/dashboard.html:125 msgid "Status activity" msgstr "" -#: bookwyrm/templates/settings/dashboard/dashboard.html:132 +#: bookwyrm/templates/settings/dashboard/dashboard.html:131 msgid "Works created" msgstr "" @@ -5873,13 +5983,49 @@ msgid "Unable to save settings" msgstr "" #: bookwyrm/templates/settings/federation/settings.html:37 +msgid "Require signed GET requests" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:38 +msgid "Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:42 +msgid "Prevents anonymous requests from federated instances. Roughly equivalent to Mastodon's 'secure mode' or 'AUTHORIZED_FETCH'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:48 +msgid "Prevent unauthenticated views" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:51 +msgid "Prevents anonymous users from seeing most pages. To block JSON requests as well, enable 'Require signed GET requests'" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:57 msgid "Disable federation" msgstr "" -#: bookwyrm/templates/settings/federation/settings.html:40 +#: bookwyrm/templates/settings/federation/settings.html:58 +msgid "Caution" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:61 msgid "Prevents your instance from interacting with other federated services. Existing data from other instances will still be present." msgstr "" +#: bookwyrm/templates/settings/federation/settings.html:67 +msgid "Block incoming search" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:68 +msgid "Not Recommended" +msgstr "" + +#: bookwyrm/templates/settings/federation/settings.html:71 +msgid "Prevents other servers from searching your instance. It is strongly recommended you do NOT enable this setting." +msgstr "" + #: bookwyrm/templates/settings/files.html:7 #: bookwyrm/templates/settings/files.html:11 msgid "Files maintenance" @@ -6590,10 +6736,6 @@ msgstr "" msgid "Tasks" msgstr "" -#: bookwyrm/templates/settings/schedules.html:22 -msgid "Name" -msgstr "" - #: bookwyrm/templates/settings/schedules.html:25 msgid "Celery task" msgstr "" @@ -7251,10 +7393,6 @@ msgstr "引用:" msgid "An excerpt from '%(book_title)s'" msgstr "" -#: bookwyrm/templates/snippets/create_status/quotation.html:31 -msgid "Position:" -msgstr "" - #: bookwyrm/templates/snippets/create_status/quotation.html:44 msgid "On page:" msgstr "" @@ -7267,12 +7405,12 @@ msgstr "" msgid "to" msgstr "" -#: bookwyrm/templates/snippets/create_status/review.html:24 +#: bookwyrm/templates/snippets/create_status/review.html:23 #, python-format msgid "Your review of '%(book_title)s'" msgstr "你對《%(book_title)s》的書評" -#: bookwyrm/templates/snippets/create_status/review.html:39 +#: bookwyrm/templates/snippets/create_status/review.html:38 msgid "Review:" msgstr "書評:" @@ -7369,6 +7507,12 @@ msgid "rated %(title)s: %(display_rating)s sta msgid_plural "rated %(title)s: %(display_rating)s stars" msgstr[0] "" +#: bookwyrm/templates/snippets/generated_status/rating_pure_name.html:3 +#, python-format +msgid "Rated \"%(book_title)s\" %(display_rating)s star %(review_title)s" +msgid_plural "Rated \"%(book_title)s\" %(display_rating)s stars %(review_title)s" +msgstr[0] "" + #: 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" @@ -7580,35 +7724,35 @@ msgstr "完成閱讀" msgid "Show rating" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:69 +#: bookwyrm/templates/snippets/status/content_status.html:71 msgid "Show status" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "(Page %(page)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:91 +#: bookwyrm/templates/snippets/status/content_status.html:93 #, python-format msgid "%(endpage)s" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid "(%(percent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:93 +#: bookwyrm/templates/snippets/status/content_status.html:95 #, python-format msgid " - %(endpercent)s%%" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:116 +#: bookwyrm/templates/snippets/status/content_status.html:118 msgid "Open image in new window" msgstr "在新視窗中開啟圖片" -#: bookwyrm/templates/snippets/status/content_status.html:137 +#: bookwyrm/templates/snippets/status/content_status.html:139 msgid "Hide status" msgstr "" @@ -7667,16 +7811,22 @@ msgstr "" msgid "started reading %(book)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:8 +#: bookwyrm/templates/snippets/status/headers/review.html:10 +#: bookwyrm/templates/snippets/status/headers/review.html:26 #, python-format msgid "reviewed %(book)s by %(author_name)s" msgstr "" -#: bookwyrm/templates/snippets/status/headers/review.html:15 +#: bookwyrm/templates/snippets/status/headers/review.html:17 #, python-format msgid "reviewed %(book)s" msgstr "" +#: bookwyrm/templates/snippets/status/headers/review.html:33 +#, python-format +msgid "rated %(book)s" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/stopped_reading.html:10 #, python-format msgid "stopped reading %(book)s by %(author_name)s" @@ -7952,15 +8102,23 @@ msgid "%(num)d book - by %(user)s" msgid_plural "%(num)d books - by %(user)s" msgstr[0] "" -#: bookwyrm/templatetags/utilities.py:50 +#: bookwyrm/templatetags/utilities.py:52 #, python-format msgid "%(title)s: %(subtitle)s" msgstr "" -#: bookwyrm/templatetags/utilities.py:133 +#: bookwyrm/templatetags/utilities.py:153 msgid "a new user account" msgstr "" +#: bookwyrm/views/books/edit_book.py:80 bookwyrm/views/books/edit_book.py:484 +msgid "There is another book in the series with the same value" +msgstr "" + +#: bookwyrm/views/books/series.py:95 +msgid "Series position must be unique for each book" +msgstr "" + #: bookwyrm/views/updates.py:46 #, python-format msgid "Load %(count)d unread status" From e6c097843e66689b55e95b8a584e8b68ab010e10 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Tue, 9 Jun 2026 07:32:36 -0700 Subject: [PATCH 744/962] New translations django.po (Indonesian) [ci skip] --- locale/id_ID/LC_MESSAGES/django.po | 102 ++++++++++++++--------------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/locale/id_ID/LC_MESSAGES/django.po b/locale/id_ID/LC_MESSAGES/django.po index 527639dff4..c4026fa92f 100644 --- a/locale/id_ID/LC_MESSAGES/django.po +++ b/locale/id_ID/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-05-23 18:40+0000\n" -"PO-Revision-Date: 2026-06-07 05:49\n" +"PO-Revision-Date: 2026-06-09 14:32\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Indonesian\n" "Language: id\n" @@ -1147,100 +1147,100 @@ msgstr "Edit ini untuk mengonfirmasi." #: bookwyrm/templates/book/book.html:69 #, python-format msgid "Book %(number)s in %(title)s" -msgstr "" +msgstr "Buku %(number)s di %(title)s" #: bookwyrm/templates/book/book.html:75 #, python-format msgid "Part of %(title)s" -msgstr "" +msgstr "Bagian dari %(title)s" #: bookwyrm/templates/book/book.html:97 bookwyrm/templates/book/book.html:98 msgid "Edit Book" -msgstr "" +msgstr "Edit Buku" #: bookwyrm/templates/book/book.html:123 bookwyrm/templates/book/book.html:126 msgid "Click to add cover" -msgstr "" +msgstr "Klik untuk menambahkan kover" #: bookwyrm/templates/book/book.html:132 msgid "Failed to load cover" -msgstr "" +msgstr "Gagal memuat kover" #: bookwyrm/templates/book/book.html:143 msgid "Click to enlarge" -msgstr "" +msgstr "Klik untuk membesarkan" #: bookwyrm/templates/book/book.html:206 msgid "View on Finna" -msgstr "" +msgstr "Lihat di Finna" #: bookwyrm/templates/book/book.html:221 msgid "View on Libris" -msgstr "" +msgstr "Lihat di Libris" #: bookwyrm/templates/book/book.html:245 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" -msgstr[0] "" +msgstr[0] "(%(review_count)s ulasan)" #: bookwyrm/templates/book/book.html:261 msgid "Add Description" -msgstr "" +msgstr "Tambahkan Deskripsi" #: bookwyrm/templates/book/book.html:268 #: bookwyrm/templates/book/edit/edit_book_form.html:55 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 msgid "Description:" -msgstr "" +msgstr "Deskripsi:" #: bookwyrm/templates/book/book.html:284 #, python-format msgid "%(count)s edition" msgid_plural "%(count)s editions" -msgstr[0] "" +msgstr[0] "%(count)s edisi" #: bookwyrm/templates/book/book.html:298 msgid "You have shelved this edition in:" -msgstr "" +msgstr "Anda sudah menyimpan edisi ini di:" #: bookwyrm/templates/book/book.html:313 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." -msgstr "" +msgstr "Edisi berbeda dari buku ini di rak %(shelf_name)s." #: bookwyrm/templates/book/book.html:324 msgid "Your reading activity" -msgstr "" +msgstr "Aktivitas membaca Anda" #: bookwyrm/templates/book/book.html:330 #: bookwyrm/templates/guided_tour/book.html:56 msgid "Add read dates" -msgstr "" +msgstr "Tambahkan tanggal baca" #: bookwyrm/templates/book/book.html:338 msgid "You don't have any reading activity for this book." -msgstr "" +msgstr "Anda tidak memiliki aktivitas membaca untuk buku ini." #: bookwyrm/templates/book/book.html:364 msgid "Your reviews" -msgstr "" +msgstr "Ulasan Anda" #: bookwyrm/templates/book/book.html:370 msgid "Your comments" -msgstr "" +msgstr "Komentar Anda" #: bookwyrm/templates/book/book.html:376 msgid "Your quotes" -msgstr "" +msgstr "Kutipan Anda" #: bookwyrm/templates/book/book.html:412 msgid "Subjects" -msgstr "" +msgstr "Subjek" #: bookwyrm/templates/book/book.html:424 msgid "Places" -msgstr "" +msgstr "Tempat" #: bookwyrm/templates/book/book.html:435 #: bookwyrm/templates/groups/group.html:19 @@ -1255,15 +1255,15 @@ msgstr "" #: bookwyrm/templates/settings/celery.html:77 #: bookwyrm/templates/user/layout.html:101 bookwyrm/templates/user/lists.html:6 msgid "Lists" -msgstr "" +msgstr "Daftar" #: bookwyrm/templates/book/book.html:447 msgid "Add to list" -msgstr "" +msgstr "Tambahkan ke daftar" #: bookwyrm/templates/book/book.html:454 msgid "Create new list..." -msgstr "" +msgstr "Buat daftar baru..." #: bookwyrm/templates/book/book.html:458 #: bookwyrm/templates/book/cover_add_modal.html:32 @@ -1272,78 +1272,78 @@ msgstr "" #: bookwyrm/templates/settings/email_blocklist/domain_form.html:24 #: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:32 msgid "Add" -msgstr "" +msgstr "Tambah" #: bookwyrm/templates/book/book_identifiers.html:8 msgid "ISBN:" -msgstr "" +msgstr "ISBN:" #: bookwyrm/templates/book/book_identifiers.html:12 #: bookwyrm/templates/book/book_identifiers.html:13 msgid "Copy ISBN" -msgstr "" +msgstr "Salin ISBN" #: bookwyrm/templates/book/book_identifiers.html:16 msgid "Copied ISBN!" -msgstr "" +msgstr "ISBN disalin!" #: bookwyrm/templates/book/book_identifiers.html:23 #: bookwyrm/templates/book/edit/edit_book_form.html:404 #: bookwyrm/templates/rss/edition.html:6 msgid "OCLC Number:" -msgstr "" +msgstr "Nomor OCLC:" #: bookwyrm/templates/book/book_identifiers.html:30 #: bookwyrm/templates/book/edit/edit_book_form.html:413 #: bookwyrm/templates/rss/edition.html:7 msgid "ASIN:" -msgstr "" +msgstr "ASIN:" #: bookwyrm/templates/book/book_identifiers.html:37 #: bookwyrm/templates/book/edit/edit_book_form.html:422 #: bookwyrm/templates/rss/edition.html:8 msgid "Audible ASIN:" -msgstr "" +msgstr "Audible ASIN:" #: bookwyrm/templates/book/book_identifiers.html:44 #: bookwyrm/templates/book/edit/edit_book_form.html:431 #: bookwyrm/templates/book/edit/edit_series.html:60 #: bookwyrm/templates/rss/edition.html:9 msgid "ISFDB ID:" -msgstr "" +msgstr "ISFDB ID:" #: bookwyrm/templates/book/book_identifiers.html:51 #: bookwyrm/templates/rss/edition.html:10 msgid "Goodreads:" -msgstr "" +msgstr "Goodreads:" #: bookwyrm/templates/book/book_identifiers.html:58 #: bookwyrm/templates/book/edit/edit_book_form.html:440 msgid "Finna ID:" -msgstr "" +msgstr "Finna ID:" #: bookwyrm/templates/book/book_identifiers.html:65 #: bookwyrm/templates/book/edit/edit_book_form.html:449 msgid "Libris ID:" -msgstr "" +msgstr "Libris ID:" #: bookwyrm/templates/book/cover_add_modal.html:5 msgid "Add cover" -msgstr "" +msgstr "Tambahkan kover" #: bookwyrm/templates/book/cover_add_modal.html:17 #: bookwyrm/templates/book/edit/edit_book_form.html:296 msgid "Upload cover:" -msgstr "" +msgstr "Unggah kover:" #: bookwyrm/templates/book/cover_add_modal.html:23 #: bookwyrm/templates/book/edit/edit_book_form.html:302 msgid "Load cover from URL:" -msgstr "" +msgstr "Muat kover dari URL:" #: bookwyrm/templates/book/cover_show_modal.html:6 msgid "Book cover preview" -msgstr "" +msgstr "Pratinjau kover buku" #: bookwyrm/templates/book/cover_show_modal.html:11 #: bookwyrm/templates/components/inline_form.html:8 @@ -1353,49 +1353,49 @@ msgstr "" #: bookwyrm/templates/get_started/layout.html:27 #: bookwyrm/templates/get_started/layout.html:60 msgid "Close" -msgstr "" +msgstr "Tutup" #: bookwyrm/templates/book/edit/edit_book.html:8 #: bookwyrm/templates/book/edit/edit_book.html:18 #, python-format msgid "Edit \"%(book_title)s\"" -msgstr "" +msgstr "Edit \"%(book_title)s\"" #: bookwyrm/templates/book/edit/edit_book.html:10 #: bookwyrm/templates/book/edit/edit_book.html:20 msgid "Add Book" -msgstr "" +msgstr "Tambah Buku" #: bookwyrm/templates/book/edit/edit_book.html:43 msgid "Failed to save book, see errors below for more information." -msgstr "" +msgstr "Gagal menyimpan buku, lihat eror di bawah ini untuk informasi lebih banyak." #: bookwyrm/templates/book/edit/edit_book.html:70 msgid "Confirm Book Info" -msgstr "" +msgstr "Konfirmasi Info Buku" #: bookwyrm/templates/book/edit/edit_book.html:78 #, python-format msgid "Is \"%(name)s\" one of these authors?" -msgstr "" +msgstr "Benarkah \"%(name)s\" salah satu penulisnya?" #: bookwyrm/templates/book/edit/edit_book.html:89 #, python-format msgid "Author of %(book_title)s" -msgstr "" +msgstr "Penulis %(book_title)s" #: bookwyrm/templates/book/edit/edit_book.html:93 #, python-format msgid "Author of %(alt_title)s" -msgstr "" +msgstr "Penulis %(alt_title)s" #: bookwyrm/templates/book/edit/edit_book.html:95 msgid "Find more information at isni.org" -msgstr "" +msgstr "Temukan lebih banyak informasi di isni.org" #: bookwyrm/templates/book/edit/edit_book.html:105 msgid "This is a new author" -msgstr "" +msgstr "Ini adalah penulis baru" #: bookwyrm/templates/book/edit/edit_book.html:115 #, python-format From 53d926f469b4491d161812f8518930ea90388db0 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Tue, 9 Jun 2026 09:38:31 -0700 Subject: [PATCH 745/962] Fixes migration chain for author dates --- ...3_author_born_precision_author_died_precision_and_more.py} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename bookwyrm/migrations/{0232_author_born_precision_author_died_precision_and_more.py => 0233_author_born_precision_author_died_precision_and_more.py} (89%) diff --git a/bookwyrm/migrations/0232_author_born_precision_author_died_precision_and_more.py b/bookwyrm/migrations/0233_author_born_precision_author_died_precision_and_more.py similarity index 89% rename from bookwyrm/migrations/0232_author_born_precision_author_died_precision_and_more.py rename to bookwyrm/migrations/0233_author_born_precision_author_died_precision_and_more.py index e7c986dd17..b03016338d 100644 --- a/bookwyrm/migrations/0232_author_born_precision_author_died_precision_and_more.py +++ b/bookwyrm/migrations/0233_author_born_precision_author_died_precision_and_more.py @@ -1,4 +1,4 @@ -# Generated by Django 5.2.14 on 2026-06-06 19:42 +# Generated by Django 5.2.14 on 2026-06-09 16:38 import bookwyrm.models.fields from django.db import migrations, models @@ -7,7 +7,7 @@ class Migration(migrations.Migration): dependencies = [ - ('bookwyrm', '0231_sitesettings_block_incoming_search_and_more'), + ('bookwyrm', '0232_user_readwise_api_key'), ] operations = [ From 157c17bd7f35d8c11fc9da8cccf64ecb7a7f2a52 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Tue, 9 Jun 2026 09:49:45 -0700 Subject: [PATCH 746/962] Re-orders migration files for list item raw notes --- ...{0230_listitem_raw_notes.py => 0234_listitem_raw_notes.py} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename bookwyrm/migrations/{0230_listitem_raw_notes.py => 0234_listitem_raw_notes.py} (70%) diff --git a/bookwyrm/migrations/0230_listitem_raw_notes.py b/bookwyrm/migrations/0234_listitem_raw_notes.py similarity index 70% rename from bookwyrm/migrations/0230_listitem_raw_notes.py rename to bookwyrm/migrations/0234_listitem_raw_notes.py index 1175588815..d878beeb20 100644 --- a/bookwyrm/migrations/0230_listitem_raw_notes.py +++ b/bookwyrm/migrations/0234_listitem_raw_notes.py @@ -1,4 +1,4 @@ -# Generated by Django 5.2.14 on 2026-05-22 19:24 +# Generated by Django 5.2.14 on 2026-06-09 16:49 from django.db import migrations, models @@ -6,7 +6,7 @@ class Migration(migrations.Migration): dependencies = [ - ('bookwyrm', '0229_series_mergedseries_seriesbook'), + ('bookwyrm', '0233_author_born_precision_author_died_precision_and_more'), ] operations = [ From c7022076649256036f246bda9a2bd065e5a0093a Mon Sep 17 00:00:00 2001 From: diaxoaine <42137630+diaxoaine@users.noreply.github.com> Date: Wed, 10 Jun 2026 19:40:52 +0700 Subject: [PATCH 747/962] Fix test failures --- bookwyrm/tests/importers/test_importer.py | 11 +++++++++++ bookwyrm/tests/models/test_shelf_model.py | 11 +++++++++++ bookwyrm/tests/models/test_user_model.py | 12 ++++++++++++ bookwyrm/tests/views/books/test_links.py | 10 ++++++++++ 4 files changed, 44 insertions(+) diff --git a/bookwyrm/tests/importers/test_importer.py b/bookwyrm/tests/importers/test_importer.py index 4e3386b99b..08a1a3e22d 100644 --- a/bookwyrm/tests/importers/test_importer.py +++ b/bookwyrm/tests/importers/test_importer.py @@ -48,6 +48,17 @@ def setUpTestData(cls): cls.local_user = models.User.objects.create_user( "mouse", "mouse@mouse.mouse", "password", local=True ) + with patch("bookwyrm.models.user.set_remote_server.delay"): + cls.remote_user = models.User.objects.create_user( + "rat", + "rat@rat.com", + "ratword", + local=False, + remote_id="https://example.com/users/rat", + inbox="https://example.com/users/rat/inbox", + outbox="https://example.com/users/rat/outbox", + ) + cls.local_user.followers.add(cls.remote_user) work = models.Work.objects.create(title="Test Work") cls.book = models.Edition.objects.create( title="Example Edition", diff --git a/bookwyrm/tests/models/test_shelf_model.py b/bookwyrm/tests/models/test_shelf_model.py index fe75af3f7f..04b0b88990 100644 --- a/bookwyrm/tests/models/test_shelf_model.py +++ b/bookwyrm/tests/models/test_shelf_model.py @@ -26,6 +26,17 @@ def setUpTestData(cls): cls.local_user = models.User.objects.create_user( "mouse", "mouse@mouse.mouse", "mouseword", local=True, localname="mouse" ) + with patch("bookwyrm.models.user.set_remote_server.delay"): + cls.remote_user = models.User.objects.create_user( + "rat", + "rat@rat.com", + "ratword", + local=False, + remote_id="https://example.com/users/rat", + inbox="https://example.com/users/rat/inbox", + outbox="https://example.com/users/rat/outbox", + ) + cls.local_user.followers.add(cls.remote_user) work = models.Work.objects.create(title="Test Work") cls.book = models.Edition.objects.create(title="test book", parent_work=work) diff --git a/bookwyrm/tests/models/test_user_model.py b/bookwyrm/tests/models/test_user_model.py index 26508735f0..0cbd774f73 100644 --- a/bookwyrm/tests/models/test_user_model.py +++ b/bookwyrm/tests/models/test_user_model.py @@ -40,6 +40,18 @@ def setUpTestData(cls): name="hi", bookwyrm_user=False, ) + with patch("bookwyrm.models.user.set_remote_server.delay"): + cls.remote_user = models.User.objects.create_user( + "badger", + "badger@badger.badger", + "badgerword", + local=False, + remote_id="https://example.com/users/badger", + inbox="https://example.com/users/badger/inbox", + outbox="https://example.com/users/badger/outbox", + bookwyrm_user=False, + ) + cls.user.followers.add(cls.remote_user) initdb.init_groups() initdb.init_permissions() diff --git a/bookwyrm/tests/views/books/test_links.py b/bookwyrm/tests/views/books/test_links.py index e92345db8e..8cb78a05bd 100644 --- a/bookwyrm/tests/views/books/test_links.py +++ b/bookwyrm/tests/views/books/test_links.py @@ -31,6 +31,16 @@ def setUpTestData(cls): localname="mouse", remote_id="https://example.com/users/mouse", ) + with patch("bookwyrm.models.user.set_remote_server.delay"): + cls.remote_user = models.User.objects.create_user( + "rat", + "rat@rat.com", + "ratword", + local=False, + remote_id="https://example.com/users/rat", + inbox="https://example.com/users/rat/inbox", + outbox="https://example.com/users/rat/outbox", + ) group = Group.objects.create(name="editor") group.permissions.add( Permission.objects.create( From e877a5a61df217b66591a1cbd81e0f82ac7e4562 Mon Sep 17 00:00:00 2001 From: diaxoaine <42137630+diaxoaine@users.noreply.github.com> Date: Wed, 10 Jun 2026 21:07:44 +0700 Subject: [PATCH 748/962] Fix some tests by patching the first broadcast call --- bookwyrm/tests/importers/test_importer.py | 13 +-------- bookwyrm/tests/models/test_shelf_model.py | 28 ++++++-------------- bookwyrm/tests/models/test_user_model.py | 18 ++----------- bookwyrm/tests/views/admin/test_reports.py | 5 ++-- bookwyrm/tests/views/books/test_book.py | 4 +-- bookwyrm/tests/views/books/test_edit_book.py | 2 +- bookwyrm/tests/views/books/test_links.py | 15 ++--------- bookwyrm/tests/views/lists/test_list.py | 20 +++++++------- 8 files changed, 28 insertions(+), 77 deletions(-) diff --git a/bookwyrm/tests/importers/test_importer.py b/bookwyrm/tests/importers/test_importer.py index 08a1a3e22d..8c97d34249 100644 --- a/bookwyrm/tests/importers/test_importer.py +++ b/bookwyrm/tests/importers/test_importer.py @@ -48,17 +48,6 @@ def setUpTestData(cls): cls.local_user = models.User.objects.create_user( "mouse", "mouse@mouse.mouse", "password", local=True ) - with patch("bookwyrm.models.user.set_remote_server.delay"): - cls.remote_user = models.User.objects.create_user( - "rat", - "rat@rat.com", - "ratword", - local=False, - remote_id="https://example.com/users/rat", - inbox="https://example.com/users/rat/inbox", - outbox="https://example.com/users/rat/outbox", - ) - cls.local_user.followers.add(cls.remote_user) work = models.Work.objects.create(title="Test Work") cls.book = models.Edition.objects.create( title="Example Edition", @@ -164,7 +153,7 @@ def test_import_item_task(self, *_): resolve.return_value = self.book with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + "bookwyrm.models.activitypub_mixin.ActivitypubMixin.broadcast" ) as mock: import_item_task(import_item.id) kwargs = mock.call_args.kwargs diff --git a/bookwyrm/tests/models/test_shelf_model.py b/bookwyrm/tests/models/test_shelf_model.py index 04b0b88990..18a5d49d53 100644 --- a/bookwyrm/tests/models/test_shelf_model.py +++ b/bookwyrm/tests/models/test_shelf_model.py @@ -1,6 +1,5 @@ """testing models""" -import json from unittest.mock import patch from django.test import TestCase @@ -26,17 +25,6 @@ def setUpTestData(cls): cls.local_user = models.User.objects.create_user( "mouse", "mouse@mouse.mouse", "mouseword", local=True, localname="mouse" ) - with patch("bookwyrm.models.user.set_remote_server.delay"): - cls.remote_user = models.User.objects.create_user( - "rat", - "rat@rat.com", - "ratword", - local=False, - remote_id="https://example.com/users/rat", - inbox="https://example.com/users/rat/inbox", - outbox="https://example.com/users/rat/outbox", - ) - cls.local_user.followers.add(cls.remote_user) work = models.Work.objects.create(title="Test Work") cls.book = models.Edition.objects.create(title="test book", parent_work=work) @@ -67,22 +55,22 @@ def test_create_update_shelf(self, *_): """create and broadcast shelf creation""" with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + "bookwyrm.models.activitypub_mixin.ActivitypubMixin.broadcast" ) as mock: shelf = models.Shelf.objects.create( name="Test Shelf", identifier="test-shelf", user=self.local_user ) - activity = json.loads(mock.call_args[1]["args"][1]) + activity = mock.call_args[0][0] self.assertEqual(activity["type"], "Create") self.assertEqual(activity["actor"], self.local_user.remote_id) self.assertEqual(activity["object"]["name"], "Test Shelf") shelf.name = "arthur russel" with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + "bookwyrm.models.activitypub_mixin.ActivitypubMixin.broadcast" ) as mock: shelf.save() - activity = json.loads(mock.call_args[1]["args"][1]) + activity = mock.call_args[0][0] self.assertEqual(activity["type"], "Update") self.assertEqual(activity["actor"], self.local_user.remote_id) self.assertEqual(activity["object"]["name"], "arthur russel") @@ -96,13 +84,13 @@ def test_shelve(self, *_): ) with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + "bookwyrm.models.activitypub_mixin.ActivitypubMixin.broadcast" ) as mock: shelf_book = models.ShelfBook.objects.create( shelf=shelf, user=self.local_user, book=self.book ) self.assertEqual(mock.call_count, 1) - activity = json.loads(mock.call_args[1]["args"][1]) + activity = mock.call_args[0][0] self.assertEqual(activity["type"], "Add") self.assertEqual(activity["actor"], self.local_user.remote_id) self.assertEqual(activity["object"]["id"], shelf_book.remote_id) @@ -110,11 +98,11 @@ def test_shelve(self, *_): self.assertEqual(shelf.books.first(), self.book) with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + "bookwyrm.models.activitypub_mixin.ActivitypubMixin.broadcast" ) as mock: shelf_book.delete() self.assertEqual(mock.call_count, 1) - activity = json.loads(mock.call_args[1]["args"][1]) + activity = mock.call_args[0][0] self.assertEqual(activity["type"], "Remove") self.assertEqual(activity["actor"], self.local_user.remote_id) self.assertEqual(activity["object"]["id"], shelf_book.remote_id) diff --git a/bookwyrm/tests/models/test_user_model.py b/bookwyrm/tests/models/test_user_model.py index 0cbd774f73..22b9780695 100644 --- a/bookwyrm/tests/models/test_user_model.py +++ b/bookwyrm/tests/models/test_user_model.py @@ -1,7 +1,5 @@ """testing models""" -import json - from unittest.mock import patch from django.contrib.auth.models import Group from django.db import IntegrityError @@ -40,18 +38,6 @@ def setUpTestData(cls): name="hi", bookwyrm_user=False, ) - with patch("bookwyrm.models.user.set_remote_server.delay"): - cls.remote_user = models.User.objects.create_user( - "badger", - "badger@badger.badger", - "badgerword", - local=False, - remote_id="https://example.com/users/badger", - inbox="https://example.com/users/badger/inbox", - outbox="https://example.com/users/badger/outbox", - bookwyrm_user=False, - ) - cls.user.followers.add(cls.remote_user) initdb.init_groups() initdb.init_permissions() @@ -245,7 +231,7 @@ def test_delete_user(self, _): self.assertEqual(self.user.email, "mouse@mouse.mouse") with ( patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + "bookwyrm.models.activitypub_mixin.ActivitypubMixin.broadcast" ) as broadcast_mock, patch( "bookwyrm.models.user.User.erase_user_statuses" @@ -257,7 +243,7 @@ def test_delete_user(self, _): # make sure the deletion is broadcast self.assertEqual(broadcast_mock.call_count, 1) - activity = json.loads(broadcast_mock.call_args[1]["args"][1]) + activity = broadcast_mock.call_args[0][0] self.assertEqual(activity["type"], "Delete") self.assertEqual(activity["object"], self.user.remote_id) diff --git a/bookwyrm/tests/views/admin/test_reports.py b/bookwyrm/tests/views/admin/test_reports.py index 6c91f40483..ebde4d6469 100644 --- a/bookwyrm/tests/views/admin/test_reports.py +++ b/bookwyrm/tests/views/admin/test_reports.py @@ -1,6 +1,5 @@ """test for app action functionality""" -import json from unittest.mock import patch from django.contrib.auth.models import Group @@ -159,11 +158,11 @@ def test_delete_user(self, *_): # de-activate with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + "bookwyrm.models.activitypub_mixin.ActivitypubMixin.broadcast" ) as mock: views.moderator_delete_user(request, self.rat.id) self.assertEqual(mock.call_count, 1) - activity = json.loads(mock.call_args[1]["args"][1]) + activity = mock.call_args[0][0] self.assertEqual(activity["type"], "Delete") self.rat.refresh_from_db() diff --git a/bookwyrm/tests/views/books/test_book.py b/bookwyrm/tests/views/books/test_book.py index 7df079ce30..d8aba6f4cd 100644 --- a/bookwyrm/tests/views/books/test_book.py +++ b/bookwyrm/tests/views/books/test_book.py @@ -172,7 +172,7 @@ def test_upload_cover_file(self): request.user = self.local_user with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + "bookwyrm.models.activitypub_mixin.ActivitypubMixin.broadcast" ) as delay_mock: views.upload_cover(request, self.book.id) self.assertEqual(delay_mock.call_count, 1) @@ -191,7 +191,7 @@ def test_upload_cover_url(self): request.user = self.local_user with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + "bookwyrm.models.activitypub_mixin.ActivitypubMixin.broadcast" ) as delay_mock: views.upload_cover(request, self.book.id) self.assertEqual(delay_mock.call_count, 1) diff --git a/bookwyrm/tests/views/books/test_edit_book.py b/bookwyrm/tests/views/books/test_edit_book.py index e776abc8f8..8a0ab69039 100644 --- a/bookwyrm/tests/views/books/test_edit_book.py +++ b/bookwyrm/tests/views/books/test_edit_book.py @@ -360,7 +360,7 @@ def test_create_book_upload_cover_url(self): request.user = self.local_user with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + "bookwyrm.models.activitypub_mixin.ActivitypubMixin.broadcast" ) as delay_mock: views.upload_cover(request, self.book.id) self.assertEqual(delay_mock.call_count, 1) diff --git a/bookwyrm/tests/views/books/test_links.py b/bookwyrm/tests/views/books/test_links.py index 8cb78a05bd..1533dd022c 100644 --- a/bookwyrm/tests/views/books/test_links.py +++ b/bookwyrm/tests/views/books/test_links.py @@ -1,6 +1,5 @@ """test for app action functionality""" -import json from unittest.mock import patch from django.contrib.auth.models import Group, Permission @@ -31,16 +30,6 @@ def setUpTestData(cls): localname="mouse", remote_id="https://example.com/users/mouse", ) - with patch("bookwyrm.models.user.set_remote_server.delay"): - cls.remote_user = models.User.objects.create_user( - "rat", - "rat@rat.com", - "ratword", - local=False, - remote_id="https://example.com/users/rat", - inbox="https://example.com/users/rat/inbox", - outbox="https://example.com/users/rat/outbox", - ) group = Group.objects.create(name="editor") group.permissions.add( Permission.objects.create( @@ -86,12 +75,12 @@ def test_add_link_post(self, *_): request = self.factory.post("", form.data) request.user = self.local_user with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + "bookwyrm.models.activitypub_mixin.ActivitypubMixin.broadcast" ) as mock: view(request, self.book.id) self.assertEqual(mock.call_count, 1) - activity = json.loads(mock.call_args[1]["args"][1]) + activity = mock.call_args[0][0] self.assertEqual(activity["type"], "Update") self.assertEqual(activity["object"]["type"], "Edition") self.assertIsInstance(activity["object"]["fileLinks"], list) diff --git a/bookwyrm/tests/views/lists/test_list.py b/bookwyrm/tests/views/lists/test_list.py index 43f8b9c7ba..0109940dc2 100644 --- a/bookwyrm/tests/views/lists/test_list.py +++ b/bookwyrm/tests/views/lists/test_list.py @@ -248,14 +248,14 @@ def test_list_edit(self): with ( patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + "bookwyrm.models.activitypub_mixin.ActivitypubMixin.broadcast" ) as mock, patch("bookwyrm.lists_stream.remove_list_task.delay"), ): result = view(request, self.list.id) self.assertEqual(mock.call_count, 1) - activity = json.loads(mock.call_args[1]["args"][1]) + activity = mock.call_args[0][0] self.assertEqual(activity["type"], "Update") self.assertEqual(activity["actor"], self.local_user.remote_id) self.assertEqual(activity["object"]["id"], self.list.remote_id) @@ -289,13 +289,13 @@ def test_delete_list(self): request.user = self.local_user with ( patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + "bookwyrm.models.activitypub_mixin.ActivitypubMixin.broadcast" ) as mock, patch("bookwyrm.lists_stream.remove_list_task.delay") as redis_mock, ): views.delete_list(request, self.list.id) self.assertTrue(redis_mock.called) - activity = json.loads(mock.call_args[1]["args"][1]) + activity = mock.call_args[0][0] self.assertEqual(activity["type"], "Delete") self.assertEqual(activity["actor"], self.local_user.remote_id) self.assertEqual(activity["object"]["id"], self.list.remote_id) @@ -618,11 +618,11 @@ def test_add_book_outsider(self): request.user = self.rat with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + "bookwyrm.models.activitypub_mixin.ActivitypubMixin.broadcast" ) as mock: views.add_book(request) self.assertEqual(mock.call_count, 1) - activity = json.loads(mock.call_args[1]["args"][1]) + activity = mock.call_args[0][0] self.assertEqual(activity["type"], "Add") self.assertEqual(activity["actor"], self.rat.remote_id) self.assertEqual(activity["target"], self.list.remote_id) @@ -647,12 +647,12 @@ def test_add_book_pending(self): request.user = self.rat with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + "bookwyrm.models.activitypub_mixin.ActivitypubMixin.broadcast" ) as mock: views.add_book(request) self.assertEqual(mock.call_count, 1) - activity = json.loads(mock.call_args[1]["args"][1]) + activity = mock.call_args[0][0] self.assertEqual(activity["type"], "Add") self.assertEqual(activity["actor"], self.rat.remote_id) @@ -680,11 +680,11 @@ def test_add_book_self_curated(self): request.user = self.local_user with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + "bookwyrm.models.activitypub_mixin.ActivitypubMixin.broadcast" ) as mock: views.add_book(request) self.assertEqual(mock.call_count, 1) - activity = json.loads(mock.call_args[1]["args"][1]) + activity = mock.call_args[0][0] self.assertEqual(activity["type"], "Add") self.assertEqual(activity["actor"], self.local_user.remote_id) self.assertEqual(activity["target"], self.list.remote_id) From 0f31fd0a0405c78b9c320f6349139376a98a0ad0 Mon Sep 17 00:00:00 2001 From: diaxoaine <42137630+diaxoaine@users.noreply.github.com> Date: Wed, 10 Jun 2026 21:33:12 +0700 Subject: [PATCH 749/962] Fix the remaining test failures --- bookwyrm/tests/views/lists/test_curate.py | 5 ++--- bookwyrm/tests/views/lists/test_list.py | 5 ++--- bookwyrm/tests/views/lists/test_list_item.py | 2 +- bookwyrm/tests/views/lists/test_lists.py | 5 ++--- bookwyrm/tests/views/preferences/test_delete_user.py | 5 ++--- bookwyrm/tests/views/preferences/test_edit_user.py | 4 ++-- bookwyrm/tests/views/shelf/test_shelf_actions.py | 9 ++++----- bookwyrm/tests/views/test_get_started.py | 4 ++-- bookwyrm/tests/views/test_interaction.py | 5 ++--- bookwyrm/tests/views/test_reading.py | 2 +- bookwyrm/tests/views/test_status.py | 9 ++++----- 11 files changed, 24 insertions(+), 31 deletions(-) diff --git a/bookwyrm/tests/views/lists/test_curate.py b/bookwyrm/tests/views/lists/test_curate.py index adc040ea3e..c36d449123 100644 --- a/bookwyrm/tests/views/lists/test_curate.py +++ b/bookwyrm/tests/views/lists/test_curate.py @@ -1,6 +1,5 @@ """test for app action functionality""" -import json from unittest.mock import patch from django.contrib.auth.models import AnonymousUser @@ -92,12 +91,12 @@ def test_curate_approve(self): request.user = self.local_user with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + "bookwyrm.models.activitypub_mixin.ActivitypubMixin.broadcast" ) as mock: view(request, self.list.id) self.assertEqual(mock.call_count, 2) - activity = json.loads(mock.call_args[1]["args"][1]) + activity = mock.call_args[0][0] self.assertEqual(activity["type"], "Add") self.assertEqual(activity["actor"], self.local_user.remote_id) self.assertEqual(activity["target"], self.list.remote_id) diff --git a/bookwyrm/tests/views/lists/test_list.py b/bookwyrm/tests/views/lists/test_list.py index 0109940dc2..03487e6b6e 100644 --- a/bookwyrm/tests/views/lists/test_list.py +++ b/bookwyrm/tests/views/lists/test_list.py @@ -1,6 +1,5 @@ """test for app action functionality""" -import json from unittest.mock import patch from django.contrib.auth.models import AnonymousUser @@ -325,11 +324,11 @@ def test_add_book(self): request.user = self.local_user with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + "bookwyrm.models.activitypub_mixin.ActivitypubMixin.broadcast" ) as mock: views.add_book(request) self.assertEqual(mock.call_count, 1) - activity = json.loads(mock.call_args[1]["args"][1]) + activity = mock.call_args[0][0] self.assertEqual(activity["type"], "Add") self.assertEqual(activity["actor"], self.local_user.remote_id) self.assertEqual(activity["target"], self.list.remote_id) diff --git a/bookwyrm/tests/views/lists/test_list_item.py b/bookwyrm/tests/views/lists/test_list_item.py index d5637ff1ad..d03d2d0998 100644 --- a/bookwyrm/tests/views/lists/test_list_item.py +++ b/bookwyrm/tests/views/lists/test_list_item.py @@ -65,7 +65,7 @@ def test_add_list_item_notes(self): ) request.user = self.local_user with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + "bookwyrm.models.activitypub_mixin.ActivitypubMixin.broadcast" ) as mock: view(request, self.list.id, item.id) self.assertEqual(mock.call_count, 1) diff --git a/bookwyrm/tests/views/lists/test_lists.py b/bookwyrm/tests/views/lists/test_lists.py index ca052a11fb..36576fb0bb 100644 --- a/bookwyrm/tests/views/lists/test_lists.py +++ b/bookwyrm/tests/views/lists/test_lists.py @@ -1,6 +1,5 @@ """test for app action functionality""" -import json from unittest.mock import patch from django.contrib.auth.models import AnonymousUser @@ -176,14 +175,14 @@ def test_lists_create(self): request.user = self.local_user with ( patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + "bookwyrm.models.activitypub_mixin.ActivitypubMixin.broadcast" ) as mock, patch("bookwyrm.lists_stream.remove_list_task.delay"), ): result = view(request) self.assertEqual(mock.call_count, 1) - activity = json.loads(mock.call_args[1]["args"][1]) + activity = mock.call_args[0][0] self.assertEqual(activity["type"], "Create") self.assertEqual(activity["actor"], self.local_user.remote_id) diff --git a/bookwyrm/tests/views/preferences/test_delete_user.py b/bookwyrm/tests/views/preferences/test_delete_user.py index fdcf8469c5..97dc5a2f10 100644 --- a/bookwyrm/tests/views/preferences/test_delete_user.py +++ b/bookwyrm/tests/views/preferences/test_delete_user.py @@ -1,6 +1,5 @@ """test for app action functionality""" -import json from unittest.mock import patch from django.contrib.auth.models import AnonymousUser @@ -81,11 +80,11 @@ def test_delete_user(self, *_): self.assertIsNone(self.local_user.name) with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + "bookwyrm.models.activitypub_mixin.ActivitypubMixin.broadcast" ) as delay_mock: view(request) self.assertEqual(delay_mock.call_count, 1) - activity = json.loads(delay_mock.call_args[1]["args"][1]) + activity = delay_mock.call_args[0][0] self.assertEqual(activity["type"], "Delete") self.assertEqual(activity["actor"], self.local_user.remote_id) self.assertEqual( diff --git a/bookwyrm/tests/views/preferences/test_edit_user.py b/bookwyrm/tests/views/preferences/test_edit_user.py index a31ee08f5f..ae21b106a2 100644 --- a/bookwyrm/tests/views/preferences/test_edit_user.py +++ b/bookwyrm/tests/views/preferences/test_edit_user.py @@ -80,7 +80,7 @@ def test_edit_user(self, _): self.assertIsNone(self.local_user.name) with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + "bookwyrm.models.activitypub_mixin.ActivitypubMixin.broadcast" ) as delay_mock: view(request) self.assertEqual(delay_mock.call_count, 1) @@ -106,7 +106,7 @@ def test_edit_user_avatar(self, _): request.user = self.local_user with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + "bookwyrm.models.activitypub_mixin.ActivitypubMixin.broadcast" ) as delay_mock: view(request) self.assertEqual(delay_mock.call_count, 1) diff --git a/bookwyrm/tests/views/shelf/test_shelf_actions.py b/bookwyrm/tests/views/shelf/test_shelf_actions.py index b78da18885..bc4cd2be18 100644 --- a/bookwyrm/tests/views/shelf/test_shelf_actions.py +++ b/bookwyrm/tests/views/shelf/test_shelf_actions.py @@ -1,6 +1,5 @@ """test for app action functionality""" -import json from unittest.mock import patch from django.core.exceptions import PermissionDenied @@ -65,12 +64,12 @@ def test_shelve(self, *_): ) request.user = self.local_user with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + "bookwyrm.models.activitypub_mixin.ActivitypubMixin.broadcast" ) as mock: views.shelve(request) self.assertEqual(mock.call_count, 1) - activity = json.loads(mock.call_args[1]["args"][1]) + activity = mock.call_args[0][0] self.assertEqual(activity["type"], "Add") item = models.ShelfBook.objects.get() @@ -156,10 +155,10 @@ def test_unshelve(self, *_): request = self.factory.post("", {"book": self.book.id, "shelf": self.shelf.id}) request.user = self.local_user with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + "bookwyrm.models.activitypub_mixin.ActivitypubMixin.broadcast" ) as mock: views.unshelve(request) - activity = json.loads(mock.call_args[1]["args"][1]) + activity = mock.call_args[0][0] self.assertEqual(activity["type"], "Remove") self.assertEqual(activity["object"]["id"], item.remote_id) self.assertEqual(self.shelf.books.count(), 0) diff --git a/bookwyrm/tests/views/test_get_started.py b/bookwyrm/tests/views/test_get_started.py index 5f9b35201c..85d6380970 100644 --- a/bookwyrm/tests/views/test_get_started.py +++ b/bookwyrm/tests/views/test_get_started.py @@ -70,7 +70,7 @@ def test_profile_view_post(self, *_): self.assertIsNone(self.local_user.name) with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + "bookwyrm.models.activitypub_mixin.ActivitypubMixin.broadcast" ) as delay_mock: view(request) self.assertEqual(delay_mock.call_count, 1) @@ -112,7 +112,7 @@ def test_books_view_post(self, *_): self.assertFalse(self.local_user.shelfbook_set.exists()) with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + "bookwyrm.models.activitypub_mixin.ActivitypubMixin.broadcast" ) as delay_mock: view(request) self.assertEqual(delay_mock.call_count, 1) diff --git a/bookwyrm/tests/views/test_interaction.py b/bookwyrm/tests/views/test_interaction.py index ead7a37167..fef65cbe68 100644 --- a/bookwyrm/tests/views/test_interaction.py +++ b/bookwyrm/tests/views/test_interaction.py @@ -1,6 +1,5 @@ """test for app action functionality""" -import json from unittest.mock import patch from django.test import TestCase from django.test.client import RequestFactory @@ -116,12 +115,12 @@ def test_self_boost(self, *_): status = models.Status.objects.create(user=self.local_user, content="hi") with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + "bookwyrm.models.activitypub_mixin.ActivitypubMixin.broadcast" ) as broadcast_mock: view(request, status.id) self.assertEqual(broadcast_mock.call_count, 1) - activity = json.loads(broadcast_mock.call_args[1]["args"][1]) + activity = broadcast_mock.call_args[0][0] self.assertEqual(activity["type"], "Announce") boost = models.Boost.objects.get() diff --git a/bookwyrm/tests/views/test_reading.py b/bookwyrm/tests/views/test_reading.py index 5cf3006b40..965368db0f 100644 --- a/bookwyrm/tests/views/test_reading.py +++ b/bookwyrm/tests/views/test_reading.py @@ -91,7 +91,7 @@ def test_start_reading(self, *_): ) request.user = self.local_user with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async" + "bookwyrm.models.activitypub_mixin.ActivitypubMixin.broadcast" ) as mock: views.ReadingStatus.as_view()(request, "start", self.book.id) diff --git a/bookwyrm/tests/views/test_status.py b/bookwyrm/tests/views/test_status.py index d9753f52dc..4582324e03 100644 --- a/bookwyrm/tests/views/test_status.py +++ b/bookwyrm/tests/views/test_status.py @@ -1,6 +1,5 @@ """test for app action functionality""" -import json from unittest.mock import patch import dateutil from django.core.exceptions import PermissionDenied @@ -74,7 +73,7 @@ def test_create_status_saves(self, *_): @patch("bookwyrm.activitystreams.populate_stream_task.delay") @patch("bookwyrm.lists_stream.populate_lists_task.delay") @patch("bookwyrm.activitystreams.remove_status_task.delay") -@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") +@patch("bookwyrm.models.activitypub_mixin.ActivitypubMixin.broadcast") class StatusViews(TestCase): """viewing and creating statuses""" @@ -591,7 +590,7 @@ def test_delete_status(self, mock, *_): with patch("bookwyrm.activitystreams.remove_status_task.delay") as redis_mock: view(request, status.id) self.assertTrue(redis_mock.called) - activity = json.loads(mock.call_args_list[1][1]["args"][1]) + activity = mock.call_args_list[1][0][0] self.assertEqual(activity["type"], "Delete") self.assertEqual(activity["object"]["type"], "Tombstone") status.refresh_from_db() @@ -625,7 +624,7 @@ def test_delete_status_moderator(self, mock, *_): with patch("bookwyrm.activitystreams.remove_status_task.delay") as redis_mock: view(request, status.id) self.assertTrue(redis_mock.called) - activity = json.loads(mock.call_args_list[1][1]["args"][1]) + activity = mock.call_args_list[1][0][0] self.assertEqual(activity["type"], "Delete") self.assertEqual(activity["object"]["type"], "Tombstone") status.refresh_from_db() @@ -677,7 +676,7 @@ def test_edit_status_success(self, mock, *_): request.user = self.local_user view(request, "comment", existing_status_id=status.id) - activity = json.loads(mock.call_args_list[1][1]["args"][1]) + activity = mock.call_args_list[1][0][0] self.assertEqual(activity["type"], "Update") self.assertEqual(activity["object"]["id"], status.remote_id) From bbda9b4b6d5de8849703fedfee5e3bb562e53ef6 Mon Sep 17 00:00:00 2001 From: Ian Young Date: Wed, 10 Jun 2026 23:09:15 -0500 Subject: [PATCH 750/962] Fix formatting and linting --- .eslintrc.js | 11 +++++++++++ bookwyrm/static/js/xhr_files.js | 8 ++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index b65fe9885a..abdeffbad5 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -86,5 +86,16 @@ module.exports = { }, ], "space-before-blocks": "error", + }, + "globals": { + "gettext": "readonly", + "ngettext": "readonly", + "interpolate": "readonly", + "get_format": "readonly", + "gettext_noop": "readonly", + "pgettext": "readonly", + "npgettext": "readonly", + "pluralidx": "readonly", + "django": "readonly" } }; diff --git a/bookwyrm/static/js/xhr_files.js b/bookwyrm/static/js/xhr_files.js index 6d0bff0ca6..3ed78392de 100644 --- a/bookwyrm/static/js/xhr_files.js +++ b/bookwyrm/static/js/xhr_files.js @@ -35,10 +35,10 @@ let XhrFiles = new (class { const file = item.getAsFile(); if (file.size > event.currentTarget.dataset.maxUpload) { - const errStr = interpolate( - gettext("File exceeds maximum size: %s"), - [event.currentTarget.dataset.maxUploadHuman] - ) + const errStr = interpolate(gettext("File exceeds maximum size: %s"), [ + event.currentTarget.dataset.maxUploadHuman, + ]); + alert(errStr); return; From c4bb8150bb31dc11cd2d30f7582aa667ca647e2f Mon Sep 17 00:00:00 2001 From: Hugh Rundle Date: Sat, 13 Jun 2026 10:52:13 +1000 Subject: [PATCH 751/962] fix migrations --- bookwyrm/migrations/0232_merge_20260524_0901.py | 14 -------------- ...blocked_books.py => 0235_user_blocked_books.py} | 4 ++-- 2 files changed, 2 insertions(+), 16 deletions(-) delete mode 100644 bookwyrm/migrations/0232_merge_20260524_0901.py rename bookwyrm/migrations/{0231_user_blocked_books.py => 0235_user_blocked_books.py} (76%) diff --git a/bookwyrm/migrations/0232_merge_20260524_0901.py b/bookwyrm/migrations/0232_merge_20260524_0901.py deleted file mode 100644 index 70a112c072..0000000000 --- a/bookwyrm/migrations/0232_merge_20260524_0901.py +++ /dev/null @@ -1,14 +0,0 @@ -# Generated by Django 5.2.14 on 2026-05-24 09:01 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('bookwyrm', '0231_sitesettings_block_incoming_search_and_more'), - ('bookwyrm', '0231_user_blocked_books'), - ] - - operations = [ - ] diff --git a/bookwyrm/migrations/0231_user_blocked_books.py b/bookwyrm/migrations/0235_user_blocked_books.py similarity index 76% rename from bookwyrm/migrations/0231_user_blocked_books.py rename to bookwyrm/migrations/0235_user_blocked_books.py index ebfbc77f5b..92c773a0bf 100644 --- a/bookwyrm/migrations/0231_user_blocked_books.py +++ b/bookwyrm/migrations/0235_user_blocked_books.py @@ -1,4 +1,4 @@ -# Generated by Django 5.2.14 on 2026-05-22 21:53 +# Generated by Django 5.2.14 on 2026-06-13 00:51 from django.db import migrations, models @@ -6,7 +6,7 @@ class Migration(migrations.Migration): dependencies = [ - ('bookwyrm', '0230_merge_20260522_2105'), + ('bookwyrm', '0234_listitem_raw_notes'), ] operations = [ From 644e6a2bdd986484834f4c817dae692ec83367ca Mon Sep 17 00:00:00 2001 From: Hugh Rundle Date: Sat, 13 Jun 2026 11:27:13 +1000 Subject: [PATCH 752/962] fix author covers overflowing --- bookwyrm/templates/author/author.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bookwyrm/templates/author/author.html b/bookwyrm/templates/author/author.html index c022d0dd4d..7b00afabfd 100644 --- a/bookwyrm/templates/author/author.html +++ b/bookwyrm/templates/author/author.html @@ -30,7 +30,7 @@

      {{ author.name }}

      {% firstof author.aliases author.born author.died as details %} {% firstof author.wikipedia_link author.website author.openlibrary_key author.inventaire_id author.isni author.isfdb author.wikidata as links %} {% if details or links %} -
      +
      {% if details %}

      {% trans "Author details" %}

      @@ -170,7 +170,7 @@

      {% trans "External links" %}

      {% endif %} -
      +
      {% if author.bio %} {% include "snippets/trimmed_text.html" with full=author.bio trim_length=200 %} {% endif %} From f971bd22a72c44c4e99dc6c9746467652cde6b61 Mon Sep 17 00:00:00 2001 From: Ilkka Ollakka Date: Sun, 19 Apr 2026 18:49:23 +0300 Subject: [PATCH 753/962] dependencies: pump django-storages to 1.14.6 --- pyproject.toml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 7d05482758..ee969a154c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,8 +15,7 @@ main = [ "django-oauth-toolkit==3.2.0", "django-pgtrigger==4.17.0", "django-sass-processor==1.4.2", - "django-storages==1.14.2", - "django-storages[azure]", + "django-storages[azure,s3]==1.14.6", "environs==14.5.0", "flower==2.0.1", "gunicorn==25.0.3", From 173935e9384ee2c0462f99eda75705bcf8f45dcc Mon Sep 17 00:00:00 2001 From: Ilkka Ollakka Date: Sat, 13 Jun 2026 15:05:50 +0300 Subject: [PATCH 754/962] tweak(celery): reduce celery concurrency to 20 100 is also max-connections default in postgresql, so 100 default could cause db-connections to run out if there is lot of jobs in celery queue. --- docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 737935fa72..98fd7c77ca 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -144,7 +144,7 @@ services: build: . networks: - main - command: celery -A celerywyrm worker --pool=threads --concurrency=100 -l info -Q high_priority,medium_priority,low_priority,streams,images,suggested_users,email,connectors,lists,inbox,imports,import_triggered,broadcast,misc + command: celery -A celerywyrm worker --pool=threads --concurrency=20 -l info -Q high_priority,medium_priority,low_priority,streams,images,suggested_users,email,connectors,lists,inbox,imports,import_triggered,broadcast,misc healthcheck: test: celery -A celerywyrm status interval: 10s From 042b05b9a0442c398efcc1bc5183225016406e55 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Sat, 13 Jun 2026 06:36:49 -0700 Subject: [PATCH 755/962] New translations django.po (Indonesian) [ci skip] --- locale/id_ID/LC_MESSAGES/django.po | 64 +++++++++++++++--------------- 1 file changed, 32 insertions(+), 32 deletions(-) diff --git a/locale/id_ID/LC_MESSAGES/django.po b/locale/id_ID/LC_MESSAGES/django.po index c4026fa92f..0140b12311 100644 --- a/locale/id_ID/LC_MESSAGES/django.po +++ b/locale/id_ID/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-05-23 18:40+0000\n" -"PO-Revision-Date: 2026-06-09 14:32\n" +"PO-Revision-Date: 2026-06-13 13:36\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Indonesian\n" "Language: id\n" @@ -1400,31 +1400,31 @@ msgstr "Ini adalah penulis baru" #: bookwyrm/templates/book/edit/edit_book.html:115 #, python-format msgid "Creating a new author: %(name)s" -msgstr "" +msgstr "Buat penulis baru: %(name)s" #: bookwyrm/templates/book/edit/edit_book.html:123 msgid "Is this an edition of an existing work?" -msgstr "" +msgstr "Apakah ini edisi dari yang sudah ada?" #: bookwyrm/templates/book/edit/edit_book.html:131 msgid "This is a new work" -msgstr "" +msgstr "Ini buku baru" #: bookwyrm/templates/book/edit/edit_book.html:142 msgid "Are you sure this is a new series? The following series have similar names and a matching author." -msgstr "" +msgstr "Yakin ini serial baru? Serial berikutnya memiliki nama sama dan penulis sama." #: bookwyrm/templates/book/edit/edit_book.html:148 msgid "Is this book part of one of these series?" -msgstr "" +msgstr "Apakah buku ini bagian dari serial ini?" #: bookwyrm/templates/book/edit/edit_book.html:160 msgid "This is a new series" -msgstr "" +msgstr "Ini serial baru" #: bookwyrm/templates/book/edit/edit_book.html:165 msgid "Creating a new series" -msgstr "" +msgstr "Membuat serial baru" #: bookwyrm/templates/book/edit/edit_book.html:175 #: bookwyrm/templates/book/edit/edit_series.html:86 @@ -1474,109 +1474,109 @@ msgstr "" #: bookwyrm/templates/guided_tour/user_profile.html:135 #: bookwyrm/templates/user/user.html:102 bookwyrm/templates/user_menu.html:18 msgid "Back" -msgstr "" +msgstr "Kembali" #: bookwyrm/templates/book/edit/edit_book_form.html:26 #: bookwyrm/templates/snippets/create_status/review.html:15 msgid "Title:" -msgstr "" +msgstr "Judul:" #: bookwyrm/templates/book/edit/edit_book_form.html:36 msgid "Sort Title:" -msgstr "" +msgstr "Urutkan Judul:" #: bookwyrm/templates/book/edit/edit_book_form.html:46 msgid "Subtitle:" -msgstr "" +msgstr "Subjudul:" #: bookwyrm/templates/book/edit/edit_book_form.html:64 msgid "Languages:" -msgstr "" +msgstr "Bahasa:" #: bookwyrm/templates/book/edit/edit_book_form.html:76 msgid "Subjects:" -msgstr "" +msgstr "Subjek:" #: bookwyrm/templates/book/edit/edit_book_form.html:80 msgid "Add subject" -msgstr "" +msgstr "Tambahkan subjek" #: bookwyrm/templates/book/edit/edit_book_form.html:98 msgid "Remove subject" -msgstr "" +msgstr "Hapus subjek" #: bookwyrm/templates/book/edit/edit_book_form.html:121 msgid "Add Another Subject" -msgstr "" +msgstr "Tambahkan Subjek Lain" #: bookwyrm/templates/book/edit/edit_book_form.html:130 msgid "Series" -msgstr "" +msgstr "Serial" #: bookwyrm/templates/book/edit/edit_book_form.html:138 #: bookwyrm/templates/book/series.html:12 #: bookwyrm/templates/book/series.html:13 msgid "Edit Series" -msgstr "" +msgstr "Edit Serial" #: bookwyrm/templates/book/edit/edit_book_form.html:141 msgid "To edit details of a series itself, click the series name" -msgstr "" +msgstr "Untuk mengedit rincian serial, klik nama serial" #: bookwyrm/templates/book/edit/edit_book_form.html:150 #: bookwyrm/templates/snippets/create_status/quotation.html:31 msgid "Position:" -msgstr "" +msgstr "Posisi:" #: bookwyrm/templates/book/edit/edit_book_form.html:164 #, python-format msgid "Remove this book from %(series_name)s" -msgstr "" +msgstr "Hapus buku ini dari %(series_name)s" #: bookwyrm/templates/book/edit/edit_book_form.html:175 msgid "Add Series" -msgstr "" +msgstr "Tambahkan Serial" #: bookwyrm/templates/book/edit/edit_book_form.html:178 msgid "Series name:" -msgstr "" +msgstr "Nama serial:" #: bookwyrm/templates/book/edit/edit_book_form.html:186 #: bookwyrm/templates/book/edit/edit_series.html:75 msgid "Series position:" -msgstr "" +msgstr "Posisi serial:" #: bookwyrm/templates/book/edit/edit_book_form.html:189 msgid "This field was previously called \"Series number\"" -msgstr "" +msgstr "Bidang ini sebelumnya disebut \"Nomor serial\"" #: bookwyrm/templates/book/edit/edit_book_form.html:202 msgid "Publication" -msgstr "" +msgstr "Publikasi" #: bookwyrm/templates/book/edit/edit_book_form.html:207 msgid "Publisher:" -msgstr "" +msgstr "Penerbit:" #: bookwyrm/templates/book/edit/edit_book_form.html:219 msgid "First published date:" -msgstr "" +msgstr "Tanggal terbit pertama kali:" #: bookwyrm/templates/book/edit/edit_book_form.html:227 msgid "Published date:" -msgstr "" +msgstr "Tanggal terbit:" #: bookwyrm/templates/book/edit/edit_book_form.html:238 #: bookwyrm/templates/import/user_import_status.html:155 #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:47 msgid "Authors" -msgstr "" +msgstr "Penulis" #: bookwyrm/templates/book/edit/edit_book_form.html:249 #, python-format msgid "Remove %(name)s" -msgstr "" +msgstr "Hapus %(name)s" #: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format From 69765eae089076d2547a38a44a00c4ad93dbc628 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Sat, 13 Jun 2026 08:13:04 -0700 Subject: [PATCH 756/962] New translations django.po (Indonesian) [ci skip] --- locale/id_ID/LC_MESSAGES/django.po | 40 +++++++++++++++--------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/locale/id_ID/LC_MESSAGES/django.po b/locale/id_ID/LC_MESSAGES/django.po index 0140b12311..e9a8d39769 100644 --- a/locale/id_ID/LC_MESSAGES/django.po +++ b/locale/id_ID/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-05-23 18:40+0000\n" -"PO-Revision-Date: 2026-06-13 13:36\n" +"PO-Revision-Date: 2026-06-13 15:13\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Indonesian\n" "Language: id\n" @@ -1581,89 +1581,89 @@ msgstr "Hapus %(name)s" #: bookwyrm/templates/book/edit/edit_book_form.html:252 #, python-format msgid "Author page for %(name)s" -msgstr "" +msgstr "Hapus halaman untuk %(name)s" #: bookwyrm/templates/book/edit/edit_book_form.html:260 msgid "Add Authors:" -msgstr "" +msgstr "Tambahkan Penulis:" #: bookwyrm/templates/book/edit/edit_book_form.html:263 #: bookwyrm/templates/book/edit/edit_book_form.html:266 msgid "Add Author" -msgstr "" +msgstr "Tambahkan Penulis" #: bookwyrm/templates/book/edit/edit_book_form.html:264 #: bookwyrm/templates/book/edit/edit_book_form.html:267 msgid "Jane Doe" -msgstr "" +msgstr "Jane Doe" #: bookwyrm/templates/book/edit/edit_book_form.html:273 msgid "Add Another Author" -msgstr "" +msgstr "Tambahkan Penulis Lain" #: bookwyrm/templates/book/edit/edit_book_form.html:283 #: bookwyrm/templates/shelf/shelf.html:155 msgid "Cover" -msgstr "" +msgstr "Kover" #: bookwyrm/templates/book/edit/edit_book_form.html:315 msgid "Physical Properties" -msgstr "" +msgstr "Properti Fisik" #: bookwyrm/templates/book/edit/edit_book_form.html:322 #: bookwyrm/templates/book/editions/format_filter.html:6 msgid "Format:" -msgstr "" +msgstr "Format:" #: bookwyrm/templates/book/edit/edit_book_form.html:332 msgid "Format details:" -msgstr "" +msgstr "Rincian format:" #: bookwyrm/templates/book/edit/edit_book_form.html:343 msgid "Pages:" -msgstr "" +msgstr "Halaman:" #: bookwyrm/templates/book/edit/edit_book_form.html:354 msgid "Book Identifiers" -msgstr "" +msgstr "Pengidentifikasi Buku" #: bookwyrm/templates/book/edit/edit_book_form.html:359 #: bookwyrm/templates/rss/edition.html:5 msgid "ISBN 13:" -msgstr "" +msgstr "ISBN 13:" #: bookwyrm/templates/book/edit/edit_book_form.html:368 msgid "ISBN 10:" -msgstr "" +msgstr "ISBN 10:" #: bookwyrm/templates/book/edit/edit_book_form.html:377 msgid "Openlibrary ID:" -msgstr "" +msgstr "Openlibrary ID:" #: bookwyrm/templates/book/edit/edit_series.html:9 #, python-format msgid "Edit \"%(title)s\"" -msgstr "" +msgstr "Edit \"%(title)s\"" #: bookwyrm/templates/book/edit/edit_series.html:20 #, python-format msgid "Edit \"%(name)s\"" -msgstr "" +msgstr "Edit \"%(name)s\"" #: bookwyrm/templates/book/edit/edit_series.html:30 #: bookwyrm/templates/settings/schedules.html:22 msgid "Name" -msgstr "" +msgstr "Nama" #: bookwyrm/templates/book/edit/edit_series.html:36 #: bookwyrm/templates/book/series.html:29 msgid "Alternative names" -msgstr "" +msgstr "Nama alternatif" #: bookwyrm/templates/book/edit/edit_series.html:39 #: bookwyrm/templates/book/edit/edit_series.html:42 msgid "Add Alternative name:" -msgstr "" +msgstr "Tambahkan nama Alternatif:" #: bookwyrm/templates/book/edit/edit_series.html:48 msgid "Add an Alternative name" From 5563400fc38506207aa2aebf37439e6724059696 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Sat, 13 Jun 2026 10:05:08 -0700 Subject: [PATCH 757/962] Adds allow_external_connections to Flag aciton --- bookwyrm/activitypub/verbs.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/activitypub/verbs.py b/bookwyrm/activitypub/verbs.py index 0cdac2d01f..6f74bfa957 100644 --- a/bookwyrm/activitypub/verbs.py +++ b/bookwyrm/activitypub/verbs.py @@ -282,7 +282,7 @@ class Flag(Verb): type: str = "Flag" content: str = None - def action(self): + def action(self, allow_external_connections=True): """Create the report and attach reported statuses""" report = self.to_model() # go through "objects" and figure out what they are From febc4d9437894727585c10be5ecff6366ecdac58 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Sun, 14 Jun 2026 08:16:44 -0700 Subject: [PATCH 758/962] New translations django.po (Indonesian) [ci skip] --- locale/id_ID/LC_MESSAGES/django.po | 102 ++++++++++++++--------------- 1 file changed, 51 insertions(+), 51 deletions(-) diff --git a/locale/id_ID/LC_MESSAGES/django.po b/locale/id_ID/LC_MESSAGES/django.po index e9a8d39769..f0c199c796 100644 --- a/locale/id_ID/LC_MESSAGES/django.po +++ b/locale/id_ID/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-05-23 18:40+0000\n" -"PO-Revision-Date: 2026-06-13 15:13\n" +"PO-Revision-Date: 2026-06-14 15:16\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Indonesian\n" "Language: id\n" @@ -1667,95 +1667,95 @@ msgstr "Tambahkan nama Alternatif:" #: bookwyrm/templates/book/edit/edit_series.html:48 msgid "Add an Alternative name" -msgstr "" +msgstr "Tambahkan nama Alternatif" #: bookwyrm/templates/book/edit/edit_series.html:57 msgid "Wikidata ID:" -msgstr "" +msgstr "Wikidata ID:" #: bookwyrm/templates/book/editions/editions.html:4 #, python-format msgid "Editions of %(book_title)s" -msgstr "" +msgstr "Edisi %(book_title)s" #: bookwyrm/templates/book/editions/editions.html:8 #, python-format msgid "Editions of %(work_title)s" -msgstr "" +msgstr "Edisi %(work_title)s" #: bookwyrm/templates/book/editions/editions.html:55 msgid "Can't find the edition you're looking for?" -msgstr "" +msgstr "Tidak menemukan edisi yang Anda cari?" #: bookwyrm/templates/book/editions/editions.html:76 msgid "Add another edition" -msgstr "" +msgstr "Tambahkan edisi lain" #: bookwyrm/templates/book/editions/format_filter.html:9 #: bookwyrm/templates/book/editions/language_filter.html:9 msgid "Any" -msgstr "" +msgstr "Apapun" #: bookwyrm/templates/book/editions/language_filter.html:6 #: bookwyrm/templates/preferences/edit_user.html:101 msgid "Language:" -msgstr "" +msgstr "Bahasa:" #: bookwyrm/templates/book/editions/search_filter.html:6 msgid "Search editions" -msgstr "" +msgstr "Cari edisi" #: bookwyrm/templates/book/file_links/add_link_modal.html:6 msgid "Add file link" -msgstr "" +msgstr "Tambahkan tautan berkas" #: 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 "" +msgstr "Tautan dari domain yang tidak dikenal harus melewati persetujuan moderator sebelum ditambahkan." #: bookwyrm/templates/book/file_links/add_link_modal.html:24 msgid "URL:" -msgstr "" +msgstr "URL:" #: bookwyrm/templates/book/file_links/add_link_modal.html:29 msgid "File type:" -msgstr "" +msgstr "Tipe berkas:" #: bookwyrm/templates/book/file_links/add_link_modal.html:48 msgid "Availability:" -msgstr "" +msgstr "Ketersediaan:" #: 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 "" +msgstr "Edit tautan" #: bookwyrm/templates/book/file_links/edit_links.html:11 #, python-format msgid "Links for \"%(title)s\"" -msgstr "" +msgstr "Tautan untuk \"%(title)s\"" #: bookwyrm/templates/book/file_links/edit_links.html:32 #: bookwyrm/templates/settings/link_domains/link_table.html:6 msgid "URL" -msgstr "" +msgstr "URL" #: bookwyrm/templates/book/file_links/edit_links.html:33 #: bookwyrm/templates/settings/link_domains/link_table.html:7 msgid "Added by" -msgstr "" +msgstr "Ditambahkan oleh" #: bookwyrm/templates/book/file_links/edit_links.html:34 #: bookwyrm/templates/settings/link_domains/link_table.html:8 msgid "Filetype" -msgstr "" +msgstr "Tipe berkas" #: 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 "" +msgstr "Domain" #: bookwyrm/templates/book/file_links/edit_links.html:36 #: bookwyrm/templates/import/import.html:149 @@ -1774,137 +1774,137 @@ msgstr "" #: bookwyrm/templates/settings/users/user_admin.html:56 #: bookwyrm/templates/settings/users/user_info.html:35 msgid "Status" -msgstr "" +msgstr "Status" #: bookwyrm/templates/book/file_links/edit_links.html:37 msgid "Availability" -msgstr "" +msgstr "Ketersediaan" #: bookwyrm/templates/book/file_links/edit_links.html:48 #: bookwyrm/templates/settings/link_domains/link_table.html:21 msgid "Unknown user" -msgstr "" +msgstr "Pengguna tidak dikenal" #: bookwyrm/templates/book/file_links/edit_links.html:57 #: bookwyrm/templates/book/file_links/verification_modal.html:22 msgid "Report spam" -msgstr "" +msgstr "Laporkan spam" #: bookwyrm/templates/book/file_links/edit_links.html:102 msgid "No links available for this book." -msgstr "" +msgstr "Tidak ada tautan tersedia untuk buku ini." #: bookwyrm/templates/book/file_links/edit_links.html:113 #: bookwyrm/templates/book/file_links/links.html:18 msgid "Add link to file" -msgstr "" +msgstr "Tambahkan tautan ke berkas" #: bookwyrm/templates/book/file_links/file_link_page.html:6 msgid "File Links" -msgstr "" +msgstr "Tautan Berkas" #: bookwyrm/templates/book/file_links/links.html:9 msgid "Get a copy" -msgstr "" +msgstr "Dapatkan salinan" #: bookwyrm/templates/book/file_links/links.html:47 msgid "No links available" -msgstr "" +msgstr "Tautan tidak tersedia" #: bookwyrm/templates/book/file_links/verification_modal.html:5 msgid "Leaving BookWyrm" -msgstr "" +msgstr "Meninggalkan 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 "" +msgstr "Tautan ini membawa Anda ke: %(link_url)s.
      Benarkan Anda akan ke sini?" #: bookwyrm/templates/book/file_links/verification_modal.html:27 #: bookwyrm/templates/setup/config.html:134 msgid "Continue" -msgstr "" +msgstr "Lanjutkan" #: bookwyrm/templates/book/publisher_info.html:23 #, python-format msgid "%(format)s, %(pages)s pages" -msgstr "" +msgstr "%(format)s, %(pages)s halaman" #: bookwyrm/templates/book/publisher_info.html:25 #, python-format msgid "%(pages)s pages" -msgstr "" +msgstr "%(pages)s halaman" #: bookwyrm/templates/book/publisher_info.html:38 #, python-format msgid "%(languages)s language" -msgstr "" +msgstr "%(languages)s halaman" #: bookwyrm/templates/book/publisher_info.html:63 #, python-format msgid "Published %(date)s by %(publisher)s." -msgstr "" +msgstr "Diterbitkan %(date)s oleh %(publisher)s." #: bookwyrm/templates/book/publisher_info.html:65 #, python-format msgid "Published by %(publisher)s." -msgstr "" +msgstr "Diterbitkan oleh %(publisher)s." #: bookwyrm/templates/book/publisher_info.html:67 #, python-format msgid "Published %(date)s" -msgstr "" +msgstr "Diterbitkan %(date)s" #: bookwyrm/templates/book/rating.html:19 msgid "rated it" -msgstr "" +msgstr "nilai ini" #: bookwyrm/templates/book/series.html:72 #, python-format msgid "Book %(series_number)s" -msgstr "" +msgstr "Buku %(series_number)s" #: 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 "" +msgstr "Memuat data akan menyambungkan ke %(source_name)s dan memeriksa metadata buku yang tidak ditampilkan di sini. Metadata yang sudah ada tidak akan ditimpa." #: bookwyrm/templates/compose.html:7 bookwyrm/templates/compose.html:21 msgid "Edit review" -msgstr "" +msgstr "Edit ulasan" #: bookwyrm/templates/compose.html:9 bookwyrm/templates/compose.html:23 msgid "Edit quote" -msgstr "" +msgstr "Edit kutipan" #: bookwyrm/templates/compose.html:11 bookwyrm/templates/compose.html:25 msgid "Edit comment" -msgstr "" +msgstr "Edit komentar" #: bookwyrm/templates/compose.html:13 bookwyrm/templates/compose.html:27 msgid "Edit status" -msgstr "" +msgstr "Edit status" #: bookwyrm/templates/confirm_email/confirm_email.html:4 msgid "Confirm email" -msgstr "" +msgstr "Konfirmasi surel" #: bookwyrm/templates/confirm_email/confirm_email.html:7 msgid "Confirm your email address" -msgstr "" +msgstr "Konfirmasi alamat surel Anda" #: 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 "" +msgstr "Kode konfirmasi telah dikirimkan ke alamat surel yang Anda pakai untuk mendaftarkan akun." #: bookwyrm/templates/confirm_email/confirm_email.html:15 msgid "Sorry! We couldn't find that code." -msgstr "" +msgstr "Maaf! Kami tidak menemukan kodenya." #: bookwyrm/templates/confirm_email/confirm_email.html:19 #: bookwyrm/templates/settings/users/user_info.html:92 msgid "Confirmation code:" -msgstr "" +msgstr "Kode konfirmasi:" #: bookwyrm/templates/confirm_email/confirm_email.html:25 #: bookwyrm/templates/landing/layout.html:81 From 1ea01fabceaf87b72602889e84de815e7f6fb63d Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Sun, 14 Jun 2026 09:16:27 -0700 Subject: [PATCH 759/962] New translations django.po (Hebrew) [ci skip] --- locale/he_IL/LC_MESSAGES/django.po | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/locale/he_IL/LC_MESSAGES/django.po b/locale/he_IL/LC_MESSAGES/django.po index 6ab0723429..d646e779f2 100644 --- a/locale/he_IL/LC_MESSAGES/django.po +++ b/locale/he_IL/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-05-23 18:40+0000\n" -"PO-Revision-Date: 2026-06-07 19:46\n" +"PO-Revision-Date: 2026-06-14 16:16\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Hebrew\n" "Language: he\n" @@ -227,7 +227,7 @@ msgstr "ביקורת" #: bookwyrm/models/bookwyrm_import_job.py:153 msgid "Quotation" -msgstr "" +msgstr "ציטוט" #: bookwyrm/models/bookwyrm_import_job.py:181 #: bookwyrm/templates/snippets/follow_button.html:24 @@ -243,15 +243,15 @@ msgstr "חסום" #: bookwyrm/models/bookwyrm_import_job.py:395 msgid "Unknown error importing book" -msgstr "" +msgstr "שגיאה לא ידועה בייבוא ספר" #: bookwyrm/models/bookwyrm_import_job.py:490 msgid "unauthorized" -msgstr "" +msgstr "לא מורשה" #: bookwyrm/models/bookwyrm_import_job.py:496 msgid "Unknown error importing book status" -msgstr "" +msgstr "שגיאה לא ידועה בייבוא סטטוס ספר" #: bookwyrm/models/bookwyrm_import_job.py:686 #: bookwyrm/models/bookwyrm_import_job.py:711 @@ -335,11 +335,11 @@ msgstr "פרטי" #: bookwyrm/models/housekeeping.py:117 msgid "Missing" -msgstr "" +msgstr "חסר" #: bookwyrm/models/housekeeping.py:118 msgid "Wrong Path" -msgstr "" +msgstr "נתיב שגוי" #: bookwyrm/models/import_job.py:51 bookwyrm/models/job.py:19 #: bookwyrm/templates/import/import.html:184 @@ -428,7 +428,7 @@ msgstr "משתמש שהשעייתו בוטלה" #: bookwyrm/models/report.py:92 msgid "Changed user permission level" -msgstr "" +msgstr "שונתה רמת הרשאת משתמש" #: bookwyrm/models/report.py:93 msgid "Deleted user account" @@ -448,7 +448,7 @@ msgstr "פריט שנמחק" #: bookwyrm/models/session.py:43 msgid "Unknown" -msgstr "" +msgstr "לא ידוע" #: bookwyrm/models/status.py:191 #, python-format @@ -639,7 +639,7 @@ msgstr "הקובץ שאתם מעלים גדול מדי." #: bookwyrm/templates/413.html:11 msgid "You you can try using a smaller file, or ask your BookWyrm server administrator to increase the DATA_UPLOAD_MAX_MEMORY_SIZE setting." -msgstr "" +msgstr "ניתן לנסות להשתמש בקובץ קטן יותר, או לבקש ממנהל שרת ה-Bookwyrm שלך להעלות את הגדרת DATA_UPLOAD_MAX_MEMORY_SIZE." #: bookwyrm/templates/500.html:4 msgid "Oops!" @@ -819,7 +819,7 @@ msgstr "לצערנו %(display_name)s לא סיים אף ספר ב-%(year)s" #, 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 book
      ובו %(pages_total)s עמודים!" +msgstr[0] "ב-%(year)s %(display_name)s קרא ספר %(books_total)s אחד
      ובו %(pages_total)s עמודים!" msgstr[1] "" msgstr[2] "" msgstr[3] "ב-%(year)s %(display_name)s קרא %(books_total)s book
      ספרים ובהם %(pages_total)s עמודים!" From f6a5f1b0599135e759ed118c7b76e90e8928573e Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Sun, 14 Jun 2026 10:28:28 -0700 Subject: [PATCH 760/962] New translations django.po (Hebrew) [ci skip] --- locale/he_IL/LC_MESSAGES/django.po | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/locale/he_IL/LC_MESSAGES/django.po b/locale/he_IL/LC_MESSAGES/django.po index d646e779f2..3cae68175b 100644 --- a/locale/he_IL/LC_MESSAGES/django.po +++ b/locale/he_IL/LC_MESSAGES/django.po @@ -3,7 +3,7 @@ msgstr "" "Project-Id-Version: bookwyrm\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2026-05-23 18:40+0000\n" -"PO-Revision-Date: 2026-06-14 16:16\n" +"PO-Revision-Date: 2026-06-14 17:28\n" "Last-Translator: Mouse Reeve \n" "Language-Team: Hebrew\n" "Language: he\n" @@ -1445,7 +1445,7 @@ msgstr "" #: bookwyrm/templates/book/edit/edit_book.html:165 msgid "Creating a new series" -msgstr "" +msgstr "יצירת סדרה חדשה" #: bookwyrm/templates/book/edit/edit_book.html:175 #: bookwyrm/templates/book/edit/edit_series.html:86 From 4ab6bf0eea132f14d2a3ac017fe59903783214cb Mon Sep 17 00:00:00 2001 From: diaxoaine <42137630+diaxoaine@users.noreply.github.com> Date: Mon, 15 Jun 2026 22:40:10 +0700 Subject: [PATCH 761/962] Add is_private field to User --- bookwyrm/migrations/0234_user_is_private.py | 18 ++++++++++++++++++ bookwyrm/models/user.py | 1 + 2 files changed, 19 insertions(+) create mode 100644 bookwyrm/migrations/0234_user_is_private.py diff --git a/bookwyrm/migrations/0234_user_is_private.py b/bookwyrm/migrations/0234_user_is_private.py new file mode 100644 index 0000000000..770921945c --- /dev/null +++ b/bookwyrm/migrations/0234_user_is_private.py @@ -0,0 +1,18 @@ +# Generated by Django 5.2.14 on 2026-06-15 15:22 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('bookwyrm', '0232_user_readwise_api_key'), + ] + + operations = [ + migrations.AddField( + model_name='user', + name='is_private', + field=models.BooleanField(default=False), + ), + ] diff --git a/bookwyrm/models/user.py b/bookwyrm/models/user.py index ece1a88d20..27784fc4fa 100644 --- a/bookwyrm/models/user.py +++ b/bookwyrm/models/user.py @@ -143,6 +143,7 @@ class User(OrderedCollectionPageMixin, AbstractUser): manually_approves_followers = fields.BooleanField(default=False) theme = models.ForeignKey("Theme", null=True, blank=True, on_delete=models.SET_NULL) hide_follows = fields.BooleanField(default=False) + is_private = models.BooleanField(default=False) # migration fields moved_to = fields.RemoteIdField( From 94875edb0b4fc320794f7e9532235e476b7a397b Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 15 Jun 2026 09:38:06 -0700 Subject: [PATCH 762/962] Adds merge migration --- bookwyrm/migrations/0235_merge_20260615_1637.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 bookwyrm/migrations/0235_merge_20260615_1637.py diff --git a/bookwyrm/migrations/0235_merge_20260615_1637.py b/bookwyrm/migrations/0235_merge_20260615_1637.py new file mode 100644 index 0000000000..6a9cc21484 --- /dev/null +++ b/bookwyrm/migrations/0235_merge_20260615_1637.py @@ -0,0 +1,14 @@ +# Generated by Django 5.2.14 on 2026-06-15 16:37 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('bookwyrm', '0232_merge_20260606_0829'), + ('bookwyrm', '0234_listitem_raw_notes'), + ] + + operations = [ + ] From c4e0041ffcb622082cea224f9bf4fe4712b6f380 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 15 Jun 2026 11:45:17 -0700 Subject: [PATCH 763/962] Updates migration file --- ...{0235_user_blocked_books.py => 0236_user_blocked_books.py} | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) rename bookwyrm/migrations/{0235_user_blocked_books.py => 0236_user_blocked_books.py} (76%) diff --git a/bookwyrm/migrations/0235_user_blocked_books.py b/bookwyrm/migrations/0236_user_blocked_books.py similarity index 76% rename from bookwyrm/migrations/0235_user_blocked_books.py rename to bookwyrm/migrations/0236_user_blocked_books.py index 92c773a0bf..7262d47be4 100644 --- a/bookwyrm/migrations/0235_user_blocked_books.py +++ b/bookwyrm/migrations/0236_user_blocked_books.py @@ -1,4 +1,4 @@ -# Generated by Django 5.2.14 on 2026-06-13 00:51 +# Generated by Django 5.2.14 on 2026-06-15 18:45 from django.db import migrations, models @@ -6,7 +6,7 @@ class Migration(migrations.Migration): dependencies = [ - ('bookwyrm', '0234_listitem_raw_notes'), + ('bookwyrm', '0235_merge_20260615_1637'), ] operations = [ From de38da4128d6688ca42c3b7bbf68a8d367cfe363 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 15 Jun 2026 12:21:11 -0700 Subject: [PATCH 764/962] Fixes merge regression and migration order --- bookwyrm/forms/lists.py | 4 ++-- ...37_alter_list_options_alter_listitem_options_and_more.py} | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) rename bookwyrm/migrations/{0232_alter_list_options_alter_listitem_options_and_more.py => 0237_alter_list_options_alter_listitem_options_and_more.py} (95%) diff --git a/bookwyrm/forms/lists.py b/bookwyrm/forms/lists.py index 850a9a7c91..b6cc3bf56a 100644 --- a/bookwyrm/forms/lists.py +++ b/bookwyrm/forms/lists.py @@ -17,7 +17,7 @@ class Meta: class ListItemForm(CustomForm): class Meta: model = models.ListItem - fields = ["user", "book", "book_list", "notes", "raw_notes"] + fields = ["user", "edition", "book_list", "notes", "raw_notes"] class SuggestionListForm(CustomForm): @@ -29,7 +29,7 @@ class Meta: class SuggestionListItemForm(CustomForm): class Meta: model = models.SuggestionListItem - fields = ["user", "book", "book_list", "notes", "raw_notes"] + fields = ["user", "work", "book_list", "notes", "raw_notes"] class SortListForm(forms.Form): diff --git a/bookwyrm/migrations/0232_alter_list_options_alter_listitem_options_and_more.py b/bookwyrm/migrations/0237_alter_list_options_alter_listitem_options_and_more.py similarity index 95% rename from bookwyrm/migrations/0232_alter_list_options_alter_listitem_options_and_more.py rename to bookwyrm/migrations/0237_alter_list_options_alter_listitem_options_and_more.py index 6d4b61cbcf..e883dd21fe 100644 --- a/bookwyrm/migrations/0232_alter_list_options_alter_listitem_options_and_more.py +++ b/bookwyrm/migrations/0237_alter_list_options_alter_listitem_options_and_more.py @@ -1,4 +1,4 @@ -# Generated by Django 5.2.14 on 2026-05-25 16:12 +# Generated by Django 5.2.14 on 2026-06-15 19:21 import bookwyrm.models.activitypub_mixin import bookwyrm.models.fields @@ -10,7 +10,7 @@ class Migration(migrations.Migration): dependencies = [ - ('bookwyrm', '0231_sitesettings_block_incoming_search_and_more'), + ('bookwyrm', '0236_user_blocked_books'), ] operations = [ @@ -66,6 +66,7 @@ class Migration(migrations.Migration): ('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])), ('notes', bookwyrm.models.fields.HtmlField(blank=True, max_length=300, null=True)), + ('raw_notes', models.TextField(blank=True, max_length=300, null=True)), ('book_list', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='bookwyrm.suggestionlist')), ('endorsement', models.ManyToManyField(related_name='suggestion_endorsers', to=settings.AUTH_USER_MODEL)), ('user', bookwyrm.models.fields.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL)), From ee02ff98eb1d04d7babab1a4c86abb61cc505704 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 15 Jun 2026 12:34:58 -0700 Subject: [PATCH 765/962] Use raw_notes field when adding suggestion list items --- bookwyrm/views/suggestion_list.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/bookwyrm/views/suggestion_list.py b/bookwyrm/views/suggestion_list.py index c40c7d645b..a97e0b305c 100644 --- a/bookwyrm/views/suggestion_list.py +++ b/bookwyrm/views/suggestion_list.py @@ -18,6 +18,7 @@ from bookwyrm.activitypub import ActivitypubResponse from bookwyrm.settings import PAGE_LENGTH from bookwyrm.views import Book +from bookwyrm.views.helpers import convert_to_markdown from bookwyrm.views.helpers import get_user_from_username from bookwyrm.views.helpers import is_api_request, redirect_to_referer from bookwyrm.views.list.list import get_list_suggestions @@ -138,7 +139,11 @@ def book_add_suggestion(request: HttpRequest, book_id: int) -> Any: if not form.is_valid(): return Book().get(request, book_id, add_failed=True) - form.save(request) + item = form.save(request, commit=False) + if item.notes: + item.raw_notes = item.notes + item.notes = convert_to_markdown(item.notes) + item.save() return redirect_to_referer(request) From cddcc8378992778815ea5874134579a77486532d Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 15 Jun 2026 12:36:59 -0700 Subject: [PATCH 766/962] Fixes ruff complaints --- bookwyrm/views/list/list.py | 7 ++----- bookwyrm/views/list/list_item.py | 2 +- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/bookwyrm/views/list/list.py b/bookwyrm/views/list/list.py index 9ed0cdea6a..f42aa18a91 100644 --- a/bookwyrm/views/list/list.py +++ b/bookwyrm/views/list/list.py @@ -130,9 +130,7 @@ def get_list_suggestions( suggestions = ( user.shelfbook_set.filter(~Q(book__in=book_list.editions.all())) .exclude(book__parent_work=ignore_book) - .exclude( - book__parent_work__in=user.blocked_books.values_list("id", flat=True) - ) + .exclude(book__parent_work__in=user.blocked_books.values_list("id", flat=True)) .distinct()[:num_suggestions] ) suggestions = [s.book for s in suggestions[:num_suggestions]] @@ -142,9 +140,8 @@ def get_list_suggestions( for s in models.Work.objects.filter( ~Q(editions__in=book_list.editions.all()), ~Q(id=ignore_book.id if ignore_book else None), - ).exclude( - id__in=user.blocked_books.values_list("id", flat=True) ) + .exclude(id__in=user.blocked_books.values_list("id", flat=True)) .distinct() .order_by("-updated_date")[:num_suggestions] ] diff --git a/bookwyrm/views/list/list_item.py b/bookwyrm/views/list/list_item.py index 6442ce6e63..46defe2f5f 100644 --- a/bookwyrm/views/list/list_item.py +++ b/bookwyrm/views/list/list_item.py @@ -50,4 +50,4 @@ def edit_list_item(request, list_id, list_item, item_model, form): else: raise Exception(form.errors) - return redirect_to_referer(request) \ No newline at end of file + return redirect_to_referer(request) From d3d490c6d1dbecfc79278468f3f5950ba61a363d Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 15 Jun 2026 13:00:17 -0700 Subject: [PATCH 767/962] Updates list tests --- bookwyrm/tests/views/lists/test_list.py | 4 ++-- bookwyrm/tests/views/lists/test_suggestion_list.py | 2 +- bookwyrm/views/list/list.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/bookwyrm/tests/views/lists/test_list.py b/bookwyrm/tests/views/lists/test_list.py index f5521407e3..402d8af635 100644 --- a/bookwyrm/tests/views/lists/test_list.py +++ b/bookwyrm/tests/views/lists/test_list.py @@ -768,7 +768,7 @@ def test_list_page_excludes_blocked_items(self): list_item_one = models.ListItem.objects.create( book_list=self.list, user=self.local_user, - book=self.book, + edition=self.edition, approved=True, notes="hello", order=1, @@ -777,7 +777,7 @@ def test_list_page_excludes_blocked_items(self): list_item_two = models.ListItem.objects.create( book_list=self.list, user=self.local_user, - book=self.book_two, + edition=self.book_two, approved=True, notes="goodbye", order=2, diff --git a/bookwyrm/tests/views/lists/test_suggestion_list.py b/bookwyrm/tests/views/lists/test_suggestion_list.py index df40e00312..bc297815bc 100644 --- a/bookwyrm/tests/views/lists/test_suggestion_list.py +++ b/bookwyrm/tests/views/lists/test_suggestion_list.py @@ -118,7 +118,7 @@ def test_book_add_suggestion(self, *_): item = suggestion_list.suggestionlistitem_set.first() self.assertEqual(item.work, self.another_book.parent_work) self.assertEqual(item.user, self.local_user) - self.assertEqual(item.notes, "hello") + self.assertEqual(item.raw_notes, "hello") def test_book_remove_suggestion(self, *_): """Remove a book from the recommendation list""" diff --git a/bookwyrm/views/list/list.py b/bookwyrm/views/list/list.py index f42aa18a91..bdc95b98eb 100644 --- a/bookwyrm/views/list/list.py +++ b/bookwyrm/views/list/list.py @@ -53,7 +53,7 @@ def get(self, request, list_id, **kwargs): items = ( book_list.listitem_set.filter(approved=True) - .exclude(book__parent_work__in=blocked) + .exclude(edition__parent_work__in=blocked) .prefetch_related("user", "edition", "edition__authors") ) From e245c5529fa9c782bf9ccc976ec7a4f6bbbae320 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 15 Jun 2026 13:08:03 -0700 Subject: [PATCH 768/962] Update blocked book filter to handle list field name variants --- bookwyrm/templatetags/book_display_tags.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/bookwyrm/templatetags/book_display_tags.py b/bookwyrm/templatetags/book_display_tags.py index 4455626bc8..88a8107713 100644 --- a/bookwyrm/templatetags/book_display_tags.py +++ b/bookwyrm/templatetags/book_display_tags.py @@ -1,6 +1,7 @@ """template filters""" from django import template +from django.core.exceptions import FieldError from bookwyrm import models @@ -44,4 +45,12 @@ def blocked_book_filter(queryset, viewer): return queryset blocked = viewer.blocked_books.all().values_list("id", flat=True) - return queryset.exclude(book__parent_work__in=blocked) + try: + return queryset.exclude(book__parent_work__in=blocked) + except FieldError: + pass + + try: + return queryset.exclude(work__in=blocked) + except FieldError: + return queryset.exclude(edition__parent_work__in=blocked) From e36d2628996b28c8d7bffac1877d5be16f47d407 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 15 Jun 2026 13:09:37 -0700 Subject: [PATCH 769/962] Removes unused imoprt --- bookwyrm/views/list/list_item.py | 1 - 1 file changed, 1 deletion(-) diff --git a/bookwyrm/views/list/list_item.py b/bookwyrm/views/list/list_item.py index 46defe2f5f..9033f19a08 100644 --- a/bookwyrm/views/list/list_item.py +++ b/bookwyrm/views/list/list_item.py @@ -7,7 +7,6 @@ from bookwyrm import forms, models from bookwyrm.views.helpers import convert_to_markdown, redirect_to_referer -from bookwyrm.views.status import to_markdown @method_decorator(login_required, name="dispatch") From fd84281644279df88ca1a62c7f9884c87b0a7eea Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 15 Jun 2026 13:12:48 -0700 Subject: [PATCH 770/962] Updates block book form identifier to avoid clashes --- .../snippets/shelve_button/shelve_button_dropdown_options.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html b/bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html index 00dbc2a42c..bc2f478b91 100644 --- a/bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html +++ b/bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html @@ -76,7 +76,7 @@ {% endif %}
      {% block tabs %} - {% if not user.moved_to %} + {% if not user.moved_to and not is_locked %} {% with user|username as username %}
      diff --git a/bookwyrm/templates/book/sections/reading.html b/bookwyrm/templates/book/sections/reading.html index 2ebbd10cc7..be5ad4304e 100644 --- a/bookwyrm/templates/book/sections/reading.html +++ b/bookwyrm/templates/book/sections/reading.html @@ -8,7 +8,7 @@

      {% trans "Your reading" %}

      {% if readthroughs.exists %}
      {% for readthrough in readthroughs %} -
      +
      {% include 'readthrough/readthrough_list.html' with readthrough=readthrough %}
      {% endfor %} diff --git a/bookwyrm/templates/book/sections/reviews.html b/bookwyrm/templates/book/sections/reviews.html index 433115cb98..3f7fa9601c 100644 --- a/bookwyrm/templates/book/sections/reviews.html +++ b/bookwyrm/templates/book/sections/reviews.html @@ -8,7 +8,7 @@

      {% trans "Reviews" %}

      {% trans "Add your thoughts" %}

      - +
      {% with 0|uuid as controls_uid %} diff --git a/bookwyrm/templates/book/sections/subjects.html b/bookwyrm/templates/book/sections/subjects.html index 8f1386481c..da16a27ea7 100644 --- a/bookwyrm/templates/book/sections/subjects.html +++ b/bookwyrm/templates/book/sections/subjects.html @@ -1,27 +1,27 @@ {% load i18n %} {% if book.subjects or book.subject_places %}
      -
      +

      {% trans "Subjects" %}

      {% if book.subjects %} -
        - {% for subject in book.subjects %} -
      • {{ subject }}
      • - {% endfor %} -
      +
        + {% for subject in book.subjects %} +
      • {{ subject }}
      • + {% endfor %} +
      {% endif %} {% if book.subject_places %} -

      {% trans "Places" %}

      -
        - {% for place in book.subject_places %} -
      • {{ place }}
      • - {% endfor %} -
      +

      {% trans "Places" %}

      +
        + {% for place in book.subject_places %} +
      • {{ place }}
      • + {% endfor %} +
      {% endif %}
      diff --git a/bookwyrm/templates/book/suggestion_list/list.html b/bookwyrm/templates/book/suggestion_list/list.html index 3ed36af39d..637f538a05 100644 --- a/bookwyrm/templates/book/suggestion_list/list.html +++ b/bookwyrm/templates/book/suggestion_list/list.html @@ -29,20 +29,20 @@

      {% endfor %} -
      +
      {% include "book/suggestion_list/search.html" with list=suggestion_list is_suggestion=True %}
      {% endif %} {% else %}
      -
      - {% csrf_token %} - - -

      {% trans "Have a recommendation for someone who liked this book?" %}

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

      {% trans "Have a recommendation for someone who liked this book?" %}

      + +
      + {% endif %} {% endif %} From e509f2330abc6e3edc271f08c9dbbf1f0a4e8c58 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Wed, 24 Jun 2026 16:16:04 -0700 Subject: [PATCH 837/962] Make suggestion search an inline form --- bookwyrm/templates/book/book.html | 2 ++ .../templates/book/suggestion_list/list.html | 25 ++++++++++++------- .../book/suggestion_list/search.html | 16 ++++++------ 3 files changed, 26 insertions(+), 17 deletions(-) diff --git a/bookwyrm/templates/book/book.html b/bookwyrm/templates/book/book.html index caacc7c12f..952ef56ebc 100644 --- a/bookwyrm/templates/book/book.html +++ b/bookwyrm/templates/book/book.html @@ -68,6 +68,8 @@ {% include "book/suggestion_list/list.html" %} + +
      {% include "book/sections/reviews.html" %}
      diff --git a/bookwyrm/templates/book/suggestion_list/list.html b/bookwyrm/templates/book/suggestion_list/list.html index 637f538a05..b0eac4bf57 100644 --- a/bookwyrm/templates/book/suggestion_list/list.html +++ b/bookwyrm/templates/book/suggestion_list/list.html @@ -2,15 +2,22 @@ {% load humanize %} {% if request.user.is_authenticated or suggestion_list %} -

      - {% trans "Readers also recommend:" %} - {% if suggestion_list and items|length > 0 %} - - {% trans "View all suggestions" %} ({{ item_count }}) - - {% endif %} -

      +
      +

      + {% trans "Readers also recommend:" %} + {% if suggestion_list and items|length > 0 %} + + {% trans "View all suggestions" %} ({{ item_count }}) + + {% endif %} +

      +
      + {% trans "Add suggestion" as button_text %} + {% include 'snippets/toggle/open_button.html' with class="is-small" controls_text="suggestion_search" icon_with_text="plus" text=button_text focus="suggestion_search_header" %} +
      +
      +
      {% if suggestion_list %} {% if items|length == 0 %} @@ -30,7 +37,7 @@

      - {% include "book/suggestion_list/search.html" with list=suggestion_list is_suggestion=True %} + {% include "book/suggestion_list/search.html" with list=suggestion_list is_suggestion=True controls_text="suggestion_search" %}
      {% endif %} {% else %} diff --git a/bookwyrm/templates/book/suggestion_list/search.html b/bookwyrm/templates/book/suggestion_list/search.html index f5e28b5ff3..451dd12d0f 100644 --- a/bookwyrm/templates/book/suggestion_list/search.html +++ b/bookwyrm/templates/book/suggestion_list/search.html @@ -1,17 +1,17 @@ +{% extends 'components/inline_form.html' %} {% load i18n %} {% load utilities %} +{% block header %} + {% trans "Add suggestions" %} +{% endblock %} + +{% block form %} + {% if request.user.is_authenticated %} -
      - - - {% trans "Add suggestions" %} - - - {% with search_url=request.path|add:"#add-suggestions" %} {% include "lists/suggestion_search.html" with is_suggestion=True query_param="suggestion_query" columns=True %} {% endwith %} -
      {% endif %} +{% endblock %} From 6c10c024a7e757737aeb76639ed9e5149ecf5c2f Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Wed, 24 Jun 2026 16:48:59 -0700 Subject: [PATCH 838/962] Re-generated migration files --- bookwyrm/migrations/0217_userupload.py | 45 ----------------- ..._file_userupload_original_file_and_more.py | 48 ------------------- .../migrations/0228_merge_20260222_0352.py | 13 ----- .../0229_userupload_status_and_more.py | 44 ----------------- .../migrations/0230_merge_20260326_0357.py | 13 ----- .../migrations/0232_merge_20260527_0333.py | 13 ----- .../0240_userupload_useruploadversion.py | 36 ++++++++++++++ 7 files changed, 36 insertions(+), 176 deletions(-) delete mode 100644 bookwyrm/migrations/0217_userupload.py delete mode 100644 bookwyrm/migrations/0218_rename_file_userupload_original_file_and_more.py delete mode 100644 bookwyrm/migrations/0228_merge_20260222_0352.py delete mode 100644 bookwyrm/migrations/0229_userupload_status_and_more.py delete mode 100644 bookwyrm/migrations/0230_merge_20260326_0357.py delete mode 100644 bookwyrm/migrations/0232_merge_20260527_0333.py create mode 100644 bookwyrm/migrations/0240_userupload_useruploadversion.py diff --git a/bookwyrm/migrations/0217_userupload.py b/bookwyrm/migrations/0217_userupload.py deleted file mode 100644 index b1cde14d1c..0000000000 --- a/bookwyrm/migrations/0217_userupload.py +++ /dev/null @@ -1,45 +0,0 @@ -# Generated by Django 5.2.3 on 2025-09-08 02:52 - -import bookwyrm.models.user_upload -import django.db.models.deletion -from django.conf import settings -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("bookwyrm", "0216_alter_edition_shelves_alter_list_books_and_more"), - ] - - operations = [ - migrations.CreateModel( - name="UserUpload", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("original_name", models.TextField()), - ("original_content_type", models.TextField()), - ( - "file", - models.ImageField( - upload_to=bookwyrm.models.user_upload.user_upload_directory_path - ), - ), - ( - "user", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - to=settings.AUTH_USER_MODEL, - ), - ), - ], - ), - ] diff --git a/bookwyrm/migrations/0218_rename_file_userupload_original_file_and_more.py b/bookwyrm/migrations/0218_rename_file_userupload_original_file_and_more.py deleted file mode 100644 index 8bbbe57a12..0000000000 --- a/bookwyrm/migrations/0218_rename_file_userupload_original_file_and_more.py +++ /dev/null @@ -1,48 +0,0 @@ -# Generated by Django 5.2.3 on 2025-09-19 03:44 - -import bookwyrm.models.user_upload -import django.db.models.deletion -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("bookwyrm", "0217_userupload"), - ] - - operations = [ - migrations.RenameField( - model_name="userupload", - old_name="file", - new_name="original_file", - ), - migrations.CreateModel( - name="UserUploadVersion", - fields=[ - ( - "id", - models.AutoField( - auto_created=True, - primary_key=True, - serialize=False, - verbose_name="ID", - ), - ), - ("max_dimension", models.TextField()), - ( - "file", - models.ImageField( - upload_to=bookwyrm.models.user_upload.user_upload_version_directory_path - ), - ), - ( - "user_upload", - models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - to="bookwyrm.userupload", - ), - ), - ], - ), - ] diff --git a/bookwyrm/migrations/0228_merge_20260222_0352.py b/bookwyrm/migrations/0228_merge_20260222_0352.py deleted file mode 100644 index 208b241124..0000000000 --- a/bookwyrm/migrations/0228_merge_20260222_0352.py +++ /dev/null @@ -1,13 +0,0 @@ -# Generated by Django 5.2.9 on 2026-02-22 03:52 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ("bookwyrm", "0218_rename_file_userupload_original_file_and_more"), - ("bookwyrm", "0227_edition_bookwyrm_ed_parent__c4f87c_idx_and_more"), - ] - - operations = [] diff --git a/bookwyrm/migrations/0229_userupload_status_and_more.py b/bookwyrm/migrations/0229_userupload_status_and_more.py deleted file mode 100644 index bada32ee41..0000000000 --- a/bookwyrm/migrations/0229_userupload_status_and_more.py +++ /dev/null @@ -1,44 +0,0 @@ -# Generated by Django 5.2.9 on 2026-02-22 05:14 - -import django.db.models.deletion -from django.conf import settings -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ("bookwyrm", "0228_merge_20260222_0352"), - ] - - operations = [ - migrations.AddField( - model_name="userupload", - name="status", - field=models.ForeignKey( - blank=True, - null=True, - on_delete=django.db.models.deletion.CASCADE, - related_name="user_image_uploads", - to="bookwyrm.status", - ), - ), - migrations.AlterField( - model_name="userupload", - name="user", - field=models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name="user_uploads", - to=settings.AUTH_USER_MODEL, - ), - ), - migrations.AlterField( - model_name="useruploadversion", - name="user_upload", - field=models.ForeignKey( - on_delete=django.db.models.deletion.CASCADE, - related_name="versions", - to="bookwyrm.userupload", - ), - ), - ] diff --git a/bookwyrm/migrations/0230_merge_20260326_0357.py b/bookwyrm/migrations/0230_merge_20260326_0357.py deleted file mode 100644 index 9b4492fe6a..0000000000 --- a/bookwyrm/migrations/0230_merge_20260326_0357.py +++ /dev/null @@ -1,13 +0,0 @@ -# Generated by Django 5.2.9 on 2026-03-26 03:57 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ("bookwyrm", "0228_remove_user_bookwyrm_us_is_acti_972dc4_idx_and_more"), - ("bookwyrm", "0229_userupload_status_and_more"), - ] - - operations = [] diff --git a/bookwyrm/migrations/0232_merge_20260527_0333.py b/bookwyrm/migrations/0232_merge_20260527_0333.py deleted file mode 100644 index b9ea5aece8..0000000000 --- a/bookwyrm/migrations/0232_merge_20260527_0333.py +++ /dev/null @@ -1,13 +0,0 @@ -# Generated by Django 5.2.9 on 2026-05-27 03:33 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ("bookwyrm", "0230_merge_20260326_0357"), - ("bookwyrm", "0231_sitesettings_block_incoming_search_and_more"), - ] - - operations = [] diff --git a/bookwyrm/migrations/0240_userupload_useruploadversion.py b/bookwyrm/migrations/0240_userupload_useruploadversion.py new file mode 100644 index 0000000000..260beafa2f --- /dev/null +++ b/bookwyrm/migrations/0240_userupload_useruploadversion.py @@ -0,0 +1,36 @@ +# Generated by Django 5.2.14 on 2026-06-24 23:45 + +import bookwyrm.models.user_upload +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('bookwyrm', '0239_alter_list_options_alter_listitem_options_and_more'), + ] + + operations = [ + migrations.CreateModel( + name='UserUpload', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('original_name', models.TextField()), + ('original_content_type', models.TextField()), + ('original_file', models.ImageField(upload_to=bookwyrm.models.user_upload.user_upload_directory_path)), + ('status', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='user_image_uploads', to='bookwyrm.status')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='user_uploads', to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='UserUploadVersion', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('max_dimension', models.TextField()), + ('file', models.ImageField(upload_to=bookwyrm.models.user_upload.user_upload_version_directory_path)), + ('user_upload', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='versions', to='bookwyrm.userupload')), + ], + ), + ] From a948adf080bcc9c7ba56156b3c90bc3f2750f475 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Wed, 24 Jun 2026 16:55:34 -0700 Subject: [PATCH 839/962] Fixes misplaced if statement in template --- bookwyrm/templates/book/suggestion_list/list.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/templates/book/suggestion_list/list.html b/bookwyrm/templates/book/suggestion_list/list.html index b0eac4bf57..f0a133fac7 100644 --- a/bookwyrm/templates/book/suggestion_list/list.html +++ b/bookwyrm/templates/book/suggestion_list/list.html @@ -17,8 +17,8 @@

      -
      {% if suggestion_list %} +
      {% if items|length == 0 %}
      From 95a8637d4488331a3f44fa0f3f55b909a5387d24 Mon Sep 17 00:00:00 2001 From: Ilkka Ollakka Date: Thu, 25 Jun 2026 14:19:03 +0300 Subject: [PATCH 840/962] backup-job: fix database user and database name variables We don't define all .env file to backup-job, only specific ones. So use those specific env-variables in backup-job. --- postgres-docker/backup.sh | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/postgres-docker/backup.sh b/postgres-docker/backup.sh index fdcb251d2c..c978596818 100755 --- a/postgres-docker/backup.sh +++ b/postgres-docker/backup.sh @@ -1,14 +1,14 @@ #!/bin/bash info() { echo >&2 "[$(date --iso-8601=seconds)] $*"; } -if [ -z "$POSTGRES_DB" ]; then +if [ -z "$PGDATABASE" ]; then info "backup: Database not specified, defaulting to bookwyrm" fi -if [ -z "$POSTGRES_USER" ]; then +if [ -z "$PGUSER" ]; then info "backup: Database user not specified, defaulting to bookwyrm" fi -BACKUP_DB=${POSTGRES_DB:-bookwyrm} -BACKUP_USER=${POSTGRES_USER:-bookwyrm} +BACKUP_DB=${PGDATABASE:-bookwyrm} +BACKUP_USER=${PGUSER:-bookwyrm} filename=backup_${BACKUP_DB}_$(date +%F) pg_dump -U "${BACKUP_USER}" "${BACKUP_DB}" --file "/backups/$filename.sql" info "backup: completed backup of $BACKUP_DB to /backups/$filename.sql" From e9d1cfa7de1e66c57963fa2e810a78d6b23afe9d Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Thu, 25 Jun 2026 09:34:57 -0700 Subject: [PATCH 841/962] Suggestion list in the sidebar --- bookwyrm/templates/book/book.html | 30 +++++----- bookwyrm/templates/book/file_links/links.html | 2 +- bookwyrm/templates/book/sections/lists.html | 2 + bookwyrm/templates/book/sections/reviews.html | 4 -- .../book/suggestion_list/book_card.html | 58 +++++++++++-------- .../templates/book/suggestion_list/list.html | 34 +++++------ bookwyrm/templates/lists/list_item_notes.html | 2 - 7 files changed, 66 insertions(+), 66 deletions(-) diff --git a/bookwyrm/templates/book/book.html b/bookwyrm/templates/book/book.html index 952ef56ebc..b6804d4ff6 100644 --- a/bookwyrm/templates/book/book.html +++ b/bookwyrm/templates/book/book.html @@ -32,14 +32,19 @@
      -
      +
      {% include "book/sections/cover.html" %}
      {% include 'snippets/shelve_button/shelve_button.html' %}
      + + {% include "book/sections/lists.html" %} +
      -
      +
      {% include "book/sections/description.html" %}
      @@ -52,28 +57,21 @@
      {% include "book/sections/reading.html" %}
      + +
      + {% include "book/sections/reviews.html" %} +
      -
      - {% include "book/sections/lists.html" %} -
      -
      -{% include "book/suggestion_list/list.html" %} -
      - - - -
      -{% include "book/sections/reviews.html" %} -
      - {% endwith %} {% endblock %} diff --git a/bookwyrm/templates/book/file_links/links.html b/bookwyrm/templates/book/file_links/links.html index febc39e56c..f1d53952e3 100644 --- a/bookwyrm/templates/book/file_links/links.html +++ b/bookwyrm/templates/book/file_links/links.html @@ -6,7 +6,7 @@ {% if links.exists or request.user.is_authenticated %}
      -

      {% trans "Get a copy" %}

      +

      {% trans "Get a copy" %}

      {% if can_edit_book %}
      diff --git a/bookwyrm/templates/book/sections/lists.html b/bookwyrm/templates/book/sections/lists.html index a797bf9ade..a8e2e25d76 100644 --- a/bookwyrm/templates/book/sections/lists.html +++ b/bookwyrm/templates/book/sections/lists.html @@ -2,12 +2,14 @@ {% if lists.exists or list_options.exists %}
      + {% if lists.exists %}

      {% trans "Lists" %}

      + {% endif %} {% if list_options.exists %}
      diff --git a/bookwyrm/templates/book/sections/reviews.html b/bookwyrm/templates/book/sections/reviews.html index 3f7fa9601c..bb99e52f4e 100644 --- a/bookwyrm/templates/book/sections/reviews.html +++ b/bookwyrm/templates/book/sections/reviews.html @@ -1,8 +1,6 @@ {% load i18n %} {% load utilities %} - -

      {% trans "Reviews" %}

      {% if user_authenticated %}
      @@ -73,5 +71,3 @@

      {% trans "Add your thoughts" %}

      {% include 'snippets/pagination.html' with page=statuses path=request.path anchor="#reviews" %}
      - -
      diff --git a/bookwyrm/templates/book/suggestion_list/book_card.html b/bookwyrm/templates/book/suggestion_list/book_card.html index fdcdf4b81f..4628956ca6 100644 --- a/bookwyrm/templates/book/suggestion_list/book_card.html +++ b/bookwyrm/templates/book/suggestion_list/book_card.html @@ -2,43 +2,51 @@ {% load book_display_tags %} {% load utilities %} -
      -
      +
      +
      +
      + +
      + {% url 'user-feed' item.user|username as user_path %} + + {% if item.notes %} + {% blocktrans trimmed with user_link=item.user|user_link %} + {{ user_link }} says: + {% endblocktrans %} + {% else %} + {% blocktrans trimmed with user_link=item.user|user_link %} + {{ user_link }} recommends: + {% endblocktrans %} + {% endif %} +
      +
      + {% with item_book=item.work.default_edition %} -
      +
      + -
      -

      - {% include 'snippets/book_titleby.html' with book=item_book %} -

      - {% if item.notes %} - {% include "lists/list_item_notes.html" with list=book.suggestion_list hide_edit=True no_trim=False trim_length=15 %} - {% else %} -
      - {% with full=item_book|book_description %} - {% include 'snippets/trimmed_text.html' with trim_length=15 hide_more=True %} - {% endwith %} -
      - {% endif %} + {% if item.notes %} +
      + {% include 'snippets/trimmed_text.html' with full=item.notes trim_length=15 %}
      + {% endif %} +
      + {% include 'snippets/book_titleby.html' with book=item_book %} +
      +
      {% endwith %}
      -
    + {% endblock %} From 836265272789a7aaa38c144e96e630c2604e0f3e Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Thu, 9 Jul 2026 11:49:33 -0700 Subject: [PATCH 889/962] Sort bookwyrm connectors by active status and latest errors --- bookwyrm/views/admin/connectors.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/views/admin/connectors.py b/bookwyrm/views/admin/connectors.py index b8fd2d24f2..a7e767097f 100644 --- a/bookwyrm/views/admin/connectors.py +++ b/bookwyrm/views/admin/connectors.py @@ -45,7 +45,7 @@ def get(self, request): # other BookWyrm instances bookwrym_connectors = Connector.objects.filter( connector_file="bookwyrm_connector" - ).order_by("identifier") + ).order_by("-active", "latest_error", "identifier") # Optional and new connectors e.g. Finna # These are not yet Connector objects so we have to describe them in the From 995c24346722924ea0c9c51521fe9d79e055a0cc Mon Sep 17 00:00:00 2001 From: Patrick Childers <8558954+PatrickChildersIT@users.noreply.github.com> Date: Thu, 9 Jul 2026 13:08:51 -0400 Subject: [PATCH 890/962] null coalesce sort response to match implicit sort --- bookwyrm/views/shelf/shelf.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/views/shelf/shelf.py b/bookwyrm/views/shelf/shelf.py index 24de1ea885..ffdeb32cf0 100644 --- a/bookwyrm/views/shelf/shelf.py +++ b/bookwyrm/views/shelf/shelf.py @@ -110,7 +110,7 @@ def get(self, request, username, shelf_identifier=None): "books": page, "edit_form": forms.ShelfForm(instance=shelf if shelf_identifier else None), "create_form": forms.ShelfForm(), - "sort": request.GET.get("sort"), + "sort": request.GET.get("sort") or "-shelved_date", "page_range": paginated.get_elided_page_range( page.number, on_each_side=2, on_ends=1 ), From b67a7337b0546feb6050b56423c51b7222bbc1f2 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Thu, 9 Jul 2026 12:50:47 -0700 Subject: [PATCH 891/962] Spacing fix --- .../readthrough/readthrough_list.html | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/bookwyrm/templates/readthrough/readthrough_list.html b/bookwyrm/templates/readthrough/readthrough_list.html index 385422edf6..e9b6c05240 100644 --- a/bookwyrm/templates/readthrough/readthrough_list.html +++ b/bookwyrm/templates/readthrough/readthrough_list.html @@ -52,24 +52,24 @@ {% endif %}
  • -
    -
    - {% trans "Edit read dates" as button_text %} - -
    -
    - {% trans "Delete these read dates" as button_text %} - -
    -
    +
    +
    + {% trans "Edit read dates" as button_text %} + +
    +
    + {% trans "Delete these read dates" as button_text %} + +
    +
  • From 2ce7f6234ef0c526182739cd1bad351a42e1a69b Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Thu, 9 Jul 2026 13:07:26 -0700 Subject: [PATCH 892/962] Remove some divs --- bookwyrm/templates/components/details.html | 8 ++------ bookwyrm/templates/readthrough/readthrough_list.html | 2 +- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/bookwyrm/templates/components/details.html b/bookwyrm/templates/components/details.html index 5d9e1a6871..4a4642879c 100644 --- a/bookwyrm/templates/components/details.html +++ b/bookwyrm/templates/components/details.html @@ -1,8 +1,6 @@ {% load i18n %}
    -
    - {% block always-visible %}{% endblock %} -
    + {% block always-visible %}{% endblock %} {% if content_count > 1 %}
    @@ -10,9 +8,7 @@ {% trans "Show more" %} -
    - {% block sometimes-visible %}{% endblock %} -
    + {% block sometimes-visible %}{% endblock %}
    {% endif %}
    diff --git a/bookwyrm/templates/readthrough/readthrough_list.html b/bookwyrm/templates/readthrough/readthrough_list.html index e9b6c05240..89e474b870 100644 --- a/bookwyrm/templates/readthrough/readthrough_list.html +++ b/bookwyrm/templates/readthrough/readthrough_list.html @@ -3,7 +3,7 @@ {% load tz %} {% load utilities %}
    -
      +
        {% if readthrough.start_date %}
      • {% trans "Started:" %} {{ readthrough.start_date | localtime | naturalday }} From 4385964ab7f0ccf15e24064f69f7c910b8254d6c Mon Sep 17 00:00:00 2001 From: Patrick Childers <8558954+PatrickChildersIT@users.noreply.github.com> Date: Thu, 9 Jul 2026 16:11:31 -0400 Subject: [PATCH 893/962] unit test to ensure the shelf view has a sorting option --- bookwyrm/tests/views/shelf/test_shelf.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/bookwyrm/tests/views/shelf/test_shelf.py b/bookwyrm/tests/views/shelf/test_shelf.py index dc678e8ddd..1dd72beb7f 100644 --- a/bookwyrm/tests/views/shelf/test_shelf.py +++ b/bookwyrm/tests/views/shelf/test_shelf.py @@ -157,6 +157,25 @@ def test_shelf_page_sorted(self, *_): validate_html(result.render()) self.assertEqual(result.status_code, 200) + def test_shelf_implicit_sort(self, *_): + """ensure the shelf view always has a sort in its response""" + view = views.Shelf.as_view() + shelf = self.local_user.shelf_set.first() + request = self.factory.get("") + request.user = self.local_user + with patch("bookwyrm.views.shelf.shelf.is_api_request") as is_api: + is_api.return_value = False + result = view( + request, + username=self.local_user.username, + shelf_identifier=shelf.identifier, + ) + self.assertIsInstance(result, TemplateResponse) + validate_html(result.render()) + self.assertIsNotNone(result.context_data["sort"]) + self.assertNotEqual("", result.context_data["sort"]) + self.assertEqual(result.status_code, 200) + def test_shelf_page(self, *_): """there are so many views, this just makes sure it LOADS""" view = views.Shelf.as_view() From a2118dbb61a50f0ecd7ac35449419b57c5254987 Mon Sep 17 00:00:00 2001 From: phanky1 Date: Fri, 10 Jul 2026 21:00:06 +0700 Subject: [PATCH 894/962] Show feed filters badge whenever filters are in effect --- bookwyrm/models/user.py | 4 +++ .../snippets/filters_panel/filters_panel.html | 31 ++++++++++--------- bookwyrm/views/feed.py | 10 +++--- 3 files changed, 24 insertions(+), 21 deletions(-) diff --git a/bookwyrm/models/user.py b/bookwyrm/models/user.py index 3912a0ccf8..d71bc38184 100644 --- a/bookwyrm/models/user.py +++ b/bookwyrm/models/user.py @@ -256,6 +256,10 @@ def has_unread_mentions(self): notification_type__in=["REPLY", "MENTION", "TAG", "REPORT"], ).exists() + @property + def filters_applied(self): + return set(self.feed_status_types) != set(get_feed_filter_choices()) + activity_serializer = activitypub.Person @classmethod diff --git a/bookwyrm/templates/snippets/filters_panel/filters_panel.html b/bookwyrm/templates/snippets/filters_panel/filters_panel.html index 928b4f69b8..6bc1e9dc6d 100644 --- a/bookwyrm/templates/snippets/filters_panel/filters_panel.html +++ b/bookwyrm/templates/snippets/filters_panel/filters_panel.html @@ -1,25 +1,26 @@ {% load i18n %} -
        +
        {% trans "Filters" %} - {% if filters_applied %} - - {% trans "Filters are applied" %} - - {% endif %} - - {% if method != "post" and request.GET %} - - - {% trans "Filters are applied" %} + {% if feed_filters_applied is not None %} + {# Feed filters persist on the user record, not in the query string. #} + {% if feed_filters_applied %} + + {% trans "Filters are applied" %} + + {% endif %} + {% elif method != "post" and request.GET %} + + + {% trans "Filters are applied" %} + + + {% trans "Clear filters" %} + - - {% trans "Clear filters" %} - - {% endif %} diff --git a/bookwyrm/views/feed.py b/bookwyrm/views/feed.py index c14eea02f6..26f6d0c0fd 100644 --- a/bookwyrm/views/feed.py +++ b/bookwyrm/views/feed.py @@ -5,7 +5,7 @@ from django.core.paginator import Paginator from django.db.models import Prefetch, Q, prefetch_related_objects from django.http import HttpResponseNotFound, Http404 -from django.shortcuts import get_object_or_404 +from django.shortcuts import get_object_or_404, redirect from django.template.response import TemplateResponse from django.utils import timezone from django.utils.decorators import method_decorator @@ -28,17 +28,15 @@ class Feed(View): def post(self, request, tab): """save feed settings form, with a silent validation fail""" - filters_applied = False form = forms.FeedStatusTypesForm(request.POST, instance=request.user) if form.is_valid(): # workaround to avoid broadcasting this change user = form.save(request, commit=False) user.save(broadcast=False, update_fields=["feed_status_types"]) - filters_applied = True - return self.get(request, tab, filters_applied) + return redirect(request.path) - def get(self, request, tab, filters_applied=False): + def get(self, request, tab): """user's homepage with activity feed""" tab = [s for s in STREAMS if s["key"] == tab] tab = tab[0] if tab else STREAMS[0] @@ -84,7 +82,7 @@ def get(self, request, tab, filters_applied=False): "streams": STREAMS, "goal_form": forms.GoalForm(), "feed_status_types_options": FeedFilterChoices, - "filters_applied": filters_applied, + "feed_filters_applied": request.user.filters_applied, "path": f"/{tab['key']}", "annual_summary_year": get_annual_summary_year(), "has_tour": True, From 5ce2961bd858c636718eb272f99fa3b3d0231a6d Mon Sep 17 00:00:00 2001 From: phanky1 Date: Fri, 10 Jul 2026 23:52:58 +0700 Subject: [PATCH 895/962] Add tests --- bookwyrm/tests/models/test_user_model.py | 7 +++++++ bookwyrm/tests/views/test_feed.py | 11 +++++++++++ 2 files changed, 18 insertions(+) diff --git a/bookwyrm/tests/models/test_user_model.py b/bookwyrm/tests/models/test_user_model.py index 580fa02053..43b920ab9b 100644 --- a/bookwyrm/tests/models/test_user_model.py +++ b/bookwyrm/tests/models/test_user_model.py @@ -51,6 +51,13 @@ def test_computed_fields(self): self.assertIsNotNone(self.user.key_pair.private_key) self.assertIsNotNone(self.user.key_pair.public_key) + def test_filters_applied_all_types_selected(self): + self.assertFalse(self.user.filters_applied) + + def test_filters_applied_with_excluded_type(self): + self.user.feed_status_types = ["review"] + self.assertTrue(self.user.filters_applied) + def test_remote_user(self): with patch("bookwyrm.models.user.set_remote_server.delay"): user = models.User.objects.create_user( diff --git a/bookwyrm/tests/views/test_feed.py b/bookwyrm/tests/views/test_feed.py index 2ae3608307..e43bbc9821 100644 --- a/bookwyrm/tests/views/test_feed.py +++ b/bookwyrm/tests/views/test_feed.py @@ -84,6 +84,17 @@ def test_save_feed_settings(self, *_): self.local_user.refresh_from_db() self.assertEqual(self.local_user.feed_status_types, ["review"]) + @patch("bookwyrm.suggested_users.SuggestedUsers.get_suggestions") + def test_feed_shows_filters_applied_badge(self, *_): + self.local_user.feed_status_types = ["review"] + view = views.Feed.as_view() + request = self.factory.get("") + request.user = self.local_user + + result = view(request, "home") + + self.assertContains(result, "Filters are applied") + def test_status_page(self, *_): """there are so many views, this just makes sure it LOADS""" view = views.Status.as_view() From b4b84349342f372e7d26f2591b8c723a033f5b46 Mon Sep 17 00:00:00 2001 From: phanky1 Date: Sat, 11 Jul 2026 00:17:29 +0700 Subject: [PATCH 896/962] Redirect feed settings POST via reverse --- bookwyrm/tests/views/test_feed.py | 3 ++- bookwyrm/urls.py | 2 +- bookwyrm/views/feed.py | 2 +- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/bookwyrm/tests/views/test_feed.py b/bookwyrm/tests/views/test_feed.py index e43bbc9821..b12bee4eef 100644 --- a/bookwyrm/tests/views/test_feed.py +++ b/bookwyrm/tests/views/test_feed.py @@ -80,7 +80,8 @@ def test_save_feed_settings(self, *_): result = view(request, "home") - self.assertEqual(result.status_code, 200) + self.assertEqual(result.status_code, 302) + self.assertEqual(result.url, "/home") self.local_user.refresh_from_db() self.assertEqual(self.local_user.feed_status_types, ["review"]) diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py index 8370f7d9f7..068eafa7cd 100644 --- a/bookwyrm/urls.py +++ b/bookwyrm/urls.py @@ -515,7 +515,7 @@ name="get-started-users", ), # feeds - re_path(rf"^(?P{STREAMS})/?$", views.Feed.as_view()), + re_path(rf"^(?P{STREAMS})/?$", views.Feed.as_view(), name="feed"), re_path( r"^direct-messages/?$", views.DirectMessage.as_view(), name="direct-messages" ), diff --git a/bookwyrm/views/feed.py b/bookwyrm/views/feed.py index 26f6d0c0fd..ceb99bb876 100644 --- a/bookwyrm/views/feed.py +++ b/bookwyrm/views/feed.py @@ -34,7 +34,7 @@ def post(self, request, tab): user = form.save(request, commit=False) user.save(broadcast=False, update_fields=["feed_status_types"]) - return redirect(request.path) + return redirect("feed", tab=tab) def get(self, request, tab): """user's homepage with activity feed""" From 27e00aa1abee0ce4c67f04290a2055bdfa55907b Mon Sep 17 00:00:00 2001 From: Tem Revil Date: Sat, 11 Jul 2026 00:04:50 +0300 Subject: [PATCH 897/962] Avoid re-running the book-statuses UNION as a subquery add_book_statuses built a UNION of the four book-status querysets and then reused it twice more: once via values_list("thread_id") and once inside exclude(id__in=...values_list("id")). Embedding a UNION as a subquery makes Postgres re-execute the whole UNION each time, which is what pushed add_book_statuses_task from ~0.1s to several seconds per call on larger instances (#4026). Evaluate the UNION once into id/thread_id lists and reuse those, so the two follow-up lookups filter on plain id lists instead of a UNION subquery. Same statuses are added; behaviour is unchanged. Applied the same change to remove_book_statuses and the HomeStream override, which share the pattern. Fixes #4026 --- bookwyrm/activitystreams.py | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/bookwyrm/activitystreams.py b/bookwyrm/activitystreams.py index 2e6e9933d5..1a4ef4a450 100644 --- a/bookwyrm/activitystreams.py +++ b/bookwyrm/activitystreams.py @@ -217,10 +217,16 @@ def add_book_statuses(self, user, book): self.bulk_add_objects_to_store(book_statuses, self.stream_id(user.id)) - threads = book_statuses.values_list("thread_id", flat=True) - thread_statuses = statuses.exclude( - id__in=book_statuses.values_list("id", flat=True) - ).filter(thread_id__in=threads) + # Evaluate the union once instead of embedding it as a subquery in the + # two lookups below: reusing the union queryset inside ``id__in`` / + # ``thread_id__in`` makes Postgres re-run the whole UNION each time, + # which is what makes the book-status tasks slow. + book_status_rows = list(book_statuses.values_list("id", "thread_id")) + book_status_ids = [row[0] for row in book_status_rows] + threads = [row[1] for row in book_status_rows] + thread_statuses = statuses.exclude(id__in=book_status_ids).filter( + thread_id__in=threads + ) self.bulk_add_objects_to_store(thread_statuses, self.stream_id(user.id)) @@ -242,10 +248,13 @@ def remove_book_statuses(self, user, book): self.bulk_remove_objects_from_store(book_statuses, self.stream_id(user.id)) - threads = book_statuses.values_list("thread_id", flat=True) - thread_statuses = statuses.exclude( - id__in=book_statuses.values_list("id", flat=True) - ).filter(thread_id__in=threads) + # Evaluate the union once; see add_book_statuses for the rationale. + book_status_rows = list(book_statuses.values_list("id", "thread_id")) + book_status_ids = [row[0] for row in book_status_rows] + threads = [row[1] for row in book_status_rows] + thread_statuses = statuses.exclude(id__in=book_status_ids).filter( + thread_id__in=threads + ) self.bulk_remove_objects_from_store(thread_statuses, self.stream_id(user.id)) @@ -305,10 +314,13 @@ def add_book_statuses(self, user, book): self.bulk_add_objects_to_store(book_statuses, self.stream_id(user.id)) - threads = book_statuses.values_list("thread_id", flat=True) - thread_statuses = statuses.exclude( - id__in=book_statuses.values_list("id", flat=True) - ).filter(thread_id__in=threads) + # Evaluate the union once; see add_book_statuses for the rationale. + book_status_rows = list(book_statuses.values_list("id", "thread_id")) + book_status_ids = [row[0] for row in book_status_rows] + threads = [row[1] for row in book_status_rows] + thread_statuses = statuses.exclude(id__in=book_status_ids).filter( + thread_id__in=threads + ) self.bulk_add_objects_to_store(thread_statuses, self.stream_id(user.id)) From 446c412f5c008e8619df00fd953b3ab5a1dd4527 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 11 Jul 2026 01:33:47 +0000 Subject: [PATCH 898/962] Bump mistune from 3.2.1 to 3.3.0 Bumps [mistune](https://github.com/lepture/mistune) from 3.2.1 to 3.3.0. - [Release notes](https://github.com/lepture/mistune/releases) - [Changelog](https://github.com/lepture/mistune/blob/main/docs/changes.rst) - [Commits](https://github.com/lepture/mistune/compare/v3.2.1...v3.3.0) --- updated-dependencies: - dependency-name: mistune dependency-version: 3.3.0 dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index dc71e19252..07ceaa3198 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -22,7 +22,7 @@ main = [ "gunicorn==25.0.3", "hiredis==2.3.2", "libsass==0.23.0", - "mistune==3.2.1", + "mistune==3.3.0", "opentelemetry-api==1.24.0", "opentelemetry-exporter-otlp-proto-grpc==1.24.0", "opentelemetry-instrumentation-celery==0.45b0", From f5047070ff602b33fb642d0b21f3654df2a3e7e4 Mon Sep 17 00:00:00 2001 From: Hugh Rundle Date: Sat, 11 Jul 2026 13:19:35 +1000 Subject: [PATCH 899/962] fix reports admin page when no reported_user --- bookwyrm/models/report.py | 4 +++- bookwyrm/templates/settings/reports/report_header.html | 6 ++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/bookwyrm/models/report.py b/bookwyrm/models/report.py index 894ad6a14e..825eeb219b 100644 --- a/bookwyrm/models/report.py +++ b/bookwyrm/models/report.py @@ -60,7 +60,9 @@ def to_activity_dataclass(self, **kwargs): def object(self): """Generate a list of reported objects in a format Mastodon will like""" - items = [self.reported_user.remote_id] + items = [] + if self.reported_user and hasattr(self.reported_user, "remote_id"): + items.append(self.reported_user.remote_id) if self.statuses: items += self.statuses.values_list("remote_id", flat=True) diff --git a/bookwyrm/templates/settings/reports/report_header.html b/bookwyrm/templates/settings/reports/report_header.html index 0c610f2df4..57bd110f4b 100644 --- a/bookwyrm/templates/settings/reports/report_header.html +++ b/bookwyrm/templates/settings/reports/report_header.html @@ -3,9 +3,15 @@ {% if report.statuses.exists %} +{% if report.reported_user %} {% blocktrans trimmed with report_id=report.id username=report.reported_user|username %} Report #{{ report_id }}: Status posted by @{{ username }} {% endblocktrans %} +{% else %} +{% blocktrans trimmed with report_id=report.id %} +Report #{{ report_id }} +{% endblocktrans %} +{% endif %} {% elif report.links.exists %} From 0b4373aae06391d1c544b91a40978caee692111f Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Sat, 11 Jul 2026 10:55:59 -0700 Subject: [PATCH 900/962] Only execute query once in redis function Plus some typing --- bookwyrm/redis_store.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/bookwyrm/redis_store.py b/bookwyrm/redis_store.py index 4d2262a408..963b94ac62 100644 --- a/bookwyrm/redis_store.py +++ b/bookwyrm/redis_store.py @@ -1,7 +1,10 @@ """access the activity stores stored in redis""" from abc import ABC, abstractmethod +from typing import Any + import redis +from django.db.models.query import QuerySet from bookwyrm import settings @@ -45,27 +48,28 @@ def remove_object_from_stores(self, obj, stores): pipeline.zrem(store, -1, obj_id) pipeline.execute() - def bulk_add_objects_to_store(self, objs, store): + def bulk_add_objects_to_store(self, objs: QuerySet[Any], store: str) -> None: """add a list of objects to a given store""" pipeline = r.pipeline() - for obj in objs[: self.max_length]: + max_length_objs = objs[: self.max_length] + for obj in max_length_objs: pipeline.zadd(store, self.get_value(obj)) - if objs and self.max_length: + if max_length_objs and self.max_length: pipeline.zremrangebyrank(store, 0, -1 * self.max_length) pipeline.execute() - def bulk_remove_objects_from_store(self, objs, store): + def bulk_remove_objects_from_store(self, objs: QuerySet[Any], store: str) -> None: """remove a list of objects from a given store""" pipeline = r.pipeline() for obj in objs[: self.max_length]: pipeline.zrem(store, -1, obj.id) pipeline.execute() - def get_store(self, store, **kwargs): + def get_store(self, store: str, **kwargs) -> list[int]: """load the values in a store""" return r.zrevrange(store, 0, -1, **kwargs) - def populate_store(self, store): + def populate_store(self, store: str) -> None: """go from zero to a store""" pipeline = r.pipeline() queryset = self.get_objects_for_store(store) From aff4b64a0f77dd884219f759a2fdcd99e4174433 Mon Sep 17 00:00:00 2001 From: Tem Revil Date: Sat, 11 Jul 2026 23:18:41 +0300 Subject: [PATCH 901/962] Unzip book_statuses with zip() instead of two list comprehensions Per review from mouse-reeve: zip() over the materialized rows is a little more direct than looping the row list twice to pull out ids and thread_ids separately. Guard the empty case explicitly, since a bare zip(*book_statuses.values_list(...)) raises ValueError when book_statuses is empty (a book with no comments, quotes, reviews, or mentions yet), which the list-comprehension version handled fine. --- bookwyrm/activitystreams.py | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/bookwyrm/activitystreams.py b/bookwyrm/activitystreams.py index 1a4ef4a450..7c8f3a549a 100644 --- a/bookwyrm/activitystreams.py +++ b/bookwyrm/activitystreams.py @@ -222,8 +222,9 @@ def add_book_statuses(self, user, book): # ``thread_id__in`` makes Postgres re-run the whole UNION each time, # which is what makes the book-status tasks slow. book_status_rows = list(book_statuses.values_list("id", "thread_id")) - book_status_ids = [row[0] for row in book_status_rows] - threads = [row[1] for row in book_status_rows] + book_status_ids, threads = ( + zip(*book_status_rows) if book_status_rows else ((), ()) + ) thread_statuses = statuses.exclude(id__in=book_status_ids).filter( thread_id__in=threads ) @@ -250,8 +251,9 @@ def remove_book_statuses(self, user, book): # Evaluate the union once; see add_book_statuses for the rationale. book_status_rows = list(book_statuses.values_list("id", "thread_id")) - book_status_ids = [row[0] for row in book_status_rows] - threads = [row[1] for row in book_status_rows] + book_status_ids, threads = ( + zip(*book_status_rows) if book_status_rows else ((), ()) + ) thread_statuses = statuses.exclude(id__in=book_status_ids).filter( thread_id__in=threads ) @@ -316,8 +318,9 @@ def add_book_statuses(self, user, book): # Evaluate the union once; see add_book_statuses for the rationale. book_status_rows = list(book_statuses.values_list("id", "thread_id")) - book_status_ids = [row[0] for row in book_status_rows] - threads = [row[1] for row in book_status_rows] + book_status_ids, threads = ( + zip(*book_status_rows) if book_status_rows else ((), ()) + ) thread_statuses = statuses.exclude(id__in=book_status_ids).filter( thread_id__in=threads ) From 17e3aa4a832a90a493dccd5878be5a9ea94bb1b3 Mon Sep 17 00:00:00 2001 From: Patrick Childers <8558954+PatrickChildersIT@users.noreply.github.com> Date: Mon, 13 Jul 2026 00:56:53 -0400 Subject: [PATCH 902/962] smooth CSS half-stars but with bad default CSS --- .../css/bookwyrm/components/_stars.scss | 62 ++++++++++++++----- .../templates/snippets/form_rate_stars.html | 46 ++++++-------- 2 files changed, 67 insertions(+), 41 deletions(-) diff --git a/bookwyrm/static/css/bookwyrm/components/_stars.scss b/bookwyrm/static/css/bookwyrm/components/_stars.scss index db2772dc05..d31cb4aab0 100644 --- a/bookwyrm/static/css/bookwyrm/components/_stars.scss +++ b/bookwyrm/static/css/bookwyrm/components/_stars.scss @@ -13,8 +13,9 @@ * * Specificity makes hovering taking over checked inputs. * - * \e9d9: filled star * \e9d7: empty star; + * \e9d8: half-filled star; + * \e9d9: filled star * -------------------------------------------------------------------------- */ .form-rate-stars { @@ -26,31 +27,62 @@ content: "\e9d9"; /* icon-star-full */ } -/* Icons directly following half star inputs are marked as half */ -.form-rate-stars input.half:checked ~ .icon::before { +// if a star container has a half-input checked, its icon is a half-star +.form-rate-stars .star-container:has(input.half:checked) .icon::before { content: "\e9d8"; /* icon-star-half */ } -/* stylelint-disable no-descending-specificity */ -.form-rate-stars input.half:checked + input + .icon:hover::before { - content: "\e9d8" !important; /* icon-star-half */ +// if a star container has a full-input checked, its icon is a full-star +.form-rate-stars .star-container:has(input.full:checked) .icon::before { + content: "\e9d9"; /* icon-star-full */ } -/* Icons directly following half check inputs that follow the checked input are emptied. */ -.form-rate-stars input.half:checked + input + .icon ~ .icon::before { +// stars following stars with checked inputs have icons that are empty +.form-rate-stars .star-container:has(input:checked) ~ .star-container .icon::before { content: "\e9d7"; /* icon-star-empty */ } -/* Icons directly following inputs that follow the checked input are emptied. */ -.form-rate-stars input:checked ~ input + .icon::before { - content: "\e9d7"; /* icon-star-empty */ +// When a star is hovered, pre-fill all icons as full +.form-rate-stars:hover .icon::before +{ + content: "\e9d9" !important; /* icon-star-full */ } -/* When a label is hovered, repeat the fill-all-then-empty-following pattern. */ -.form-rate-stars:hover .icon.icon::before { +// when an star is hovered, following icons are emptied +.form-rate-stars .star-container:hover ~ .star-container .icon::before +{ + content: "\e9d7" !important; /* icon-star-empty */ +} + +// if you hover over a star's half-input make its icon a half-star +.inputs-container:has(input.half:hover) + .icon::before +{ + content: "\e9d8" !important; /* icon-star-half */ +} + +// if you hover over a star's full-input make its icon a full-star +.inputs-container:has(input.full:hover) + .icon::before +{ content: "\e9d9" !important; /* icon-star-full */ } -.form-rate-stars .icon:hover ~ .icon::before { - content: "\e9d7" !important; /* icon-star-empty */ +.form-rate-stars input.half { + width: 0.75rem !important; + position:relative; + +} +.form-rate-stars input.full { + width: 0.75rem !important; + position:relative; + opacity: 0; + pointer-events: none; +} + +.form-rate-stars .star-container { + position: relative; +} + +.inputs-container { + position: absolute; + opacity: 0; } diff --git a/bookwyrm/templates/snippets/form_rate_stars.html b/bookwyrm/templates/snippets/form_rate_stars.html index 8cc405abba..ec3210b3ae 100644 --- a/bookwyrm/templates/snippets/form_rate_stars.html +++ b/bookwyrm/templates/snippets/form_rate_stars.html @@ -21,32 +21,25 @@ {% for i in '12345'|make_list %} - - 0 and default_rating > forloop.counter0 %}checked{% endif %} - /> - = forloop.counter %}checked{% endif %} - /> +
        +
        + 0 and default_rating > forloop.counter0 %}checked{% endif %} + /> + = forloop.counter %}checked{% endif %} + /> +
      • - {% include 'snippets/report_button.html' with user=user class="is-fullwidth" %} + {% include 'snippets/remote_follow_button.html' with user=user class="is-fullwidth is-light" %}
      • - {% include 'snippets/block_button.html' with user=user class="is-fullwidth" blocks=False %} + {% include 'snippets/report_button.html' with user=user class="is-fullwidth" %}
      • - {% include 'snippets/remote_follow_button.html' with user=user class="is-fullwidth is-light" %} + {% include 'snippets/block_button.html' with user=user class="is-fullwidth" blocks=False %}
      • {% if followers_page %}
      • From 1793549b418a29e3d9be66fc9b554007454c13f9 Mon Sep 17 00:00:00 2001 From: Patrick Childers <8558954+PatrickChildersIT@users.noreply.github.com> Date: Tue, 4 Aug 2026 17:48:40 -0400 Subject: [PATCH 953/962] better autocomplete using regex --- bookwyrm/static/js/autocomplete.js | 170 +++++------------------------ 1 file changed, 25 insertions(+), 145 deletions(-) diff --git a/bookwyrm/static/js/autocomplete.js b/bookwyrm/static/js/autocomplete.js index 6836d356d8..5ce9ed35e0 100644 --- a/bookwyrm/static/js/autocomplete.js +++ b/bookwyrm/static/js/autocomplete.js @@ -1,6 +1,28 @@ (function () { "use strict"; + const mimeTypes = [ + "AAC", + "AZW", + "Daisy", + "EPUB", + "FB2", + "FB3", + "FLAC", + "HTML", + "M4A", + "M4B", + "MOBI", + "MP3", + "OGG", + "PDF", + "Plaintext", + "Print book" + ]; + + const regexEscape = (string) => string.replace(/[$^*()-+.?[]{}|\\\/]/g, '\\$&'); + + /** * Suggest a completion as a user types * @@ -18,15 +40,14 @@ function autocomplete(event) { const input = event.target; - // Get suggestions - let trie = tries[input.getAttribute("data-autocomplete")]; + const cleanInput = regexEscape(input.value); - let suggestions = getSuggestions(input.value, trie); + const suggestions = mimeTypes.filter(mimeType => RegExp("^" + cleanInput, "i").test(mimeType)); const boxId = input.getAttribute("list"); // Create suggestion box, if needed - let suggestionsBox = document.getElementById(boxId); + const suggestionsBox = document.getElementById(boxId); // Clear existing suggestions suggestionsBox.innerHTML = ""; @@ -40,149 +61,8 @@ }); } - function getSuggestions(input, trie) { - // Follow the trie through the provided input - input = input.toLowerCase(); - - input.split("").forEach((letter) => { - if (!trie) { - return; - } - - trie = trie[letter]; - }); - - if (!trie) { - return []; - } - - return searchTrie(trie); - } - - function searchTrie(trie) { - const options = Object.values(trie); - - if (typeof trie == "string") { - return [trie]; - } - - return options - .map((option) => { - const newTrie = option; - - if (typeof newTrie == "string") { - return [newTrie]; - } - - return searchTrie(newTrie); - }) - .reduce((prev, next) => prev.concat(next)); - } - document.querySelectorAll("[data-autocomplete]").forEach((input) => { input.addEventListener("input", autocomplete); }); })(); -const tries = { - mimetype: { - a: { - a: { - c: "AAC", - }, - z: { - w: "AZW", - }, - }, - d: { - a: { - i: { - s: { - y: "Daisy", - }, - }, - }, - }, - e: { - p: { - u: { - b: "EPUB", - }, - }, - }, - f: { - b: { - 2: "FB2", - 3: "FB3", - }, - l: { - a: { - c: "FLAC", - }, - }, - }, - h: { - t: { - m: { - l: "HTML", - }, - }, - }, - m: { - 4: { - a: "M4A", - b: "M4B", - }, - o: { - b: { - i: "MOBI", - }, - }, - p: { - 3: "MP3", - }, - }, - o: { - g: { - g: "OGG", - }, - }, - p: { - d: { - f: "PDF", - }, - l: { - a: { - i: { - n: { - t: { - e: { - x: { - t: "Plaintext", - }, - }, - }, - }, - }, - }, - }, - r: { - i: { - n: { - t: { - " ": { - b: { - o: { - o: { - k: "Print book", - }, - }, - }, - }, - }, - }, - }, - }, - }, - }, -}; From ebb53dd36cfde4f335a71218ca61246ac257b0e5 Mon Sep 17 00:00:00 2001 From: Patrick Childers <8558954+PatrickChildersIT@users.noreply.github.com> Date: Tue, 4 Aug 2026 17:52:09 -0400 Subject: [PATCH 954/962] completely remove addRemoveClass, instead dedicate functions to small utility of not having to write classList.add or classList.remove --- bookwyrm/static/js/bookwyrm.js | 130 +++++++++++++++++------------ bookwyrm/static/js/localstorage.js | 10 ++- bookwyrm/static/js/status_cache.js | 73 ++++++---------- 3 files changed, 109 insertions(+), 104 deletions(-) diff --git a/bookwyrm/static/js/bookwyrm.js b/bookwyrm/static/js/bookwyrm.js index 3f155218b4..abc76bdad6 100644 --- a/bookwyrm/static/js/bookwyrm.js +++ b/bookwyrm/static/js/bookwyrm.js @@ -145,7 +145,7 @@ let BookWyrm = new (class { * @return {undefined} */ updateCountElement(counter, data) { - let count = data.count; + const count = data.count; if (count === undefined) { return; @@ -155,9 +155,18 @@ let BookWyrm = new (class { const hasMentions = data.has_mentions; if (count != currentCount) { - this.addRemoveClass(counter.closest("[data-poll-wrapper]"), "is-hidden", count < 1); + const wrapper = counter.closest("[data-poll-wrapper]"); + if(count < 1) { + this.classHide(wrapper); + } else { + this.classShow(wrapper); + } counter.innerText = count; - this.addRemoveClass(counter.closest("[data-poll-wrapper]"), "is-danger", hasMentions); + if(hasMentions) { + this.classList.add("is-danger"); + } else { + this.classList.remove("is-danger"); + } } } @@ -168,11 +177,11 @@ let BookWyrm = new (class { * @return {undefined} */ revealForm(event) { - let trigger = event.currentTarget; - let hidden = trigger.closest(".hidden-form").querySelectorAll(".is-hidden")[0]; + const trigger = event.currentTarget; + const hidden = trigger.closest(".hidden-form").querySelectorAll(".is-hidden")[0]; if (hidden) { - this.addRemoveClass(hidden, "is-hidden", !hidden); + this.classShow(hidden); } } @@ -183,11 +192,11 @@ let BookWyrm = new (class { * @return {undefined} */ hideForm(event) { - let trigger = event.currentTarget; - let targetId = trigger.dataset.hides; - let visible = document.getElementById(targetId); + const trigger = event.currentTarget; + const targetId = trigger.dataset.hides; + const visible = document.getElementById(targetId); - this.addRemoveClass(visible, "is-hidden", true); + this.classHide(visible); } /** @@ -197,9 +206,9 @@ let BookWyrm = new (class { * @return {undefined} */ hideSelf(event) { - let trigger = event.currentTarget; + const trigger = event.currentTarget; - this.addRemoveClass(trigger, "is-hidden", true); + this.classHide(trigger); } /** @@ -209,13 +218,13 @@ let BookWyrm = new (class { * @return {undefined} */ toggleAction(event) { - let trigger = event.currentTarget; + const trigger = event.currentTarget; if (!trigger.dataset.allowDefault || event.currentTarget == event.target) { event.preventDefault(); } - let pressed = trigger.getAttribute("aria-pressed") === "false"; - let targetId = trigger.dataset.controls; + const pressed = trigger.getAttribute("aria-pressed") === "false"; + const targetId = trigger.dataset.controls; // Toggle pressed status on all triggers controlling the same target. document @@ -229,10 +238,15 @@ let BookWyrm = new (class { // @todo Find a better way to handle the exception. if (targetId && !trigger.classList.contains("pulldown-menu")) { - let target = document.getElementById(targetId); + const target = document.getElementById(targetId); - this.addRemoveClass(target, "is-hidden", !pressed); - this.addRemoveClass(target, "is-active", pressed); + if(pressed) { + this.classShow(target); + this.classActivate(target); + } else { + this.classHide(target); + this.classDeactivate(target); + } } // Show/hide pulldown-menus. @@ -241,28 +255,28 @@ let BookWyrm = new (class { } // Show/hide container. - let container = document.getElementById("hide_" + targetId); + const container = document.getElementById("hide_" + targetId); if (container) { this.toggleContainer(container, pressed); } // Check checkbox, if appropriate. - let checkbox = trigger.dataset.controlsCheckbox; + const checkbox = trigger.dataset.controlsCheckbox; if (checkbox) { this.toggleCheckbox(checkbox, pressed); } // Toggle form disabled, if appropriate - let disable = trigger.dataset.disables; + const disable = trigger.dataset.disables; if (disable) { this.toggleDisabled(disable, !pressed); } // Set focus, if appropriate. - let focus = trigger.dataset.focusTarget; + const focus = trigger.dataset.focusTarget; if (focus) { this.toggleFocus(focus); @@ -278,14 +292,18 @@ let BookWyrm = new (class { * @return {undefined} */ toggleMenu(trigger, targetId) { - let expanded = trigger.getAttribute("aria-expanded") == "false"; + const expanded = trigger.getAttribute("aria-expanded") == "false"; trigger.setAttribute("aria-expanded", expanded); if (targetId) { - let target = document.getElementById(targetId); + const target = document.getElementById(targetId); - this.addRemoveClass(target, "is-active", expanded); + if(expanded) { + this.classActivate(target); + } else { + this.classDeactivate(target); + } } } @@ -297,7 +315,11 @@ let BookWyrm = new (class { * @return {undefined} */ toggleContainer(container, pressed) { - this.addRemoveClass(container, "is-hidden", pressed); + if(pressed) { + this.classHide(container); + } else { + this.classShow(container); + } } /** @@ -330,7 +352,7 @@ let BookWyrm = new (class { * @return {undefined} */ toggleFocus(nodeId) { - let node = document.getElementById(nodeId); + const node = document.getElementById(nodeId); node.focus(); @@ -355,11 +377,14 @@ let BookWyrm = new (class { // Toggle class on all related forms. relatedforms.forEach((relatedForm) => - bookwyrm.addRemoveClass( - relatedForm, - "is-hidden", - relatedForm.className.indexOf("is-hidden") == -1 - ) + { + const isHidden = relatedForm.className.indexOf("is-hidden") == -1; + if(isHidden) { + bookwyrm.classShow(relatedForm); + } else { + bookwyrm.classHide(relatedForm); + } + } ); this.ajaxPost(form).catch((error) => { @@ -384,24 +409,23 @@ let BookWyrm = new (class { }); } - /** - * Add or remove a class based on a boolean condition. - * - * @param {object} node - DOM node to change class on - * @param {string} classname - Name of the class - * @param {boolean} add - Add? - * @return {undefined} - */ - addRemoveClass(node, classname, add) { - if (add) { - node.classList.add(classname); - } else { - node.classList.remove(classname); - } + classHide(node) { + node.classList.add("is-hidden"); + } + + classShow(node) { + node.classList.remote("is-hidden"); + } + + classActivate(node) { + node.classList.add("is-active"); + } + + classDeactivate(node) { + node.classList.remove("is-active"); } disableIfTooLarge(eventOrElement) { - const { addRemoveClass } = this; const element = eventOrElement.currentTarget || eventOrElement; const limit = element.dataset.maxUpload; @@ -412,10 +436,10 @@ let BookWyrm = new (class { if (isTooBig) { submits.forEach((submitter) => (submitter.disabled = true)); - warns.forEach((sib) => addRemoveClass(sib, "is-hidden", false)); + warns.forEach((sib) => this.classShow(sib)); } else { submits.forEach((submitter) => (submitter.disabled = false)); - warns.forEach((sib) => addRemoveClass(sib, "is-hidden", true)); + warns.forEach((sib) => this.classHide(sib)); } } @@ -866,12 +890,12 @@ let BookWyrm = new (class { if (passwordInputElement.type === "password") { passwordInputElement.type = "text"; - this.addRemoveClass(iconElement, "icon-eye-blocked"); - this.addRemoveClass(iconElement, "icon-eye", true); + iconElement.classList.remove("icon-eye-blocked"); + iconElement.classList.add("icon-eye") } else { passwordInputElement.type = "password"; - this.addRemoveClass(iconElement, "icon-eye"); - this.addRemoveClass(iconElement, "icon-eye-blocked", true); + iconElement.classList.add("icon-eye-blocked"); + iconElement.classList.remove("icon-eye") } this.toggleFocus(passwordElementId); diff --git a/bookwyrm/static/js/localstorage.js b/bookwyrm/static/js/localstorage.js index 7d0dc9d819..a4488adc92 100644 --- a/bookwyrm/static/js/localstorage.js +++ b/bookwyrm/static/js/localstorage.js @@ -36,9 +36,13 @@ let LocalStorageTools = new (class { */ setDisplay(node) { // Used in set reading goal - let key = node.dataset.hide; - let value = window.localStorage.getItem(key); + const key = node.dataset.hide; + const value = window.localStorage.getItem(key); - BookWyrm.addRemoveClass(node, "is-hidden", value); + if(value) { + BookWyrm.classHide(node); + } else { + BookWyrm.classShow(node); + } } })(); diff --git a/bookwyrm/static/js/status_cache.js b/bookwyrm/static/js/status_cache.js index 0a9f3abc5f..892895156b 100644 --- a/bookwyrm/static/js/status_cache.js +++ b/bookwyrm/static/js/status_cache.js @@ -12,10 +12,6 @@ let StatusCache = new (class { document .querySelectorAll(".submit-status") .forEach((button) => button.addEventListener("submit", this.submitStatus.bind(this))); - - document - .querySelectorAll(".form-rate-stars label.icon") - .forEach((button) => button.addEventListener("click", this.toggleStar.bind(this))); } /** @@ -26,8 +22,8 @@ let StatusCache = new (class { */ updateDraft(event) { // Used in set reading goal - let key = event.target.dataset.cacheDraft; - let value = event.target.value; + const key = event.target.dataset.cacheDraft; + const value = event.target.value; if (!value) { window.localStorage.removeItem(key); @@ -46,8 +42,8 @@ let StatusCache = new (class { */ populateDraft(node) { // Used in set reading goal - let key = node.dataset.cacheDraft; - let value = window.localStorage.getItem(key); + const key = node.dataset.cacheDraft; + const value = window.localStorage.getItem(key); if (!value) { return; @@ -79,14 +75,14 @@ let StatusCache = new (class { event.preventDefault(); - BookWyrm.addRemoveClass(form, "is-processing", true); + form.classList.add("is-processing"); trigger.setAttribute("disabled", null); BookWyrm.ajaxPost(form) .finally(() => { // Change icon to remove ongoing activity on the current UI. // Enable back the element used to submit the form. - BookWyrm.addRemoveClass(form, "is-processing", false); + form.classList.remove("is-processing"); trigger.removeAttribute("disabled"); }) .then((response) => { @@ -107,14 +103,14 @@ let StatusCache = new (class { * @param {String} the id of the message dom element * @return {undefined} */ - announceMessage(message_id) { - const element = document.getElementById(message_id); + announceMessage(messageId) { + const element = document.getElementById(messageId); let copy = element.cloneNode(true); copy.id = null; element.insertAdjacentElement("beforebegin", copy); - BookWyrm.addRemoveClass(copy, "is-hidden", false); + BookWyrm.classShow(copy); setTimeout( function () { copy.remove(); @@ -140,7 +136,7 @@ let StatusCache = new (class { ); // Close modals - let modal = form.closest(".modal.is-active"); + const modal = form.closest(".modal.is-active"); if (modal) { modal.getElementsByClassName("modal-close")[0].click(); @@ -158,7 +154,7 @@ let StatusCache = new (class { } // Close reply panel - let reply = form.closest(".reply-panel"); + const reply = form.closest(".reply-panel"); if (reply) { document.querySelector("[data-controls=" + reply.id + "]").click(); @@ -176,25 +172,25 @@ let StatusCache = new (class { */ cycleShelveButtons(button, identifier) { // Pressed button - let shelf = button.querySelector("[data-shelf-identifier='" + identifier + "']"); - let next_identifier = shelf.dataset.shelfNext; + const shelf = button.querySelector("[data-shelf-identifier='" + identifier + "']"); + let nextIdentifier = shelf.dataset.shelfNext; // Set all buttons to hidden button .querySelectorAll("[data-shelf-identifier]") - .forEach((item) => BookWyrm.addRemoveClass(item, "is-hidden", true)); + .forEach((item) => BookWyrm.classHide(item)); // Button that should be visible now - let next = button.querySelector("[data-shelf-identifier=" + next_identifier + "]"); + const next = button.querySelector("[data-shelf-identifier=" + nextIdentifier + "]"); // Show the desired button - BookWyrm.addRemoveClass(next, "is-hidden", false); + BookWyrm.classShow(next); // ------ update the dropdown buttons // Remove existing hidden class button .querySelectorAll("[data-shelf-dropdown-identifier]") - .forEach((item) => BookWyrm.addRemoveClass(item, "is-hidden", false)); + .forEach((item) => BookWyrm.classShow(item)); // Remove existing disabled states @@ -202,51 +198,32 @@ let StatusCache = new (class { .querySelectorAll("[data-shelf-dropdown-identifier] button") .forEach((item) => (item.disabled = false)); - next_identifier = next_identifier == "complete" ? "read" : next_identifier; - next_identifier = - next_identifier == "stopped-reading-complete" ? "stopped-reading" : next_identifier; + nextIdentifier = nextIdentifier == "complete" ? "read" : nextIdentifier; + nextIdentifier = + nextIdentifier == "stopped-reading-complete" ? "stopped-reading" : nextIdentifier; // Disable the current state button.querySelector( "[data-shelf-dropdown-identifier=" + identifier + "] button" ).disabled = true; - let main_button = button.querySelector( - "[data-shelf-dropdown-identifier=" + next_identifier + "]" + const mainButton = button.querySelector( + "[data-shelf-dropdown-identifier=" + nextIdentifier + "]" ); // Hide the option that's shown as the main button - BookWyrm.addRemoveClass(main_button, "is-hidden", true); + BookWyrm.classHide(mainButton); // Just hide the other two menu options, idk what to do with them button .querySelectorAll("[data-extra-options]") - .forEach((item) => BookWyrm.addRemoveClass(item, "is-hidden", true)); + .forEach((item) => BookWyrm.classHide(item)); // Close menu - let menu = button.querySelector("details[open]"); + const menu = button.querySelector("details[open]"); if (menu) { menu.removeAttribute("open"); } } - - /** - * Reveal half-stars - * - * @param {Event} event - * @return {undefined} - */ - toggleStar(event) { - const label = event.currentTarget; - let wholeStar = document.getElementById(label.getAttribute("for")); - - if (wholeStar.checked) { - event.preventDefault(); - let halfStar = document.getElementById(label.dataset.forHalf); - - wholeStar.checked = null; - halfStar.checked = "checked"; - } - } })(); From 2eba222127b5a6fc9218babf60db3206c50e441d Mon Sep 17 00:00:00 2001 From: Patrick Childers <8558954+PatrickChildersIT@users.noreply.github.com> Date: Tue, 4 Aug 2026 19:20:06 -0400 Subject: [PATCH 955/962] ran formatters --- bookwyrm/static/js/autocomplete.js | 10 ++++----- bookwyrm/static/js/bookwyrm.js | 34 ++++++++++++++++-------------- bookwyrm/static/js/localstorage.js | 2 +- bookwyrm/static/js/status_cache.js | 4 +--- 4 files changed, 25 insertions(+), 25 deletions(-) diff --git a/bookwyrm/static/js/autocomplete.js b/bookwyrm/static/js/autocomplete.js index 5ce9ed35e0..84286ac619 100644 --- a/bookwyrm/static/js/autocomplete.js +++ b/bookwyrm/static/js/autocomplete.js @@ -17,11 +17,10 @@ "OGG", "PDF", "Plaintext", - "Print book" + "Print book", ]; - const regexEscape = (string) => string.replace(/[$^*()-+.?[]{}|\\\/]/g, '\\$&'); - + const regexEscape = (string) => string.replace(/[$^*()-+.?[]{}|\\\/]/g, "\\$&"); /** * Suggest a completion as a user types @@ -42,7 +41,9 @@ const cleanInput = regexEscape(input.value); - const suggestions = mimeTypes.filter(mimeType => RegExp("^" + cleanInput, "i").test(mimeType)); + const suggestions = mimeTypes.filter((mimeType) => + RegExp("^" + cleanInput, "i").test(mimeType) + ); const boxId = input.getAttribute("list"); @@ -65,4 +66,3 @@ input.addEventListener("input", autocomplete); }); })(); - diff --git a/bookwyrm/static/js/bookwyrm.js b/bookwyrm/static/js/bookwyrm.js index abc76bdad6..da1b1f8643 100644 --- a/bookwyrm/static/js/bookwyrm.js +++ b/bookwyrm/static/js/bookwyrm.js @@ -156,13 +156,16 @@ let BookWyrm = new (class { if (count != currentCount) { const wrapper = counter.closest("[data-poll-wrapper]"); - if(count < 1) { + + if (count < 1) { this.classHide(wrapper); } else { this.classShow(wrapper); } + counter.innerText = count; - if(hasMentions) { + + if (hasMentions) { this.classList.add("is-danger"); } else { this.classList.remove("is-danger"); @@ -240,7 +243,7 @@ let BookWyrm = new (class { if (targetId && !trigger.classList.contains("pulldown-menu")) { const target = document.getElementById(targetId); - if(pressed) { + if (pressed) { this.classShow(target); this.classActivate(target); } else { @@ -299,7 +302,7 @@ let BookWyrm = new (class { if (targetId) { const target = document.getElementById(targetId); - if(expanded) { + if (expanded) { this.classActivate(target); } else { this.classDeactivate(target); @@ -315,7 +318,7 @@ let BookWyrm = new (class { * @return {undefined} */ toggleContainer(container, pressed) { - if(pressed) { + if (pressed) { this.classHide(container); } else { this.classShow(container); @@ -376,16 +379,15 @@ let BookWyrm = new (class { const relatedforms = document.querySelectorAll(`.${form.dataset.id}`); // Toggle class on all related forms. - relatedforms.forEach((relatedForm) => - { - const isHidden = relatedForm.className.indexOf("is-hidden") == -1; - if(isHidden) { - bookwyrm.classShow(relatedForm); - } else { - bookwyrm.classHide(relatedForm); - } + relatedforms.forEach((relatedForm) => { + const isHidden = relatedForm.className.indexOf("is-hidden") == -1; + + if (isHidden) { + bookwyrm.classShow(relatedForm); + } else { + bookwyrm.classHide(relatedForm); } - ); + }); this.ajaxPost(form).catch((error) => { // @todo Display a notification in the UI instead. @@ -891,11 +893,11 @@ let BookWyrm = new (class { if (passwordInputElement.type === "password") { passwordInputElement.type = "text"; iconElement.classList.remove("icon-eye-blocked"); - iconElement.classList.add("icon-eye") + iconElement.classList.add("icon-eye"); } else { passwordInputElement.type = "password"; iconElement.classList.add("icon-eye-blocked"); - iconElement.classList.remove("icon-eye") + iconElement.classList.remove("icon-eye"); } this.toggleFocus(passwordElementId); diff --git a/bookwyrm/static/js/localstorage.js b/bookwyrm/static/js/localstorage.js index a4488adc92..1fc9f86b83 100644 --- a/bookwyrm/static/js/localstorage.js +++ b/bookwyrm/static/js/localstorage.js @@ -39,7 +39,7 @@ let LocalStorageTools = new (class { const key = node.dataset.hide; const value = window.localStorage.getItem(key); - if(value) { + if (value) { BookWyrm.classHide(node); } else { BookWyrm.classShow(node); diff --git a/bookwyrm/static/js/status_cache.js b/bookwyrm/static/js/status_cache.js index 892895156b..7abde1a10e 100644 --- a/bookwyrm/static/js/status_cache.js +++ b/bookwyrm/static/js/status_cache.js @@ -215,9 +215,7 @@ let StatusCache = new (class { BookWyrm.classHide(mainButton); // Just hide the other two menu options, idk what to do with them - button - .querySelectorAll("[data-extra-options]") - .forEach((item) => BookWyrm.classHide(item)); + button.querySelectorAll("[data-extra-options]").forEach((item) => BookWyrm.classHide(item)); // Close menu const menu = button.querySelector("details[open]"); From 6b6769322e49374fd7ff8711618a8606a468838a Mon Sep 17 00:00:00 2001 From: Patrick Childers <8558954+PatrickChildersIT@users.noreply.github.com> Date: Wed, 5 Aug 2026 10:09:06 -0400 Subject: [PATCH 956/962] a few remaining let-to-const --- bookwyrm/static/js/localstorage.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/bookwyrm/static/js/localstorage.js b/bookwyrm/static/js/localstorage.js index 1fc9f86b83..9088d555e2 100644 --- a/bookwyrm/static/js/localstorage.js +++ b/bookwyrm/static/js/localstorage.js @@ -18,8 +18,8 @@ let LocalStorageTools = new (class { */ updateDisplay(event) { // Used in set reading goal - let key = event.target.dataset.id; - let value = event.target.dataset.value; + const key = event.target.dataset.id; + const value = event.target.dataset.value; window.localStorage.setItem(key, value); From 2c276363348820ed76a434cfdcacba42553a24e5 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 5 Aug 2026 19:55:22 +0000 Subject: [PATCH 957/962] Bump aiohttp from 3.14.1 to 3.14.3 Bumps [aiohttp](https://github.com/aio-libs/aiohttp) from 3.14.1 to 3.14.3. - [Changelog](https://github.com/aio-libs/aiohttp/blob/master/CHANGES.rst) - [Commits](https://github.com/aio-libs/aiohttp/compare/v3.14.1...v3.14.3) --- updated-dependencies: - dependency-name: aiohttp dependency-version: 3.14.3 dependency-type: direct:development ... Signed-off-by: dependabot[bot] --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 9026e50682..5a46f9f182 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [dependency-groups] main = [ - "aiohttp==3.14.1", + "aiohttp==3.14.3", "arabic-reshaper==3.0.1", "bleach==6.4.0", "boto3==1.34.74", From a1d46c035e10e5841d448ebfd1e4cb904cf58788 Mon Sep 17 00:00:00 2001 From: Patrick Childers <8558954+PatrickChildersIT@users.noreply.github.com> Date: Thu, 6 Aug 2026 09:40:11 -0400 Subject: [PATCH 958/962] typo remote -> remove --- bookwyrm/static/js/bookwyrm.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/static/js/bookwyrm.js b/bookwyrm/static/js/bookwyrm.js index da1b1f8643..abe813c34f 100644 --- a/bookwyrm/static/js/bookwyrm.js +++ b/bookwyrm/static/js/bookwyrm.js @@ -416,7 +416,7 @@ let BookWyrm = new (class { } classShow(node) { - node.classList.remote("is-hidden"); + node.classList.remove("is-hidden"); } classActivate(node) { From aa769721be2087025126aead6ca9e3ecfb1f5dfc Mon Sep 17 00:00:00 2001 From: Patrick Childers <8558954+PatrickChildersIT@users.noreply.github.com> Date: Fri, 7 Aug 2026 10:38:13 -0400 Subject: [PATCH 959/962] move inline style to scss file and changed px to rem --- bookwyrm/static/css/bookwyrm/_all.scss | 1 + bookwyrm/static/css/bookwyrm/components/_embed.scss | 6 ++++++ bookwyrm/templates/embed-layout.html | 2 +- 3 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 bookwyrm/static/css/bookwyrm/components/_embed.scss diff --git a/bookwyrm/static/css/bookwyrm/_all.scss b/bookwyrm/static/css/bookwyrm/_all.scss index 147af984f9..3de604ceed 100644 --- a/bookwyrm/static/css/bookwyrm/_all.scss +++ b/bookwyrm/static/css/bookwyrm/_all.scss @@ -9,6 +9,7 @@ @import "components/breadcrumbs"; @import "components/copy"; @import "components/details"; +@import "components/embed"; @import "components/file_input"; @import "components/live_message"; @import "components/modal"; diff --git a/bookwyrm/static/css/bookwyrm/components/_embed.scss b/bookwyrm/static/css/bookwyrm/components/_embed.scss new file mode 100644 index 0000000000..d35112bd57 --- /dev/null +++ b/bookwyrm/static/css/bookwyrm/components/_embed.scss @@ -0,0 +1,6 @@ +/** CSS for Embedded layout + ******************************************************************************/ + + .logo-image-height { + height: 2rem; + } \ No newline at end of file diff --git a/bookwyrm/templates/embed-layout.html b/bookwyrm/templates/embed-layout.html index 8652036272..bdce1f2634 100644 --- a/bookwyrm/templates/embed-layout.html +++ b/bookwyrm/templates/embed-layout.html @@ -18,7 +18,7 @@
        - + {{ site.name }}
        From 6c8d70230d495b11547a35d6cb39f8f08d59e68d Mon Sep 17 00:00:00 2001 From: Ilkka Ollakka Date: Fri, 7 Aug 2026 21:47:50 +0300 Subject: [PATCH 960/962] anubis: allow POST methods by default Safari might have issue with anubis from time to time, so don't prevent for example book adding or modification for that. --- anubis/botPolicy.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/anubis/botPolicy.yaml b/anubis/botPolicy.yaml index b25731aa80..6c0ce427ca 100644 --- a/anubis/botPolicy.yaml +++ b/anubis/botPolicy.yaml @@ -17,6 +17,11 @@ bots: - name: Allow access to user reviews/quotes/comments rss action: ALLOW path_regex: "^/user/.*/rss-(quotes|reviews|comments)/?$" + # Anubis and Safari don't always see eachother eye-to-eye, most likely happy eyeballs thing + # https://github.com/TecharoHQ/anubis/issues/289 + - name: Allow POST method for book creation etc + action: ALLOW + expression: method == "POST" # Anubis subauth doesn't seem to handle CHALLENGE nicely, so tune weight - name: All email confirmations are suspicious by default action: WEIGH From 662098996c7a28850b75798bff0a0afba1b8743d Mon Sep 17 00:00:00 2001 From: Ilkka Ollakka Date: Fri, 7 Aug 2026 21:53:34 +0300 Subject: [PATCH 961/962] systemd: add export to bindpaths in main service it is present in worker-service already --- contrib/systemd/bookwyrm.service | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/contrib/systemd/bookwyrm.service b/contrib/systemd/bookwyrm.service index 6e9434aa3d..f7a6374459 100644 --- a/contrib/systemd/bookwyrm.service +++ b/contrib/systemd/bookwyrm.service @@ -17,7 +17,7 @@ TemporaryFileSystem=/var /run /opt PrivateUsers=true PrivateDevices=true BindReadOnlyPaths=/opt/bookwyrm -BindPaths=/opt/bookwyrm/images /opt/bookwyrm/static /var/run/postgresql +BindPaths=/opt/bookwyrm/images /opt/bookwyrm/static /opt/bookwyrm/exports /var/run/postgresql LockPersonality=yes MemoryDenyWriteExecute=true PrivateMounts=true From c6b71decb0f4e8c3f2f7186d1e06ee79ec4f731a Mon Sep 17 00:00:00 2001 From: Patrick Childers <8558954+PatrickChildersIT@users.noreply.github.com> Date: Tue, 11 Aug 2026 10:38:24 -0400 Subject: [PATCH 962/962] fix inverted hidden logic for interact event --- bookwyrm/static/js/bookwyrm.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bookwyrm/static/js/bookwyrm.js b/bookwyrm/static/js/bookwyrm.js index abe813c34f..b2b1991aa5 100644 --- a/bookwyrm/static/js/bookwyrm.js +++ b/bookwyrm/static/js/bookwyrm.js @@ -380,7 +380,7 @@ let BookWyrm = new (class { // Toggle class on all related forms. relatedforms.forEach((relatedForm) => { - const isHidden = relatedForm.className.indexOf("is-hidden") == -1; + const isHidden = relatedForm.className.indexOf("is-hidden") != -1; if (isHidden) { bookwyrm.classShow(relatedForm);