+
+
{% if related_status %}
{% block preview %}{% endblock %}
diff --git a/bookwyrm/templates/notifications/notifications_page.html b/bookwyrm/templates/notifications/notifications_page.html
index dc6acbdb3..c6a2c3ed5 100644
--- a/bookwyrm/templates/notifications/notifications_page.html
+++ b/bookwyrm/templates/notifications/notifications_page.html
@@ -46,7 +46,3 @@
{% endif %}
{% endblock %}
-
-{% block scripts %}
-
-{% endblock %}
diff --git a/bookwyrm/templates/snippets/status/headers/generatednote.html b/bookwyrm/templates/snippets/status/headers/generatednote.html
index 58a65adbe..cc684a5f2 100644
--- a/bookwyrm/templates/snippets/status/headers/generatednote.html
+++ b/bookwyrm/templates/snippets/status/headers/generatednote.html
@@ -1,11 +1,9 @@
{% if status.content == 'wants to read' %}
{% include 'snippets/status/headers/to_read.html' with book=status.mention_books.first %}
-{% endif %}
-
-{% if status.content == 'finished reading' %}
+{% elif status.content == 'finished reading' %}
{% include 'snippets/status/headers/read.html' with book=status.mention_books.first %}
-{% endif %}
-
-{% if status.content == 'started reading' %}
+{% elif status.content == 'started reading' %}
{% include 'snippets/status/headers/reading.html' with book=status.mention_books.first %}
+{% else %}
+ {{ status.content }}
{% endif %}
diff --git a/bookwyrm/templates/snippets/status/headers/goal.html b/bookwyrm/templates/snippets/status/headers/goal.html
deleted file mode 100644
index e31dec2a7..000000000
--- a/bookwyrm/templates/snippets/status/headers/goal.html
+++ /dev/null
@@ -1,5 +0,0 @@
-{% spaceless %}
-{% load i18n %}{% load humanize %}
-
-{{ status.content }}
-{% endspaceless %}
diff --git a/bookwyrm/tests/importers/test_storygraph_import.py b/bookwyrm/tests/importers/test_storygraph_import.py
index 09cf32dc1..8db459dc5 100644
--- a/bookwyrm/tests/importers/test_storygraph_import.py
+++ b/bookwyrm/tests/importers/test_storygraph_import.py
@@ -48,7 +48,9 @@ class StorygraphImport(TestCase):
self.local_user, self.csv, False, "public"
)
- import_items = models.ImportItem.objects.filter(job=import_job).all()
+ import_items = (
+ models.ImportItem.objects.filter(job=import_job).order_by("index").all()
+ )
self.assertEqual(len(import_items), 2)
self.assertEqual(import_items[0].index, 0)
self.assertEqual(import_items[0].normalized_data["title"], "Always Coming Home")
diff --git a/bookwyrm/tests/templatetags/__init__.py b/bookwyrm/tests/templatetags/__init__.py
new file mode 100644
index 000000000..b6e690fd5
--- /dev/null
+++ b/bookwyrm/tests/templatetags/__init__.py
@@ -0,0 +1 @@
+from . import *
diff --git a/bookwyrm/tests/templatetags/test_bookwyrm_tags.py b/bookwyrm/tests/templatetags/test_bookwyrm_tags.py
new file mode 100644
index 000000000..04f6a5d4d
--- /dev/null
+++ b/bookwyrm/tests/templatetags/test_bookwyrm_tags.py
@@ -0,0 +1,101 @@
+""" style fixes and lookups for templates """
+from unittest.mock import patch
+
+from django.test import TestCase
+
+from bookwyrm import models
+from bookwyrm.templatetags import bookwyrm_tags
+
+
+@patch("bookwyrm.activitystreams.add_status_task.delay")
+@patch("bookwyrm.activitystreams.remove_status_task.delay")
+class BookWyrmTags(TestCase):
+ """lotta different things here"""
+
+ def setUp(self):
+ """create some filler objects"""
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch(
+ "bookwyrm.activitystreams.populate_stream_task.delay"
+ ):
+ self.user = models.User.objects.create_user(
+ "mouse@example.com",
+ "mouse@mouse.mouse",
+ "mouseword",
+ local=True,
+ localname="mouse",
+ )
+ with patch("bookwyrm.models.user.set_remote_server.delay"):
+ self.remote_user = models.User.objects.create_user(
+ "rat",
+ "rat@rat.rat",
+ "ratword",
+ remote_id="http://example.com/rat",
+ local=False,
+ )
+ self.book = models.Edition.objects.create(title="Test Book")
+
+ def test_get_user_rating(self, *_):
+ """get a user's most recent rating of a book"""
+ with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
+ models.Review.objects.create(user=self.user, book=self.book, rating=3)
+ self.assertEqual(bookwyrm_tags.get_user_rating(self.book, self.user), 3)
+
+ def test_get_user_rating_doesnt_exist(self, *_):
+ """there is no rating available"""
+ self.assertEqual(bookwyrm_tags.get_user_rating(self.book, self.user), 0)
+
+ def test_get_book_description(self, *_):
+ """grab it from the edition or the parent"""
+ work = models.Work.objects.create(title="Test Work")
+ self.book.parent_work = work
+ self.book.save()
+
+ self.assertIsNone(bookwyrm_tags.get_book_description(self.book))
+
+ work.description = "hi"
+ work.save()
+ self.assertEqual(bookwyrm_tags.get_book_description(self.book), "hi")
+
+ self.book.description = "hello"
+ self.book.save()
+ self.assertEqual(bookwyrm_tags.get_book_description(self.book), "hello")
+
+ def test_get_next_shelf(self, *_):
+ """self progress helper"""
+ self.assertEqual(bookwyrm_tags.get_next_shelf("to-read"), "reading")
+ self.assertEqual(bookwyrm_tags.get_next_shelf("reading"), "read")
+ self.assertEqual(bookwyrm_tags.get_next_shelf("read"), "complete")
+ self.assertEqual(bookwyrm_tags.get_next_shelf("blooooga"), "to-read")
+
+ @patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async")
+ def test_load_subclass(self, *_):
+ """get a status' real type"""
+ review = models.Review.objects.create(user=self.user, book=self.book, rating=3)
+ status = models.Status.objects.get(id=review.id)
+ self.assertIsInstance(status, models.Status)
+ self.assertIsInstance(bookwyrm_tags.load_subclass(status), models.Review)
+
+ quote = models.Quotation.objects.create(
+ user=self.user, book=self.book, content="hi"
+ )
+ status = models.Status.objects.get(id=quote.id)
+ self.assertIsInstance(status, models.Status)
+ self.assertIsInstance(bookwyrm_tags.load_subclass(status), models.Quotation)
+
+ comment = models.Comment.objects.create(
+ user=self.user, book=self.book, content="hi"
+ )
+ status = models.Status.objects.get(id=comment.id)
+ self.assertIsInstance(status, models.Status)
+ self.assertIsInstance(bookwyrm_tags.load_subclass(status), models.Comment)
+
+ def test_related_status(self, *_):
+ """gets the subclass model for a notification status"""
+ with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
+ status = models.Status.objects.create(content="hi", user=self.user)
+ notification = models.Notification.objects.create(
+ user=self.user, notification_type="MENTION", related_status=status
+ )
+
+ result = bookwyrm_tags.related_status(notification)
+ self.assertIsInstance(result, models.Status)
diff --git a/bookwyrm/tests/templatetags/test_interaction.py b/bookwyrm/tests/templatetags/test_interaction.py
new file mode 100644
index 000000000..d32548e4c
--- /dev/null
+++ b/bookwyrm/tests/templatetags/test_interaction.py
@@ -0,0 +1,53 @@
+""" style fixes and lookups for templates """
+from unittest.mock import patch
+
+from django.test import TestCase
+
+from bookwyrm import models
+from bookwyrm.templatetags import interaction
+
+
+@patch("bookwyrm.activitystreams.add_status_task.delay")
+@patch("bookwyrm.activitystreams.remove_status_task.delay")
+class InteractionTags(TestCase):
+ """lotta different things here"""
+
+ def setUp(self):
+ """create some filler objects"""
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch(
+ "bookwyrm.activitystreams.populate_stream_task.delay"
+ ):
+ self.user = models.User.objects.create_user(
+ "mouse@example.com",
+ "mouse@mouse.mouse",
+ "mouseword",
+ local=True,
+ localname="mouse",
+ )
+ with patch("bookwyrm.models.user.set_remote_server.delay"):
+ self.remote_user = models.User.objects.create_user(
+ "rat",
+ "rat@rat.rat",
+ "ratword",
+ remote_id="http://example.com/rat",
+ local=False,
+ )
+ self.book = models.Edition.objects.create(title="Test Book")
+
+ def test_get_user_liked(self, *_):
+ """did a user like a status"""
+ status = models.Review.objects.create(user=self.remote_user, book=self.book)
+
+ self.assertFalse(interaction.get_user_liked(self.user, status))
+ with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
+ models.Favorite.objects.create(user=self.user, status=status)
+ self.assertTrue(interaction.get_user_liked(self.user, status))
+
+ def test_get_user_boosted(self, *_):
+ """did a user boost a status"""
+ status = models.Review.objects.create(user=self.remote_user, book=self.book)
+
+ self.assertFalse(interaction.get_user_boosted(self.user, status))
+ with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
+ models.Boost.objects.create(user=self.user, boosted_status=status)
+ self.assertTrue(interaction.get_user_boosted(self.user, status))
diff --git a/bookwyrm/tests/templatetags/test_markdown.py b/bookwyrm/tests/templatetags/test_markdown.py
new file mode 100644
index 000000000..ba283a4f2
--- /dev/null
+++ b/bookwyrm/tests/templatetags/test_markdown.py
@@ -0,0 +1,15 @@
+""" style fixes and lookups for templates """
+from django.test import TestCase
+from bookwyrm.templatetags import markdown
+
+
+class MarkdownTags(TestCase):
+ """lotta different things here"""
+
+ def test_get_markdown(self):
+ """mardown format data"""
+ result = markdown.get_markdown("_hi_")
+ self.assertEqual(result, "
hi
")
+
+ result = markdown.get_markdown("
")
+ self.assertEqual(result, "
hi
")
diff --git a/bookwyrm/tests/templatetags/test_status_display.py b/bookwyrm/tests/templatetags/test_status_display.py
new file mode 100644
index 000000000..b3eaeab87
--- /dev/null
+++ b/bookwyrm/tests/templatetags/test_status_display.py
@@ -0,0 +1,90 @@
+""" style fixes and lookups for templates """
+from unittest.mock import patch
+
+from django.test import TestCase
+from django.utils import timezone
+
+from bookwyrm import models
+from bookwyrm.templatetags import status_display
+
+
+@patch("bookwyrm.activitystreams.add_status_task.delay")
+@patch("bookwyrm.activitystreams.remove_status_task.delay")
+class StatusDisplayTags(TestCase):
+ """lotta different things here"""
+
+ def setUp(self):
+ """create some filler objects"""
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch(
+ "bookwyrm.activitystreams.populate_stream_task.delay"
+ ):
+ self.user = models.User.objects.create_user(
+ "mouse@example.com",
+ "mouse@mouse.mouse",
+ "mouseword",
+ local=True,
+ localname="mouse",
+ )
+ with patch("bookwyrm.models.user.set_remote_server.delay"):
+ self.remote_user = models.User.objects.create_user(
+ "rat",
+ "rat@rat.rat",
+ "ratword",
+ remote_id="http://example.com/rat",
+ local=False,
+ )
+ self.book = models.Edition.objects.create(title="Test Book")
+
+ @patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async")
+ def test_get_replies(self, *_):
+ """direct replies to a status"""
+ parent = models.Review.objects.create(
+ user=self.user, book=self.book, content="hi"
+ )
+ first_child = models.Status.objects.create(
+ reply_parent=parent, user=self.user, content="hi"
+ )
+ second_child = models.Status.objects.create(
+ reply_parent=parent, user=self.user, content="hi"
+ )
+ third_child = models.Status.objects.create(
+ reply_parent=parent,
+ user=self.user,
+ deleted=True,
+ deleted_date=timezone.now(),
+ )
+
+ replies = status_display.get_replies(parent)
+ self.assertEqual(len(replies), 2)
+ self.assertTrue(first_child in replies)
+ self.assertTrue(second_child in replies)
+ self.assertFalse(third_child in replies)
+
+ def test_get_parent(self, *_):
+ """get the reply parent of a status"""
+ with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
+ parent = models.Review.objects.create(
+ user=self.user, book=self.book, content="hi"
+ )
+ child = models.Status.objects.create(
+ reply_parent=parent, user=self.user, content="hi"
+ )
+
+ result = status_display.get_parent(child)
+ self.assertEqual(result, parent)
+ self.assertIsInstance(result, models.Review)
+
+ def test_get_boosted(self, *_):
+ """load a boosted status"""
+ with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
+ status = models.Review.objects.create(user=self.remote_user, book=self.book)
+ boost = models.Boost.objects.create(user=self.user, boosted_status=status)
+ boosted = status_display.get_boosted(boost)
+ self.assertIsInstance(boosted, models.Review)
+ self.assertEqual(boosted, status)
+
+ def test_get_mentions(self, *_):
+ """list of people mentioned"""
+ status = models.Status.objects.create(content="hi", user=self.remote_user)
+ result = status_display.get_mentions(status, self.user)
+ self.assertEqual(result, "@rat@example.com ")
diff --git a/bookwyrm/tests/templatetags/test_utilities.py b/bookwyrm/tests/templatetags/test_utilities.py
new file mode 100644
index 000000000..f40d24dcf
--- /dev/null
+++ b/bookwyrm/tests/templatetags/test_utilities.py
@@ -0,0 +1,52 @@
+""" style fixes and lookups for templates """
+import re
+from unittest.mock import patch
+
+from django.test import TestCase
+
+from bookwyrm import models
+from bookwyrm.templatetags import utilities
+
+
+@patch("bookwyrm.activitystreams.add_status_task.delay")
+@patch("bookwyrm.activitystreams.remove_status_task.delay")
+class UtilitiesTags(TestCase):
+ """lotta different things here"""
+
+ def setUp(self):
+ """create some filler objects"""
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch(
+ "bookwyrm.activitystreams.populate_stream_task.delay"
+ ):
+ self.user = models.User.objects.create_user(
+ "mouse@example.com",
+ "mouse@mouse.mouse",
+ "mouseword",
+ local=True,
+ localname="mouse",
+ )
+ with patch("bookwyrm.models.user.set_remote_server.delay"):
+ self.remote_user = models.User.objects.create_user(
+ "rat",
+ "rat@rat.rat",
+ "ratword",
+ remote_id="http://example.com/rat",
+ local=False,
+ )
+ self.book = models.Edition.objects.create(title="Test Book")
+
+ def test_get_user_identifer_local(self, *_):
+ """fall back to the simplest uid available"""
+ self.assertNotEqual(self.user.username, self.user.localname)
+ self.assertEqual(utilities.get_user_identifier(self.user), "mouse")
+
+ def test_get_user_identifer_remote(self, *_):
+ """for a remote user, should be their full username"""
+ self.assertEqual(
+ utilities.get_user_identifier(self.remote_user), "rat@example.com"
+ )
+
+ def test_get_uuid(self, *_):
+ """uuid functionality"""
+ uuid = utilities.get_uuid("hi")
+ self.assertTrue(re.match(r"hi[A-Za-z0-9\-]", uuid))
diff --git a/bookwyrm/tests/test_templatetags.py b/bookwyrm/tests/test_templatetags.py
deleted file mode 100644
index ed4466f58..000000000
--- a/bookwyrm/tests/test_templatetags.py
+++ /dev/null
@@ -1,183 +0,0 @@
-""" style fixes and lookups for templates """
-import re
-from unittest.mock import patch
-
-from django.test import TestCase
-from django.utils import timezone
-
-from bookwyrm import models
-from bookwyrm.templatetags import (
- bookwyrm_tags,
- interaction,
- markdown,
- status_display,
- utilities,
-)
-
-
-@patch("bookwyrm.activitystreams.add_status_task.delay")
-@patch("bookwyrm.activitystreams.remove_status_task.delay")
-class TemplateTags(TestCase):
- """lotta different things here"""
-
- def setUp(self):
- """create some filler objects"""
- with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch(
- "bookwyrm.activitystreams.populate_stream_task.delay"
- ):
- self.user = models.User.objects.create_user(
- "mouse@example.com",
- "mouse@mouse.mouse",
- "mouseword",
- local=True,
- localname="mouse",
- )
- with patch("bookwyrm.models.user.set_remote_server.delay"):
- self.remote_user = models.User.objects.create_user(
- "rat",
- "rat@rat.rat",
- "ratword",
- remote_id="http://example.com/rat",
- local=False,
- )
- self.book = models.Edition.objects.create(title="Test Book")
-
- def test_get_user_rating(self, *_):
- """get a user's most recent rating of a book"""
- with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
- models.Review.objects.create(user=self.user, book=self.book, rating=3)
- self.assertEqual(bookwyrm_tags.get_user_rating(self.book, self.user), 3)
-
- def test_get_user_rating_doesnt_exist(self, *_):
- """there is no rating available"""
- self.assertEqual(bookwyrm_tags.get_user_rating(self.book, self.user), 0)
-
- def test_get_user_identifer_local(self, *_):
- """fall back to the simplest uid available"""
- self.assertNotEqual(self.user.username, self.user.localname)
- self.assertEqual(utilities.get_user_identifier(self.user), "mouse")
-
- def test_get_user_identifer_remote(self, *_):
- """for a remote user, should be their full username"""
- self.assertEqual(
- utilities.get_user_identifier(self.remote_user), "rat@example.com"
- )
-
- @patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async")
- def test_get_replies(self, *_):
- """direct replies to a status"""
- parent = models.Review.objects.create(
- user=self.user, book=self.book, content="hi"
- )
- first_child = models.Status.objects.create(
- reply_parent=parent, user=self.user, content="hi"
- )
- second_child = models.Status.objects.create(
- reply_parent=parent, user=self.user, content="hi"
- )
- third_child = models.Status.objects.create(
- reply_parent=parent,
- user=self.user,
- deleted=True,
- deleted_date=timezone.now(),
- )
-
- replies = status_display.get_replies(parent)
- self.assertEqual(len(replies), 2)
- self.assertTrue(first_child in replies)
- self.assertTrue(second_child in replies)
- self.assertFalse(third_child in replies)
-
- def test_get_parent(self, *_):
- """get the reply parent of a status"""
- with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
- parent = models.Review.objects.create(
- user=self.user, book=self.book, content="hi"
- )
- child = models.Status.objects.create(
- reply_parent=parent, user=self.user, content="hi"
- )
-
- result = status_display.get_parent(child)
- self.assertEqual(result, parent)
- self.assertIsInstance(result, models.Review)
-
- def test_get_user_liked(self, *_):
- """did a user like a status"""
- status = models.Review.objects.create(user=self.remote_user, book=self.book)
-
- self.assertFalse(interaction.get_user_liked(self.user, status))
- with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
- models.Favorite.objects.create(user=self.user, status=status)
- self.assertTrue(interaction.get_user_liked(self.user, status))
-
- def test_get_user_boosted(self, *_):
- """did a user boost a status"""
- status = models.Review.objects.create(user=self.remote_user, book=self.book)
-
- self.assertFalse(interaction.get_user_boosted(self.user, status))
- with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
- models.Boost.objects.create(user=self.user, boosted_status=status)
- self.assertTrue(interaction.get_user_boosted(self.user, status))
-
- def test_get_boosted(self, *_):
- """load a boosted status"""
- with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
- status = models.Review.objects.create(user=self.remote_user, book=self.book)
- boost = models.Boost.objects.create(user=self.user, boosted_status=status)
- boosted = status_display.get_boosted(boost)
- self.assertIsInstance(boosted, models.Review)
- self.assertEqual(boosted, status)
-
- def test_get_book_description(self, *_):
- """grab it from the edition or the parent"""
- work = models.Work.objects.create(title="Test Work")
- self.book.parent_work = work
- self.book.save()
-
- self.assertIsNone(bookwyrm_tags.get_book_description(self.book))
-
- work.description = "hi"
- work.save()
- self.assertEqual(bookwyrm_tags.get_book_description(self.book), "hi")
-
- self.book.description = "hello"
- self.book.save()
- self.assertEqual(bookwyrm_tags.get_book_description(self.book), "hello")
-
- def test_get_uuid(self, *_):
- """uuid functionality"""
- uuid = utilities.get_uuid("hi")
- self.assertTrue(re.match(r"hi[A-Za-z0-9\-]", uuid))
-
- def test_get_markdown(self, *_):
- """mardown format data"""
- result = markdown.get_markdown("_hi_")
- self.assertEqual(result, "
hi
")
-
- result = markdown.get_markdown("
")
- self.assertEqual(result, "
hi
")
-
- def test_get_mentions(self, *_):
- """list of people mentioned"""
- status = models.Status.objects.create(content="hi", user=self.remote_user)
- result = status_display.get_mentions(status, self.user)
- self.assertEqual(result, "@rat@example.com ")
-
- def test_related_status(self, *_):
- """gets the subclass model for a notification status"""
- with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
- status = models.Status.objects.create(content="hi", user=self.user)
- notification = models.Notification.objects.create(
- user=self.user, notification_type="MENTION", related_status=status
- )
-
- result = bookwyrm_tags.related_status(notification)
- self.assertIsInstance(result, models.Status)
-
- def test_get_next_shelf(self, *_):
- """self progress helper"""
- self.assertEqual(bookwyrm_tags.get_next_shelf("to-read"), "reading")
- self.assertEqual(bookwyrm_tags.get_next_shelf("reading"), "read")
- self.assertEqual(bookwyrm_tags.get_next_shelf("read"), "complete")
- self.assertEqual(bookwyrm_tags.get_next_shelf("blooooga"), "to-read")
diff --git a/bookwyrm/tests/views/test_list.py b/bookwyrm/tests/views/test_list.py
index 3d9b6d241..dc764326f 100644
--- a/bookwyrm/tests/views/test_list.py
+++ b/bookwyrm/tests/views/test_list.py
@@ -347,9 +347,12 @@ class ListViews(TestCase):
"""there are so many views, this just makes sure it LOADS"""
view = views.Curate.as_view()
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
- models.List.objects.create(name="Public list", user=self.local_user)
- models.List.objects.create(
- name="Private list", privacy="direct", user=self.local_user
+ models.ListItem.objects.create(
+ user=self.local_user,
+ book_list=self.list,
+ book=self.book,
+ approved=False,
+ order=1,
)
request = self.factory.get("")
request.user = self.local_user
diff --git a/bookwyrm/views/list.py b/bookwyrm/views/list.py
index b29a5b133..e04f6df4d 100644
--- a/bookwyrm/views/list.py
+++ b/bookwyrm/views/list.py
@@ -264,10 +264,10 @@ class EmbedList(View):
return TemplateResponse(request, "lists/embed-list.html", data)
+@method_decorator(login_required, name="dispatch")
class Curate(View):
"""approve or discard list suggestsions"""
- @method_decorator(login_required, name="dispatch")
def get(self, request, list_id):
"""display a pending list"""
book_list = get_object_or_404(models.List, id=list_id)
@@ -280,8 +280,6 @@ class Curate(View):
}
return TemplateResponse(request, "lists/curate.html", data)
- @method_decorator(login_required, name="dispatch")
- # pylint: disable=unused-argument
def post(self, request, list_id):
"""edit a book_list"""
book_list = get_object_or_404(models.List, id=list_id)
diff --git a/locale/de_DE/LC_MESSAGES/django.mo b/locale/de_DE/LC_MESSAGES/django.mo
index b86acb87b..7cf62013b 100644
Binary files a/locale/de_DE/LC_MESSAGES/django.mo and b/locale/de_DE/LC_MESSAGES/django.mo differ
diff --git a/locale/de_DE/LC_MESSAGES/django.po b/locale/de_DE/LC_MESSAGES/django.po
index 1b06c1712..a4a2d55f4 100644
--- a/locale/de_DE/LC_MESSAGES/django.po
+++ b/locale/de_DE/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-12-28 15:00+0000\n"
-"PO-Revision-Date: 2021-12-28 16:03\n"
+"POT-Creation-Date: 2021-12-28 20:12+0000\n"
+"PO-Revision-Date: 2021-12-28 21:17\n"
"Last-Translator: Mouse Reeve
\n"
"Language-Team: German\n"
"Language: de\n"
@@ -263,76 +263,78 @@ msgstr ""
msgid "Share this page"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:61
+#: bookwyrm/templates/annual_summary/layout.html:67
msgid "Copy address"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:61
+#: bookwyrm/templates/annual_summary/layout.html:68
#: bookwyrm/templates/lists/list.html:194
msgid "Copied!"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:69
+#: bookwyrm/templates/annual_summary/layout.html:77
msgid "Sharing status: public with key"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:70
+#: 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:75
+#: bookwyrm/templates/annual_summary/layout.html:83
msgid "Make page private"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:81
+#: bookwyrm/templates/annual_summary/layout.html:89
msgid "Sharing status: private"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:82
+#: bookwyrm/templates/annual_summary/layout.html:90
msgid "The page is private, only you can see it."
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:87
+#: bookwyrm/templates/annual_summary/layout.html:95
msgid "Make page public"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:91
+#: 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:104
+#: bookwyrm/templates/annual_summary/layout.html:112
#, python-format
msgid "Sadly %(display_name)s didn’t finish any book in %(year)s"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:110
+#: bookwyrm/templates/annual_summary/layout.html:118
#, python-format
-msgid "In %(year)s, %(display_name)s read %(books_total)s books
for a total of %(pages_total)s pages!"
-msgstr ""
+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:112
+#: bookwyrm/templates/annual_summary/layout.html:124
msgid "That’s great!"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:115
+#: bookwyrm/templates/annual_summary/layout.html:127
#, python-format
msgid "That makes an average of %(pages)s pages per book."
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:120
+#: bookwyrm/templates/annual_summary/layout.html:132
#, python-format
msgid "(%(no_page_number)s book doesn’t have pages)"
msgid_plural "(%(no_page_number)s books don’t have pages)"
msgstr[0] ""
msgstr[1] ""
-#: bookwyrm/templates/annual_summary/layout.html:136
+#: bookwyrm/templates/annual_summary/layout.html:148
msgid "Their shortest read this year…"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:143
-#: bookwyrm/templates/annual_summary/layout.html:164
-#: bookwyrm/templates/annual_summary/layout.html:204
+#: bookwyrm/templates/annual_summary/layout.html:155
+#: bookwyrm/templates/annual_summary/layout.html:176
+#: bookwyrm/templates/annual_summary/layout.html:220
#: bookwyrm/templates/book/book.html:47
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:25
@@ -340,33 +342,35 @@ msgstr ""
msgid "by"
msgstr "von"
-#: bookwyrm/templates/annual_summary/layout.html:149
-#: bookwyrm/templates/annual_summary/layout.html:170
+#: bookwyrm/templates/annual_summary/layout.html:161
+#: bookwyrm/templates/annual_summary/layout.html:182
#, python-format
msgid "%(pages)s pages"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:157
+#: bookwyrm/templates/annual_summary/layout.html:169
msgid "…and the longest"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:187
+#: bookwyrm/templates/annual_summary/layout.html:199
#, python-format
-msgid "%(display_name)s left %(ratings_total)s ratings,
their average rating is %(rating_average)s"
-msgstr ""
+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:197
+#: bookwyrm/templates/annual_summary/layout.html:213
msgid "Their best rated review"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:210
+#: bookwyrm/templates/annual_summary/layout.html:226
#, python-format
msgid "Their rating: %(rating)s"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:227
+#: bookwyrm/templates/annual_summary/layout.html:243
#, python-format
-msgid "All the books %(display_name)s read in 2021"
+msgid "All the books %(display_name)s read in %(year)s"
msgstr ""
#: bookwyrm/templates/author/author.html:18
diff --git a/locale/en_US/LC_MESSAGES/django.po b/locale/en_US/LC_MESSAGES/django.po
index 8de2afe9c..ccc82bf8e 100644
--- a/locale/en_US/LC_MESSAGES/django.po
+++ b/locale/en_US/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.0.1\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-12-28 20:12+0000\n"
+"POT-Creation-Date: 2021-12-29 21:32+0000\n"
"PO-Revision-Date: 2021-02-28 17:19-0800\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: English \n"
@@ -61,7 +61,7 @@ msgstr ""
msgid "Rating"
msgstr ""
-#: bookwyrm/forms.py:473 bookwyrm/templates/lists/list.html:110
+#: bookwyrm/forms.py:473 bookwyrm/templates/lists/list.html:121
msgid "Sort By"
msgstr ""
@@ -145,7 +145,7 @@ msgstr ""
msgid "%(value)s is not a valid username"
msgstr ""
-#: bookwyrm/models/fields.py:183 bookwyrm/templates/layout.html:173
+#: bookwyrm/models/fields.py:183 bookwyrm/templates/layout.html:170
#: bookwyrm/templates/ostatus/error.html:29
msgid "username"
msgstr ""
@@ -269,7 +269,7 @@ msgid "Copy address"
msgstr ""
#: bookwyrm/templates/annual_summary/layout.html:68
-#: bookwyrm/templates/lists/list.html:194
+#: bookwyrm/templates/lists/list.html:217
msgid "Copied!"
msgstr ""
@@ -520,7 +520,7 @@ msgstr ""
#: bookwyrm/templates/book/readthrough.html:76
#: bookwyrm/templates/groups/form.html:24
#: bookwyrm/templates/lists/bookmark_button.html:15
-#: bookwyrm/templates/lists/form.html:75
+#: bookwyrm/templates/lists/form.html:124
#: bookwyrm/templates/preferences/edit_user.html:124
#: bookwyrm/templates/settings/announcements/announcement_form.html:76
#: bookwyrm/templates/settings/federation/edit_instance.html:82
@@ -642,7 +642,7 @@ msgstr ""
msgid "Places"
msgstr ""
-#: bookwyrm/templates/book/book.html:320 bookwyrm/templates/layout.html:77
+#: bookwyrm/templates/book/book.html:320 bookwyrm/templates/layout.html:74
#: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:25
#: bookwyrm/templates/search/layout.html:50
@@ -656,7 +656,7 @@ msgstr ""
#: bookwyrm/templates/book/book.html:341
#: bookwyrm/templates/book/cover_modal.html:31
-#: bookwyrm/templates/lists/list.html:182
+#: bookwyrm/templates/lists/list.html:195
#: bookwyrm/templates/settings/email_blocklist/domain_form.html:24
#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:31
msgid "Add"
@@ -940,8 +940,8 @@ msgstr ""
#: bookwyrm/templates/components/modal.html:11
#: bookwyrm/templates/components/tooltip.html:7
#: bookwyrm/templates/feed/layout.html:71
-#: bookwyrm/templates/get_started/layout.html:20
-#: bookwyrm/templates/get_started/layout.html:53
+#: bookwyrm/templates/get_started/layout.html:25
+#: bookwyrm/templates/get_started/layout.html:58
#: bookwyrm/templates/search/book.html:49
#: bookwyrm/templates/snippets/announcement.html:18
msgid "Close"
@@ -1017,7 +1017,7 @@ msgstr ""
#: bookwyrm/templates/directory/directory.html:4
#: bookwyrm/templates/directory/directory.html:9
-#: bookwyrm/templates/layout.html:103
+#: bookwyrm/templates/layout.html:100
msgid "Directory"
msgstr ""
@@ -1137,7 +1137,7 @@ msgstr ""
#: bookwyrm/templates/discover/discover.html:4
#: bookwyrm/templates/discover/discover.html:10
-#: bookwyrm/templates/layout.html:80
+#: bookwyrm/templates/layout.html:77
msgid "Discover"
msgstr ""
@@ -1260,12 +1260,12 @@ msgid "%(site_name)s home page"
msgstr ""
#: bookwyrm/templates/embed-layout.html:34
-#: bookwyrm/templates/landing/about.html:7 bookwyrm/templates/layout.html:232
+#: bookwyrm/templates/landing/about.html:7 bookwyrm/templates/layout.html:229
#, python-format
msgid "About %(site_name)s"
msgstr ""
-#: bookwyrm/templates/embed-layout.html:40 bookwyrm/templates/layout.html:236
+#: bookwyrm/templates/embed-layout.html:40 bookwyrm/templates/layout.html:233
msgid "Contact site admin"
msgstr ""
@@ -1279,7 +1279,7 @@ msgid "Direct Messages with %(username)s"
msgstr ""
#: bookwyrm/templates/feed/direct_messages.html:10
-#: bookwyrm/templates/layout.html:113
+#: bookwyrm/templates/layout.html:110
msgid "Direct Messages"
msgstr ""
@@ -1332,7 +1332,7 @@ msgstr ""
msgid "Updates"
msgstr ""
-#: bookwyrm/templates/feed/layout.html:12 bookwyrm/templates/layout.html:108
+#: bookwyrm/templates/feed/layout.html:12 bookwyrm/templates/layout.html:105
msgid "Your Books"
msgstr ""
@@ -1409,7 +1409,7 @@ msgid "What are you reading?"
msgstr ""
#: bookwyrm/templates/get_started/books.html:9
-#: bookwyrm/templates/layout.html:47 bookwyrm/templates/lists/list.html:138
+#: bookwyrm/templates/layout.html:47 bookwyrm/templates/lists/list.html:149
msgid "Search for a book"
msgstr ""
@@ -1429,7 +1429,7 @@ msgstr ""
#: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/group.html:19
#: bookwyrm/templates/groups/group.html:20 bookwyrm/templates/layout.html:53
-#: bookwyrm/templates/layout.html:54 bookwyrm/templates/lists/list.html:142
+#: bookwyrm/templates/layout.html:54 bookwyrm/templates/lists/list.html:153
#: bookwyrm/templates/search/layout.html:4
#: bookwyrm/templates/search/layout.html:9
msgid "Search"
@@ -1445,12 +1445,12 @@ msgid "Popular on %(site_name)s"
msgstr ""
#: bookwyrm/templates/get_started/books.html:58
-#: bookwyrm/templates/lists/list.html:155
+#: bookwyrm/templates/lists/list.html:166
msgid "No books found"
msgstr ""
#: bookwyrm/templates/get_started/books.html:63
-#: bookwyrm/templates/get_started/profile.html:51
+#: bookwyrm/templates/get_started/profile.html:64
msgid "Save & continue"
msgstr ""
@@ -1459,33 +1459,33 @@ msgstr ""
msgid "Welcome"
msgstr ""
-#: bookwyrm/templates/get_started/layout.html:15
+#: bookwyrm/templates/get_started/layout.html:20
#, python-format
msgid "Welcome to %(site_name)s!"
msgstr ""
-#: bookwyrm/templates/get_started/layout.html:17
+#: bookwyrm/templates/get_started/layout.html:22
msgid "These are some first steps to get you started."
msgstr ""
-#: bookwyrm/templates/get_started/layout.html:31
+#: bookwyrm/templates/get_started/layout.html:36
#: bookwyrm/templates/get_started/profile.html:6
msgid "Create your profile"
msgstr ""
-#: bookwyrm/templates/get_started/layout.html:35
+#: bookwyrm/templates/get_started/layout.html:40
msgid "Add books"
msgstr ""
-#: bookwyrm/templates/get_started/layout.html:39
+#: bookwyrm/templates/get_started/layout.html:44
msgid "Find friends"
msgstr ""
-#: bookwyrm/templates/get_started/layout.html:45
+#: bookwyrm/templates/get_started/layout.html:50
msgid "Skip this step"
msgstr ""
-#: bookwyrm/templates/get_started/layout.html:49
+#: bookwyrm/templates/get_started/layout.html:54
msgid "Finish"
msgstr ""
@@ -1494,29 +1494,29 @@ msgstr ""
msgid "Display name:"
msgstr ""
-#: bookwyrm/templates/get_started/profile.html:21
+#: bookwyrm/templates/get_started/profile.html:29
#: bookwyrm/templates/preferences/edit_user.html:47
msgid "Summary:"
msgstr ""
-#: bookwyrm/templates/get_started/profile.html:22
+#: bookwyrm/templates/get_started/profile.html:34
msgid "A little bit about you"
msgstr ""
-#: bookwyrm/templates/get_started/profile.html:30
+#: bookwyrm/templates/get_started/profile.html:43
#: bookwyrm/templates/preferences/edit_user.html:27
msgid "Avatar:"
msgstr ""
-#: bookwyrm/templates/get_started/profile.html:39
+#: bookwyrm/templates/get_started/profile.html:52
msgid "Manually approve followers:"
msgstr ""
-#: bookwyrm/templates/get_started/profile.html:45
+#: bookwyrm/templates/get_started/profile.html:58
msgid "Show this account in suggested users:"
msgstr ""
-#: bookwyrm/templates/get_started/profile.html:49
+#: 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 ""
@@ -1908,7 +1908,7 @@ msgid "Login"
msgstr ""
#: bookwyrm/templates/landing/login.html:7
-#: bookwyrm/templates/landing/login.html:36 bookwyrm/templates/layout.html:181
+#: bookwyrm/templates/landing/login.html:36 bookwyrm/templates/layout.html:178
#: bookwyrm/templates/ostatus/error.html:37
msgid "Log in"
msgstr ""
@@ -1917,7 +1917,7 @@ msgstr ""
msgid "Success! Email address confirmed."
msgstr ""
-#: bookwyrm/templates/landing/login.html:21 bookwyrm/templates/layout.html:172
+#: bookwyrm/templates/landing/login.html:21 bookwyrm/templates/layout.html:169
#: bookwyrm/templates/ostatus/error.html:28
#: bookwyrm/templates/snippets/register_form.html:4
msgid "Username:"
@@ -1925,12 +1925,12 @@ msgstr ""
#: bookwyrm/templates/landing/login.html:27
#: bookwyrm/templates/landing/password_reset.html:26
-#: bookwyrm/templates/layout.html:176 bookwyrm/templates/ostatus/error.html:32
+#: bookwyrm/templates/layout.html:173 bookwyrm/templates/ostatus/error.html:32
#: bookwyrm/templates/snippets/register_form.html:20
msgid "Password:"
msgstr ""
-#: bookwyrm/templates/landing/login.html:39 bookwyrm/templates/layout.html:178
+#: bookwyrm/templates/landing/login.html:39 bookwyrm/templates/layout.html:175
#: bookwyrm/templates/ostatus/error.html:34
msgid "Forgot your password?"
msgstr ""
@@ -1962,19 +1962,19 @@ msgstr ""
msgid "Search for a book, user, or list"
msgstr ""
-#: bookwyrm/templates/layout.html:63 bookwyrm/templates/layout.html:64
+#: bookwyrm/templates/layout.html:63
msgid "Main navigation menu"
msgstr ""
-#: bookwyrm/templates/layout.html:74
+#: bookwyrm/templates/layout.html:71
msgid "Feed"
msgstr ""
-#: bookwyrm/templates/layout.html:118
+#: bookwyrm/templates/layout.html:115
msgid "Settings"
msgstr ""
-#: bookwyrm/templates/layout.html:127
+#: bookwyrm/templates/layout.html:124
#: 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
@@ -1982,46 +1982,46 @@ msgstr ""
msgid "Invites"
msgstr ""
-#: bookwyrm/templates/layout.html:134
+#: bookwyrm/templates/layout.html:131
msgid "Admin"
msgstr ""
-#: bookwyrm/templates/layout.html:141
+#: bookwyrm/templates/layout.html:138
msgid "Log out"
msgstr ""
-#: bookwyrm/templates/layout.html:149 bookwyrm/templates/layout.html:150
+#: bookwyrm/templates/layout.html:146 bookwyrm/templates/layout.html:147
#: bookwyrm/templates/notifications/notifications_page.html:5
#: bookwyrm/templates/notifications/notifications_page.html:10
msgid "Notifications"
msgstr ""
-#: bookwyrm/templates/layout.html:177 bookwyrm/templates/ostatus/error.html:33
+#: bookwyrm/templates/layout.html:174 bookwyrm/templates/ostatus/error.html:33
msgid "password"
msgstr ""
-#: bookwyrm/templates/layout.html:189
+#: bookwyrm/templates/layout.html:186
msgid "Join"
msgstr ""
-#: bookwyrm/templates/layout.html:223
+#: bookwyrm/templates/layout.html:220
msgid "Successfully posted status"
msgstr ""
-#: bookwyrm/templates/layout.html:224
+#: bookwyrm/templates/layout.html:221
msgid "Error posting status"
msgstr ""
-#: bookwyrm/templates/layout.html:240
+#: bookwyrm/templates/layout.html:237
msgid "Documentation"
msgstr ""
-#: bookwyrm/templates/layout.html:247
+#: bookwyrm/templates/layout.html:244
#, python-format
msgid "Support %(site_name)s on %(support_title)s"
msgstr ""
-#: bookwyrm/templates/layout.html:251
+#: bookwyrm/templates/layout.html:248
msgid "BookWyrm's source code is freely available. You can contribute or report issues on GitHub."
msgstr ""
@@ -2097,56 +2097,56 @@ msgstr ""
msgid "List curation:"
msgstr ""
-#: bookwyrm/templates/lists/form.html:22
+#: bookwyrm/templates/lists/form.html:31
msgid "Closed"
msgstr ""
-#: bookwyrm/templates/lists/form.html:23
+#: bookwyrm/templates/lists/form.html:34
msgid "Only you can add and remove books to this list"
msgstr ""
-#: bookwyrm/templates/lists/form.html:27
+#: bookwyrm/templates/lists/form.html:48
msgid "Curated"
msgstr ""
-#: bookwyrm/templates/lists/form.html:28
+#: bookwyrm/templates/lists/form.html:51
msgid "Anyone can suggest books, subject to your approval"
msgstr ""
-#: bookwyrm/templates/lists/form.html:32
+#: bookwyrm/templates/lists/form.html:65
msgctxt "curation type"
msgid "Open"
msgstr ""
-#: bookwyrm/templates/lists/form.html:33
+#: bookwyrm/templates/lists/form.html:68
msgid "Anyone can add books to this list"
msgstr ""
-#: bookwyrm/templates/lists/form.html:37
+#: bookwyrm/templates/lists/form.html:82
msgid "Group"
msgstr ""
-#: bookwyrm/templates/lists/form.html:38
+#: bookwyrm/templates/lists/form.html:85
msgid "Group members can add to and remove from this list"
msgstr ""
-#: bookwyrm/templates/lists/form.html:41
+#: bookwyrm/templates/lists/form.html:90
msgid "Select Group"
msgstr ""
-#: bookwyrm/templates/lists/form.html:45
+#: bookwyrm/templates/lists/form.html:94
msgid "Select a group"
msgstr ""
-#: bookwyrm/templates/lists/form.html:56
+#: bookwyrm/templates/lists/form.html:105
msgid "You don't have any Groups yet!"
msgstr ""
-#: bookwyrm/templates/lists/form.html:58
+#: bookwyrm/templates/lists/form.html:107
msgid "Create a Group"
msgstr ""
-#: bookwyrm/templates/lists/form.html:81
+#: bookwyrm/templates/lists/form.html:130
msgid "Delete list"
msgstr ""
@@ -2163,62 +2163,62 @@ msgstr ""
msgid "Added by %(username)s"
msgstr ""
-#: bookwyrm/templates/lists/list.html:76
+#: bookwyrm/templates/lists/list.html:82
msgid "List position"
msgstr ""
-#: bookwyrm/templates/lists/list.html:82
+#: bookwyrm/templates/lists/list.html:88
msgid "Set"
msgstr ""
-#: bookwyrm/templates/lists/list.html:92
+#: bookwyrm/templates/lists/list.html:103
#: bookwyrm/templates/snippets/remove_from_group_button.html:19
msgid "Remove"
msgstr ""
-#: bookwyrm/templates/lists/list.html:106
-#: bookwyrm/templates/lists/list.html:123
+#: bookwyrm/templates/lists/list.html:117
+#: bookwyrm/templates/lists/list.html:134
msgid "Sort List"
msgstr ""
-#: bookwyrm/templates/lists/list.html:116
+#: bookwyrm/templates/lists/list.html:127
msgid "Direction"
msgstr ""
-#: bookwyrm/templates/lists/list.html:130
+#: bookwyrm/templates/lists/list.html:141
msgid "Add Books"
msgstr ""
-#: bookwyrm/templates/lists/list.html:132
+#: bookwyrm/templates/lists/list.html:143
msgid "Suggest Books"
msgstr ""
-#: bookwyrm/templates/lists/list.html:143
+#: bookwyrm/templates/lists/list.html:154
msgid "search"
msgstr ""
-#: bookwyrm/templates/lists/list.html:149
+#: bookwyrm/templates/lists/list.html:160
msgid "Clear search"
msgstr ""
-#: bookwyrm/templates/lists/list.html:154
+#: bookwyrm/templates/lists/list.html:165
#, python-format
msgid "No books found matching the query \"%(query)s\""
msgstr ""
-#: bookwyrm/templates/lists/list.html:182
+#: bookwyrm/templates/lists/list.html:197
msgid "Suggest"
msgstr ""
-#: bookwyrm/templates/lists/list.html:191
+#: bookwyrm/templates/lists/list.html:208
msgid "Embed this list on a website"
msgstr ""
-#: bookwyrm/templates/lists/list.html:194
+#: bookwyrm/templates/lists/list.html:216
msgid "Copy embed code"
msgstr ""
-#: bookwyrm/templates/lists/list.html:194
+#: bookwyrm/templates/lists/list.html:218
#, python-format
msgid "%(list_name)s, a list by %(owner)s on %(site_name)s"
msgstr ""
@@ -2697,7 +2697,7 @@ msgstr ""
msgid "Edit Announcement"
msgstr ""
-#: bookwyrm/templates/settings/announcements/announcement.html:35
+#: bookwyrm/templates/settings/announcements/announcement.html:34
msgid "Visible:"
msgstr ""
@@ -2709,19 +2709,19 @@ msgstr ""
msgid "False"
msgstr ""
-#: bookwyrm/templates/settings/announcements/announcement.html:47
+#: bookwyrm/templates/settings/announcements/announcement.html:46
#: bookwyrm/templates/settings/announcements/announcement_form.html:44
#: bookwyrm/templates/settings/dashboard/dashboard.html:71
msgid "Start date:"
msgstr ""
-#: bookwyrm/templates/settings/announcements/announcement.html:54
+#: bookwyrm/templates/settings/announcements/announcement.html:51
#: bookwyrm/templates/settings/announcements/announcement_form.html:54
#: bookwyrm/templates/settings/dashboard/dashboard.html:77
msgid "End date:"
msgstr ""
-#: bookwyrm/templates/settings/announcements/announcement.html:60
+#: bookwyrm/templates/settings/announcements/announcement.html:55
#: bookwyrm/templates/settings/announcements/announcement_form.html:64
msgid "Active:"
msgstr ""
@@ -4284,7 +4284,7 @@ msgstr ""
msgid "Not a valid csv file"
msgstr ""
-#: bookwyrm/views/landing/login.py:69
+#: bookwyrm/views/landing/login.py:70
msgid "Username or password are incorrect"
msgstr ""
diff --git a/locale/es_ES/LC_MESSAGES/django.mo b/locale/es_ES/LC_MESSAGES/django.mo
index 1169b92fe..dcbbaf95e 100644
Binary files a/locale/es_ES/LC_MESSAGES/django.mo and b/locale/es_ES/LC_MESSAGES/django.mo differ
diff --git a/locale/es_ES/LC_MESSAGES/django.po b/locale/es_ES/LC_MESSAGES/django.po
index a59ef61ae..d5b073536 100644
--- a/locale/es_ES/LC_MESSAGES/django.po
+++ b/locale/es_ES/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-12-28 15:00+0000\n"
-"PO-Revision-Date: 2021-12-28 17:59\n"
+"POT-Creation-Date: 2021-12-28 20:12+0000\n"
+"PO-Revision-Date: 2021-12-28 22:55\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: Spanish\n"
"Language: es\n"
@@ -263,76 +263,78 @@ msgstr "El año de lectura de %(display_name)s"
msgid "Share this page"
msgstr "Compartir esta página"
-#: bookwyrm/templates/annual_summary/layout.html:61
+#: bookwyrm/templates/annual_summary/layout.html:67
msgid "Copy address"
msgstr "Copiar direcciĂłn"
-#: bookwyrm/templates/annual_summary/layout.html:61
+#: bookwyrm/templates/annual_summary/layout.html:68
#: bookwyrm/templates/lists/list.html:194
msgid "Copied!"
msgstr "¡Copiado!"
-#: bookwyrm/templates/annual_summary/layout.html:69
+#: bookwyrm/templates/annual_summary/layout.html:77
msgid "Sharing status: public with key"
msgstr "Nivel de compartido: pĂşblico con llave"
-#: bookwyrm/templates/annual_summary/layout.html:70
+#: bookwyrm/templates/annual_summary/layout.html:78
msgid "The page can be seen by anyone with the complete address."
msgstr "La página puede ser vista por cualquier persona que tenga la dirección completa."
-#: bookwyrm/templates/annual_summary/layout.html:75
+#: bookwyrm/templates/annual_summary/layout.html:83
msgid "Make page private"
msgstr "Hacer privada la página"
-#: bookwyrm/templates/annual_summary/layout.html:81
+#: bookwyrm/templates/annual_summary/layout.html:89
msgid "Sharing status: private"
msgstr "Nivel de compartido: privado"
-#: bookwyrm/templates/annual_summary/layout.html:82
+#: bookwyrm/templates/annual_summary/layout.html:90
msgid "The page is private, only you can see it."
msgstr "La página es privada, solo tú puedes verla."
-#: bookwyrm/templates/annual_summary/layout.html:87
+#: bookwyrm/templates/annual_summary/layout.html:95
msgid "Make page public"
msgstr "Hacer pública la página"
-#: bookwyrm/templates/annual_summary/layout.html:91
+#: 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 "Una vez que haces privada tu página, la clave antigua ya no dará acceso a la página. Si la página se vuelve a hacer pública se creará una nueva clave."
-#: bookwyrm/templates/annual_summary/layout.html:104
+#: bookwyrm/templates/annual_summary/layout.html:112
#, python-format
msgid "Sadly %(display_name)s didn’t finish any book in %(year)s"
msgstr "Lamentablemente, %(display_name)s no terminĂł ningĂşn libro en %(year)s"
-#: bookwyrm/templates/annual_summary/layout.html:110
+#: bookwyrm/templates/annual_summary/layout.html:118
#, python-format
-msgid "In %(year)s, %(display_name)s read %(books_total)s books
for a total of %(pages_total)s pages!"
-msgstr "En %(year)s %(display_name)s ha leĂdo %(books_total)s libros
¡haciendo un total de %(pages_total)s páginas!"
+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] "En %(year)s %(display_name)s ha leĂdo %(books_total)s libro
¡haciendo un total de %(pages_total)s páginas!"
+msgstr[1] "En %(year)s %(display_name)s ha leĂdo %(books_total)s libros
¡haciendo un total de %(pages_total)s páginas!"
-#: bookwyrm/templates/annual_summary/layout.html:112
+#: bookwyrm/templates/annual_summary/layout.html:124
msgid "That’s great!"
msgstr "¡Eso es genial!"
-#: bookwyrm/templates/annual_summary/layout.html:115
+#: bookwyrm/templates/annual_summary/layout.html:127
#, python-format
msgid "That makes an average of %(pages)s pages per book."
msgstr "Eso hace un promedio de %(pages)s páginas por libro."
-#: bookwyrm/templates/annual_summary/layout.html:120
+#: bookwyrm/templates/annual_summary/layout.html:132
#, python-format
msgid "(%(no_page_number)s book doesn’t have pages)"
msgid_plural "(%(no_page_number)s books don’t have pages)"
msgstr[0] "(%(no_page_number)s libro no tiene páginas)"
msgstr[1] "(%(no_page_number)s libros no tienen páginas)"
-#: bookwyrm/templates/annual_summary/layout.html:136
+#: bookwyrm/templates/annual_summary/layout.html:148
msgid "Their shortest read this year…"
msgstr "Su lectura más corta de este año…"
-#: bookwyrm/templates/annual_summary/layout.html:143
-#: bookwyrm/templates/annual_summary/layout.html:164
-#: bookwyrm/templates/annual_summary/layout.html:204
+#: bookwyrm/templates/annual_summary/layout.html:155
+#: bookwyrm/templates/annual_summary/layout.html:176
+#: bookwyrm/templates/annual_summary/layout.html:220
#: bookwyrm/templates/book/book.html:47
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:25
@@ -340,34 +342,36 @@ msgstr "Su lectura más corta de este año…"
msgid "by"
msgstr "por"
-#: bookwyrm/templates/annual_summary/layout.html:149
-#: bookwyrm/templates/annual_summary/layout.html:170
+#: bookwyrm/templates/annual_summary/layout.html:161
+#: bookwyrm/templates/annual_summary/layout.html:182
#, python-format
msgid "%(pages)s pages"
msgstr "%(pages)s páginas"
-#: bookwyrm/templates/annual_summary/layout.html:157
+#: bookwyrm/templates/annual_summary/layout.html:169
msgid "…and the longest"
msgstr "… y la más larga"
-#: bookwyrm/templates/annual_summary/layout.html:187
+#: bookwyrm/templates/annual_summary/layout.html:199
#, python-format
-msgid "%(display_name)s left %(ratings_total)s ratings,
their average rating is %(rating_average)s"
-msgstr "%(display_name)s dio %(ratings_total)s valoraciones,
su valoraciĂłn media es %(rating_average)s"
+msgid "%(display_name)s left %(ratings_total)s rating,
their average rating is %(rating_average)s"
+msgid_plural "%(display_name)s left %(ratings_total)s ratings,
their average rating is %(rating_average)s"
+msgstr[0] "%(display_name)s dio %(ratings_total)s valoraciĂłn,
su valoraciĂłn media es %(rating_average)s"
+msgstr[1] "%(display_name)s dio %(ratings_total)s valoraciones,
su valoraciĂłn media es %(rating_average)s"
-#: bookwyrm/templates/annual_summary/layout.html:197
+#: bookwyrm/templates/annual_summary/layout.html:213
msgid "Their best rated review"
msgstr "Su mejor valoraciĂłn"
-#: bookwyrm/templates/annual_summary/layout.html:210
+#: bookwyrm/templates/annual_summary/layout.html:226
#, python-format
msgid "Their rating: %(rating)s"
msgstr "Su valoraciĂłn: %(rating)s"
-#: bookwyrm/templates/annual_summary/layout.html:227
+#: bookwyrm/templates/annual_summary/layout.html:243
#, python-format
-msgid "All the books %(display_name)s read in 2021"
-msgstr "Todos los libros que ha leĂdo %(display_name)s en 2021"
+msgid "All the books %(display_name)s read in %(year)s"
+msgstr "Todos los libros que ha leĂdo %(display_name)s en %(year)s"
#: bookwyrm/templates/author/author.html:18
#: bookwyrm/templates/author/author.html:19
diff --git a/locale/fr_FR/LC_MESSAGES/django.mo b/locale/fr_FR/LC_MESSAGES/django.mo
index bf14adb82..bbac096ea 100644
Binary files a/locale/fr_FR/LC_MESSAGES/django.mo and b/locale/fr_FR/LC_MESSAGES/django.mo differ
diff --git a/locale/fr_FR/LC_MESSAGES/django.po b/locale/fr_FR/LC_MESSAGES/django.po
index 2710a8b9c..199a0de68 100644
--- a/locale/fr_FR/LC_MESSAGES/django.po
+++ b/locale/fr_FR/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-12-28 15:00+0000\n"
-"PO-Revision-Date: 2021-12-28 16:59\n"
+"POT-Creation-Date: 2021-12-28 20:12+0000\n"
+"PO-Revision-Date: 2021-12-28 21:17\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: French\n"
"Language: fr\n"
@@ -263,76 +263,78 @@ msgstr "l’année de lecture de %(display_name)s"
msgid "Share this page"
msgstr "Partager cette page"
-#: bookwyrm/templates/annual_summary/layout.html:61
+#: bookwyrm/templates/annual_summary/layout.html:67
msgid "Copy address"
msgstr "Copier l’adresse"
-#: bookwyrm/templates/annual_summary/layout.html:61
+#: bookwyrm/templates/annual_summary/layout.html:68
#: bookwyrm/templates/lists/list.html:194
msgid "Copied!"
msgstr "Copié!"
-#: bookwyrm/templates/annual_summary/layout.html:69
+#: bookwyrm/templates/annual_summary/layout.html:77
msgid "Sharing status: public with key"
msgstr "Statut de partage : public avec clé"
-#: bookwyrm/templates/annual_summary/layout.html:70
+#: bookwyrm/templates/annual_summary/layout.html:78
msgid "The page can be seen by anyone with the complete address."
msgstr "La page peut être consultée par toute personne ayant l'adresse complète."
-#: bookwyrm/templates/annual_summary/layout.html:75
+#: bookwyrm/templates/annual_summary/layout.html:83
msgid "Make page private"
msgstr "Rendre cette page privée"
-#: bookwyrm/templates/annual_summary/layout.html:81
+#: bookwyrm/templates/annual_summary/layout.html:89
msgid "Sharing status: private"
msgstr "Statut de partage : privé"
-#: bookwyrm/templates/annual_summary/layout.html:82
+#: bookwyrm/templates/annual_summary/layout.html:90
msgid "The page is private, only you can see it."
msgstr "La page est privée, seulement vous pouvez la voir."
-#: bookwyrm/templates/annual_summary/layout.html:87
+#: bookwyrm/templates/annual_summary/layout.html:95
msgid "Make page public"
msgstr "Rendre cette page publique"
-#: bookwyrm/templates/annual_summary/layout.html:91
+#: 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 "Lorsque vous rendez votre page privée, l’ancienne clé ne donnera plus accès à la page. Une nouvelle clé sera créée si la page est à nouveau rendue publique."
-#: bookwyrm/templates/annual_summary/layout.html:104
+#: bookwyrm/templates/annual_summary/layout.html:112
#, python-format
msgid "Sadly %(display_name)s didn’t finish any book in %(year)s"
msgstr "Malheureusement, %(display_name)s n’a terminé aucun livre en %(year)s"
-#: bookwyrm/templates/annual_summary/layout.html:110
+#: bookwyrm/templates/annual_summary/layout.html:118
#, python-format
-msgid "In %(year)s, %(display_name)s read %(books_total)s books
for a total of %(pages_total)s pages!"
-msgstr "En %(year)s, %(display_name)s a lu %(books_total)s livres
pour un total de %(pages_total)s pages !"
+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] "En %(year)s, %(display_name)s a lu %(books_total)s livre
pour un total de %(pages_total)s pages !"
+msgstr[1] "En %(year)s, %(display_name)s a lu %(books_total)s livres
pour un total de %(pages_total)s pages !"
-#: bookwyrm/templates/annual_summary/layout.html:112
+#: bookwyrm/templates/annual_summary/layout.html:124
msgid "That’s great!"
msgstr "C’est génial !"
-#: bookwyrm/templates/annual_summary/layout.html:115
+#: bookwyrm/templates/annual_summary/layout.html:127
#, python-format
msgid "That makes an average of %(pages)s pages per book."
msgstr "Ce qui fait en moyenne %(pages)s pages par livre."
-#: bookwyrm/templates/annual_summary/layout.html:120
+#: bookwyrm/templates/annual_summary/layout.html:132
#, python-format
msgid "(%(no_page_number)s book doesn’t have pages)"
msgid_plural "(%(no_page_number)s books don’t have pages)"
msgstr[0] "(%(no_page_number)s livre n’a pas de pages)"
msgstr[1] "(%(no_page_number)s livres n’ont pas de pages)"
-#: bookwyrm/templates/annual_summary/layout.html:136
+#: bookwyrm/templates/annual_summary/layout.html:148
msgid "Their shortest read this year…"
msgstr "Sa lecture la plus courte l’année…"
-#: bookwyrm/templates/annual_summary/layout.html:143
-#: bookwyrm/templates/annual_summary/layout.html:164
-#: bookwyrm/templates/annual_summary/layout.html:204
+#: bookwyrm/templates/annual_summary/layout.html:155
+#: bookwyrm/templates/annual_summary/layout.html:176
+#: bookwyrm/templates/annual_summary/layout.html:220
#: bookwyrm/templates/book/book.html:47
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:25
@@ -340,34 +342,36 @@ msgstr "Sa lecture la plus courte l’année…"
msgid "by"
msgstr "de"
-#: bookwyrm/templates/annual_summary/layout.html:149
-#: bookwyrm/templates/annual_summary/layout.html:170
+#: bookwyrm/templates/annual_summary/layout.html:161
+#: bookwyrm/templates/annual_summary/layout.html:182
#, python-format
msgid "%(pages)s pages"
msgstr "%(pages)s pages"
-#: bookwyrm/templates/annual_summary/layout.html:157
+#: bookwyrm/templates/annual_summary/layout.html:169
msgid "…and the longest"
msgstr "…et sa plus longue lecture"
-#: bookwyrm/templates/annual_summary/layout.html:187
+#: bookwyrm/templates/annual_summary/layout.html:199
#, python-format
-msgid "%(display_name)s left %(ratings_total)s ratings,
their average rating is %(rating_average)s"
-msgstr "%(display_name)s a laissé %(ratings_total)s notes,
sa note moyenne est %(rating_average)s"
+msgid "%(display_name)s left %(ratings_total)s rating,
their average rating is %(rating_average)s"
+msgid_plural "%(display_name)s left %(ratings_total)s ratings,
their average rating is %(rating_average)s"
+msgstr[0] "%(display_name)s a laissé %(ratings_total)s critique,
sa note moyenne est %(rating_average)s"
+msgstr[1] "%(display_name)s a laissé %(ratings_total)s critiques,
sa note moyenne est %(rating_average)s"
-#: bookwyrm/templates/annual_summary/layout.html:197
+#: bookwyrm/templates/annual_summary/layout.html:213
msgid "Their best rated review"
msgstr "Son avis le mieux noté"
-#: bookwyrm/templates/annual_summary/layout.html:210
+#: bookwyrm/templates/annual_summary/layout.html:226
#, python-format
msgid "Their rating: %(rating)s"
msgstr "Sa note : %(rating)s"
-#: bookwyrm/templates/annual_summary/layout.html:227
+#: bookwyrm/templates/annual_summary/layout.html:243
#, python-format
-msgid "All the books %(display_name)s read in 2021"
-msgstr "Tous les livres que %(display_name)s a lus"
+msgid "All the books %(display_name)s read in %(year)s"
+msgstr "Tous les livres que %(display_name)s a lus en %(year)s"
#: bookwyrm/templates/author/author.html:18
#: bookwyrm/templates/author/author.html:19
diff --git a/locale/gl_ES/LC_MESSAGES/django.mo b/locale/gl_ES/LC_MESSAGES/django.mo
index d6d47d04b..d0e70f055 100644
Binary files a/locale/gl_ES/LC_MESSAGES/django.mo and b/locale/gl_ES/LC_MESSAGES/django.mo differ
diff --git a/locale/gl_ES/LC_MESSAGES/django.po b/locale/gl_ES/LC_MESSAGES/django.po
index 5f114c51f..eeccd7f09 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: 2021-12-28 15:00+0000\n"
-"PO-Revision-Date: 2021-12-28 16:03\n"
+"POT-Creation-Date: 2021-12-28 20:12+0000\n"
+"PO-Revision-Date: 2021-12-29 06:07\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: Galician\n"
"Language: gl\n"
@@ -263,76 +263,78 @@ msgstr "Un ano de lecturas de %(display_name)s"
msgid "Share this page"
msgstr "Comparte esta páxina"
-#: bookwyrm/templates/annual_summary/layout.html:61
+#: bookwyrm/templates/annual_summary/layout.html:67
msgid "Copy address"
msgstr "Copiar enderezo"
-#: bookwyrm/templates/annual_summary/layout.html:61
+#: bookwyrm/templates/annual_summary/layout.html:68
#: bookwyrm/templates/lists/list.html:194
msgid "Copied!"
msgstr "Copiado!"
-#: bookwyrm/templates/annual_summary/layout.html:69
+#: bookwyrm/templates/annual_summary/layout.html:77
msgid "Sharing status: public with key"
msgstr "Compartir estado: pĂşblico con chave"
-#: bookwyrm/templates/annual_summary/layout.html:70
+#: bookwyrm/templates/annual_summary/layout.html:78
msgid "The page can be seen by anyone with the complete address."
msgstr "Esta páxina será visible para calquera que teña o enderezo completo."
-#: bookwyrm/templates/annual_summary/layout.html:75
+#: bookwyrm/templates/annual_summary/layout.html:83
msgid "Make page private"
msgstr "Facer privada a páxina"
-#: bookwyrm/templates/annual_summary/layout.html:81
+#: bookwyrm/templates/annual_summary/layout.html:89
msgid "Sharing status: private"
msgstr "Compartir estado: privado"
-#: bookwyrm/templates/annual_summary/layout.html:82
+#: bookwyrm/templates/annual_summary/layout.html:90
msgid "The page is private, only you can see it."
msgstr "Esta páxina é privada só ti podes vela."
-#: bookwyrm/templates/annual_summary/layout.html:87
+#: bookwyrm/templates/annual_summary/layout.html:95
msgid "Make page public"
msgstr "Facer pública a páxina"
-#: bookwyrm/templates/annual_summary/layout.html:91
+#: 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 "Cando fas privada unha páxina, a chave antiga non dará acceso á mesma nunca máis. Crearase unha nova chave se volves a facer pública a páxina."
-#: bookwyrm/templates/annual_summary/layout.html:104
+#: bookwyrm/templates/annual_summary/layout.html:112
#, python-format
msgid "Sadly %(display_name)s didn’t finish any book in %(year)s"
msgstr "Unha mágoa, pero %(display_name)s aĂnda non rematou ningĂşn libro en %(year)s"
-#: bookwyrm/templates/annual_summary/layout.html:110
+#: bookwyrm/templates/annual_summary/layout.html:118
#, python-format
-msgid "In %(year)s, %(display_name)s read %(books_total)s books
for a total of %(pages_total)s pages!"
-msgstr "En %(year)s, %(display_name)s leu %(books_total)s libros
cun total de %(pages_total)s páxinas!"
+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] "En %(year)s, %(display_name)s leu %(books_total)s libro
cun total de %(pages_total)s páxinas!"
+msgstr[1] "En %(year)s, %(display_name)s leu %(books_total)s libros
cun total de %(pages_total)s páxinas!"
-#: bookwyrm/templates/annual_summary/layout.html:112
+#: bookwyrm/templates/annual_summary/layout.html:124
msgid "That’s great!"
msgstr "Está moi ben!"
-#: bookwyrm/templates/annual_summary/layout.html:115
+#: bookwyrm/templates/annual_summary/layout.html:127
#, python-format
msgid "That makes an average of %(pages)s pages per book."
-msgstr ""
+msgstr "Esto fai unha media de %(pages)s páxinas por libro."
-#: bookwyrm/templates/annual_summary/layout.html:120
+#: bookwyrm/templates/annual_summary/layout.html:132
#, python-format
msgid "(%(no_page_number)s book doesn’t have pages)"
msgid_plural "(%(no_page_number)s books don’t have pages)"
msgstr[0] "(%(no_page_number)s libro non ten páxinas)"
msgstr[1] "(%(no_page_number)s libros non teñen páxinas)"
-#: bookwyrm/templates/annual_summary/layout.html:136
+#: bookwyrm/templates/annual_summary/layout.html:148
msgid "Their shortest read this year…"
msgstr "A lectura máis curta deste ano…"
-#: bookwyrm/templates/annual_summary/layout.html:143
-#: bookwyrm/templates/annual_summary/layout.html:164
-#: bookwyrm/templates/annual_summary/layout.html:204
+#: bookwyrm/templates/annual_summary/layout.html:155
+#: bookwyrm/templates/annual_summary/layout.html:176
+#: bookwyrm/templates/annual_summary/layout.html:220
#: bookwyrm/templates/book/book.html:47
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:25
@@ -340,34 +342,36 @@ msgstr "A lectura máis curta deste ano…"
msgid "by"
msgstr "por"
-#: bookwyrm/templates/annual_summary/layout.html:149
-#: bookwyrm/templates/annual_summary/layout.html:170
+#: bookwyrm/templates/annual_summary/layout.html:161
+#: bookwyrm/templates/annual_summary/layout.html:182
#, python-format
msgid "%(pages)s pages"
msgstr "%(pages)s páxinas"
-#: bookwyrm/templates/annual_summary/layout.html:157
+#: bookwyrm/templates/annual_summary/layout.html:169
msgid "…and the longest"
msgstr "…e a máis longa"
-#: bookwyrm/templates/annual_summary/layout.html:187
+#: bookwyrm/templates/annual_summary/layout.html:199
#, python-format
-msgid "%(display_name)s left %(ratings_total)s ratings,
their average rating is %(rating_average)s"
-msgstr "%(display_name)s escribiu %(ratings_total)s valoraciĂłns,
a media das sĂşas valoraciĂłns Ă© %(rating_average)s"
+msgid "%(display_name)s left %(ratings_total)s rating,
their average rating is %(rating_average)s"
+msgid_plural "%(display_name)s left %(ratings_total)s ratings,
their average rating is %(rating_average)s"
+msgstr[0] "%(display_name)s fixo %(ratings_total)s valoraciĂłn,
cunha media de %(rating_average)s"
+msgstr[1] "%(display_name)s fixo %(ratings_total)s valoraciĂłns,
cunha puntuaciĂłn media de %(rating_average)s"
-#: bookwyrm/templates/annual_summary/layout.html:197
+#: bookwyrm/templates/annual_summary/layout.html:213
msgid "Their best rated review"
msgstr "A súa recensión máis valorada"
-#: bookwyrm/templates/annual_summary/layout.html:210
+#: bookwyrm/templates/annual_summary/layout.html:226
#, python-format
msgid "Their rating: %(rating)s"
msgstr "ValoraciĂłn: %(rating)s"
-#: bookwyrm/templates/annual_summary/layout.html:227
+#: bookwyrm/templates/annual_summary/layout.html:243
#, python-format
-msgid "All the books %(display_name)s read in 2021"
-msgstr "TĂłdolos libros lidos por %(display_name)s en 2021"
+msgid "All the books %(display_name)s read in %(year)s"
+msgstr "TĂłdolos libros que %(display_name)s leu en %(year)s"
#: bookwyrm/templates/author/author.html:18
#: bookwyrm/templates/author/author.html:19
diff --git a/locale/lt_LT/LC_MESSAGES/django.mo b/locale/lt_LT/LC_MESSAGES/django.mo
index d4cb5e29b..21cce6fa7 100644
Binary files a/locale/lt_LT/LC_MESSAGES/django.mo and b/locale/lt_LT/LC_MESSAGES/django.mo differ
diff --git a/locale/lt_LT/LC_MESSAGES/django.po b/locale/lt_LT/LC_MESSAGES/django.po
index 61c42289a..6a0971a34 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: 2021-12-28 15:00+0000\n"
-"PO-Revision-Date: 2021-12-28 16:03\n"
+"POT-Creation-Date: 2021-12-28 20:12+0000\n"
+"PO-Revision-Date: 2021-12-28 21:17\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: Lithuanian\n"
"Language: lt\n"
@@ -263,63 +263,67 @@ msgstr ""
msgid "Share this page"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:61
+#: bookwyrm/templates/annual_summary/layout.html:67
msgid "Copy address"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:61
+#: bookwyrm/templates/annual_summary/layout.html:68
#: bookwyrm/templates/lists/list.html:194
msgid "Copied!"
msgstr "Nukopijuota"
-#: bookwyrm/templates/annual_summary/layout.html:69
+#: bookwyrm/templates/annual_summary/layout.html:77
msgid "Sharing status: public with key"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:70
+#: 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:75
+#: bookwyrm/templates/annual_summary/layout.html:83
msgid "Make page private"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:81
+#: bookwyrm/templates/annual_summary/layout.html:89
msgid "Sharing status: private"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:82
+#: bookwyrm/templates/annual_summary/layout.html:90
msgid "The page is private, only you can see it."
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:87
+#: bookwyrm/templates/annual_summary/layout.html:95
msgid "Make page public"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:91
+#: 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:104
+#: bookwyrm/templates/annual_summary/layout.html:112
#, python-format
msgid "Sadly %(display_name)s didn’t finish any book in %(year)s"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:110
+#: bookwyrm/templates/annual_summary/layout.html:118
#, python-format
-msgid "In %(year)s, %(display_name)s read %(books_total)s books
for a total of %(pages_total)s pages!"
-msgstr ""
+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[2] ""
+msgstr[3] ""
-#: bookwyrm/templates/annual_summary/layout.html:112
+#: bookwyrm/templates/annual_summary/layout.html:124
msgid "That’s great!"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:115
+#: bookwyrm/templates/annual_summary/layout.html:127
#, python-format
msgid "That makes an average of %(pages)s pages per book."
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:120
+#: bookwyrm/templates/annual_summary/layout.html:132
#, python-format
msgid "(%(no_page_number)s book doesn’t have pages)"
msgid_plural "(%(no_page_number)s books don’t have pages)"
@@ -328,13 +332,13 @@ msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
-#: bookwyrm/templates/annual_summary/layout.html:136
+#: bookwyrm/templates/annual_summary/layout.html:148
msgid "Their shortest read this year…"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:143
-#: bookwyrm/templates/annual_summary/layout.html:164
-#: bookwyrm/templates/annual_summary/layout.html:204
+#: bookwyrm/templates/annual_summary/layout.html:155
+#: bookwyrm/templates/annual_summary/layout.html:176
+#: bookwyrm/templates/annual_summary/layout.html:220
#: bookwyrm/templates/book/book.html:47
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:25
@@ -342,33 +346,37 @@ msgstr ""
msgid "by"
msgstr " "
-#: bookwyrm/templates/annual_summary/layout.html:149
-#: bookwyrm/templates/annual_summary/layout.html:170
+#: bookwyrm/templates/annual_summary/layout.html:161
+#: bookwyrm/templates/annual_summary/layout.html:182
#, python-format
msgid "%(pages)s pages"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:157
+#: bookwyrm/templates/annual_summary/layout.html:169
msgid "…and the longest"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:187
+#: bookwyrm/templates/annual_summary/layout.html:199
#, python-format
-msgid "%(display_name)s left %(ratings_total)s ratings,
their average rating is %(rating_average)s"
-msgstr ""
+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[2] ""
+msgstr[3] ""
-#: bookwyrm/templates/annual_summary/layout.html:197
+#: bookwyrm/templates/annual_summary/layout.html:213
msgid "Their best rated review"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:210
+#: bookwyrm/templates/annual_summary/layout.html:226
#, python-format
msgid "Their rating: %(rating)s"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:227
+#: bookwyrm/templates/annual_summary/layout.html:243
#, python-format
-msgid "All the books %(display_name)s read in 2021"
+msgid "All the books %(display_name)s read in %(year)s"
msgstr ""
#: bookwyrm/templates/author/author.html:18
diff --git a/locale/pt_BR/LC_MESSAGES/django.mo b/locale/pt_BR/LC_MESSAGES/django.mo
index ef3d0c170..3862e0bb9 100644
Binary files a/locale/pt_BR/LC_MESSAGES/django.mo and b/locale/pt_BR/LC_MESSAGES/django.mo differ
diff --git a/locale/pt_BR/LC_MESSAGES/django.po b/locale/pt_BR/LC_MESSAGES/django.po
index a2d20005c..f8bbf8ec9 100644
--- a/locale/pt_BR/LC_MESSAGES/django.po
+++ b/locale/pt_BR/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-12-28 15:00+0000\n"
-"PO-Revision-Date: 2021-12-28 16:59\n"
+"POT-Creation-Date: 2021-12-28 20:12+0000\n"
+"PO-Revision-Date: 2021-12-29 00:08\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: Portuguese, Brazilian\n"
"Language: pt\n"
@@ -263,76 +263,78 @@ msgstr "O ano de leitura de %(display_name)s"
msgid "Share this page"
msgstr "Compartilhe esta página"
-#: bookwyrm/templates/annual_summary/layout.html:61
+#: bookwyrm/templates/annual_summary/layout.html:67
msgid "Copy address"
msgstr "Copiar endereço"
-#: bookwyrm/templates/annual_summary/layout.html:61
+#: bookwyrm/templates/annual_summary/layout.html:68
#: bookwyrm/templates/lists/list.html:194
msgid "Copied!"
msgstr "Copiado!"
-#: bookwyrm/templates/annual_summary/layout.html:69
+#: bookwyrm/templates/annual_summary/layout.html:77
msgid "Sharing status: public with key"
msgstr "Compartilhamento: pĂşblico com chave"
-#: bookwyrm/templates/annual_summary/layout.html:70
+#: bookwyrm/templates/annual_summary/layout.html:78
msgid "The page can be seen by anyone with the complete address."
msgstr "Esta página pode ser vista por qualquer pessoa que tenha seu link."
-#: bookwyrm/templates/annual_summary/layout.html:75
+#: bookwyrm/templates/annual_summary/layout.html:83
msgid "Make page private"
msgstr "Tornar a página particular"
-#: bookwyrm/templates/annual_summary/layout.html:81
+#: bookwyrm/templates/annual_summary/layout.html:89
msgid "Sharing status: private"
msgstr "Compartilhamento: particular"
-#: bookwyrm/templates/annual_summary/layout.html:82
+#: bookwyrm/templates/annual_summary/layout.html:90
msgid "The page is private, only you can see it."
msgstr "A página é particular, só você pode vê-la."
-#: bookwyrm/templates/annual_summary/layout.html:87
+#: bookwyrm/templates/annual_summary/layout.html:95
msgid "Make page public"
msgstr "Tornar a página pública"
-#: bookwyrm/templates/annual_summary/layout.html:91
+#: 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 "Ao tornar a página particular, a chave antiga passa a não funcionar mais. Uma nova chave será gerada quando a página for tornada pública novamente."
-#: bookwyrm/templates/annual_summary/layout.html:104
+#: bookwyrm/templates/annual_summary/layout.html:112
#, python-format
msgid "Sadly %(display_name)s didn’t finish any book in %(year)s"
msgstr "Infelizmente %(display_name)s nĂŁo terminou nenhum livro em %(year)s"
-#: bookwyrm/templates/annual_summary/layout.html:110
+#: bookwyrm/templates/annual_summary/layout.html:118
#, python-format
-msgid "In %(year)s, %(display_name)s read %(books_total)s books
for a total of %(pages_total)s pages!"
-msgstr "Em %(year)s, %(display_name)s leu %(books_total)s livros,
um total de %(pages_total)s páginas!"
+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] "Em %(year)s, %(display_name)s leu %(books_total)s livro,
um total de %(pages_total)s páginas!"
+msgstr[1] "Em %(year)s, %(display_name)s leu %(books_total)s livros,
um total de %(pages_total)s páginas!"
-#: bookwyrm/templates/annual_summary/layout.html:112
+#: bookwyrm/templates/annual_summary/layout.html:124
msgid "That’s great!"
msgstr "Muito legal!"
-#: bookwyrm/templates/annual_summary/layout.html:115
+#: bookwyrm/templates/annual_summary/layout.html:127
#, python-format
msgid "That makes an average of %(pages)s pages per book."
msgstr "Isso dá uma média de %(pages)s páginas por livro."
-#: bookwyrm/templates/annual_summary/layout.html:120
+#: bookwyrm/templates/annual_summary/layout.html:132
#, python-format
msgid "(%(no_page_number)s book doesn’t have pages)"
msgid_plural "(%(no_page_number)s books don’t have pages)"
msgstr[0] "(%(no_page_number)s livro não tem páginas cadastradas)"
msgstr[1] "(%(no_page_number)s livros não têm páginas cadastradas)"
-#: bookwyrm/templates/annual_summary/layout.html:136
+#: bookwyrm/templates/annual_summary/layout.html:148
msgid "Their shortest read this year…"
msgstr "A leitura mais curta do ano…"
-#: bookwyrm/templates/annual_summary/layout.html:143
-#: bookwyrm/templates/annual_summary/layout.html:164
-#: bookwyrm/templates/annual_summary/layout.html:204
+#: bookwyrm/templates/annual_summary/layout.html:155
+#: bookwyrm/templates/annual_summary/layout.html:176
+#: bookwyrm/templates/annual_summary/layout.html:220
#: bookwyrm/templates/book/book.html:47
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:25
@@ -340,34 +342,36 @@ msgstr "A leitura mais curta do ano…"
msgid "by"
msgstr "de"
-#: bookwyrm/templates/annual_summary/layout.html:149
-#: bookwyrm/templates/annual_summary/layout.html:170
+#: bookwyrm/templates/annual_summary/layout.html:161
+#: bookwyrm/templates/annual_summary/layout.html:182
#, python-format
msgid "%(pages)s pages"
msgstr "%(pages)s páginas"
-#: bookwyrm/templates/annual_summary/layout.html:157
+#: bookwyrm/templates/annual_summary/layout.html:169
msgid "…and the longest"
msgstr "…e a mais longa"
-#: bookwyrm/templates/annual_summary/layout.html:187
+#: bookwyrm/templates/annual_summary/layout.html:199
#, python-format
-msgid "%(display_name)s left %(ratings_total)s ratings,
their average rating is %(rating_average)s"
-msgstr "%(display_name)s fez %(ratings_total)s avaliações,
e sua nota média é %(rating_average)s"
+msgid "%(display_name)s left %(ratings_total)s rating,
their average rating is %(rating_average)s"
+msgid_plural "%(display_name)s left %(ratings_total)s ratings,
their average rating is %(rating_average)s"
+msgstr[0] "%(display_name)s fez %(ratings_total)s avaliação,
com uma média de %(rating_average)s"
+msgstr[1] "%(display_name)s fez %(ratings_total)s avaliações,
com uma média de %(rating_average)s"
-#: bookwyrm/templates/annual_summary/layout.html:197
+#: bookwyrm/templates/annual_summary/layout.html:213
msgid "Their best rated review"
msgstr "Sua melhor avaliação"
-#: bookwyrm/templates/annual_summary/layout.html:210
+#: bookwyrm/templates/annual_summary/layout.html:226
#, python-format
msgid "Their rating: %(rating)s"
msgstr "Avaliação: %(rating)s"
-#: bookwyrm/templates/annual_summary/layout.html:227
+#: bookwyrm/templates/annual_summary/layout.html:243
#, python-format
-msgid "All the books %(display_name)s read in 2021"
-msgstr "Todos os livros que %(display_name)s leu em 2021"
+msgid "All the books %(display_name)s read in %(year)s"
+msgstr "Todos os livros lidos por %(display_name)s em %(year)s"
#: bookwyrm/templates/author/author.html:18
#: bookwyrm/templates/author/author.html:19
diff --git a/locale/zh_Hans/LC_MESSAGES/django.mo b/locale/zh_Hans/LC_MESSAGES/django.mo
index bbfee4c5f..fdd768973 100644
Binary files a/locale/zh_Hans/LC_MESSAGES/django.mo and b/locale/zh_Hans/LC_MESSAGES/django.mo differ
diff --git a/locale/zh_Hans/LC_MESSAGES/django.po b/locale/zh_Hans/LC_MESSAGES/django.po
index 501db0b89..08559cd89 100644
--- a/locale/zh_Hans/LC_MESSAGES/django.po
+++ b/locale/zh_Hans/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-12-28 15:00+0000\n"
-"PO-Revision-Date: 2021-12-28 16:03\n"
+"POT-Creation-Date: 2021-12-28 20:12+0000\n"
+"PO-Revision-Date: 2021-12-28 21:17\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: Chinese Simplified\n"
"Language: zh\n"
@@ -263,75 +263,76 @@ msgstr ""
msgid "Share this page"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:61
+#: bookwyrm/templates/annual_summary/layout.html:67
msgid "Copy address"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:61
+#: bookwyrm/templates/annual_summary/layout.html:68
#: bookwyrm/templates/lists/list.html:194
msgid "Copied!"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:69
+#: bookwyrm/templates/annual_summary/layout.html:77
msgid "Sharing status: public with key"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:70
+#: 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:75
+#: bookwyrm/templates/annual_summary/layout.html:83
msgid "Make page private"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:81
+#: bookwyrm/templates/annual_summary/layout.html:89
msgid "Sharing status: private"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:82
+#: bookwyrm/templates/annual_summary/layout.html:90
msgid "The page is private, only you can see it."
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:87
+#: bookwyrm/templates/annual_summary/layout.html:95
msgid "Make page public"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:91
+#: 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:104
+#: bookwyrm/templates/annual_summary/layout.html:112
#, python-format
msgid "Sadly %(display_name)s didn’t finish any book in %(year)s"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:110
+#: bookwyrm/templates/annual_summary/layout.html:118
#, python-format
-msgid "In %(year)s, %(display_name)s read %(books_total)s books
for a total of %(pages_total)s pages!"
-msgstr ""
+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] ""
-#: bookwyrm/templates/annual_summary/layout.html:112
+#: bookwyrm/templates/annual_summary/layout.html:124
msgid "That’s great!"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:115
+#: bookwyrm/templates/annual_summary/layout.html:127
#, python-format
msgid "That makes an average of %(pages)s pages per book."
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:120
+#: bookwyrm/templates/annual_summary/layout.html:132
#, python-format
msgid "(%(no_page_number)s book doesn’t have pages)"
msgid_plural "(%(no_page_number)s books don’t have pages)"
msgstr[0] ""
-#: bookwyrm/templates/annual_summary/layout.html:136
+#: bookwyrm/templates/annual_summary/layout.html:148
msgid "Their shortest read this year…"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:143
-#: bookwyrm/templates/annual_summary/layout.html:164
-#: bookwyrm/templates/annual_summary/layout.html:204
+#: bookwyrm/templates/annual_summary/layout.html:155
+#: bookwyrm/templates/annual_summary/layout.html:176
+#: bookwyrm/templates/annual_summary/layout.html:220
#: bookwyrm/templates/book/book.html:47
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:25
@@ -339,33 +340,34 @@ msgstr ""
msgid "by"
msgstr "作者"
-#: bookwyrm/templates/annual_summary/layout.html:149
-#: bookwyrm/templates/annual_summary/layout.html:170
+#: bookwyrm/templates/annual_summary/layout.html:161
+#: bookwyrm/templates/annual_summary/layout.html:182
#, python-format
msgid "%(pages)s pages"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:157
+#: bookwyrm/templates/annual_summary/layout.html:169
msgid "…and the longest"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:187
+#: bookwyrm/templates/annual_summary/layout.html:199
#, python-format
-msgid "%(display_name)s left %(ratings_total)s ratings,
their average rating is %(rating_average)s"
-msgstr ""
+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] ""
-#: bookwyrm/templates/annual_summary/layout.html:197
+#: bookwyrm/templates/annual_summary/layout.html:213
msgid "Their best rated review"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:210
+#: bookwyrm/templates/annual_summary/layout.html:226
#, python-format
msgid "Their rating: %(rating)s"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:227
+#: bookwyrm/templates/annual_summary/layout.html:243
#, python-format
-msgid "All the books %(display_name)s read in 2021"
+msgid "All the books %(display_name)s read in %(year)s"
msgstr ""
#: bookwyrm/templates/author/author.html:18
diff --git a/locale/zh_Hant/LC_MESSAGES/django.mo b/locale/zh_Hant/LC_MESSAGES/django.mo
index 4b754cce9..fcfea5706 100644
Binary files a/locale/zh_Hant/LC_MESSAGES/django.mo and b/locale/zh_Hant/LC_MESSAGES/django.mo differ
diff --git a/locale/zh_Hant/LC_MESSAGES/django.po b/locale/zh_Hant/LC_MESSAGES/django.po
index d5c5d0680..15bd82c07 100644
--- a/locale/zh_Hant/LC_MESSAGES/django.po
+++ b/locale/zh_Hant/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-12-28 15:00+0000\n"
-"PO-Revision-Date: 2021-12-28 16:03\n"
+"POT-Creation-Date: 2021-12-28 20:12+0000\n"
+"PO-Revision-Date: 2021-12-28 21:17\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: Chinese Traditional\n"
"Language: zh\n"
@@ -263,75 +263,76 @@ msgstr ""
msgid "Share this page"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:61
+#: bookwyrm/templates/annual_summary/layout.html:67
msgid "Copy address"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:61
+#: bookwyrm/templates/annual_summary/layout.html:68
#: bookwyrm/templates/lists/list.html:194
msgid "Copied!"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:69
+#: bookwyrm/templates/annual_summary/layout.html:77
msgid "Sharing status: public with key"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:70
+#: 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:75
+#: bookwyrm/templates/annual_summary/layout.html:83
msgid "Make page private"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:81
+#: bookwyrm/templates/annual_summary/layout.html:89
msgid "Sharing status: private"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:82
+#: bookwyrm/templates/annual_summary/layout.html:90
msgid "The page is private, only you can see it."
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:87
+#: bookwyrm/templates/annual_summary/layout.html:95
msgid "Make page public"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:91
+#: 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:104
+#: bookwyrm/templates/annual_summary/layout.html:112
#, python-format
msgid "Sadly %(display_name)s didn’t finish any book in %(year)s"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:110
+#: bookwyrm/templates/annual_summary/layout.html:118
#, python-format
-msgid "In %(year)s, %(display_name)s read %(books_total)s books
for a total of %(pages_total)s pages!"
-msgstr ""
+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] ""
-#: bookwyrm/templates/annual_summary/layout.html:112
+#: bookwyrm/templates/annual_summary/layout.html:124
msgid "That’s great!"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:115
+#: bookwyrm/templates/annual_summary/layout.html:127
#, python-format
msgid "That makes an average of %(pages)s pages per book."
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:120
+#: bookwyrm/templates/annual_summary/layout.html:132
#, python-format
msgid "(%(no_page_number)s book doesn’t have pages)"
msgid_plural "(%(no_page_number)s books don’t have pages)"
msgstr[0] ""
-#: bookwyrm/templates/annual_summary/layout.html:136
+#: bookwyrm/templates/annual_summary/layout.html:148
msgid "Their shortest read this year…"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:143
-#: bookwyrm/templates/annual_summary/layout.html:164
-#: bookwyrm/templates/annual_summary/layout.html:204
+#: bookwyrm/templates/annual_summary/layout.html:155
+#: bookwyrm/templates/annual_summary/layout.html:176
+#: bookwyrm/templates/annual_summary/layout.html:220
#: bookwyrm/templates/book/book.html:47
#: bookwyrm/templates/discover/large-book.html:22
#: bookwyrm/templates/landing/large-book.html:25
@@ -339,33 +340,34 @@ msgstr ""
msgid "by"
msgstr "作者"
-#: bookwyrm/templates/annual_summary/layout.html:149
-#: bookwyrm/templates/annual_summary/layout.html:170
+#: bookwyrm/templates/annual_summary/layout.html:161
+#: bookwyrm/templates/annual_summary/layout.html:182
#, python-format
msgid "%(pages)s pages"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:157
+#: bookwyrm/templates/annual_summary/layout.html:169
msgid "…and the longest"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:187
+#: bookwyrm/templates/annual_summary/layout.html:199
#, python-format
-msgid "%(display_name)s left %(ratings_total)s ratings,
their average rating is %(rating_average)s"
-msgstr ""
+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] ""
-#: bookwyrm/templates/annual_summary/layout.html:197
+#: bookwyrm/templates/annual_summary/layout.html:213
msgid "Their best rated review"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:210
+#: bookwyrm/templates/annual_summary/layout.html:226
#, python-format
msgid "Their rating: %(rating)s"
msgstr ""
-#: bookwyrm/templates/annual_summary/layout.html:227
+#: bookwyrm/templates/annual_summary/layout.html:243
#, python-format
-msgid "All the books %(display_name)s read in 2021"
+msgid "All the books %(display_name)s read in %(year)s"
msgstr ""
#: bookwyrm/templates/author/author.html:18