-
{% if user.name %}{{ user.name }}{% else %}{{ user.localname }}{% endif %}
+
+ {% if user.name %}{{ user.name }}{% else %}{{ user.localname }}{% endif %}
+ {% if user.manually_approves_followers %}
+
+ {% trans "Locked account" %}
+
+ {% endif %}
+
{{ user.username }}
{% blocktrans with date=user.created_date|naturaltime %}Joined {{ date }}{% endblocktrans %}
@@ -23,7 +30,13 @@
{% mutuals_count user as mutuals %}
+ {% if mutuals %}
{% blocktrans with mutuals_display=mutuals|intcomma count counter=mutuals %}{{ mutuals_display }} follower you follow{% plural %}{{ mutuals_display }} followers you follow{% endblocktrans %}
+ {% elif request.user in user.following.all %}
+ {% trans "Follows you" %}
+ {% else %}
+ {% trans "No followers you follow" %}
+ {% endif %}
{% endif %}
diff --git a/bookwyrm/tests/activitypub/test_author.py b/bookwyrm/tests/activitypub/test_author.py
index 6d65974a1..0a344340a 100644
--- a/bookwyrm/tests/activitypub/test_author.py
+++ b/bookwyrm/tests/activitypub/test_author.py
@@ -1,6 +1,4 @@
-import datetime
-
-from unittest.mock import patch
+"""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 77844a222..0758fe99a 100644
--- a/bookwyrm/tests/activitypub/test_base_activity.py
+++ b/bookwyrm/tests/activitypub/test_base_activity.py
@@ -20,16 +20,20 @@ from bookwyrm import models
@patch("bookwyrm.activitystreams.ActivityStream.add_status")
+@patch("bookwyrm.suggested_users.rerank_user_task.delay")
+@patch("bookwyrm.suggested_users.remove_user_task.delay")
+@patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
class BaseActivity(TestCase):
"""the super class for model-linked activitypub dataclasses"""
def setUp(self):
"""we're probably going to re-use this so why copy/paste"""
- self.user = models.User.objects.create_user(
- "mouse", "mouse@mouse.mouse", "mouseword", local=True, localname="mouse"
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.user = models.User.objects.create_user(
+ "mouse", "mouse@mouse.mouse", "mouseword", local=True, localname="mouse"
+ )
self.user.remote_id = "http://example.com/a/b"
- self.user.save(broadcast=False)
+ self.user.save(broadcast=False, update_fields=["remote_id"])
datafile = pathlib.Path(__file__).parent.joinpath("../data/ap_user.json")
self.userdata = json.loads(datafile.read_bytes())
@@ -44,24 +48,24 @@ class BaseActivity(TestCase):
image.save(output, format=image.format)
self.image_data = output.getvalue()
- def test_init(self, _):
+ def test_init(self, *_):
"""simple successfuly init"""
instance = ActivityObject(id="a", type="b")
self.assertTrue(hasattr(instance, "id"))
self.assertTrue(hasattr(instance, "type"))
- def test_init_missing(self, _):
+ def test_init_missing(self, *_):
"""init with missing required params"""
with self.assertRaises(ActivitySerializerError):
ActivityObject()
- def test_init_extra_fields(self, _):
+ def test_init_extra_fields(self, *_):
"""init ignoring additional fields"""
instance = ActivityObject(id="a", type="b", fish="c")
self.assertTrue(hasattr(instance, "id"))
self.assertTrue(hasattr(instance, "type"))
- def test_init_default_field(self, _):
+ def test_init_default_field(self, *_):
"""replace an existing required field with a default field"""
@dataclass(init=False)
@@ -74,7 +78,7 @@ class BaseActivity(TestCase):
self.assertEqual(instance.id, "a")
self.assertEqual(instance.type, "TestObject")
- def test_serialize(self, _):
+ def test_serialize(self, *_):
"""simple function for converting dataclass to dict"""
instance = ActivityObject(id="a", type="b")
serialized = instance.serialize()
@@ -83,7 +87,7 @@ class BaseActivity(TestCase):
self.assertEqual(serialized["type"], "b")
@responses.activate
- def test_resolve_remote_id(self, _):
+ def test_resolve_remote_id(self, *_):
"""look up or load remote data"""
# existing item
result = resolve_remote_id("http://example.com/a/b", model=models.User)
@@ -105,14 +109,14 @@ class BaseActivity(TestCase):
self.assertEqual(result.remote_id, "https://example.com/user/mouse")
self.assertEqual(result.name, "MOUSE?? MOUSE!!")
- def test_to_model_invalid_model(self, _):
+ def test_to_model_invalid_model(self, *_):
"""catch mismatch between activity type and model type"""
instance = ActivityObject(id="a", type="b")
with self.assertRaises(ActivitySerializerError):
instance.to_model(model=models.User)
@responses.activate
- def test_to_model_image(self, _):
+ def test_to_model_image(self, *_):
"""update an image field"""
activity = activitypub.Person(
id=self.user.remote_id,
@@ -145,7 +149,7 @@ class BaseActivity(TestCase):
self.assertEqual(self.user.name, "New Name")
self.assertEqual(self.user.key_pair.public_key, "hi")
- def test_to_model_many_to_many(self, _):
+ def test_to_model_many_to_many(self, *_):
"""annoying that these all need special handling"""
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
status = models.Status.objects.create(
@@ -176,7 +180,7 @@ class BaseActivity(TestCase):
self.assertEqual(status.mention_books.first(), book)
@responses.activate
- def test_to_model_one_to_many(self, _):
+ def test_to_model_one_to_many(self, *_):
"""these are reversed relationships, where the secondary object
keys the primary object but not vice versa"""
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
@@ -215,7 +219,7 @@ class BaseActivity(TestCase):
self.assertIsNone(status.attachments.first())
@responses.activate
- def test_set_related_field(self, _):
+ def test_set_related_field(self, *_):
"""celery task to add back-references to created objects"""
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
status = models.Status.objects.create(
diff --git a/bookwyrm/tests/connectors/test_abstract_connector.py b/bookwyrm/tests/connectors/test_abstract_connector.py
index 5c50e4b73..8ce4c96bf 100644
--- a/bookwyrm/tests/connectors/test_abstract_connector.py
+++ b/bookwyrm/tests/connectors/test_abstract_connector.py
@@ -119,10 +119,12 @@ class AbstractConnector(TestCase):
@responses.activate
def test_get_or_create_author(self):
"""load an author"""
- self.connector.author_mappings = [
- Mapping("id"),
- Mapping("name"),
- ]
+ self.connector.author_mappings = (
+ [ # pylint: disable=attribute-defined-outside-init
+ Mapping("id"),
+ Mapping("name"),
+ ]
+ )
responses.add(
responses.GET,
diff --git a/bookwyrm/tests/connectors/test_inventaire_connector.py b/bookwyrm/tests/connectors/test_inventaire_connector.py
index c66f0400d..381017727 100644
--- a/bookwyrm/tests/connectors/test_inventaire_connector.py
+++ b/bookwyrm/tests/connectors/test_inventaire_connector.py
@@ -171,3 +171,15 @@ class Inventaire(TestCase):
}
self.assertEqual(get_language_code(options), "there")
self.assertIsNone(get_language_code({}))
+
+ @responses.activate
+ def test_get_description(self):
+ """extract a wikipedia excerpt"""
+ responses.add(
+ responses.GET,
+ "https://inventaire.io/api/data?action=wp-extract&lang=en&title=test_path",
+ json={"extract": "hi hi"},
+ )
+
+ extract = self.connector.get_description({"enwiki": "test_path"})
+ self.assertEqual(extract, "hi hi")
diff --git a/bookwyrm/tests/data/ap_user.json b/bookwyrm/tests/data/ap_user.json
index bc4488e38..63c8a7e83 100644
--- a/bookwyrm/tests/data/ap_user.json
+++ b/bookwyrm/tests/data/ap_user.json
@@ -28,7 +28,7 @@
},
"bookwyrmUser": true,
"manuallyApprovesFollowers": false,
- "discoverable": true,
+ "discoverable": false,
"devices": "https://friend.camp/users/tripofmice/collections/devices",
"tag": [],
"icon": {
diff --git a/bookwyrm/tests/importers/test_goodreads_import.py b/bookwyrm/tests/importers/test_goodreads_import.py
index 8a0b25ec2..e92bdb354 100644
--- a/bookwyrm/tests/importers/test_goodreads_import.py
+++ b/bookwyrm/tests/importers/test_goodreads_import.py
@@ -16,9 +16,12 @@ from bookwyrm.settings import DOMAIN
def make_date(*args):
+ """helper function to easily generate a date obj"""
return datetime.datetime(*args, tzinfo=pytz.UTC)
+# pylint: disable=consider-using-with
+@patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
class GoodreadsImport(TestCase):
"""importing from goodreads csv"""
@@ -27,9 +30,10 @@ class GoodreadsImport(TestCase):
self.importer = GoodreadsImporter()
datafile = pathlib.Path(__file__).parent.joinpath("../data/goodreads.csv")
self.csv = open(datafile, "r", encoding=self.importer.encoding)
- self.user = models.User.objects.create_user(
- "mouse", "mouse@mouse.mouse", "password", local=True
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.user = models.User.objects.create_user(
+ "mouse", "mouse@mouse.mouse", "password", local=True
+ )
models.Connector.objects.create(
identifier=DOMAIN,
@@ -49,7 +53,7 @@ class GoodreadsImport(TestCase):
parent_work=work,
)
- def test_create_job(self):
+ def test_create_job(self, _):
"""creates the import job entry and checks csv"""
import_job = self.importer.create_job(self.user, self.csv, False, "public")
self.assertEqual(import_job.user, self.user)
@@ -65,7 +69,7 @@ class GoodreadsImport(TestCase):
self.assertEqual(import_items[2].index, 2)
self.assertEqual(import_items[2].data["Book Id"], "28694510")
- def test_create_retry_job(self):
+ def test_create_retry_job(self, _):
"""trying again with items that didn't import"""
import_job = self.importer.create_job(self.user, self.csv, False, "unlisted")
import_items = models.ImportItem.objects.filter(job=import_job).all()[:2]
@@ -83,7 +87,7 @@ class GoodreadsImport(TestCase):
self.assertEqual(retry_items[1].index, 1)
self.assertEqual(retry_items[1].data["Book Id"], "52691223")
- def test_start_import(self):
+ def test_start_import(self, _):
"""begin loading books"""
import_job = self.importer.create_job(self.user, self.csv, False, "unlisted")
MockTask = namedtuple("Task", ("id"))
@@ -95,7 +99,7 @@ class GoodreadsImport(TestCase):
self.assertEqual(import_job.task_id, "7")
@responses.activate
- def test_import_data(self):
+ def test_import_data(self, _):
"""resolve entry"""
import_job = self.importer.create_job(self.user, self.csv, False, "unlisted")
book = models.Edition.objects.create(title="Test Book")
@@ -110,7 +114,7 @@ class GoodreadsImport(TestCase):
import_item = models.ImportItem.objects.get(job=import_job, index=0)
self.assertEqual(import_item.book.id, book.id)
- def test_handle_imported_book(self):
+ def test_handle_imported_book(self, _):
"""goodreads import added a book, this adds related connections"""
shelf = self.user.shelf_set.filter(identifier="read").first()
self.assertIsNone(shelf.books.first())
@@ -141,7 +145,7 @@ class GoodreadsImport(TestCase):
self.assertEqual(readthrough.start_date, make_date(2020, 10, 21))
self.assertEqual(readthrough.finish_date, make_date(2020, 10, 25))
- def test_handle_imported_book_already_shelved(self):
+ def test_handle_imported_book_already_shelved(self, _):
"""goodreads import added a book, this adds related connections"""
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
shelf = self.user.shelf_set.filter(identifier="to-read").first()
@@ -179,7 +183,7 @@ class GoodreadsImport(TestCase):
self.assertEqual(readthrough.start_date, make_date(2020, 10, 21))
self.assertEqual(readthrough.finish_date, make_date(2020, 10, 25))
- def test_handle_import_twice(self):
+ def test_handle_import_twice(self, _):
"""re-importing books"""
shelf = self.user.shelf_set.filter(identifier="read").first()
import_job = models.ImportJob.objects.create(user=self.user)
@@ -212,7 +216,7 @@ class GoodreadsImport(TestCase):
self.assertEqual(readthrough.finish_date, make_date(2020, 10, 25))
@patch("bookwyrm.activitystreams.ActivityStream.add_status")
- def test_handle_imported_book_review(self, _):
+ def test_handle_imported_book_review(self, *_):
"""goodreads review import"""
import_job = models.ImportJob.objects.create(user=self.user)
datafile = pathlib.Path(__file__).parent.joinpath("../data/goodreads.csv")
@@ -234,7 +238,7 @@ class GoodreadsImport(TestCase):
self.assertEqual(review.privacy, "unlisted")
@patch("bookwyrm.activitystreams.ActivityStream.add_status")
- def test_handle_imported_book_rating(self, _):
+ def test_handle_imported_book_rating(self, *_):
"""goodreads rating import"""
import_job = models.ImportJob.objects.create(user=self.user)
datafile = pathlib.Path(__file__).parent.joinpath(
@@ -257,7 +261,7 @@ class GoodreadsImport(TestCase):
self.assertEqual(review.published_date, make_date(2019, 7, 8))
self.assertEqual(review.privacy, "unlisted")
- def test_handle_imported_book_reviews_disabled(self):
+ def test_handle_imported_book_reviews_disabled(self, _):
"""goodreads review import"""
import_job = models.ImportJob.objects.create(user=self.user)
datafile = pathlib.Path(__file__).parent.joinpath("../data/goodreads.csv")
diff --git a/bookwyrm/tests/importers/test_librarything_import.py b/bookwyrm/tests/importers/test_librarything_import.py
index 0bdfb2636..504951c2f 100644
--- a/bookwyrm/tests/importers/test_librarything_import.py
+++ b/bookwyrm/tests/importers/test_librarything_import.py
@@ -19,6 +19,8 @@ def make_date(*args):
return datetime.datetime(*args, tzinfo=pytz.UTC)
+# pylint: disable=consider-using-with
+@patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
class LibrarythingImport(TestCase):
"""importing from librarything tsv"""
@@ -29,9 +31,10 @@ class LibrarythingImport(TestCase):
# Librarything generates latin encoded exports...
self.csv = open(datafile, "r", encoding=self.importer.encoding)
- self.user = models.User.objects.create_user(
- "mmai", "mmai@mmai.mmai", "password", local=True
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.user = models.User.objects.create_user(
+ "mmai", "mmai@mmai.mmai", "password", local=True
+ )
models.Connector.objects.create(
identifier=DOMAIN,
@@ -51,7 +54,7 @@ class LibrarythingImport(TestCase):
parent_work=work,
)
- def test_create_job(self):
+ def test_create_job(self, _):
"""creates the import job entry and checks csv"""
import_job = self.importer.create_job(self.user, self.csv, False, "public")
self.assertEqual(import_job.user, self.user)
@@ -67,7 +70,7 @@ class LibrarythingImport(TestCase):
self.assertEqual(import_items[2].index, 2)
self.assertEqual(import_items[2].data["Book Id"], "5015399")
- def test_create_retry_job(self):
+ def test_create_retry_job(self, _):
"""trying again with items that didn't import"""
import_job = self.importer.create_job(self.user, self.csv, False, "unlisted")
import_items = models.ImportItem.objects.filter(job=import_job).all()[:2]
@@ -86,7 +89,7 @@ class LibrarythingImport(TestCase):
self.assertEqual(retry_items[1].data["Book Id"], "5015319")
@responses.activate
- def test_import_data(self):
+ def test_import_data(self, _):
"""resolve entry"""
import_job = self.importer.create_job(self.user, self.csv, False, "unlisted")
book = models.Edition.objects.create(title="Test Book")
@@ -101,7 +104,7 @@ class LibrarythingImport(TestCase):
import_item = models.ImportItem.objects.get(job=import_job, index=0)
self.assertEqual(import_item.book.id, book.id)
- def test_handle_imported_book(self):
+ def test_handle_imported_book(self, _):
"""librarything import added a book, this adds related connections"""
shelf = self.user.shelf_set.filter(identifier="read").first()
self.assertIsNone(shelf.books.first())
@@ -131,7 +134,7 @@ class LibrarythingImport(TestCase):
self.assertEqual(readthrough.start_date, make_date(2007, 4, 16))
self.assertEqual(readthrough.finish_date, make_date(2007, 5, 8))
- def test_handle_imported_book_already_shelved(self):
+ def test_handle_imported_book_already_shelved(self, _):
"""librarything import added a book, this adds related connections"""
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
shelf = self.user.shelf_set.filter(identifier="to-read").first()
@@ -163,7 +166,7 @@ class LibrarythingImport(TestCase):
self.assertEqual(readthrough.start_date, make_date(2007, 4, 16))
self.assertEqual(readthrough.finish_date, make_date(2007, 5, 8))
- def test_handle_import_twice(self):
+ def test_handle_import_twice(self, _):
"""re-importing books"""
shelf = self.user.shelf_set.filter(identifier="read").first()
import_job = models.ImportJob.objects.create(user=self.user)
@@ -195,7 +198,7 @@ class LibrarythingImport(TestCase):
self.assertEqual(readthrough.finish_date, make_date(2007, 5, 8))
@patch("bookwyrm.activitystreams.ActivityStream.add_status")
- def test_handle_imported_book_review(self, _):
+ def test_handle_imported_book_review(self, *_):
"""librarything review import"""
import_job = models.ImportJob.objects.create(user=self.user)
datafile = pathlib.Path(__file__).parent.joinpath("../data/librarything.tsv")
@@ -216,7 +219,7 @@ class LibrarythingImport(TestCase):
self.assertEqual(review.published_date, make_date(2007, 5, 8))
self.assertEqual(review.privacy, "unlisted")
- def test_handle_imported_book_reviews_disabled(self):
+ def test_handle_imported_book_reviews_disabled(self, _):
"""librarything review import"""
import_job = models.ImportJob.objects.create(user=self.user)
datafile = pathlib.Path(__file__).parent.joinpath("../data/librarything.tsv")
diff --git a/bookwyrm/tests/management/test_populate_streams.py b/bookwyrm/tests/management/test_populate_streams.py
index ddbce7d35..c080e3fe5 100644
--- a/bookwyrm/tests/management/test_populate_streams.py
+++ b/bookwyrm/tests/management/test_populate_streams.py
@@ -12,16 +12,17 @@ class Activitystreams(TestCase):
def setUp(self):
"""we need some stuff"""
- self.local_user = models.User.objects.create_user(
- "mouse", "mouse@mouse.mouse", "password", local=True, localname="mouse"
- )
- self.another_user = models.User.objects.create_user(
- "nutria",
- "nutria@nutria.nutria",
- "password",
- local=True,
- localname="nutria",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse", "mouse@mouse.mouse", "password", local=True, localname="mouse"
+ )
+ self.another_user = models.User.objects.create_user(
+ "nutria",
+ "nutria@nutria.nutria",
+ "password",
+ local=True,
+ localname="nutria",
+ )
with patch("bookwyrm.models.user.set_remote_server.delay"):
self.remote_user = models.User.objects.create_user(
"rat",
@@ -45,4 +46,4 @@ class Activitystreams(TestCase):
"bookwyrm.activitystreams.ActivityStream.populate_store"
) as redis_mock:
populate_streams()
- self.assertEqual(redis_mock.call_count, 6) # 2 users x 3 streams
+ self.assertEqual(redis_mock.call_count, 4) # 2 users x 2 streams
diff --git a/bookwyrm/tests/models/test_activitypub_mixin.py b/bookwyrm/tests/models/test_activitypub_mixin.py
index 6d8fe270a..01d06e02f 100644
--- a/bookwyrm/tests/models/test_activitypub_mixin.py
+++ b/bookwyrm/tests/models/test_activitypub_mixin.py
@@ -27,11 +27,12 @@ class ActivitypubMixins(TestCase):
def setUp(self):
"""shared data"""
- self.local_user = models.User.objects.create_user(
- "mouse", "mouse@mouse.com", "mouseword", local=True, localname="mouse"
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse", "mouse@mouse.com", "mouseword", local=True, localname="mouse"
+ )
self.local_user.remote_id = "http://example.com/a/b"
- self.local_user.save(broadcast=False)
+ self.local_user.save(broadcast=False, update_fields=["remote_id"])
with patch("bookwyrm.models.user.set_remote_server.delay"):
self.remote_user = models.User.objects.create_user(
"rat",
@@ -189,7 +190,7 @@ class ActivitypubMixins(TestCase):
def test_get_recipients_combine_inboxes(self, *_):
"""should combine users with the same shared_inbox"""
self.remote_user.shared_inbox = "http://example.com/inbox"
- self.remote_user.save(broadcast=False)
+ self.remote_user.save(broadcast=False, update_fields=["shared_inbox"])
with patch("bookwyrm.models.user.set_remote_server.delay"):
another_remote_user = models.User.objects.create_user(
"nutria",
diff --git a/bookwyrm/tests/models/test_base_model.py b/bookwyrm/tests/models/test_base_model.py
index e140887af..43cd5d3f4 100644
--- a/bookwyrm/tests/models/test_base_model.py
+++ b/bookwyrm/tests/models/test_base_model.py
@@ -13,9 +13,10 @@ class BaseModel(TestCase):
def setUp(self):
"""shared data"""
- self.local_user = models.User.objects.create_user(
- "mouse", "mouse@mouse.com", "mouseword", local=True, localname="mouse"
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse", "mouse@mouse.com", "mouseword", local=True, localname="mouse"
+ )
with patch("bookwyrm.models.user.set_remote_server.delay"):
self.remote_user = models.User.objects.create_user(
"rat",
diff --git a/bookwyrm/tests/models/test_fields.py b/bookwyrm/tests/models/test_fields.py
index c234ffd08..2520a2fd2 100644
--- a/bookwyrm/tests/models/test_fields.py
+++ b/bookwyrm/tests/models/test_fields.py
@@ -24,10 +24,11 @@ from bookwyrm.models.base_model import BookWyrmModel
from bookwyrm.models.activitypub_mixin import ActivitypubMixin
# pylint: disable=too-many-public-methods
-class ActivitypubFields(TestCase):
+@patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
+class ModelFields(TestCase):
"""overwrites standard model feilds to work with activitypub"""
- def test_validate_remote_id(self):
+ def test_validate_remote_id(self, _):
"""should look like a url"""
self.assertIsNone(fields.validate_remote_id("http://www.example.com"))
self.assertIsNone(fields.validate_remote_id("https://www.example.com"))
@@ -44,7 +45,7 @@ class ActivitypubFields(TestCase):
"http://www.example.com/dlfjg 23/x",
)
- def test_activitypub_field_mixin(self):
+ def test_activitypub_field_mixin(self, _):
"""generic mixin with super basic to and from functionality"""
instance = fields.ActivitypubFieldMixin()
self.assertEqual(instance.field_to_activity("fish"), "fish")
@@ -62,7 +63,7 @@ class ActivitypubFields(TestCase):
instance.name = "snake_case_name"
self.assertEqual(instance.get_activitypub_field(), "snakeCaseName")
- def test_set_field_from_activity(self):
+ def test_set_field_from_activity(self, _):
"""setter from entire json blob"""
@dataclass
@@ -81,7 +82,7 @@ class ActivitypubFields(TestCase):
instance.set_field_from_activity(mock_model, data)
self.assertEqual(mock_model.field_name, "hi")
- def test_set_activity_from_field(self):
+ def test_set_activity_from_field(self, _):
"""set json field given entire model"""
@dataclass
@@ -99,7 +100,7 @@ class ActivitypubFields(TestCase):
instance.set_activity_from_field(data, mock_model)
self.assertEqual(data["fieldName"], "bip")
- def test_remote_id_field(self):
+ def test_remote_id_field(self, _):
"""just sets some defaults on charfield"""
instance = fields.RemoteIdField()
self.assertEqual(instance.max_length, 255)
@@ -108,7 +109,7 @@ class ActivitypubFields(TestCase):
with self.assertRaises(ValidationError):
instance.run_validators("http://www.example.com/dlfjg 23/x")
- def test_username_field(self):
+ def test_username_field(self, _):
"""again, just setting defaults on username field"""
instance = fields.UsernameField()
self.assertEqual(instance.activitypub_field, "preferredUsername")
@@ -129,7 +130,7 @@ class ActivitypubFields(TestCase):
self.assertEqual(instance.field_to_activity("test@example.com"), "test")
- def test_privacy_field_defaults(self):
+ def test_privacy_field_defaults(self, _):
"""post privacy field's many default values"""
instance = fields.PrivacyField()
self.assertEqual(instance.max_length, 255)
@@ -142,7 +143,7 @@ class ActivitypubFields(TestCase):
instance.public, "https://www.w3.org/ns/activitystreams#Public"
)
- def test_privacy_field_set_field_from_activity(self):
+ def test_privacy_field_set_field_from_activity(self, _):
"""translate between to/cc fields and privacy"""
@dataclass(init=False)
@@ -230,7 +231,7 @@ class ActivitypubFields(TestCase):
self.assertEqual(activity["to"], [user.remote_id])
self.assertEqual(activity["cc"], [])
- def test_foreign_key(self):
+ def test_foreign_key(self, _):
"""should be able to format a related model"""
instance = fields.ForeignKey("User", on_delete=models.CASCADE)
Serializable = namedtuple("Serializable", ("to_activity", "remote_id"))
@@ -239,7 +240,7 @@ class ActivitypubFields(TestCase):
self.assertEqual(instance.field_to_activity(item), "https://e.b/c")
@responses.activate
- def test_foreign_key_from_activity_str(self):
+ def test_foreign_key_from_activity_str(self, _):
"""create a new object from a foreign key"""
instance = fields.ForeignKey(User, on_delete=models.CASCADE)
datafile = pathlib.Path(__file__).parent.joinpath("../data/ap_user.json")
@@ -266,7 +267,7 @@ class ActivitypubFields(TestCase):
self.assertEqual(value.remote_id, "https://example.com/user/mouse")
self.assertEqual(value.name, "MOUSE?? MOUSE!!")
- def test_foreign_key_from_activity_dict(self):
+ def test_foreign_key_from_activity_dict(self, *_):
"""test recieving activity json"""
instance = fields.ForeignKey(User, on_delete=models.CASCADE)
datafile = pathlib.Path(__file__).parent.joinpath("../data/ap_user.json")
@@ -286,7 +287,7 @@ class ActivitypubFields(TestCase):
self.assertEqual(value.name, "MOUSE?? MOUSE!!")
# et cetera but we're not testing serializing user json
- def test_foreign_key_from_activity_dict_existing(self):
+ def test_foreign_key_from_activity_dict_existing(self, _):
"""test receiving a dict of an existing object in the db"""
instance = fields.ForeignKey(User, on_delete=models.CASCADE)
datafile = pathlib.Path(__file__).parent.joinpath("../data/ap_user.json")
@@ -295,7 +296,7 @@ class ActivitypubFields(TestCase):
"mouse", "mouse@mouse.mouse", "mouseword", local=True, localname="mouse"
)
user.remote_id = "https://example.com/user/mouse"
- user.save(broadcast=False)
+ user.save(broadcast=False, update_fields=["remote_id"])
User.objects.create_user(
"rat", "rat@rat.rat", "ratword", local=True, localname="rat"
@@ -305,7 +306,7 @@ class ActivitypubFields(TestCase):
value = instance.field_from_activity(activitypub.Person(**userdata))
self.assertEqual(value, user)
- def test_foreign_key_from_activity_str_existing(self):
+ def test_foreign_key_from_activity_str_existing(self, _):
"""test receiving a remote id of an existing object in the db"""
instance = fields.ForeignKey(User, on_delete=models.CASCADE)
user = User.objects.create_user(
@@ -318,14 +319,14 @@ class ActivitypubFields(TestCase):
value = instance.field_from_activity(user.remote_id)
self.assertEqual(value, user)
- def test_one_to_one_field(self):
+ def test_one_to_one_field(self, _):
"""a gussied up foreign key"""
instance = fields.OneToOneField("User", on_delete=models.CASCADE)
Serializable = namedtuple("Serializable", ("to_activity", "remote_id"))
item = Serializable(lambda: {"a": "b"}, "https://e.b/c")
self.assertEqual(instance.field_to_activity(item), {"a": "b"})
- def test_many_to_many_field(self):
+ def test_many_to_many_field(self, _):
"""lists!"""
instance = fields.ManyToManyField("User")
@@ -343,7 +344,7 @@ class ActivitypubFields(TestCase):
self.assertEqual(instance.field_to_activity(items), "example.com/snake_case")
@responses.activate
- def test_many_to_many_field_from_activity(self):
+ def test_many_to_many_field_from_activity(self, _):
"""resolve related fields for a list, takes a list of remote ids"""
instance = fields.ManyToManyField(User)
datafile = pathlib.Path(__file__).parent.joinpath("../data/ap_user.json")
@@ -363,7 +364,7 @@ class ActivitypubFields(TestCase):
self.assertEqual(len(value), 1)
self.assertIsInstance(value[0], User)
- def test_tag_field(self):
+ def test_tag_field(self, _):
"""a special type of many to many field"""
instance = fields.TagField("User")
@@ -382,13 +383,14 @@ class ActivitypubFields(TestCase):
self.assertEqual(result[0].name, "Name")
self.assertEqual(result[0].type, "Serializable")
- def test_tag_field_from_activity(self):
+ def test_tag_field_from_activity(self, _):
"""loadin' a list of items from Links"""
# TODO
@responses.activate
@patch("bookwyrm.models.activitypub_mixin.ObjectMixin.broadcast")
- def test_image_field(self, _):
+ @patch("bookwyrm.suggested_users.remove_user_task.delay")
+ def test_image_field(self, *_):
"""storing images"""
user = User.objects.create_user(
"mouse", "mouse@mouse.mouse", "mouseword", local=True, localname="mouse"
@@ -426,7 +428,7 @@ class ActivitypubFields(TestCase):
self.assertIsInstance(loaded_image, list)
self.assertIsInstance(loaded_image[1], ContentFile)
- def test_image_serialize(self):
+ def test_image_serialize(self, _):
"""make sure we're creating sensible image paths"""
ValueMock = namedtuple("ValueMock", ("url"))
value_mock = ValueMock("/images/fish.jpg")
@@ -435,7 +437,7 @@ class ActivitypubFields(TestCase):
self.assertEqual(result.url, "https://your.domain.here/images/fish.jpg")
self.assertEqual(result.name, "hello")
- def test_datetime_field(self):
+ def test_datetime_field(self, _):
"""this one is pretty simple, it just has to use isoformat"""
instance = fields.DateTimeField()
now = timezone.now()
@@ -443,12 +445,12 @@ class ActivitypubFields(TestCase):
self.assertEqual(instance.field_from_activity(now.isoformat()), now)
self.assertEqual(instance.field_from_activity("bip"), None)
- def test_array_field(self):
+ def test_array_field(self, _):
"""idk why it makes them strings but probably for a good reason"""
instance = fields.ArrayField(fields.IntegerField)
self.assertEqual(instance.field_to_activity([0, 1]), ["0", "1"])
- def test_html_field(self):
+ def test_html_field(self, _):
"""sanitizes html, the sanitizer has its own tests"""
instance = fields.HtmlField()
self.assertEqual(
diff --git a/bookwyrm/tests/models/test_import_model.py b/bookwyrm/tests/models/test_import_model.py
index 76a914d1b..15a75a96e 100644
--- a/bookwyrm/tests/models/test_import_model.py
+++ b/bookwyrm/tests/models/test_import_model.py
@@ -59,9 +59,10 @@ class ImportJob(TestCase):
unknown_read_data["Exclusive Shelf"] = "read"
unknown_read_data["Date Read"] = ""
- user = models.User.objects.create_user(
- "mouse", "mouse@mouse.mouse", "mouseword", local=True, localname="mouse"
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ user = models.User.objects.create_user(
+ "mouse", "mouse@mouse.mouse", "mouseword", local=True, localname="mouse"
+ )
job = models.ImportJob.objects.create(user=user)
self.item_1 = models.ImportItem.objects.create(
job=job, index=1, data=currently_reading_data
diff --git a/bookwyrm/tests/models/test_list.py b/bookwyrm/tests/models/test_list.py
index 8f5bd4976..6e1ff8094 100644
--- a/bookwyrm/tests/models/test_list.py
+++ b/bookwyrm/tests/models/test_list.py
@@ -11,9 +11,10 @@ class List(TestCase):
def setUp(self):
"""look, a list"""
- self.local_user = models.User.objects.create_user(
- "mouse", "mouse@mouse.mouse", "mouseword", local=True, localname="mouse"
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse", "mouse@mouse.mouse", "mouseword", local=True, localname="mouse"
+ )
work = models.Work.objects.create(title="hello")
self.book = models.Edition.objects.create(title="hi", parent_work=work)
diff --git a/bookwyrm/tests/models/test_readthrough_model.py b/bookwyrm/tests/models/test_readthrough_model.py
index a8d74e54c..596753f79 100644
--- a/bookwyrm/tests/models/test_readthrough_model.py
+++ b/bookwyrm/tests/models/test_readthrough_model.py
@@ -1,4 +1,5 @@
""" testing models """
+from unittest.mock import patch
from django.test import TestCase
from django.core.exceptions import ValidationError
@@ -10,9 +11,10 @@ class ReadThrough(TestCase):
def setUp(self):
"""look, a shelf"""
- self.user = models.User.objects.create_user(
- "mouse", "mouse@mouse.mouse", "mouseword", local=True, localname="mouse"
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.user = models.User.objects.create_user(
+ "mouse", "mouse@mouse.mouse", "mouseword", local=True, localname="mouse"
+ )
self.work = models.Work.objects.create(title="Example Work")
self.edition = models.Edition.objects.create(
diff --git a/bookwyrm/tests/models/test_relationship_models.py b/bookwyrm/tests/models/test_relationship_models.py
index d629b5c7a..f66cf1091 100644
--- a/bookwyrm/tests/models/test_relationship_models.py
+++ b/bookwyrm/tests/models/test_relationship_models.py
@@ -1,4 +1,5 @@
""" testing models """
+import json
from unittest.mock import patch
from django.test import TestCase
@@ -20,25 +21,21 @@ class Relationship(TestCase):
inbox="https://example.com/users/rat/inbox",
outbox="https://example.com/users/rat/outbox",
)
- self.local_user = models.User.objects.create_user(
- "mouse", "mouse@mouse.com", "mouseword", local=True, localname="mouse"
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse", "mouse@mouse.com", "mouseword", local=True, localname="mouse"
+ )
self.local_user.remote_id = "http://local.com/user/mouse"
- self.local_user.save(broadcast=False)
+ self.local_user.save(broadcast=False, update_fields=["remote_id"])
def test_user_follows_from_request(self):
"""convert a follow request into a follow"""
- real_broadcast = models.UserFollowRequest.broadcast
-
- def mock_broadcast(_, activity, user):
- """introspect what's being sent out"""
- self.assertEqual(user.remote_id, self.local_user.remote_id)
- self.assertEqual(activity["type"], "Follow")
-
- models.UserFollowRequest.broadcast = mock_broadcast
- request = models.UserFollowRequest.objects.create(
- user_subject=self.local_user, user_object=self.remote_user
- )
+ with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") as mock:
+ request = models.UserFollowRequest.objects.create(
+ user_subject=self.local_user, user_object=self.remote_user
+ )
+ activity = json.loads(mock.call_args[0][1])
+ self.assertEqual(activity["type"], "Follow")
self.assertEqual(
request.remote_id, "http://local.com/user/mouse#follows/%d" % request.id
)
@@ -51,7 +48,6 @@ class Relationship(TestCase):
self.assertEqual(rel.status, "follows")
self.assertEqual(rel.user_subject, self.local_user)
self.assertEqual(rel.user_object, self.remote_user)
- models.UserFollowRequest.broadcast = real_broadcast
def test_user_follows_from_request_custom_remote_id(self):
"""store a specific remote id for a relationship provided by remote"""
@@ -70,36 +66,26 @@ class Relationship(TestCase):
self.assertEqual(rel.user_subject, self.local_user)
self.assertEqual(rel.user_object, self.remote_user)
- def test_follow_request_activity(self):
+ @patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay")
+ def test_follow_request_activity(self, broadcast_mock):
"""accept a request and make it a relationship"""
- real_broadcast = models.UserFollowRequest.broadcast
-
- def mock_broadcast(_, activity, user):
- self.assertEqual(user.remote_id, self.local_user.remote_id)
- self.assertEqual(activity["actor"], self.local_user.remote_id)
- self.assertEqual(activity["object"], self.remote_user.remote_id)
- self.assertEqual(activity["type"], "Follow")
-
- models.UserFollowRequest.broadcast = mock_broadcast
models.UserFollowRequest.objects.create(
user_subject=self.local_user,
user_object=self.remote_user,
)
- models.UserFollowRequest.broadcast = real_broadcast
+ activity = json.loads(broadcast_mock.call_args[0][1])
+ self.assertEqual(activity["actor"], self.local_user.remote_id)
+ self.assertEqual(activity["object"], self.remote_user.remote_id)
+ self.assertEqual(activity["type"], "Follow")
- def test_follow_request_accept(self):
+ @patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay")
+ def test_follow_request_accept(self, broadcast_mock):
"""accept a request and make it a relationship"""
- real_broadcast = models.UserFollowRequest.broadcast
-
- def mock_broadcast(_, activity, user):
- self.assertEqual(user.remote_id, self.local_user.remote_id)
- self.assertEqual(activity["type"], "Accept")
- self.assertEqual(activity["actor"], self.local_user.remote_id)
- self.assertEqual(activity["object"]["id"], "https://www.hi.com/")
-
self.local_user.manually_approves_followers = True
- self.local_user.save(broadcast=False)
- models.UserFollowRequest.broadcast = mock_broadcast
+ self.local_user.save(
+ broadcast=False, update_fields=["manually_approves_followers"]
+ )
+
request = models.UserFollowRequest.objects.create(
user_subject=self.remote_user,
user_object=self.local_user,
@@ -107,32 +93,34 @@ class Relationship(TestCase):
)
request.accept()
+ activity = json.loads(broadcast_mock.call_args[0][1])
+ self.assertEqual(activity["type"], "Accept")
+ self.assertEqual(activity["actor"], self.local_user.remote_id)
+ self.assertEqual(activity["object"]["id"], "https://www.hi.com/")
+
self.assertFalse(models.UserFollowRequest.objects.exists())
self.assertTrue(models.UserFollows.objects.exists())
rel = models.UserFollows.objects.get()
self.assertEqual(rel.user_subject, self.remote_user)
self.assertEqual(rel.user_object, self.local_user)
- models.UserFollowRequest.broadcast = real_broadcast
- def test_follow_request_reject(self):
+ @patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay")
+ def test_follow_request_reject(self, broadcast_mock):
"""accept a request and make it a relationship"""
- real_broadcast = models.UserFollowRequest.broadcast
-
- def mock_reject(_, activity, user):
- self.assertEqual(user.remote_id, self.local_user.remote_id)
- self.assertEqual(activity["type"], "Reject")
- self.assertEqual(activity["actor"], self.local_user.remote_id)
- self.assertEqual(activity["object"]["id"], request.remote_id)
-
- models.UserFollowRequest.broadcast = mock_reject
self.local_user.manually_approves_followers = True
- self.local_user.save(broadcast=False)
+ self.local_user.save(
+ broadcast=False, update_fields=["manually_approves_followers"]
+ )
request = models.UserFollowRequest.objects.create(
user_subject=self.remote_user,
user_object=self.local_user,
)
request.reject()
+ activity = json.loads(broadcast_mock.call_args[0][1])
+ self.assertEqual(activity["type"], "Reject")
+ self.assertEqual(activity["actor"], self.local_user.remote_id)
+ self.assertEqual(activity["object"]["id"], request.remote_id)
+
self.assertFalse(models.UserFollowRequest.objects.exists())
self.assertFalse(models.UserFollows.objects.exists())
- models.UserFollowRequest.broadcast = real_broadcast
diff --git a/bookwyrm/tests/models/test_shelf_model.py b/bookwyrm/tests/models/test_shelf_model.py
index 911df059d..f6fd68509 100644
--- a/bookwyrm/tests/models/test_shelf_model.py
+++ b/bookwyrm/tests/models/test_shelf_model.py
@@ -7,18 +7,20 @@ from bookwyrm import models, settings
# pylint: disable=unused-argument
+@patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
class Shelf(TestCase):
"""some activitypub oddness ahead"""
def setUp(self):
"""look, a shelf"""
- self.local_user = models.User.objects.create_user(
- "mouse", "mouse@mouse.mouse", "mouseword", local=True, localname="mouse"
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse", "mouse@mouse.mouse", "mouseword", local=True, localname="mouse"
+ )
work = models.Work.objects.create(title="Test Work")
self.book = models.Edition.objects.create(title="test book", parent_work=work)
- def test_remote_id(self):
+ def test_remote_id(self, _):
"""shelves use custom remote ids"""
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
shelf = models.Shelf.objects.create(
@@ -27,7 +29,7 @@ class Shelf(TestCase):
expected_id = "https://%s/user/mouse/books/test-shelf" % settings.DOMAIN
self.assertEqual(shelf.get_remote_id(), expected_id)
- def test_to_activity(self):
+ def test_to_activity(self, _):
"""jsonify it"""
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
shelf = models.Shelf.objects.create(
@@ -41,7 +43,7 @@ class Shelf(TestCase):
self.assertEqual(activity_json["name"], "Test Shelf")
self.assertEqual(activity_json["owner"], self.local_user.remote_id)
- def test_create_update_shelf(self):
+ def test_create_update_shelf(self, _):
"""create and broadcast shelf creation"""
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") as mock:
@@ -62,7 +64,7 @@ class Shelf(TestCase):
self.assertEqual(activity["object"]["name"], "arthur russel")
self.assertEqual(shelf.name, "arthur russel")
- def test_shelve(self):
+ def test_shelve(self, _):
"""create and broadcast shelf creation"""
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
shelf = models.Shelf.objects.create(
diff --git a/bookwyrm/tests/models/test_status_model.py b/bookwyrm/tests/models/test_status_model.py
index 355caab9b..f8113549d 100644
--- a/bookwyrm/tests/models/test_status_model.py
+++ b/bookwyrm/tests/models/test_status_model.py
@@ -22,9 +22,10 @@ class Status(TestCase):
def setUp(self):
"""useful things for creating a status"""
- self.local_user = models.User.objects.create_user(
- "mouse", "mouse@mouse.mouse", "mouseword", local=True, localname="mouse"
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.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"):
self.remote_user = models.User.objects.create_user(
"rat",
diff --git a/bookwyrm/tests/models/test_user_model.py b/bookwyrm/tests/models/test_user_model.py
index b2791379d..177b2ad62 100644
--- a/bookwyrm/tests/models/test_user_model.py
+++ b/bookwyrm/tests/models/test_user_model.py
@@ -11,15 +11,16 @@ from bookwyrm.settings import DOMAIN
# pylint: disable=missing-function-docstring
class User(TestCase):
def setUp(self):
- self.user = models.User.objects.create_user(
- "mouse@%s" % DOMAIN,
- "mouse@mouse.mouse",
- "mouseword",
- local=True,
- localname="mouse",
- name="hi",
- bookwyrm_user=False,
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.user = models.User.objects.create_user(
+ "mouse@%s" % DOMAIN,
+ "mouse@mouse.mouse",
+ "mouseword",
+ local=True,
+ localname="mouse",
+ name="hi",
+ bookwyrm_user=False,
+ )
def test_computed_fields(self):
"""username instead of id here"""
@@ -154,7 +155,8 @@ class User(TestCase):
self.assertIsNone(server.application_type)
self.assertIsNone(server.application_version)
- def test_delete_user(self):
+ @patch("bookwyrm.suggested_users.remove_user_task.delay")
+ def test_delete_user(self, _):
"""deactivate a user"""
self.assertTrue(self.user.is_active)
with patch(
diff --git a/bookwyrm/tests/test_activitystreams.py b/bookwyrm/tests/test_activitystreams.py
index 0dd8ffe39..ac57d8b3d 100644
--- a/bookwyrm/tests/test_activitystreams.py
+++ b/bookwyrm/tests/test_activitystreams.py
@@ -6,21 +6,24 @@ from bookwyrm import activitystreams, models
@patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay")
@patch("bookwyrm.activitystreams.ActivityStream.add_status")
+@patch("bookwyrm.activitystreams.BooksStream.add_book_statuses")
+@patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
class Activitystreams(TestCase):
"""using redis to build activity streams"""
def setUp(self):
"""use a test csv"""
- self.local_user = models.User.objects.create_user(
- "mouse", "mouse@mouse.mouse", "password", local=True, localname="mouse"
- )
- self.another_user = models.User.objects.create_user(
- "nutria",
- "nutria@nutria.nutria",
- "password",
- local=True,
- localname="nutria",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse", "mouse@mouse.mouse", "password", local=True, localname="mouse"
+ )
+ self.another_user = models.User.objects.create_user(
+ "nutria",
+ "nutria@nutria.nutria",
+ "password",
+ local=True,
+ localname="nutria",
+ )
with patch("bookwyrm.models.user.set_remote_server.delay"):
self.remote_user = models.User.objects.create_user(
"rat",
@@ -31,7 +34,8 @@ class Activitystreams(TestCase):
inbox="https://example.com/users/rat/inbox",
outbox="https://example.com/users/rat/outbox",
)
- self.book = models.Edition.objects.create(title="test book")
+ work = models.Work.objects.create(title="test work")
+ self.book = models.Edition.objects.create(title="test book", parent_work=work)
class TestStream(activitystreams.ActivityStream):
"""test stream, don't have to do anything here"""
@@ -190,19 +194,95 @@ class Activitystreams(TestCase):
users = activitystreams.LocalStream().get_audience(status)
self.assertEqual(users, [])
- def test_federatedstream_get_audience(self, *_):
+ def test_localstream_get_audience_books_no_book(self, *_):
"""get a list of users that should see a status"""
status = models.Status.objects.create(
- user=self.remote_user, content="hi", privacy="public"
+ user=self.local_user, content="hi", privacy="public"
)
- users = activitystreams.FederatedStream().get_audience(status)
- self.assertTrue(self.local_user in users)
- self.assertTrue(self.another_user in users)
+ audience = activitystreams.BooksStream().get_audience(status)
+ # no books, no audience
+ self.assertEqual(audience, [])
- def test_federatedstream_get_audience_unlisted(self, *_):
+ def test_localstream_get_audience_books_mention_books(self, *_):
"""get a list of users that should see a status"""
status = models.Status.objects.create(
- user=self.remote_user, content="hi", privacy="unlisted"
+ user=self.local_user, content="hi", privacy="public"
)
- users = activitystreams.FederatedStream().get_audience(status)
- self.assertEqual(users, [])
+ status.mention_books.add(self.book)
+ status.save(broadcast=False)
+ models.ShelfBook.objects.create(
+ user=self.local_user,
+ shelf=self.local_user.shelf_set.first(),
+ book=self.book,
+ )
+ # yes book, yes audience
+ audience = activitystreams.BooksStream().get_audience(status)
+ self.assertTrue(self.local_user in audience)
+
+ def test_localstream_get_audience_books_book_field(self, *_):
+ """get a list of users that should see a status"""
+ status = models.Comment.objects.create(
+ user=self.local_user, content="hi", privacy="public", book=self.book
+ )
+ models.ShelfBook.objects.create(
+ user=self.local_user,
+ shelf=self.local_user.shelf_set.first(),
+ book=self.book,
+ )
+ # yes book, yes audience
+ audience = activitystreams.BooksStream().get_audience(status)
+ self.assertTrue(self.local_user in audience)
+
+ def test_localstream_get_audience_books_alternate_edition(self, *_):
+ """get a list of users that should see a status"""
+ alt_book = models.Edition.objects.create(
+ title="hi", parent_work=self.book.parent_work
+ )
+ status = models.Comment.objects.create(
+ user=self.remote_user, content="hi", privacy="public", book=alt_book
+ )
+ models.ShelfBook.objects.create(
+ user=self.local_user,
+ shelf=self.local_user.shelf_set.first(),
+ book=self.book,
+ )
+ # yes book, yes audience
+ audience = activitystreams.BooksStream().get_audience(status)
+ self.assertTrue(self.local_user in audience)
+
+ def test_localstream_get_audience_books_non_public(self, *_):
+ """get a list of users that should see a status"""
+ alt_book = models.Edition.objects.create(
+ title="hi", parent_work=self.book.parent_work
+ )
+ status = models.Comment.objects.create(
+ user=self.remote_user, content="hi", privacy="unlisted", book=alt_book
+ )
+ models.ShelfBook.objects.create(
+ user=self.local_user,
+ shelf=self.local_user.shelf_set.first(),
+ book=self.book,
+ )
+ # yes book, yes audience
+ audience = activitystreams.BooksStream().get_audience(status)
+ self.assertEqual(audience, [])
+
+ def test_get_statuses_for_user_books(self, *_):
+ """create a stream for a user"""
+ alt_book = models.Edition.objects.create(
+ title="hi", parent_work=self.book.parent_work
+ )
+ status = models.Status.objects.create(
+ user=self.local_user, content="hi", privacy="public"
+ )
+ status = models.Comment.objects.create(
+ user=self.remote_user, content="hi", privacy="public", book=alt_book
+ )
+ models.ShelfBook.objects.create(
+ user=self.local_user,
+ shelf=self.local_user.shelf_set.first(),
+ book=self.book,
+ )
+ # yes book, yes audience
+ result = activitystreams.BooksStream().get_statuses_for_user(self.local_user)
+ self.assertEqual(list(result), [status])
diff --git a/bookwyrm/tests/test_emailing.py b/bookwyrm/tests/test_emailing.py
index 4f8b16eb7..4c3d86a46 100644
--- a/bookwyrm/tests/test_emailing.py
+++ b/bookwyrm/tests/test_emailing.py
@@ -14,13 +14,14 @@ class Emailing(TestCase):
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
- self.local_user = models.User.objects.create_user(
- "mouse@local.com",
- "mouse@mouse.mouse",
- "password",
- local=True,
- localname="mouse",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@local.com",
+ "mouse@mouse.mouse",
+ "password",
+ local=True,
+ localname="mouse",
+ )
models.SiteSettings.objects.create()
def test_invite_email(self, email_mock):
diff --git a/bookwyrm/tests/test_preview_images.py b/bookwyrm/tests/test_preview_images.py
index 04e4c591f..37638c27c 100644
--- a/bookwyrm/tests/test_preview_images.py
+++ b/bookwyrm/tests/test_preview_images.py
@@ -1,5 +1,6 @@
""" test generating preview images """
import pathlib
+from unittest.mock import patch
from PIL import Image
from django.test import TestCase
@@ -8,7 +9,6 @@ from django.core.files.uploadedfile import SimpleUploadedFile
from django.db.models.fields.files import ImageFieldFile
from bookwyrm import models, settings
-
from bookwyrm.preview_images import (
generate_site_preview_image_task,
generate_edition_preview_image_task,
@@ -29,18 +29,19 @@ class PreviewImages(TestCase):
avatar_file = pathlib.Path(__file__).parent.joinpath(
"../static/images/no_cover.jpg"
)
- self.local_user = models.User.objects.create_user(
- "possum@local.com",
- "possum@possum.possum",
- "password",
- local=True,
- localname="possum",
- avatar=SimpleUploadedFile(
- avatar_file,
- open(avatar_file, "rb").read(),
- content_type="image/jpeg",
- ),
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "possum@local.com",
+ "possum@possum.possum",
+ "password",
+ local=True,
+ localname="possum",
+ avatar=SimpleUploadedFile(
+ avatar_file,
+ open(avatar_file, "rb").read(),
+ content_type="image/jpeg",
+ ),
+ )
self.work = models.Work.objects.create(title="Test Work")
self.edition = models.Edition.objects.create(
diff --git a/bookwyrm/tests/test_signing.py b/bookwyrm/tests/test_signing.py
index 01b25904c..d9a87dd56 100644
--- a/bookwyrm/tests/test_signing.py
+++ b/bookwyrm/tests/test_signing.py
@@ -37,19 +37,20 @@ class Signature(TestCase):
def setUp(self):
"""create users and test data"""
- self.mouse = models.User.objects.create_user(
- "mouse@%s" % DOMAIN,
- "mouse@example.com",
- "",
- local=True,
- localname="mouse",
- )
- self.rat = models.User.objects.create_user(
- "rat@%s" % DOMAIN, "rat@example.com", "", local=True, localname="rat"
- )
- self.cat = models.User.objects.create_user(
- "cat@%s" % DOMAIN, "cat@example.com", "", local=True, localname="cat"
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.mouse = models.User.objects.create_user(
+ "mouse@%s" % DOMAIN,
+ "mouse@example.com",
+ "",
+ local=True,
+ localname="mouse",
+ )
+ self.rat = models.User.objects.create_user(
+ "rat@%s" % DOMAIN, "rat@example.com", "", local=True, localname="rat"
+ )
+ self.cat = models.User.objects.create_user(
+ "cat@%s" % DOMAIN, "cat@example.com", "", local=True, localname="cat"
+ )
private_key, public_key = create_key_pair()
diff --git a/bookwyrm/tests/test_suggested_users.py b/bookwyrm/tests/test_suggested_users.py
new file mode 100644
index 000000000..7e4a9d00f
--- /dev/null
+++ b/bookwyrm/tests/test_suggested_users.py
@@ -0,0 +1,173 @@
+""" testing user follow suggestions """
+from collections import namedtuple
+from unittest.mock import patch
+
+from django.db.models import Q
+from django.test import TestCase
+
+from bookwyrm import models
+from bookwyrm.suggested_users import suggested_users, get_annotated_users
+
+
+@patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay")
+@patch("bookwyrm.activitystreams.ActivityStream.add_status")
+@patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
+@patch("bookwyrm.suggested_users.rerank_user_task.delay")
+@patch("bookwyrm.suggested_users.remove_user_task.delay")
+class SuggestedUsers(TestCase):
+ """using redis to build activity streams"""
+
+ def setUp(self):
+ """use a test csv"""
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse", "mouse@mouse.mouse", "password", local=True, localname="mouse"
+ )
+
+ def test_get_rank(self, *_):
+ """a float that reflects both the mutuals count and shared books"""
+ Mock = namedtuple("AnnotatedUserMock", ("mutuals", "shared_books"))
+ annotated_user_mock = Mock(3, 27)
+ rank = suggested_users.get_rank(annotated_user_mock)
+ self.assertEqual(rank, 3) # 3.9642857142857144)
+
+ def test_store_id(self, *_):
+ """redis key generation"""
+ self.assertEqual(
+ suggested_users.store_id(self.local_user),
+ "{:d}-suggestions".format(self.local_user.id),
+ )
+
+ def test_get_counts_from_rank(self, *_):
+ """reverse the rank computation to get the mutuals and shared books counts"""
+ counts = suggested_users.get_counts_from_rank(3.9642857142857144)
+ self.assertEqual(counts["mutuals"], 3)
+ # self.assertEqual(counts["shared_books"], 27)
+
+ def test_get_objects_for_store(self, *_):
+ """list of people to follow for a given user"""
+
+ mutual_user = models.User.objects.create_user(
+ "rat", "rat@local.rat", "password", local=True, localname="rat"
+ )
+ suggestable_user = models.User.objects.create_user(
+ "nutria",
+ "nutria@nutria.nutria",
+ "password",
+ local=True,
+ localname="nutria",
+ discoverable=True,
+ )
+
+ # you follow rat
+ mutual_user.followers.add(self.local_user)
+ # rat follows the suggested user
+ suggestable_user.followers.add(mutual_user)
+
+ results = suggested_users.get_objects_for_store(
+ "{:d}-suggestions".format(self.local_user.id)
+ )
+ self.assertEqual(results.count(), 1)
+ match = results.first()
+ self.assertEqual(match.id, suggestable_user.id)
+ self.assertEqual(match.mutuals, 1)
+
+ def test_create_user_signal(self, *_):
+ """build suggestions for new users"""
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay") as mock:
+ models.User.objects.create_user(
+ "nutria", "nutria@nu.tria", "password", local=True, localname="nutria"
+ )
+
+ self.assertEqual(mock.call_count, 1)
+
+ def test_get_annotated_users(self, *_):
+ """list of people you might know"""
+ user_1 = models.User.objects.create_user(
+ "nutria@local.com",
+ "nutria@nutria.com",
+ "nutriaword",
+ local=True,
+ localname="nutria",
+ discoverable=True,
+ )
+ user_2 = models.User.objects.create_user(
+ "fish@local.com",
+ "fish@fish.com",
+ "fishword",
+ local=True,
+ localname="fish",
+ )
+ work = models.Work.objects.create(title="Test Work")
+ book = models.Edition.objects.create(
+ title="Test Book",
+ remote_id="https://example.com/book/1",
+ parent_work=work,
+ )
+ with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
+ # 1 shared follow
+ self.local_user.following.add(user_2)
+ user_1.followers.add(user_2)
+
+ # 1 shared book
+ models.ShelfBook.objects.create(
+ user=self.local_user,
+ book=book,
+ shelf=self.local_user.shelf_set.first(),
+ )
+ models.ShelfBook.objects.create(
+ user=user_1, book=book, shelf=user_1.shelf_set.first()
+ )
+
+ result = get_annotated_users(self.local_user)
+ self.assertEqual(result.count(), 1)
+ self.assertTrue(user_1 in result)
+ self.assertFalse(user_2 in result)
+
+ user_1_annotated = result.get(id=user_1.id)
+ self.assertEqual(user_1_annotated.mutuals, 1)
+ # self.assertEqual(user_1_annotated.shared_books, 1)
+
+ def test_get_annotated_users_counts(self, *_):
+ """correct counting for multiple shared attributed"""
+ user_1 = models.User.objects.create_user(
+ "nutria@local.com",
+ "nutria@nutria.com",
+ "nutriaword",
+ local=True,
+ localname="nutria",
+ discoverable=True,
+ )
+ for i in range(3):
+ user = models.User.objects.create_user(
+ "{:d}@local.com".format(i),
+ "{:d}@nutria.com".format(i),
+ "password",
+ local=True,
+ localname=i,
+ )
+ user.following.add(user_1)
+ user.followers.add(self.local_user)
+
+ with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
+ for i in range(3):
+ book = models.Edition.objects.create(
+ title=i,
+ parent_work=models.Work.objects.create(title=i),
+ )
+ models.ShelfBook.objects.create(
+ user=self.local_user,
+ book=book,
+ shelf=self.local_user.shelf_set.first(),
+ )
+ models.ShelfBook.objects.create(
+ user=user_1, book=book, shelf=user_1.shelf_set.first()
+ )
+
+ result = get_annotated_users(
+ self.local_user,
+ ~Q(id=self.local_user.id),
+ ~Q(followers=self.local_user),
+ )
+ user_1_annotated = result.get(id=user_1.id)
+ self.assertEqual(user_1_annotated.mutuals, 3)
diff --git a/bookwyrm/tests/test_templatetags.py b/bookwyrm/tests/test_templatetags.py
index 8e16c9d3d..3c5d8b258 100644
--- a/bookwyrm/tests/test_templatetags.py
+++ b/bookwyrm/tests/test_templatetags.py
@@ -22,13 +22,14 @@ class TemplateTags(TestCase):
def setUp(self):
"""create some filler objects"""
- self.user = models.User.objects.create_user(
- "mouse@example.com",
- "mouse@mouse.mouse",
- "mouseword",
- local=True,
- localname="mouse",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_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",
diff --git a/bookwyrm/tests/views/inbox/test_inbox.py b/bookwyrm/tests/views/inbox/test_inbox.py
index 43032c626..8e49d25a4 100644
--- a/bookwyrm/tests/views/inbox/test_inbox.py
+++ b/bookwyrm/tests/views/inbox/test_inbox.py
@@ -19,15 +19,16 @@ class Inbox(TestCase):
self.client = Client()
self.factory = RequestFactory()
- local_user = models.User.objects.create_user(
- "mouse@example.com",
- "mouse@mouse.com",
- "mouseword",
- local=True,
- localname="mouse",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ local_user = models.User.objects.create_user(
+ "mouse@example.com",
+ "mouse@mouse.com",
+ "mouseword",
+ local=True,
+ localname="mouse",
+ )
local_user.remote_id = "https://example.com/user/mouse"
- local_user.save(broadcast=False)
+ local_user.save(broadcast=False, update_fields=["remote_id"])
with patch("bookwyrm.models.user.set_remote_server.delay"):
self.remote_user = models.User.objects.create_user(
"rat",
@@ -144,7 +145,8 @@ class Inbox(TestCase):
)
self.assertTrue(views.inbox.is_blocked_activity(activity))
- def test_create_by_deactivated_user(self):
+ @patch("bookwyrm.suggested_users.remove_user_task.delay")
+ def test_create_by_deactivated_user(self, _):
"""don't let deactivated users post"""
self.remote_user.delete(broadcast=False)
self.assertTrue(self.remote_user.deleted)
diff --git a/bookwyrm/tests/views/inbox/test_inbox_add.py b/bookwyrm/tests/views/inbox/test_inbox_add.py
index 64be49b85..07525c34e 100644
--- a/bookwyrm/tests/views/inbox/test_inbox_add.py
+++ b/bookwyrm/tests/views/inbox/test_inbox_add.py
@@ -13,15 +13,16 @@ class InboxAdd(TestCase):
def setUp(self):
"""basic user and book data"""
- local_user = models.User.objects.create_user(
- "mouse@example.com",
- "mouse@mouse.com",
- "mouseword",
- local=True,
- localname="mouse",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ local_user = models.User.objects.create_user(
+ "mouse@example.com",
+ "mouse@mouse.com",
+ "mouseword",
+ local=True,
+ localname="mouse",
+ )
local_user.remote_id = "https://example.com/user/mouse"
- local_user.save(broadcast=False)
+ local_user.save(broadcast=False, update_fields=["remote_id"])
with patch("bookwyrm.models.user.set_remote_server.delay"):
self.remote_user = models.User.objects.create_user(
"rat",
diff --git a/bookwyrm/tests/views/inbox/test_inbox_announce.py b/bookwyrm/tests/views/inbox/test_inbox_announce.py
index 5866ed1f3..8bc6cd1d0 100644
--- a/bookwyrm/tests/views/inbox/test_inbox_announce.py
+++ b/bookwyrm/tests/views/inbox/test_inbox_announce.py
@@ -13,15 +13,16 @@ class InboxActivities(TestCase):
def setUp(self):
"""basic user and book data"""
- self.local_user = models.User.objects.create_user(
- "mouse@example.com",
- "mouse@mouse.com",
- "mouseword",
- local=True,
- localname="mouse",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@example.com",
+ "mouse@mouse.com",
+ "mouseword",
+ local=True,
+ localname="mouse",
+ )
self.local_user.remote_id = "https://example.com/user/mouse"
- self.local_user.save(broadcast=False)
+ self.local_user.save(broadcast=False, update_fields=["remote_id"])
with patch("bookwyrm.models.user.set_remote_server.delay"):
self.remote_user = models.User.objects.create_user(
"rat",
diff --git a/bookwyrm/tests/views/inbox/test_inbox_block.py b/bookwyrm/tests/views/inbox/test_inbox_block.py
index 956cf538a..ce650a007 100644
--- a/bookwyrm/tests/views/inbox/test_inbox_block.py
+++ b/bookwyrm/tests/views/inbox/test_inbox_block.py
@@ -12,15 +12,16 @@ class InboxBlock(TestCase):
def setUp(self):
"""basic user and book data"""
- self.local_user = models.User.objects.create_user(
- "mouse@example.com",
- "mouse@mouse.com",
- "mouseword",
- local=True,
- localname="mouse",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@example.com",
+ "mouse@mouse.com",
+ "mouseword",
+ local=True,
+ localname="mouse",
+ )
self.local_user.remote_id = "https://example.com/user/mouse"
- self.local_user.save(broadcast=False)
+ self.local_user.save(broadcast=False, update_fields=["remote_id"])
with patch("bookwyrm.models.user.set_remote_server.delay"):
self.remote_user = models.User.objects.create_user(
"rat",
diff --git a/bookwyrm/tests/views/inbox/test_inbox_create.py b/bookwyrm/tests/views/inbox/test_inbox_create.py
index d2fdb8b61..f93354bfb 100644
--- a/bookwyrm/tests/views/inbox/test_inbox_create.py
+++ b/bookwyrm/tests/views/inbox/test_inbox_create.py
@@ -16,15 +16,16 @@ class InboxCreate(TestCase):
def setUp(self):
"""basic user and book data"""
- self.local_user = models.User.objects.create_user(
- "mouse@example.com",
- "mouse@mouse.com",
- "mouseword",
- local=True,
- localname="mouse",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@example.com",
+ "mouse@mouse.com",
+ "mouseword",
+ local=True,
+ localname="mouse",
+ )
self.local_user.remote_id = "https://example.com/user/mouse"
- self.local_user.save(broadcast=False)
+ self.local_user.save(broadcast=False, update_fields=["remote_id"])
with patch("bookwyrm.models.user.set_remote_server.delay"):
self.remote_user = models.User.objects.create_user(
"rat",
diff --git a/bookwyrm/tests/views/inbox/test_inbox_delete.py b/bookwyrm/tests/views/inbox/test_inbox_delete.py
index 617dcf6f5..1566c05a2 100644
--- a/bookwyrm/tests/views/inbox/test_inbox_delete.py
+++ b/bookwyrm/tests/views/inbox/test_inbox_delete.py
@@ -13,15 +13,16 @@ class InboxActivities(TestCase):
def setUp(self):
"""basic user and book data"""
- self.local_user = models.User.objects.create_user(
- "mouse@example.com",
- "mouse@mouse.com",
- "mouseword",
- local=True,
- localname="mouse",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@example.com",
+ "mouse@mouse.com",
+ "mouseword",
+ local=True,
+ localname="mouse",
+ )
self.local_user.remote_id = "https://example.com/user/mouse"
- self.local_user.save(broadcast=False)
+ self.local_user.save(broadcast=False, update_fields=["remote_id"])
with patch("bookwyrm.models.user.set_remote_server.delay"):
self.remote_user = models.User.objects.create_user(
"rat",
@@ -105,7 +106,8 @@ class InboxActivities(TestCase):
self.assertEqual(models.Notification.objects.count(), 1)
self.assertEqual(models.Notification.objects.get(), notif)
- def test_delete_user(self):
+ @patch("bookwyrm.suggested_users.remove_user_task.delay")
+ def test_delete_user(self, _):
"""delete a user"""
self.assertTrue(models.User.objects.get(username="rat@example.com").is_active)
activity = {
diff --git a/bookwyrm/tests/views/inbox/test_inbox_follow.py b/bookwyrm/tests/views/inbox/test_inbox_follow.py
index f5332b7a3..d1a4e0d00 100644
--- a/bookwyrm/tests/views/inbox/test_inbox_follow.py
+++ b/bookwyrm/tests/views/inbox/test_inbox_follow.py
@@ -13,15 +13,16 @@ class InboxRelationships(TestCase):
def setUp(self):
"""basic user and book data"""
- self.local_user = models.User.objects.create_user(
- "mouse@example.com",
- "mouse@mouse.com",
- "mouseword",
- local=True,
- localname="mouse",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@example.com",
+ "mouse@mouse.com",
+ "mouseword",
+ local=True,
+ localname="mouse",
+ )
self.local_user.remote_id = "https://example.com/user/mouse"
- self.local_user.save(broadcast=False)
+ self.local_user.save(broadcast=False, update_fields=["remote_id"])
with patch("bookwyrm.models.user.set_remote_server.delay"):
self.remote_user = models.User.objects.create_user(
"rat",
@@ -102,7 +103,9 @@ class InboxRelationships(TestCase):
}
self.local_user.manually_approves_followers = True
- self.local_user.save(broadcast=False)
+ self.local_user.save(
+ broadcast=False, update_fields=["manually_approves_followers"]
+ )
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
views.inbox.activity_task(activity)
@@ -124,7 +127,9 @@ class InboxRelationships(TestCase):
def test_undo_follow_request(self):
"""the requester cancels a follow request"""
self.local_user.manually_approves_followers = True
- self.local_user.save(broadcast=False)
+ self.local_user.save(
+ broadcast=False, update_fields=["manually_approves_followers"]
+ )
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
request = models.UserFollowRequest.objects.create(
user_subject=self.remote_user, user_object=self.local_user
diff --git a/bookwyrm/tests/views/inbox/test_inbox_like.py b/bookwyrm/tests/views/inbox/test_inbox_like.py
index 433d5ba49..56f21e894 100644
--- a/bookwyrm/tests/views/inbox/test_inbox_like.py
+++ b/bookwyrm/tests/views/inbox/test_inbox_like.py
@@ -12,15 +12,16 @@ class InboxActivities(TestCase):
def setUp(self):
"""basic user and book data"""
- self.local_user = models.User.objects.create_user(
- "mouse@example.com",
- "mouse@mouse.com",
- "mouseword",
- local=True,
- localname="mouse",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@example.com",
+ "mouse@mouse.com",
+ "mouseword",
+ local=True,
+ localname="mouse",
+ )
self.local_user.remote_id = "https://example.com/user/mouse"
- self.local_user.save(broadcast=False)
+ self.local_user.save(broadcast=False, update_fields=["remote_id"])
with patch("bookwyrm.models.user.set_remote_server.delay"):
self.remote_user = models.User.objects.create_user(
"rat",
diff --git a/bookwyrm/tests/views/inbox/test_inbox_remove.py b/bookwyrm/tests/views/inbox/test_inbox_remove.py
index 4e78480a4..3d64fcb23 100644
--- a/bookwyrm/tests/views/inbox/test_inbox_remove.py
+++ b/bookwyrm/tests/views/inbox/test_inbox_remove.py
@@ -12,15 +12,16 @@ class InboxRemove(TestCase):
def setUp(self):
"""basic user and book data"""
- self.local_user = models.User.objects.create_user(
- "mouse@example.com",
- "mouse@mouse.com",
- "mouseword",
- local=True,
- localname="mouse",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@example.com",
+ "mouse@mouse.com",
+ "mouseword",
+ local=True,
+ localname="mouse",
+ )
self.local_user.remote_id = "https://example.com/user/mouse"
- self.local_user.save(broadcast=False)
+ self.local_user.save(broadcast=False, update_fields=["remote_id"])
with patch("bookwyrm.models.user.set_remote_server.delay"):
self.remote_user = models.User.objects.create_user(
"rat",
diff --git a/bookwyrm/tests/views/inbox/test_inbox_update.py b/bookwyrm/tests/views/inbox/test_inbox_update.py
index 242cfe915..4abb0fa0d 100644
--- a/bookwyrm/tests/views/inbox/test_inbox_update.py
+++ b/bookwyrm/tests/views/inbox/test_inbox_update.py
@@ -14,15 +14,16 @@ class InboxUpdate(TestCase):
def setUp(self):
"""basic user and book data"""
- self.local_user = models.User.objects.create_user(
- "mouse@example.com",
- "mouse@mouse.com",
- "mouseword",
- local=True,
- localname="mouse",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@example.com",
+ "mouse@mouse.com",
+ "mouseword",
+ local=True,
+ localname="mouse",
+ )
self.local_user.remote_id = "https://example.com/user/mouse"
- self.local_user.save(broadcast=False)
+ self.local_user.save(broadcast=False, update_fields=["remote_id"])
with patch("bookwyrm.models.user.set_remote_server.delay"):
self.remote_user = models.User.objects.create_user(
"rat",
@@ -79,7 +80,8 @@ class InboxUpdate(TestCase):
self.assertEqual(book_list.description, "summary text")
self.assertEqual(book_list.remote_id, "https://example.com/list/22")
- def test_update_user(self):
+ @patch("bookwyrm.suggested_users.rerank_user_task.delay")
+ def test_update_user(self, _):
"""update an existing user"""
models.UserFollows.objects.create(
user_subject=self.local_user,
diff --git a/bookwyrm/tests/views/test_announcements.py b/bookwyrm/tests/views/test_announcements.py
index 8df6302cb..16ef81e9c 100644
--- a/bookwyrm/tests/views/test_announcements.py
+++ b/bookwyrm/tests/views/test_announcements.py
@@ -1,4 +1,5 @@
""" 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
@@ -12,13 +13,14 @@ class AnnouncementViews(TestCase):
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
- self.local_user = models.User.objects.create_user(
- "mouse@local.com",
- "mouse@mouse.mouse",
- "password",
- local=True,
- localname="mouse",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@local.com",
+ "mouse@mouse.mouse",
+ "password",
+ local=True,
+ localname="mouse",
+ )
models.SiteSettings.objects.create()
diff --git a/bookwyrm/tests/views/test_authentication.py b/bookwyrm/tests/views/test_authentication.py
index 22f3c20f4..10531f517 100644
--- a/bookwyrm/tests/views/test_authentication.py
+++ b/bookwyrm/tests/views/test_authentication.py
@@ -13,25 +13,27 @@ from bookwyrm.settings import DOMAIN
# pylint: disable=too-many-public-methods
+@patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
class AuthenticationViews(TestCase):
"""login and password management"""
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
- self.local_user = models.User.objects.create_user(
- "mouse@local.com",
- "mouse@mouse.com",
- "password",
- local=True,
- localname="mouse",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@local.com",
+ "mouse@mouse.com",
+ "password",
+ local=True,
+ localname="mouse",
+ )
self.anonymous_user = AnonymousUser
self.anonymous_user.is_authenticated = False
self.settings = models.SiteSettings.objects.create(id=1)
- def test_login_get(self):
+ def test_login_get(self, _):
"""there are so many views, this just makes sure it LOADS"""
login = views.Login.as_view()
request = self.factory.get("")
@@ -47,7 +49,7 @@ class AuthenticationViews(TestCase):
self.assertEqual(result.url, "/")
self.assertEqual(result.status_code, 302)
- def test_register(self):
+ def test_register(self, _):
"""create a user"""
view = views.Register.as_view()
self.assertEqual(models.User.objects.count(), 1)
@@ -68,7 +70,7 @@ class AuthenticationViews(TestCase):
self.assertEqual(nutria.localname, "nutria-user.user_nutria")
self.assertEqual(nutria.local, True)
- def test_register_trailing_space(self):
+ def test_register_trailing_space(self, _):
"""django handles this so weirdly"""
view = views.Register.as_view()
request = self.factory.post(
@@ -84,7 +86,7 @@ class AuthenticationViews(TestCase):
self.assertEqual(nutria.localname, "nutria")
self.assertEqual(nutria.local, True)
- def test_register_invalid_email(self):
+ def test_register_invalid_email(self, _):
"""gotta have an email"""
view = views.Register.as_view()
self.assertEqual(models.User.objects.count(), 1)
@@ -95,7 +97,7 @@ class AuthenticationViews(TestCase):
self.assertEqual(models.User.objects.count(), 1)
response.render()
- def test_register_invalid_username(self):
+ def test_register_invalid_username(self, _):
"""gotta have an email"""
view = views.Register.as_view()
self.assertEqual(models.User.objects.count(), 1)
@@ -123,7 +125,7 @@ class AuthenticationViews(TestCase):
self.assertEqual(models.User.objects.count(), 1)
response.render()
- def test_register_closed_instance(self):
+ def test_register_closed_instance(self, _):
"""you can't just register"""
view = views.Register.as_view()
self.settings.allow_registration = False
@@ -135,7 +137,7 @@ class AuthenticationViews(TestCase):
with self.assertRaises(PermissionDenied):
view(request)
- def test_register_invite(self):
+ def test_register_invite(self, _):
"""you can't just register"""
view = views.Register.as_view()
self.settings.allow_registration = False
diff --git a/bookwyrm/tests/views/test_author.py b/bookwyrm/tests/views/test_author.py
index 0169bbe8b..6157b6516 100644
--- a/bookwyrm/tests/views/test_author.py
+++ b/bookwyrm/tests/views/test_author.py
@@ -17,14 +17,15 @@ class AuthorViews(TestCase):
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
- self.local_user = models.User.objects.create_user(
- "mouse@local.com",
- "mouse@mouse.com",
- "mouseword",
- local=True,
- localname="mouse",
- remote_id="https://example.com/users/mouse",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@local.com",
+ "mouse@mouse.com",
+ "mouseword",
+ local=True,
+ localname="mouse",
+ remote_id="https://example.com/users/mouse",
+ )
self.group = Group.objects.create(name="editor")
self.group.permissions.add(
Permission.objects.create(
diff --git a/bookwyrm/tests/views/test_block.py b/bookwyrm/tests/views/test_block.py
index c6fc9eb86..11283869b 100644
--- a/bookwyrm/tests/views/test_block.py
+++ b/bookwyrm/tests/views/test_block.py
@@ -14,13 +14,14 @@ class BlockViews(TestCase):
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
- self.local_user = models.User.objects.create_user(
- "mouse@local.com",
- "mouse@mouse.mouse",
- "password",
- local=True,
- localname="mouse",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@local.com",
+ "mouse@mouse.mouse",
+ "password",
+ local=True,
+ localname="mouse",
+ )
with patch("bookwyrm.models.user.set_remote_server.delay"):
self.remote_user = models.User.objects.create_user(
"rat",
diff --git a/bookwyrm/tests/views/test_book.py b/bookwyrm/tests/views/test_book.py
index 73f2cad11..3b6748523 100644
--- a/bookwyrm/tests/views/test_book.py
+++ b/bookwyrm/tests/views/test_book.py
@@ -23,14 +23,15 @@ class BookViews(TestCase):
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
- self.local_user = models.User.objects.create_user(
- "mouse@local.com",
- "mouse@mouse.com",
- "mouseword",
- local=True,
- localname="mouse",
- remote_id="https://example.com/users/mouse",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@local.com",
+ "mouse@mouse.com",
+ "mouseword",
+ local=True,
+ localname="mouse",
+ remote_id="https://example.com/users/mouse",
+ )
self.group = Group.objects.create(name="editor")
self.group.permissions.add(
Permission.objects.create(
@@ -200,7 +201,8 @@ class BookViews(TestCase):
self.assertEqual(book.authors.first().name, "Sappho")
self.assertEqual(book.authors.first(), book.parent_work.authors.first())
- def test_switch_edition(self):
+ @patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
+ def test_switch_edition(self, _):
"""updates user's relationships to a book"""
work = models.Work.objects.create(title="test work")
edition1 = models.Edition.objects.create(title="first ed", parent_work=work)
@@ -297,3 +299,16 @@ class BookViews(TestCase):
self.book.refresh_from_db()
self.assertTrue(self.book.cover)
+
+ def test_add_description(self):
+ """add a book description"""
+ self.local_user.groups.add(self.group)
+ request = self.factory.post("", {"description": "new description hi"})
+ request.user = self.local_user
+
+ with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
+ views.add_description(request, self.book.id)
+
+ self.book.refresh_from_db()
+ self.assertEqual(self.book.description, "new description hi")
+ self.assertEqual(self.book.last_edited_by, self.local_user)
diff --git a/bookwyrm/tests/views/test_directory.py b/bookwyrm/tests/views/test_directory.py
index c2026cca3..bdda81013 100644
--- a/bookwyrm/tests/views/test_directory.py
+++ b/bookwyrm/tests/views/test_directory.py
@@ -1,4 +1,7 @@
""" test for app action functionality """
+from unittest.mock import patch
+
+from django.contrib.auth.models import AnonymousUser
from django.template.response import TemplateResponse
from django.test import TestCase
from django.test.client import RequestFactory
@@ -12,15 +15,25 @@ class DirectoryViews(TestCase):
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
- self.local_user = models.User.objects.create_user(
- "mouse@local.com",
- "mouse@mouse.com",
- "mouseword",
- local=True,
- localname="mouse",
- remote_id="https://example.com/users/mouse",
- )
- self.rat = models.User.objects.create_user(
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@local.com",
+ "mouse@mouse.com",
+ "mouseword",
+ local=True,
+ localname="mouse",
+ remote_id="https://example.com/users/mouse",
+ )
+
+ models.SiteSettings.objects.create()
+ self.anonymous_user = AnonymousUser
+ self.anonymous_user.is_authenticated = False
+
+ @patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
+ @patch("bookwyrm.suggested_users.rerank_user_task.delay")
+ def test_directory_page(self, *_):
+ """there are so many views, this just makes sure it LOADS"""
+ models.User.objects.create_user(
"rat@local.com",
"rat@rat.com",
"ratword",
@@ -29,10 +42,16 @@ class DirectoryViews(TestCase):
remote_id="https://example.com/users/rat",
discoverable=True,
)
+ view = views.Directory.as_view()
+ request = self.factory.get("")
+ request.user = self.local_user
- models.SiteSettings.objects.create()
+ result = view(request)
+ self.assertIsInstance(result, TemplateResponse)
+ result.render()
+ self.assertEqual(result.status_code, 200)
- def test_directory_page(self):
+ def test_directory_page_empty(self):
"""there are so many views, this just makes sure it LOADS"""
view = views.Directory.as_view()
request = self.factory.get("")
@@ -42,3 +61,12 @@ class DirectoryViews(TestCase):
self.assertIsInstance(result, TemplateResponse)
result.render()
self.assertEqual(result.status_code, 200)
+
+ def test_directory_page_logged_out(self):
+ """there are so many views, this just makes sure it LOADS"""
+ view = views.Directory.as_view()
+ request = self.factory.get("")
+ request.user = self.anonymous_user
+
+ result = view(request)
+ self.assertEqual(result.status_code, 302)
diff --git a/bookwyrm/tests/views/test_edit_user.py b/bookwyrm/tests/views/test_edit_user.py
index 7c0825b19..df89d5b09 100644
--- a/bookwyrm/tests/views/test_edit_user.py
+++ b/bookwyrm/tests/views/test_edit_user.py
@@ -15,36 +15,40 @@ from django.test.client import RequestFactory
from bookwyrm import forms, models, views
+@patch("bookwyrm.suggested_users.remove_user_task.delay")
class EditUserViews(TestCase):
"""view user and edit profile"""
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
- self.local_user = models.User.objects.create_user(
- "mouse@local.com",
- "mouse@mouse.mouse",
- "password",
- local=True,
- localname="mouse",
- )
- self.rat = models.User.objects.create_user(
- "rat@local.com", "rat@rat.rat", "password", local=True, localname="rat"
- )
-
- self.book = models.Edition.objects.create(title="test")
- with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
- models.ShelfBook.objects.create(
- book=self.book,
- user=self.local_user,
- shelf=self.local_user.shelf_set.first(),
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@local.com",
+ "mouse@mouse.mouse",
+ "password",
+ local=True,
+ localname="mouse",
)
+ self.rat = models.User.objects.create_user(
+ "rat@local.com", "rat@rat.rat", "password", local=True, localname="rat"
+ )
+
+ self.book = models.Edition.objects.create(
+ title="test", parent_work=models.Work.objects.create(title="test work")
+ )
+ with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
+ models.ShelfBook.objects.create(
+ book=self.book,
+ user=self.local_user,
+ shelf=self.local_user.shelf_set.first(),
+ )
models.SiteSettings.objects.create()
self.anonymous_user = AnonymousUser
self.anonymous_user.is_authenticated = False
- def test_edit_user_page(self):
+ def test_edit_user_page(self, _):
"""there are so many views, this just makes sure it LOADS"""
view = views.EditUser.as_view()
request = self.factory.get("")
@@ -54,12 +58,13 @@ class EditUserViews(TestCase):
result.render()
self.assertEqual(result.status_code, 200)
- def test_edit_user(self):
+ def test_edit_user(self, _):
"""use a form to update a user"""
view = views.EditUser.as_view()
form = forms.EditUserForm(instance=self.local_user)
form.data["name"] = "New Name"
form.data["email"] = "wow@email.com"
+ form.data["default_post_privacy"] = "public"
form.data["preferred_timezone"] = "UTC"
request = self.factory.post("", form.data)
request.user = self.local_user
@@ -73,12 +78,13 @@ class EditUserViews(TestCase):
self.assertEqual(self.local_user.name, "New Name")
self.assertEqual(self.local_user.email, "wow@email.com")
- def test_edit_user_avatar(self):
+ def test_edit_user_avatar(self, _):
"""use a form to update a user"""
view = views.EditUser.as_view()
form = forms.EditUserForm(instance=self.local_user)
form.data["name"] = "New Name"
form.data["email"] = "wow@email.com"
+ form.data["default_post_privacy"] = "public"
form.data["preferred_timezone"] = "UTC"
image_file = pathlib.Path(__file__).parent.joinpath(
"../../static/images/no_cover.jpg"
@@ -100,7 +106,7 @@ class EditUserViews(TestCase):
self.assertEqual(self.local_user.avatar.width, 120)
self.assertEqual(self.local_user.avatar.height, 120)
- def test_crop_avatar(self):
+ def test_crop_avatar(self, _):
"""reduce that image size"""
image_file = pathlib.Path(__file__).parent.joinpath(
"../../static/images/no_cover.jpg"
@@ -112,7 +118,7 @@ class EditUserViews(TestCase):
image_result = Image.open(result)
self.assertEqual(image_result.size, (120, 120))
- def test_delete_user_page(self):
+ def test_delete_user_page(self, _):
"""there are so many views, this just makes sure it LOADS"""
view = views.DeleteUser.as_view()
request = self.factory.get("")
@@ -122,7 +128,8 @@ class EditUserViews(TestCase):
result.render()
self.assertEqual(result.status_code, 200)
- def test_delete_user(self):
+ @patch("bookwyrm.suggested_users.rerank_suggestions_task")
+ def test_delete_user(self, *_):
"""use a form to update a user"""
view = views.DeleteUser.as_view()
form = forms.DeleteUserForm()
diff --git a/bookwyrm/tests/views/test_federation.py b/bookwyrm/tests/views/test_federation.py
index 6db65b785..f43a9623e 100644
--- a/bookwyrm/tests/views/test_federation.py
+++ b/bookwyrm/tests/views/test_federation.py
@@ -15,13 +15,14 @@ class FederationViews(TestCase):
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
- self.local_user = models.User.objects.create_user(
- "mouse@local.com",
- "mouse@mouse.mouse",
- "password",
- local=True,
- localname="mouse",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@local.com",
+ "mouse@mouse.mouse",
+ "password",
+ local=True,
+ localname="mouse",
+ )
with patch("bookwyrm.models.user.set_remote_server.delay"):
self.remote_user = models.User.objects.create_user(
"rat",
@@ -68,7 +69,7 @@ class FederationViews(TestCase):
identifier="hi.there.com",
)
self.remote_user.federated_server = server
- self.remote_user.save()
+ self.remote_user.save(update_fields=["federated_server"])
self.assertEqual(server.status, "federated")
@@ -107,7 +108,9 @@ class FederationViews(TestCase):
self.remote_user.federated_server = server
self.remote_user.is_active = False
self.remote_user.deactivation_reason = "domain_block"
- self.remote_user.save()
+ self.remote_user.save(
+ update_fields=["federated_server", "is_active", "deactivation_reason"]
+ )
request = self.factory.post("")
request.user = self.local_user
@@ -162,7 +165,7 @@ class FederationViews(TestCase):
"""load a json file with a list of servers to block"""
server = models.FederatedServer.objects.create(server_name="hi.there.com")
self.remote_user.federated_server = server
- self.remote_user.save()
+ self.remote_user.save(update_fields=["federated_server"])
data = [
{"instance": "server.name", "url": "https://explanation.url"}, # new server
diff --git a/bookwyrm/tests/views/test_feed.py b/bookwyrm/tests/views/test_feed.py
index a6a3d9677..666c3e02b 100644
--- a/bookwyrm/tests/views/test_feed.py
+++ b/bookwyrm/tests/views/test_feed.py
@@ -16,19 +16,22 @@ from bookwyrm.activitypub import ActivitypubResponse
@patch("bookwyrm.activitystreams.ActivityStream.get_activity_stream")
@patch("bookwyrm.activitystreams.ActivityStream.add_status")
+@patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
+@patch("bookwyrm.suggested_users.remove_user_task.delay")
class FeedViews(TestCase):
"""activity feed, statuses, dms"""
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
- self.local_user = models.User.objects.create_user(
- "mouse@local.com",
- "mouse@mouse.mouse",
- "password",
- local=True,
- localname="mouse",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@local.com",
+ "mouse@mouse.mouse",
+ "password",
+ local=True,
+ localname="mouse",
+ )
self.book = models.Edition.objects.create(
parent_work=models.Work.objects.create(title="hi"),
title="Example Edition",
@@ -36,12 +39,13 @@ class FeedViews(TestCase):
)
models.SiteSettings.objects.create()
+ @patch("bookwyrm.suggested_users.SuggestedUsers.get_suggestions")
def test_feed(self, *_):
"""there are so many views, this just makes sure it LOADS"""
view = views.Feed.as_view()
request = self.factory.get("")
request.user = self.local_user
- result = view(request, "local")
+ result = view(request, "home")
self.assertIsInstance(result, TemplateResponse)
result.render()
self.assertEqual(result.status_code, 200)
diff --git a/bookwyrm/tests/views/test_follow.py b/bookwyrm/tests/views/test_follow.py
index 45e60d3cb..714284b01 100644
--- a/bookwyrm/tests/views/test_follow.py
+++ b/bookwyrm/tests/views/test_follow.py
@@ -10,20 +10,21 @@ from django.test.client import RequestFactory
from bookwyrm import models, views
-class BookViews(TestCase):
- """books books books"""
+class FollowViews(TestCase):
+ """follows"""
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
- self.local_user = models.User.objects.create_user(
- "mouse@local.com",
- "mouse@mouse.com",
- "mouseword",
- local=True,
- localname="mouse",
- remote_id="https://example.com/users/mouse",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@local.com",
+ "mouse@mouse.com",
+ "mouseword",
+ local=True,
+ localname="mouse",
+ remote_id="https://example.com/users/mouse",
+ )
with patch("bookwyrm.models.user.set_remote_server"):
self.remote_user = models.User.objects.create_user(
"rat",
@@ -66,15 +67,16 @@ class BookViews(TestCase):
def test_handle_follow_local_manually_approves(self):
"""send a follow request"""
- rat = models.User.objects.create_user(
- "rat@local.com",
- "rat@rat.com",
- "ratword",
- local=True,
- localname="rat",
- remote_id="https://example.com/users/rat",
- manually_approves_followers=True,
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ rat = models.User.objects.create_user(
+ "rat@local.com",
+ "rat@rat.com",
+ "ratword",
+ local=True,
+ localname="rat",
+ remote_id="https://example.com/users/rat",
+ manually_approves_followers=True,
+ )
request = self.factory.post("", {"user": rat})
request.user = self.local_user
self.assertEqual(models.UserFollowRequest.objects.count(), 0)
@@ -89,14 +91,15 @@ class BookViews(TestCase):
def test_handle_follow_local(self):
"""send a follow request"""
- rat = models.User.objects.create_user(
- "rat@local.com",
- "rat@rat.com",
- "ratword",
- local=True,
- localname="rat",
- remote_id="https://example.com/users/rat",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ rat = models.User.objects.create_user(
+ "rat@local.com",
+ "rat@rat.com",
+ "ratword",
+ local=True,
+ localname="rat",
+ remote_id="https://example.com/users/rat",
+ )
request = self.factory.post("", {"user": rat})
request.user = self.local_user
self.assertEqual(models.UserFollowRequest.objects.count(), 0)
@@ -127,7 +130,9 @@ class BookViews(TestCase):
def test_handle_accept(self):
"""accept a follow request"""
self.local_user.manually_approves_followers = True
- self.local_user.save(broadcast=False)
+ self.local_user.save(
+ broadcast=False, update_fields=["manually_approves_followers"]
+ )
request = self.factory.post("", {"user": self.remote_user.username})
request.user = self.local_user
rel = models.UserFollowRequest.objects.create(
@@ -144,7 +149,9 @@ class BookViews(TestCase):
def test_handle_reject(self):
"""reject a follow request"""
self.local_user.manually_approves_followers = True
- self.local_user.save(broadcast=False)
+ self.local_user.save(
+ broadcast=False, update_fields=["manually_approves_followers"]
+ )
request = self.factory.post("", {"user": self.remote_user.username})
request.user = self.local_user
rel = models.UserFollowRequest.objects.create(
diff --git a/bookwyrm/tests/views/test_get_started.py b/bookwyrm/tests/views/test_get_started.py
index 1c55da086..eb9d67b5d 100644
--- a/bookwyrm/tests/views/test_get_started.py
+++ b/bookwyrm/tests/views/test_get_started.py
@@ -13,13 +13,14 @@ class GetStartedViews(TestCase):
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
- self.local_user = models.User.objects.create_user(
- "mouse@local.com",
- "mouse@mouse.mouse",
- "password",
- local=True,
- localname="mouse",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@local.com",
+ "mouse@mouse.mouse",
+ "password",
+ local=True,
+ localname="mouse",
+ )
self.book = models.Edition.objects.create(
parent_work=models.Work.objects.create(title="hi"),
title="Example Edition",
@@ -42,7 +43,9 @@ class GetStartedViews(TestCase):
result.render()
self.assertEqual(result.status_code, 200)
- def test_profile_view_post(self):
+ @patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
+ @patch("bookwyrm.suggested_users.rerank_user_task.delay")
+ def test_profile_view_post(self, *_):
"""save basic user details"""
view = views.GetStartedProfile.as_view()
form = forms.LimitedEditUserForm(instance=self.local_user)
@@ -84,7 +87,8 @@ class GetStartedViews(TestCase):
result.render()
self.assertEqual(result.status_code, 200)
- def test_books_view_post(self):
+ @patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
+ def test_books_view_post(self, _):
"""shelve some books"""
view = views.GetStartedBooks.as_view()
data = {self.book.id: self.local_user.shelf_set.first().id}
@@ -102,7 +106,8 @@ class GetStartedViews(TestCase):
self.assertEqual(shelfbook.book, self.book)
self.assertEqual(shelfbook.user, self.local_user)
- def test_users_view(self):
+ @patch("bookwyrm.suggested_users.SuggestedUsers.get_suggestions")
+ def test_users_view(self, _):
"""there are so many views, this just makes sure it LOADS"""
view = views.GetStartedUsers.as_view()
request = self.factory.get("")
@@ -114,7 +119,8 @@ class GetStartedViews(TestCase):
result.render()
self.assertEqual(result.status_code, 200)
- def test_users_view_with_query(self):
+ @patch("bookwyrm.suggested_users.SuggestedUsers.get_suggestions")
+ def test_users_view_with_query(self, _):
"""there are so many views, this just makes sure it LOADS"""
view = views.GetStartedUsers.as_view()
request = self.factory.get("?query=rat")
diff --git a/bookwyrm/tests/views/test_goal.py b/bookwyrm/tests/views/test_goal.py
index 4e8f6ee23..23bd8e1a8 100644
--- a/bookwyrm/tests/views/test_goal.py
+++ b/bookwyrm/tests/views/test_goal.py
@@ -16,28 +16,30 @@ class GoalViews(TestCase):
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
- self.local_user = models.User.objects.create_user(
- "mouse@local.com",
- "mouse@mouse.com",
- "mouseword",
- local=True,
- localname="mouse",
- remote_id="https://example.com/users/mouse",
- )
- self.rat = models.User.objects.create_user(
- "rat@local.com",
- "rat@rat.com",
- "ratword",
- local=True,
- localname="rat",
- remote_id="https://example.com/users/rat",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@local.com",
+ "mouse@mouse.com",
+ "mouseword",
+ local=True,
+ localname="mouse",
+ remote_id="https://example.com/users/mouse",
+ )
+ self.rat = models.User.objects.create_user(
+ "rat@local.com",
+ "rat@rat.com",
+ "ratword",
+ local=True,
+ localname="rat",
+ remote_id="https://example.com/users/rat",
+ )
self.book = models.Edition.objects.create(
title="Example Edition",
remote_id="https://example.com/book/1",
)
self.anonymous_user = AnonymousUser
self.anonymous_user.is_authenticated = False
+ self.year = timezone.now().year
models.SiteSettings.objects.create()
def test_goal_page_no_goal(self):
@@ -46,7 +48,7 @@ class GoalViews(TestCase):
request = self.factory.get("")
request.user = self.rat
- result = view(request, self.local_user.localname, 2020)
+ result = view(request, self.local_user.localname, self.year)
self.assertEqual(result.status_code, 404)
def test_goal_page_no_goal_self(self):
@@ -55,7 +57,7 @@ class GoalViews(TestCase):
request = self.factory.get("")
request.user = self.local_user
- result = view(request, self.local_user.localname, 2020)
+ result = view(request, self.local_user.localname, self.year)
result.render()
self.assertIsInstance(result, TemplateResponse)
@@ -65,7 +67,7 @@ class GoalViews(TestCase):
request = self.factory.get("")
request.user = self.anonymous_user
- result = view(request, self.local_user.localname, 2020)
+ result = view(request, self.local_user.localname, self.year)
self.assertEqual(result.status_code, 302)
def test_goal_page_public(self):
@@ -93,13 +95,13 @@ class GoalViews(TestCase):
def test_goal_page_private(self):
"""view a user's private goal"""
models.AnnualGoal.objects.create(
- user=self.local_user, year=2020, goal=15, privacy="followers"
+ user=self.local_user, year=self.year, goal=15, privacy="followers"
)
view = views.Goal.as_view()
request = self.factory.get("")
request.user = self.rat
- result = view(request, self.local_user.localname, 2020)
+ result = view(request, self.local_user.localname, self.year)
self.assertEqual(result.status_code, 404)
@patch("bookwyrm.activitystreams.ActivityStream.add_status")
@@ -111,19 +113,19 @@ class GoalViews(TestCase):
{
"user": self.local_user.id,
"goal": 10,
- "year": 2020,
+ "year": self.year,
"privacy": "unlisted",
"post-status": True,
},
)
request.user = self.local_user
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
- view(request, self.local_user.localname, 2020)
+ view(request, self.local_user.localname, self.year)
goal = models.AnnualGoal.objects.get()
self.assertEqual(goal.user, self.local_user)
self.assertEqual(goal.goal, 10)
- self.assertEqual(goal.year, 2020)
+ self.assertEqual(goal.year, self.year)
self.assertEqual(goal.privacy, "unlisted")
status = models.GeneratedNote.objects.get()
diff --git a/bookwyrm/tests/views/test_helpers.py b/bookwyrm/tests/views/test_helpers.py
index 874b913ec..b9a82e681 100644
--- a/bookwyrm/tests/views/test_helpers.py
+++ b/bookwyrm/tests/views/test_helpers.py
@@ -2,7 +2,6 @@
import json
from unittest.mock import patch
import pathlib
-from django.db.models import Q
from django.http import Http404
from django.test import TestCase
from django.test.client import RequestFactory
@@ -13,32 +12,37 @@ from bookwyrm.settings import USER_AGENT
@patch("bookwyrm.activitystreams.ActivityStream.add_status")
+@patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
+@patch("bookwyrm.suggested_users.rerank_user_task.delay")
class ViewsHelpers(TestCase):
"""viewing and creating statuses"""
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
- self.local_user = models.User.objects.create_user(
- "mouse@local.com",
- "mouse@mouse.com",
- "mouseword",
- local=True,
- discoverable=True,
- localname="mouse",
- remote_id="https://example.com/users/mouse",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ with patch("bookwyrm.suggested_users.rerank_user_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@local.com",
+ "mouse@mouse.com",
+ "mouseword",
+ local=True,
+ discoverable=True,
+ localname="mouse",
+ remote_id="https://example.com/users/mouse",
+ )
with patch("bookwyrm.models.user.set_remote_server.delay"):
- self.remote_user = models.User.objects.create_user(
- "rat",
- "rat@rat.com",
- "ratword",
- local=False,
- remote_id="https://example.com/users/rat",
- discoverable=True,
- inbox="https://example.com/users/rat/inbox",
- outbox="https://example.com/users/rat/outbox",
- )
+ with patch("bookwyrm.suggested_users.rerank_user_task.delay"):
+ self.remote_user = models.User.objects.create_user(
+ "rat",
+ "rat@rat.com",
+ "ratword",
+ local=False,
+ remote_id="https://example.com/users/rat",
+ discoverable=True,
+ inbox="https://example.com/users/rat/inbox",
+ outbox="https://example.com/users/rat/outbox",
+ )
self.work = models.Work.objects.create(title="Test Work")
self.book = models.Edition.objects.create(
title="Test Book",
@@ -53,12 +57,12 @@ class ViewsHelpers(TestCase):
name="Test Shelf", identifier="test-shelf", user=self.local_user
)
- def test_get_edition(self, _):
+ def test_get_edition(self, *_):
"""given an edition or a work, returns an edition"""
self.assertEqual(views.helpers.get_edition(self.book.id), self.book)
self.assertEqual(views.helpers.get_edition(self.work.id), self.book)
- def test_get_user_from_username(self, _):
+ def test_get_user_from_username(self, *_):
"""works for either localname or username"""
self.assertEqual(
views.helpers.get_user_from_username(self.local_user, "mouse"),
@@ -71,7 +75,7 @@ class ViewsHelpers(TestCase):
with self.assertRaises(Http404):
views.helpers.get_user_from_username(self.local_user, "mojfse@example.com")
- def test_is_api_request(self, _):
+ def test_is_api_request(self, *_):
"""should it return html or json"""
request = self.factory.get("/path")
request.headers = {"Accept": "application/json"}
@@ -85,12 +89,12 @@ class ViewsHelpers(TestCase):
request.headers = {"Accept": "Praise"}
self.assertFalse(views.helpers.is_api_request(request))
- def test_is_api_request_no_headers(self, _):
+ def test_is_api_request_no_headers(self, *_):
"""should it return html or json"""
request = self.factory.get("/path")
self.assertFalse(views.helpers.is_api_request(request))
- def test_is_bookwyrm_request(self, _):
+ def test_is_bookwyrm_request(self, *_):
"""checks if a request came from a bookwyrm instance"""
request = self.factory.get("", {"q": "Test Book"})
self.assertFalse(views.helpers.is_bookwyrm_request(request))
@@ -105,7 +109,7 @@ class ViewsHelpers(TestCase):
request = self.factory.get("", {"q": "Test Book"}, HTTP_USER_AGENT=USER_AGENT)
self.assertTrue(views.helpers.is_bookwyrm_request(request))
- def test_existing_user(self, _):
+ def test_existing_user(self, *_):
"""simple database lookup by username"""
result = views.helpers.handle_remote_webfinger("@mouse@local.com")
self.assertEqual(result, self.local_user)
@@ -117,7 +121,7 @@ class ViewsHelpers(TestCase):
self.assertEqual(result, self.local_user)
@responses.activate
- def test_load_user(self, _):
+ def test_load_user(self, *_):
"""find a remote user using webfinger"""
username = "mouse@example.com"
wellknown = {
@@ -147,7 +151,7 @@ class ViewsHelpers(TestCase):
self.assertIsInstance(result, models.User)
self.assertEqual(result.username, "mouse@example.com")
- def test_user_on_blocked_server(self, _):
+ def test_user_on_blocked_server(self, *_):
"""find a remote user using webfinger"""
models.FederatedServer.objects.create(
server_name="example.com", status="blocked"
@@ -156,7 +160,7 @@ class ViewsHelpers(TestCase):
result = views.helpers.handle_remote_webfinger("@mouse@example.com")
self.assertIsNone(result)
- def test_handle_reading_status_to_read(self, _):
+ def test_handle_reading_status_to_read(self, *_):
"""posts shelve activities"""
shelf = self.local_user.shelf_set.get(identifier="to-read")
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
@@ -168,7 +172,7 @@ class ViewsHelpers(TestCase):
self.assertEqual(status.mention_books.first(), self.book)
self.assertEqual(status.content, "wants to read")
- def test_handle_reading_status_reading(self, _):
+ def test_handle_reading_status_reading(self, *_):
"""posts shelve activities"""
shelf = self.local_user.shelf_set.get(identifier="reading")
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
@@ -180,7 +184,7 @@ class ViewsHelpers(TestCase):
self.assertEqual(status.mention_books.first(), self.book)
self.assertEqual(status.content, "started reading")
- def test_handle_reading_status_read(self, _):
+ def test_handle_reading_status_read(self, *_):
"""posts shelve activities"""
shelf = self.local_user.shelf_set.get(identifier="read")
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
@@ -192,102 +196,10 @@ class ViewsHelpers(TestCase):
self.assertEqual(status.mention_books.first(), self.book)
self.assertEqual(status.content, "finished reading")
- def test_handle_reading_status_other(self, _):
+ def test_handle_reading_status_other(self, *_):
"""posts shelve activities"""
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
views.helpers.handle_reading_status(
self.local_user, self.shelf, self.book, "public"
)
self.assertFalse(models.GeneratedNote.objects.exists())
-
- def test_get_annotated_users(self, _):
- """list of people you might know"""
- user_1 = models.User.objects.create_user(
- "nutria@local.com",
- "nutria@nutria.com",
- "nutriaword",
- local=True,
- localname="nutria",
- discoverable=True,
- )
- user_2 = models.User.objects.create_user(
- "fish@local.com",
- "fish@fish.com",
- "fishword",
- local=True,
- localname="fish",
- )
- with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
- # 1 shared follow
- self.local_user.following.add(user_2)
- user_1.followers.add(user_2)
-
- # 1 shared book
- models.ShelfBook.objects.create(
- user=self.local_user,
- book=self.book,
- shelf=self.local_user.shelf_set.first(),
- )
- models.ShelfBook.objects.create(
- user=user_1, book=self.book, shelf=user_1.shelf_set.first()
- )
-
- result = views.helpers.get_annotated_users(self.local_user)
- self.assertEqual(result.count(), 3)
- self.assertTrue(user_1 in result)
- self.assertFalse(user_2 in result)
- self.assertTrue(self.local_user in result)
- self.assertTrue(self.remote_user in result)
-
- user_1_annotated = result.get(id=user_1.id)
- self.assertEqual(user_1_annotated.mutuals, 1)
- self.assertEqual(user_1_annotated.shared_books, 1)
-
- remote_user_annotated = result.get(id=self.remote_user.id)
- self.assertEqual(remote_user_annotated.mutuals, 0)
- self.assertEqual(remote_user_annotated.shared_books, 0)
-
- def test_get_annotated_users_counts(self, _):
- """correct counting for multiple shared attributed"""
- user_1 = models.User.objects.create_user(
- "nutria@local.com",
- "nutria@nutria.com",
- "nutriaword",
- local=True,
- localname="nutria",
- discoverable=True,
- )
- for i in range(3):
- user = models.User.objects.create_user(
- "{:d}@local.com".format(i),
- "{:d}@nutria.com".format(i),
- "password",
- local=True,
- localname=i,
- )
- user.following.add(user_1)
- user.followers.add(self.local_user)
-
- with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
- for i in range(3):
- book = models.Edition.objects.create(
- title=i,
- parent_work=models.Work.objects.create(title=i),
- )
- models.ShelfBook.objects.create(
- user=self.local_user,
- book=book,
- shelf=self.local_user.shelf_set.first(),
- )
- models.ShelfBook.objects.create(
- user=user_1, book=book, shelf=user_1.shelf_set.first()
- )
-
- result = views.helpers.get_annotated_users(
- self.local_user,
- ~Q(id=self.local_user.id),
- ~Q(followers=self.local_user),
- )
- self.assertEqual(result.count(), 2)
- user_1_annotated = result.get(id=user_1.id)
- self.assertEqual(user_1_annotated.mutuals, 3)
diff --git a/bookwyrm/tests/views/test_import.py b/bookwyrm/tests/views/test_import.py
index 22694623a..13c0ef5d2 100644
--- a/bookwyrm/tests/views/test_import.py
+++ b/bookwyrm/tests/views/test_import.py
@@ -14,13 +14,14 @@ class ImportViews(TestCase):
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
- self.local_user = models.User.objects.create_user(
- "mouse@local.com",
- "mouse@mouse.mouse",
- "password",
- local=True,
- localname="mouse",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@local.com",
+ "mouse@mouse.mouse",
+ "password",
+ local=True,
+ localname="mouse",
+ )
models.SiteSettings.objects.create()
def test_import_page(self):
diff --git a/bookwyrm/tests/views/test_interaction.py b/bookwyrm/tests/views/test_interaction.py
index 3867f57d5..d83fc1190 100644
--- a/bookwyrm/tests/views/test_interaction.py
+++ b/bookwyrm/tests/views/test_interaction.py
@@ -15,14 +15,15 @@ class InteractionViews(TestCase):
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
- self.local_user = models.User.objects.create_user(
- "mouse@local.com",
- "mouse@mouse.com",
- "mouseword",
- local=True,
- localname="mouse",
- remote_id="https://example.com/users/mouse",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@local.com",
+ "mouse@mouse.com",
+ "mouseword",
+ local=True,
+ localname="mouse",
+ remote_id="https://example.com/users/mouse",
+ )
with patch("bookwyrm.models.user.set_remote_server"):
self.remote_user = models.User.objects.create_user(
"rat",
diff --git a/bookwyrm/tests/views/test_invite.py b/bookwyrm/tests/views/test_invite.py
index 7b5071b36..1eaf57c03 100644
--- a/bookwyrm/tests/views/test_invite.py
+++ b/bookwyrm/tests/views/test_invite.py
@@ -16,13 +16,14 @@ class InviteViews(TestCase):
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
- self.local_user = models.User.objects.create_user(
- "mouse@local.com",
- "mouse@mouse.mouse",
- "password",
- local=True,
- localname="mouse",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@local.com",
+ "mouse@mouse.mouse",
+ "password",
+ local=True,
+ localname="mouse",
+ )
models.SiteSettings.objects.create()
def test_invite_page(self):
diff --git a/bookwyrm/tests/views/test_isbn.py b/bookwyrm/tests/views/test_isbn.py
index 2aedd3cea..7c413e8bf 100644
--- a/bookwyrm/tests/views/test_isbn.py
+++ b/bookwyrm/tests/views/test_isbn.py
@@ -16,14 +16,15 @@ class IsbnViews(TestCase):
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
- self.local_user = models.User.objects.create_user(
- "mouse@local.com",
- "mouse@mouse.com",
- "mouseword",
- local=True,
- localname="mouse",
- remote_id="https://example.com/users/mouse",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@local.com",
+ "mouse@mouse.com",
+ "mouseword",
+ local=True,
+ localname="mouse",
+ remote_id="https://example.com/users/mouse",
+ )
self.work = models.Work.objects.create(title="Test Work")
self.book = models.Edition.objects.create(
title="Test Book",
diff --git a/bookwyrm/tests/views/test_landing.py b/bookwyrm/tests/views/test_landing.py
index 864e48f7f..4d1531e45 100644
--- a/bookwyrm/tests/views/test_landing.py
+++ b/bookwyrm/tests/views/test_landing.py
@@ -15,18 +15,20 @@ class LandingViews(TestCase):
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
- self.local_user = models.User.objects.create_user(
- "mouse@local.com",
- "mouse@mouse.mouse",
- "password",
- local=True,
- localname="mouse",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@local.com",
+ "mouse@mouse.mouse",
+ "password",
+ local=True,
+ localname="mouse",
+ )
self.anonymous_user = AnonymousUser
self.anonymous_user.is_authenticated = False
models.SiteSettings.objects.create()
- def test_home_page(self):
+ @patch("bookwyrm.suggested_users.SuggestedUsers.get_suggestions")
+ def test_home_page(self, _):
"""there are so many views, this just makes sure it LOADS"""
view = views.Home.as_view()
request = self.factory.get("")
diff --git a/bookwyrm/tests/views/test_list.py b/bookwyrm/tests/views/test_list.py
index 399892e3c..988d8d4ad 100644
--- a/bookwyrm/tests/views/test_list.py
+++ b/bookwyrm/tests/views/test_list.py
@@ -17,22 +17,23 @@ class ListViews(TestCase):
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
- self.local_user = models.User.objects.create_user(
- "mouse@local.com",
- "mouse@mouse.com",
- "mouseword",
- local=True,
- localname="mouse",
- remote_id="https://example.com/users/mouse",
- )
- self.rat = models.User.objects.create_user(
- "rat@local.com",
- "rat@rat.com",
- "ratword",
- local=True,
- localname="rat",
- remote_id="https://example.com/users/rat",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@local.com",
+ "mouse@mouse.com",
+ "mouseword",
+ local=True,
+ localname="mouse",
+ remote_id="https://example.com/users/mouse",
+ )
+ self.rat = models.User.objects.create_user(
+ "rat@local.com",
+ "rat@rat.com",
+ "ratword",
+ local=True,
+ localname="rat",
+ remote_id="https://example.com/users/rat",
+ )
work = models.Work.objects.create(title="Work")
self.book = models.Edition.objects.create(
title="Example Edition",
diff --git a/bookwyrm/tests/views/test_list_actions.py b/bookwyrm/tests/views/test_list_actions.py
index a59867822..2339427c6 100644
--- a/bookwyrm/tests/views/test_list_actions.py
+++ b/bookwyrm/tests/views/test_list_actions.py
@@ -15,22 +15,23 @@ class ListActionViews(TestCase):
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
- self.local_user = models.User.objects.create_user(
- "mouse@local.com",
- "mouse@mouse.com",
- "mouseword",
- local=True,
- localname="mouse",
- remote_id="https://example.com/users/mouse",
- )
- self.rat = models.User.objects.create_user(
- "rat@local.com",
- "rat@rat.com",
- "ratword",
- local=True,
- localname="rat",
- remote_id="https://example.com/users/rat",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@local.com",
+ "mouse@mouse.com",
+ "mouseword",
+ local=True,
+ localname="mouse",
+ remote_id="https://example.com/users/mouse",
+ )
+ self.rat = models.User.objects.create_user(
+ "rat@local.com",
+ "rat@rat.com",
+ "ratword",
+ local=True,
+ localname="rat",
+ remote_id="https://example.com/users/rat",
+ )
work = models.Work.objects.create(title="Work")
self.book = models.Edition.objects.create(
diff --git a/bookwyrm/tests/views/test_notifications.py b/bookwyrm/tests/views/test_notifications.py
index 182753f91..af6aac13e 100644
--- a/bookwyrm/tests/views/test_notifications.py
+++ b/bookwyrm/tests/views/test_notifications.py
@@ -1,4 +1,5 @@
""" 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
@@ -13,13 +14,14 @@ class NotificationViews(TestCase):
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
- self.local_user = models.User.objects.create_user(
- "mouse@local.com",
- "mouse@mouse.mouse",
- "password",
- local=True,
- localname="mouse",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@local.com",
+ "mouse@mouse.mouse",
+ "password",
+ local=True,
+ localname="mouse",
+ )
models.SiteSettings.objects.create()
def test_notifications_page(self):
diff --git a/bookwyrm/tests/views/test_outbox.py b/bookwyrm/tests/views/test_outbox.py
index f89258e5f..fe493bb87 100644
--- a/bookwyrm/tests/views/test_outbox.py
+++ b/bookwyrm/tests/views/test_outbox.py
@@ -18,14 +18,15 @@ class OutboxView(TestCase):
def setUp(self):
"""we'll need some data"""
self.factory = RequestFactory()
- self.local_user = models.User.objects.create_user(
- "mouse@local.com",
- "mouse@mouse.com",
- "mouseword",
- local=True,
- localname="mouse",
- remote_id="https://example.com/users/mouse",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@local.com",
+ "mouse@mouse.com",
+ "mouseword",
+ local=True,
+ localname="mouse",
+ remote_id="https://example.com/users/mouse",
+ )
work = models.Work.objects.create(title="Test Work")
self.book = models.Edition.objects.create(
title="Example Edition",
diff --git a/bookwyrm/tests/views/test_password.py b/bookwyrm/tests/views/test_password.py
index ec686db74..5f59e9e32 100644
--- a/bookwyrm/tests/views/test_password.py
+++ b/bookwyrm/tests/views/test_password.py
@@ -15,13 +15,14 @@ class PasswordViews(TestCase):
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
- self.local_user = models.User.objects.create_user(
- "mouse@local.com",
- "mouse@mouse.com",
- "password",
- local=True,
- localname="mouse",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@local.com",
+ "mouse@mouse.com",
+ "password",
+ local=True,
+ localname="mouse",
+ )
self.anonymous_user = AnonymousUser
self.anonymous_user.is_authenticated = False
models.SiteSettings.objects.create(id=1)
diff --git a/bookwyrm/tests/views/test_reading.py b/bookwyrm/tests/views/test_reading.py
index 00bd62c73..bebd9f5a9 100644
--- a/bookwyrm/tests/views/test_reading.py
+++ b/bookwyrm/tests/views/test_reading.py
@@ -9,20 +9,22 @@ from bookwyrm import models, views
@patch("bookwyrm.activitystreams.ActivityStream.add_status")
+@patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
class ReadingViews(TestCase):
"""viewing and creating statuses"""
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
- self.local_user = models.User.objects.create_user(
- "mouse@local.com",
- "mouse@mouse.com",
- "mouseword",
- local=True,
- localname="mouse",
- remote_id="https://example.com/users/mouse",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@local.com",
+ "mouse@mouse.com",
+ "mouseword",
+ local=True,
+ localname="mouse",
+ remote_id="https://example.com/users/mouse",
+ )
with patch("bookwyrm.models.user.set_remote_server.delay"):
self.remote_user = models.User.objects.create_user(
"rat",
@@ -40,7 +42,7 @@ class ReadingViews(TestCase):
parent_work=self.work,
)
- def test_start_reading(self, _):
+ def test_start_reading(self, *_):
"""begin a book"""
shelf = self.local_user.shelf_set.get(identifier=models.Shelf.READING)
self.assertFalse(shelf.books.exists())
@@ -71,7 +73,7 @@ class ReadingViews(TestCase):
self.assertEqual(readthrough.user, self.local_user)
self.assertEqual(readthrough.book, self.book)
- def test_start_reading_reshelf(self, _):
+ def test_start_reading_reshelf(self, *_):
"""begin a book"""
to_read_shelf = self.local_user.shelf_set.get(identifier=models.Shelf.TO_READ)
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
@@ -91,7 +93,7 @@ class ReadingViews(TestCase):
self.assertFalse(to_read_shelf.books.exists())
self.assertEqual(shelf.books.get(), self.book)
- def test_finish_reading(self, _):
+ def test_finish_reading(self, *_):
"""begin a book"""
shelf = self.local_user.shelf_set.get(identifier=models.Shelf.READ_FINISHED)
self.assertFalse(shelf.books.exists())
@@ -127,7 +129,7 @@ class ReadingViews(TestCase):
self.assertEqual(readthrough.user, self.local_user)
self.assertEqual(readthrough.book, self.book)
- def test_edit_readthrough(self, _):
+ def test_edit_readthrough(self, *_):
"""adding dates to an ongoing readthrough"""
start = timezone.make_aware(dateutil.parser.parse("2021-01-03"))
readthrough = models.ReadThrough.objects.create(
@@ -154,7 +156,7 @@ class ReadingViews(TestCase):
self.assertEqual(readthrough.finish_date.day, 7)
self.assertEqual(readthrough.book, self.book)
- def test_delete_readthrough(self, _):
+ def test_delete_readthrough(self, *_):
"""remove a readthrough"""
readthrough = models.ReadThrough.objects.create(
book=self.book, user=self.local_user
@@ -171,7 +173,7 @@ class ReadingViews(TestCase):
views.delete_readthrough(request)
self.assertFalse(models.ReadThrough.objects.filter(id=readthrough.id).exists())
- def test_create_readthrough(self, _):
+ def test_create_readthrough(self, *_):
"""adding new read dates"""
request = self.factory.post(
"",
diff --git a/bookwyrm/tests/views/test_readthrough.py b/bookwyrm/tests/views/test_readthrough.py
index 764490d89..618d9cf87 100644
--- a/bookwyrm/tests/views/test_readthrough.py
+++ b/bookwyrm/tests/views/test_readthrough.py
@@ -7,6 +7,7 @@ from django.utils import timezone
from bookwyrm import models
+@patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
@patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay")
class ReadThrough(TestCase):
"""readthrough tests"""
@@ -21,14 +22,15 @@ class ReadThrough(TestCase):
title="Example Edition", parent_work=self.work
)
- self.user = models.User.objects.create_user(
- "cinco", "cinco@example.com", "seissiete", local=True, localname="cinco"
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.user = models.User.objects.create_user(
+ "cinco", "cinco@example.com", "seissiete", local=True, localname="cinco"
+ )
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
self.client.force_login(self.user)
- def test_create_basic_readthrough(self, delay_mock):
+ def test_create_basic_readthrough(self, delay_mock, _):
"""A basic readthrough doesn't create a progress update"""
self.assertEqual(self.edition.readthrough_set.count(), 0)
@@ -49,7 +51,7 @@ class ReadThrough(TestCase):
self.assertEqual(readthroughs[0].finish_date, None)
self.assertEqual(delay_mock.call_count, 1)
- def test_create_progress_readthrough(self, delay_mock):
+ def test_create_progress_readthrough(self, delay_mock, _):
"""a readthrough with progress"""
self.assertEqual(self.edition.readthrough_set.count(), 0)
diff --git a/bookwyrm/tests/views/test_reports.py b/bookwyrm/tests/views/test_reports.py
index 84539489d..7d39a0076 100644
--- a/bookwyrm/tests/views/test_reports.py
+++ b/bookwyrm/tests/views/test_reports.py
@@ -1,4 +1,5 @@
""" 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
@@ -12,20 +13,21 @@ class ReportViews(TestCase):
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
- self.local_user = models.User.objects.create_user(
- "mouse@local.com",
- "mouse@mouse.mouse",
- "password",
- local=True,
- localname="mouse",
- )
- self.rat = models.User.objects.create_user(
- "rat@local.com",
- "rat@mouse.mouse",
- "password",
- local=True,
- localname="rat",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@local.com",
+ "mouse@mouse.mouse",
+ "password",
+ local=True,
+ localname="mouse",
+ )
+ self.rat = models.User.objects.create_user(
+ "rat@local.com",
+ "rat@mouse.mouse",
+ "password",
+ local=True,
+ localname="rat",
+ )
models.SiteSettings.objects.create()
def test_reports_page(self):
@@ -114,7 +116,9 @@ class ReportViews(TestCase):
report.refresh_from_db()
self.assertFalse(report.resolved)
- def test_suspend_user(self):
+ @patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
+ @patch("bookwyrm.suggested_users.remove_user_task.delay")
+ def test_suspend_user(self, *_):
"""toggle whether a user is able to log in"""
self.assertTrue(self.rat.is_active)
request = self.factory.post("")
diff --git a/bookwyrm/tests/views/test_rss_feed.py b/bookwyrm/tests/views/test_rss_feed.py
index eacb3c936..3608b043a 100644
--- a/bookwyrm/tests/views/test_rss_feed.py
+++ b/bookwyrm/tests/views/test_rss_feed.py
@@ -14,9 +14,10 @@ class RssFeedView(TestCase):
"""test data"""
self.site = models.SiteSettings.objects.create()
- self.user = models.User.objects.create_user(
- "rss_user", "rss@test.rss", "password", local=True
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.user = models.User.objects.create_user(
+ "rss_user", "rss@test.rss", "password", local=True
+ )
work = models.Work.objects.create(title="Test Work")
self.book = models.Edition.objects.create(
diff --git a/bookwyrm/tests/views/test_search.py b/bookwyrm/tests/views/test_search.py
index ab2c910d4..3da6f866b 100644
--- a/bookwyrm/tests/views/test_search.py
+++ b/bookwyrm/tests/views/test_search.py
@@ -19,14 +19,15 @@ class Views(TestCase):
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
- self.local_user = models.User.objects.create_user(
- "mouse@local.com",
- "mouse@mouse.com",
- "mouseword",
- local=True,
- localname="mouse",
- remote_id="https://example.com/users/mouse",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@local.com",
+ "mouse@mouse.com",
+ "mouseword",
+ local=True,
+ localname="mouse",
+ remote_id="https://example.com/users/mouse",
+ )
self.work = models.Work.objects.create(title="Test Work")
self.book = models.Edition.objects.create(
title="Test Book",
diff --git a/bookwyrm/tests/views/test_shelf.py b/bookwyrm/tests/views/test_shelf.py
index 239b3318f..44c4b9cb5 100644
--- a/bookwyrm/tests/views/test_shelf.py
+++ b/bookwyrm/tests/views/test_shelf.py
@@ -10,20 +10,22 @@ from bookwyrm.activitypub import ActivitypubResponse
@patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay")
+@patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
class ShelfViews(TestCase):
"""tag views"""
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
- self.local_user = models.User.objects.create_user(
- "mouse@local.com",
- "mouse@mouse.com",
- "mouseword",
- local=True,
- localname="mouse",
- remote_id="https://example.com/users/mouse",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@local.com",
+ "mouse@mouse.com",
+ "mouseword",
+ local=True,
+ localname="mouse",
+ remote_id="https://example.com/users/mouse",
+ )
self.work = models.Work.objects.create(title="Test Work")
self.book = models.Edition.objects.create(
title="Example Edition",
@@ -36,7 +38,7 @@ class ShelfViews(TestCase):
)
models.SiteSettings.objects.create()
- def test_shelf_page(self, _):
+ def test_shelf_page(self, *_):
"""there are so many views, this just makes sure it LOADS"""
view = views.Shelf.as_view()
shelf = self.local_user.shelf_set.first()
@@ -63,7 +65,7 @@ class ShelfViews(TestCase):
self.assertIsInstance(result, ActivitypubResponse)
self.assertEqual(result.status_code, 200)
- def test_edit_shelf_privacy(self, _):
+ def test_edit_shelf_privacy(self, *_):
"""set name or privacy on shelf"""
view = views.Shelf.as_view()
shelf = self.local_user.shelf_set.get(identifier="to-read")
@@ -83,7 +85,7 @@ class ShelfViews(TestCase):
self.assertEqual(shelf.privacy, "unlisted")
- def test_edit_shelf_name(self, _):
+ def test_edit_shelf_name(self, *_):
"""change the name of an editable shelf"""
view = views.Shelf.as_view()
shelf = models.Shelf.objects.create(name="Test Shelf", user=self.local_user)
@@ -100,7 +102,7 @@ class ShelfViews(TestCase):
self.assertEqual(shelf.name, "cool name")
self.assertEqual(shelf.identifier, "testshelf-%d" % shelf.id)
- def test_edit_shelf_name_not_editable(self, _):
+ def test_edit_shelf_name_not_editable(self, *_):
"""can't change the name of an non-editable shelf"""
view = views.Shelf.as_view()
shelf = self.local_user.shelf_set.get(identifier="to-read")
@@ -115,7 +117,7 @@ class ShelfViews(TestCase):
self.assertEqual(shelf.name, "To Read")
- def test_handle_shelve(self, _):
+ def test_handle_shelve(self, *_):
"""shelve a book"""
request = self.factory.post(
"", {"book": self.book.id, "shelf": self.shelf.identifier}
@@ -133,7 +135,7 @@ class ShelfViews(TestCase):
# make sure the book is on the shelf
self.assertEqual(self.shelf.books.get(), self.book)
- def test_handle_shelve_to_read(self, _):
+ def test_handle_shelve_to_read(self, *_):
"""special behavior for the to-read shelf"""
shelf = models.Shelf.objects.get(identifier="to-read")
request = self.factory.post(
@@ -146,7 +148,7 @@ class ShelfViews(TestCase):
# make sure the book is on the shelf
self.assertEqual(shelf.books.get(), self.book)
- def test_handle_shelve_reading(self, _):
+ def test_handle_shelve_reading(self, *_):
"""special behavior for the reading shelf"""
shelf = models.Shelf.objects.get(identifier="reading")
request = self.factory.post(
@@ -159,7 +161,7 @@ class ShelfViews(TestCase):
# make sure the book is on the shelf
self.assertEqual(shelf.books.get(), self.book)
- def test_handle_shelve_read(self, _):
+ def test_handle_shelve_read(self, *_):
"""special behavior for the read shelf"""
shelf = models.Shelf.objects.get(identifier="read")
request = self.factory.post(
@@ -172,7 +174,7 @@ class ShelfViews(TestCase):
# make sure the book is on the shelf
self.assertEqual(shelf.books.get(), self.book)
- def test_handle_unshelve(self, _):
+ def test_handle_unshelve(self, *_):
"""remove a book from a shelf"""
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
models.ShelfBook.objects.create(
diff --git a/bookwyrm/tests/views/test_status.py b/bookwyrm/tests/views/test_status.py
index a20e98b92..d4edee0b3 100644
--- a/bookwyrm/tests/views/test_status.py
+++ b/bookwyrm/tests/views/test_status.py
@@ -9,6 +9,7 @@ from bookwyrm.settings import DOMAIN
# pylint: disable=invalid-name
+@patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
@patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay")
class StatusViews(TestCase):
"""viewing and creating statuses"""
@@ -16,14 +17,15 @@ class StatusViews(TestCase):
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
- self.local_user = models.User.objects.create_user(
- "mouse@local.com",
- "mouse@mouse.com",
- "mouseword",
- local=True,
- localname="mouse",
- remote_id="https://example.com/users/mouse",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@local.com",
+ "mouse@mouse.com",
+ "mouseword",
+ local=True,
+ localname="mouse",
+ remote_id="https://example.com/users/mouse",
+ )
with patch("bookwyrm.models.user.set_remote_server"):
self.remote_user = models.User.objects.create_user(
"rat",
@@ -43,7 +45,7 @@ class StatusViews(TestCase):
)
models.SiteSettings.objects.create()
- def test_handle_status(self, _):
+ def test_handle_status(self, *_):
"""create a status"""
view = views.CreateStatus.as_view()
form = forms.CommentForm(
@@ -66,7 +68,7 @@ class StatusViews(TestCase):
self.assertEqual(status.user, self.local_user)
self.assertEqual(status.book, self.book)
- def test_handle_status_reply(self, _):
+ def test_handle_status_reply(self, *_):
"""create a status in reply to an existing status"""
view = views.CreateStatus.as_view()
user = models.User.objects.create_user(
@@ -96,7 +98,7 @@ class StatusViews(TestCase):
self.assertEqual(status.user, user)
self.assertEqual(models.Notification.objects.get().user, self.local_user)
- def test_handle_status_mentions(self, _):
+ def test_handle_status_mentions(self, *_):
"""@mention a user in a post"""
view = views.CreateStatus.as_view()
user = models.User.objects.create_user(
@@ -128,7 +130,7 @@ class StatusViews(TestCase):
status.content, '
hi @rat
' % user.remote_id
)
- def test_handle_status_reply_with_mentions(self, _):
+ def test_handle_status_reply_with_mentions(self, *_):
"""reply to a post with an @mention'ed user"""
view = views.CreateStatus.as_view()
user = models.User.objects.create_user(
@@ -172,7 +174,7 @@ class StatusViews(TestCase):
self.assertFalse(self.remote_user in reply.mention_users.all())
self.assertTrue(self.local_user in reply.mention_users.all())
- def test_delete_and_redraft(self, _):
+ def test_delete_and_redraft(self, *_):
"""delete and re-draft a status"""
view = views.DeleteAndRedraft.as_view()
request = self.factory.post("")
@@ -193,7 +195,7 @@ class StatusViews(TestCase):
status.refresh_from_db()
self.assertTrue(status.deleted)
- def test_delete_and_redraft_invalid_status_type_rating(self, _):
+ def test_delete_and_redraft_invalid_status_type_rating(self, *_):
"""you can't redraft generated statuses"""
view = views.DeleteAndRedraft.as_view()
request = self.factory.post("")
@@ -213,7 +215,7 @@ class StatusViews(TestCase):
status.refresh_from_db()
self.assertFalse(status.deleted)
- def test_delete_and_redraft_invalid_status_type_generated_note(self, _):
+ def test_delete_and_redraft_invalid_status_type_generated_note(self, *_):
"""you can't redraft generated statuses"""
view = views.DeleteAndRedraft.as_view()
request = self.factory.post("")
@@ -233,7 +235,7 @@ class StatusViews(TestCase):
status.refresh_from_db()
self.assertFalse(status.deleted)
- def test_find_mentions(self, _):
+ def test_find_mentions(self, *_):
"""detect and look up @ mentions of users"""
user = models.User.objects.create_user(
"nutria@%s" % DOMAIN,
@@ -279,7 +281,7 @@ class StatusViews(TestCase):
("@nutria@%s" % DOMAIN, user),
)
- def test_format_links(self, _):
+ def test_format_links(self, *_):
"""find and format urls into a tags"""
url = "http://www.fish.com/"
self.assertEqual(
@@ -302,7 +304,7 @@ class StatusViews(TestCase):
"?q=arkady+strugatsky&mode=everything" % url,
)
- def test_to_markdown(self, _):
+ def test_to_markdown(self, *_):
"""this is mostly handled in other places, but nonetheless"""
text = "_hi_ and http://fish.com is
"
result = views.status.to_markdown(text)
@@ -311,7 +313,7 @@ class StatusViews(TestCase):
'
hi and fish.com ' "is rad
",
)
- def test_to_markdown_detect_url(self, _):
+ def test_to_markdown_detect_url(self, *_):
"""this is mostly handled in other places, but nonetheless"""
text = "http://fish.com/@hello#okay"
result = views.status.to_markdown(text)
@@ -320,13 +322,13 @@ class StatusViews(TestCase):
'
fish.com/@hello#okay
',
)
- def test_to_markdown_link(self, _):
+ def test_to_markdown_link(self, *_):
"""this is mostly handled in other places, but nonetheless"""
text = "[hi](http://fish.com) is
"
result = views.status.to_markdown(text)
self.assertEqual(result, '
hi ' "is rad
")
- def test_handle_delete_status(self, mock):
+ def test_handle_delete_status(self, mock, *_):
"""marks a status as deleted"""
view = views.DeleteStatus.as_view()
with patch("bookwyrm.activitystreams.ActivityStream.add_status"):
@@ -346,7 +348,7 @@ class StatusViews(TestCase):
status.refresh_from_db()
self.assertTrue(status.deleted)
- def test_handle_delete_status_permission_denied(self, _):
+ def test_handle_delete_status_permission_denied(self, *_):
"""marks a status as deleted"""
view = views.DeleteStatus.as_view()
with patch("bookwyrm.activitystreams.ActivityStream.add_status"):
@@ -360,7 +362,7 @@ class StatusViews(TestCase):
status.refresh_from_db()
self.assertFalse(status.deleted)
- def test_handle_delete_status_moderator(self, mock):
+ def test_handle_delete_status_moderator(self, mock, _):
"""marks a status as deleted"""
view = views.DeleteStatus.as_view()
with patch("bookwyrm.activitystreams.ActivityStream.add_status"):
diff --git a/bookwyrm/tests/views/test_updates.py b/bookwyrm/tests/views/test_updates.py
index fb003f8de..627b756e7 100644
--- a/bookwyrm/tests/views/test_updates.py
+++ b/bookwyrm/tests/views/test_updates.py
@@ -15,13 +15,14 @@ class UpdateViews(TestCase):
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
- self.local_user = models.User.objects.create_user(
- "mouse@local.com",
- "mouse@mouse.mouse",
- "password",
- local=True,
- localname="mouse",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@local.com",
+ "mouse@mouse.mouse",
+ "password",
+ local=True,
+ localname="mouse",
+ )
models.SiteSettings.objects.create()
def test_get_notification_count(self):
diff --git a/bookwyrm/tests/views/test_user.py b/bookwyrm/tests/views/test_user.py
index 478d2e8f4..740f0d299 100644
--- a/bookwyrm/tests/views/test_user.py
+++ b/bookwyrm/tests/views/test_user.py
@@ -17,23 +17,27 @@ class UserViews(TestCase):
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
- self.local_user = models.User.objects.create_user(
- "mouse@local.com",
- "mouse@mouse.mouse",
- "password",
- local=True,
- localname="mouse",
- )
- self.rat = models.User.objects.create_user(
- "rat@local.com", "rat@rat.rat", "password", local=True, localname="rat"
- )
- self.book = models.Edition.objects.create(title="test")
- with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
- models.ShelfBook.objects.create(
- book=self.book,
- user=self.local_user,
- shelf=self.local_user.shelf_set.first(),
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@local.com",
+ "mouse@mouse.mouse",
+ "password",
+ local=True,
+ localname="mouse",
)
+ self.rat = models.User.objects.create_user(
+ "rat@local.com", "rat@rat.rat", "password", local=True, localname="rat"
+ )
+ self.book = models.Edition.objects.create(
+ title="test", parent_work=models.Work.objects.create(title="test work")
+ )
+ with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ models.ShelfBook.objects.create(
+ book=self.book,
+ user=self.local_user,
+ shelf=self.local_user.shelf_set.first(),
+ )
models.SiteSettings.objects.create()
self.anonymous_user = AnonymousUser
@@ -94,7 +98,8 @@ class UserViews(TestCase):
self.assertIsInstance(result, ActivitypubResponse)
self.assertEqual(result.status_code, 200)
- def test_followers_page_blocked(self):
+ @patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
+ def test_followers_page_blocked(self, _):
"""there are so many views, this just makes sure it LOADS"""
view = views.Followers.as_view()
request = self.factory.get("")
diff --git a/bookwyrm/tests/views/test_user_admin.py b/bookwyrm/tests/views/test_user_admin.py
index a044a22c5..86309045d 100644
--- a/bookwyrm/tests/views/test_user_admin.py
+++ b/bookwyrm/tests/views/test_user_admin.py
@@ -14,13 +14,14 @@ class UserAdminViews(TestCase):
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
- self.local_user = models.User.objects.create_user(
- "mouse@local.com",
- "mouse@mouse.mouse",
- "password",
- local=True,
- localname="mouse",
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@local.com",
+ "mouse@mouse.mouse",
+ "password",
+ local=True,
+ localname="mouse",
+ )
models.SiteSettings.objects.create()
def test_user_admin_list_page(self):
@@ -47,7 +48,9 @@ class UserAdminViews(TestCase):
result.render()
self.assertEqual(result.status_code, 200)
- def test_user_admin_page_post(self):
+ @patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
+ @patch("bookwyrm.suggested_users.remove_user_task.delay")
+ def test_user_admin_page_post(self, *_):
"""set the user's group"""
group = Group.objects.create(name="editor")
self.assertEqual(
diff --git a/bookwyrm/tests/views/test_wellknown.py b/bookwyrm/tests/views/test_wellknown.py
index 244921d47..4a3eb579f 100644
--- a/bookwyrm/tests/views/test_wellknown.py
+++ b/bookwyrm/tests/views/test_wellknown.py
@@ -16,16 +16,17 @@ class UserViews(TestCase):
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
- self.local_user = models.User.objects.create_user(
- "mouse@local.com",
- "mouse@mouse.mouse",
- "password",
- local=True,
- localname="mouse",
- )
- models.User.objects.create_user(
- "rat@local.com", "rat@rat.rat", "password", local=True, localname="rat"
- )
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@local.com",
+ "mouse@mouse.mouse",
+ "password",
+ local=True,
+ localname="mouse",
+ )
+ models.User.objects.create_user(
+ "rat@local.com", "rat@rat.rat", "password", local=True, localname="rat"
+ )
with patch("bookwyrm.models.user.set_remote_server.delay"):
models.User.objects.create_user(
"rat",
diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py
index 7eccfd651..d3e2dad1a 100644
--- a/bookwyrm/urls.py
+++ b/bookwyrm/urls.py
@@ -23,6 +23,8 @@ STATUS_PATH = r"%s/(%s)/(?P
\d+)" % (USER_PATH, "|".join(status_types)
BOOK_PATH = r"^book/(?P\d+)"
+STREAMS = "|".join(s["key"] for s in settings.STREAMS)
+
urlpatterns = [
path("admin/", admin.site.urls),
path(
@@ -177,7 +179,7 @@ urlpatterns = [
name="get-started-users",
),
# feeds
- re_path(r"^(?Phome|local|federated)/?$", views.Feed.as_view()),
+ re_path(r"^(?P{:s})/?$".format(STREAMS), views.Feed.as_view()),
re_path(
r"^direct-messages/?$", views.DirectMessage.as_view(), name="direct-messages"
),
diff --git a/bookwyrm/views/authentication.py b/bookwyrm/views/authentication.py
index bfb492480..003e94b09 100644
--- a/bookwyrm/views/authentication.py
+++ b/bookwyrm/views/authentication.py
@@ -50,7 +50,7 @@ class Login(View):
# successful login
login(request, user)
user.last_active_date = timezone.now()
- user.save(broadcast=False)
+ user.save(broadcast=False, update_fields=["last_active_date"])
return redirect(request.GET.get("next", "/"))
# login errors
diff --git a/bookwyrm/views/books.py b/bookwyrm/views/books.py
index 492d0cac4..d56e2f22c 100644
--- a/bookwyrm/views/books.py
+++ b/bookwyrm/views/books.py
@@ -339,18 +339,15 @@ def set_cover_from_url(url):
@permission_required("bookwyrm.edit_book", raise_exception=True)
def add_description(request, book_id):
"""upload a new cover"""
- if not request.method == "POST":
- return redirect("/")
-
book = get_object_or_404(models.Edition, id=book_id)
description = request.POST.get("description")
book.description = description
book.last_edited_by = request.user
- book.save()
+ book.save(update_fields=["description", "last_edited_by"])
- return redirect("/book/%s" % book.id)
+ return redirect("book", book.id)
@require_POST
@@ -360,7 +357,7 @@ def resolve_book(request):
connector = connector_manager.get_or_create_connector(remote_id)
book = connector.get_or_create_book(remote_id)
- return redirect("/book/%d" % book.id)
+ return redirect("book", book.id)
@login_required
diff --git a/bookwyrm/views/directory.py b/bookwyrm/views/directory.py
index b3fdc76a9..8d893047a 100644
--- a/bookwyrm/views/directory.py
+++ b/bookwyrm/views/directory.py
@@ -6,7 +6,7 @@ from django.template.response import TemplateResponse
from django.views import View
from django.utils.decorators import method_decorator
-from .helpers import get_annotated_users
+from bookwyrm import suggested_users
# pylint: disable=no-self-use
@method_decorator(login_required, name="dispatch")
@@ -23,12 +23,12 @@ class Directory(View):
if scope == "local":
filters["local"] = True
- users = get_annotated_users(request.user, **filters)
+ users = suggested_users.get_annotated_users(request.user, **filters)
sort = request.GET.get("sort")
if sort == "recent":
users = users.order_by("-last_active_date")
else:
- users = users.order_by("-mutuals", "-shared_books", "-last_active_date")
+ users = users.order_by("-mutuals", "-last_active_date")
paginated = Paginator(users, 12)
diff --git a/bookwyrm/views/feed.py b/bookwyrm/views/feed.py
index 9a85dbb16..7a46ca57d 100644
--- a/bookwyrm/views/feed.py
+++ b/bookwyrm/views/feed.py
@@ -11,7 +11,8 @@ from django.views import View
from bookwyrm import activitystreams, forms, models
from bookwyrm.activitypub import ActivitypubResponse
from bookwyrm.settings import PAGE_LENGTH, STREAMS
-from .helpers import get_user_from_username, privacy_filter, get_suggested_users
+from bookwyrm.suggested_users import suggested_users
+from .helpers import get_user_from_username, privacy_filter
from .helpers import is_api_request, is_bookwyrm_request
@@ -22,23 +23,26 @@ class Feed(View):
def get(self, request, tab):
"""user's homepage with activity feed"""
- if not tab in STREAMS:
- tab = "home"
+ tab = [s for s in STREAMS if s["key"] == tab]
+ tab = tab[0] if tab else STREAMS[0]
- activities = activitystreams.streams[tab].get_activity_stream(request.user)
+ activities = activitystreams.streams[tab["key"]].get_activity_stream(
+ request.user
+ )
paginated = Paginator(activities, PAGE_LENGTH)
- suggested_users = get_suggested_users(request.user)
+ suggestions = suggested_users.get_suggestions(request.user)
data = {
**feed_page_data(request.user),
**{
"user": request.user,
"activities": paginated.get_page(request.GET.get("page")),
- "suggested_users": suggested_users,
+ "suggested_users": suggestions,
"tab": tab,
+ "streams": STREAMS,
"goal_form": forms.GoalForm(),
- "path": "/%s" % tab,
+ "path": "/%s" % tab["key"],
},
}
return TemplateResponse(request, "feed/feed.html", data)
diff --git a/bookwyrm/views/get_started.py b/bookwyrm/views/get_started.py
index 7f6151728..3de88e104 100644
--- a/bookwyrm/views/get_started.py
+++ b/bookwyrm/views/get_started.py
@@ -13,7 +13,7 @@ from django.views import View
from bookwyrm import forms, models
from bookwyrm.connectors import connector_manager
-from .helpers import get_suggested_users
+from bookwyrm.suggested_users import suggested_users
from .edit_user import save_user_form
@@ -118,11 +118,12 @@ class GetStartedUsers(View):
)
.order_by("-similarity")[:5]
)
+ data = {"no_results": not user_results}
if user_results.count() < 5:
- user_results = list(user_results) + list(get_suggested_users(request.user))
+ user_results = list(user_results) + suggested_users.get_suggestions(
+ request.user
+ )
- data = {
- "suggested_users": user_results,
- }
+ data["suggested_users"] = user_results
return TemplateResponse(request, "get_started/users.html", data)
diff --git a/bookwyrm/views/goal.py b/bookwyrm/views/goal.py
index 84091fe35..122245179 100644
--- a/bookwyrm/views/goal.py
+++ b/bookwyrm/views/goal.py
@@ -4,6 +4,7 @@ from django.http import HttpResponseNotFound
from django.shortcuts import redirect
from django.template.loader import get_template
from django.template.response import TemplateResponse
+from django.utils import timezone
from django.utils.decorators import method_decorator
from django.views import View
from django.views.decorators.http import require_POST
@@ -26,6 +27,10 @@ class Goal(View):
if not goal and user != request.user:
return HttpResponseNotFound()
+ current_year = timezone.now().year
+ if not goal and year != timezone.now().year:
+ return redirect("user-goal", username, current_year)
+
if goal and not goal.visible_to_user(request.user):
return HttpResponseNotFound()
diff --git a/bookwyrm/views/helpers.py b/bookwyrm/views/helpers.py
index 452d81b9c..42aa48f0e 100644
--- a/bookwyrm/views/helpers.py
+++ b/bookwyrm/views/helpers.py
@@ -2,7 +2,7 @@
import re
from requests import HTTPError
from django.core.exceptions import FieldError
-from django.db.models import Count, Max, Q
+from django.db.models import Max, Q
from django.http import Http404
from bookwyrm import activitypub, models
@@ -177,47 +177,3 @@ def get_discover_books():
.order_by("-review__published_date__max")[:6]
)
)
-
-
-def get_suggested_users(user):
- """bookwyrm users you don't already know"""
- return (
- get_annotated_users(
- user,
- ~Q(id=user.id),
- ~Q(followers=user),
- ~Q(follower_requests=user),
- bookwyrm_user=True,
- )
- .order_by("-mutuals", "-last_active_date")
- .all()[:5]
- )
-
-
-def get_annotated_users(user, *args, **kwargs):
- """Users, annotated with things they have in common"""
- return (
- models.User.objects.filter(discoverable=True, is_active=True, *args, **kwargs)
- .exclude(Q(id__in=user.blocks.all()) | Q(blocks=user))
- .annotate(
- mutuals=Count(
- "followers",
- filter=Q(
- ~Q(id=user.id),
- ~Q(id__in=user.following.all()),
- followers__in=user.following.all(),
- ),
- distinct=True,
- ),
- shared_books=Count(
- "shelfbook",
- filter=Q(
- ~Q(id=user.id),
- shelfbook__book__parent_work__in=[
- s.book.parent_work for s in user.shelfbook_set.all()
- ],
- ),
- distinct=True,
- ),
- )
- )
diff --git a/bookwyrm/views/password.py b/bookwyrm/views/password.py
index 91a379f31..18fcb02cd 100644
--- a/bookwyrm/views/password.py
+++ b/bookwyrm/views/password.py
@@ -76,7 +76,7 @@ class PasswordReset(View):
return TemplateResponse(request, "password_reset.html", data)
user.set_password(new_password)
- user.save(broadcast=False)
+ user.save(broadcast=False, update_fields=["password"])
login(request, user)
reset_code.delete()
return redirect("/")
@@ -100,6 +100,6 @@ class ChangePassword(View):
return redirect("preferences/password")
request.user.set_password(new_password)
- request.user.save(broadcast=False)
+ request.user.save(broadcast=False, update_fields=["password"])
login(request, request.user)
return redirect(request.user.local_path)
diff --git a/bw-dev b/bw-dev
index f607acfd3..e937c1833 100755
--- a/bw-dev
+++ b/bw-dev
@@ -123,6 +123,9 @@ case "$CMD" in
populate_streams)
runweb python manage.py populate_streams
;;
+ populate_suggestions)
+ runweb python manage.py populate_suggestions
+ ;;
generate_thumbnails)
runweb python manage.py generateimages
;;
@@ -170,6 +173,7 @@ case "$CMD" in
echo " clean"
echo " black"
echo " populate_streams"
+ echo " populate_suggestions"
echo " generate_thumbnails"
echo " generate_preview_images [--all]"
echo " copy_media_to_s3"
diff --git a/celerywyrm/celery.py b/celerywyrm/celery.py
index 1dad55888..3ab338621 100644
--- a/celerywyrm/celery.py
+++ b/celerywyrm/celery.py
@@ -26,4 +26,5 @@ app.autodiscover_tasks(["bookwyrm"], related_name="emailing")
app.autodiscover_tasks(["bookwyrm"], related_name="goodreads_import")
app.autodiscover_tasks(["bookwyrm"], related_name="preview_images")
app.autodiscover_tasks(["bookwyrm"], related_name="models.user")
+app.autodiscover_tasks(["bookwyrm"], related_name="suggested_users")
app.autodiscover_tasks(["bookwyrm"], related_name="views.inbox")
diff --git a/locale/de_DE/LC_MESSAGES/django.mo b/locale/de_DE/LC_MESSAGES/django.mo
index dde00be62..543d53559 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 3125d147c..b047f0310 100644
--- a/locale/de_DE/LC_MESSAGES/django.po
+++ b/locale/de_DE/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-06-06 20:52+0000\n"
+"POT-Creation-Date: 2021-08-05 01:33+0000\n"
"PO-Revision-Date: 2021-03-02 17:19-0800\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: English \n"
@@ -18,109 +18,135 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: bookwyrm/forms.py:224
+#: bookwyrm/forms.py:232
#, fuzzy
#| msgid "A user with that username already exists."
msgid "A user with this email already exists."
msgstr "Dieser Benutzename ist bereits vergeben."
-#: bookwyrm/forms.py:238
+#: bookwyrm/forms.py:246
msgid "One Day"
msgstr "Ein Tag"
-#: bookwyrm/forms.py:239
+#: bookwyrm/forms.py:247
msgid "One Week"
msgstr "Eine Woche"
-#: bookwyrm/forms.py:240
+#: bookwyrm/forms.py:248
msgid "One Month"
msgstr "Ein Monat"
-#: bookwyrm/forms.py:241
+#: bookwyrm/forms.py:249
msgid "Does Not Expire"
msgstr "Läuft nicht aus"
-#: bookwyrm/forms.py:246
+#: bookwyrm/forms.py:254
#, python-format
msgid "%(count)d uses"
msgstr "%(count)d Benutzungen"
-#: bookwyrm/forms.py:249
+#: bookwyrm/forms.py:257
#, fuzzy
#| msgid "Unlisted"
msgid "Unlimited"
msgstr "Ungelistet"
-#: bookwyrm/forms.py:299
+#: bookwyrm/forms.py:307
msgid "List Order"
msgstr ""
-#: bookwyrm/forms.py:300
+#: bookwyrm/forms.py:308
#, fuzzy
#| msgid "Title"
msgid "Book Title"
msgstr "Titel"
-#: bookwyrm/forms.py:301 bookwyrm/templates/snippets/create_status_form.html:34
+#: bookwyrm/forms.py:309 bookwyrm/templates/snippets/create_status_form.html:34
#: bookwyrm/templates/user/shelf/shelf.html:85
#: bookwyrm/templates/user/shelf/shelf.html:116
msgid "Rating"
msgstr ""
-#: bookwyrm/forms.py:303 bookwyrm/templates/lists/list.html:107
+#: bookwyrm/forms.py:311 bookwyrm/templates/lists/list.html:107
msgid "Sort By"
msgstr ""
-#: bookwyrm/forms.py:307
+#: bookwyrm/forms.py:315
#, fuzzy
#| msgid "Started reading"
msgid "Ascending"
msgstr "Zu lesen angefangen"
-#: bookwyrm/forms.py:308
+#: bookwyrm/forms.py:316
#, fuzzy
#| msgid "Started reading"
msgid "Descending"
msgstr "Zu lesen angefangen"
-#: bookwyrm/models/fields.py:25
+#: bookwyrm/models/fields.py:27
#, python-format
msgid "%(value)s is not a valid remote_id"
msgstr "%(value)s ist keine gültige remote_id"
-#: bookwyrm/models/fields.py:34 bookwyrm/models/fields.py:43
+#: bookwyrm/models/fields.py:36 bookwyrm/models/fields.py:45
#, python-format
msgid "%(value)s is not a valid username"
msgstr "%(value)s ist kein gültiger Username"
-#: bookwyrm/models/fields.py:166 bookwyrm/templates/layout.html:152
+#: bookwyrm/models/fields.py:174 bookwyrm/templates/layout.html:159
msgid "username"
msgstr "Username"
-#: bookwyrm/models/fields.py:171
+#: bookwyrm/models/fields.py:179
msgid "A user with that username already exists."
msgstr "Dieser Benutzename ist bereits vergeben."
-#: bookwyrm/settings.py:156
+#: bookwyrm/settings.py:123
+msgid "Home Timeline"
+msgstr ""
+
+#: bookwyrm/settings.py:123
+msgid "Home"
+msgstr ""
+
+#: bookwyrm/settings.py:124
+#, fuzzy
+#| msgid "Title"
+msgid "Books Timeline"
+msgstr "Titel"
+
+#: bookwyrm/settings.py:124 bookwyrm/templates/search/layout.html:21
+#: bookwyrm/templates/search/layout.html:42
+#: bookwyrm/templates/user/layout.html:81
+#, fuzzy
+#| msgid "Book"
+msgid "Books"
+msgstr "Buch"
+
+#: bookwyrm/settings.py:170
msgid "English"
msgstr "Englisch"
-#: bookwyrm/settings.py:157
+#: bookwyrm/settings.py:171
msgid "German"
msgstr "Deutsch"
-#: bookwyrm/settings.py:158
+#: bookwyrm/settings.py:172
msgid "Spanish"
msgstr "Spanisch"
-#: bookwyrm/settings.py:159
+#: bookwyrm/settings.py:173
msgid "French"
msgstr "Französisch"
-#: bookwyrm/settings.py:160
+#: bookwyrm/settings.py:174
msgid "Simplified Chinese"
msgstr "Vereinfachtes Chinesisch"
+#: bookwyrm/settings.py:175
+msgid "Traditional Chinese"
+msgstr ""
+
#: bookwyrm/templates/404.html:4 bookwyrm/templates/404.html:8
msgid "Not Found"
msgstr "Nicht gefunden"
@@ -146,36 +172,46 @@ msgstr "Etwas lief schief. Entschuldigung!"
msgid "Edit Author"
msgstr "Autor*in editieren"
-#: bookwyrm/templates/author/author.html:32
-#: bookwyrm/templates/author/edit_author.html:38
+#: bookwyrm/templates/author/author.html:34
+#: bookwyrm/templates/author/edit_author.html:41
msgid "Aliases:"
msgstr ""
-#: bookwyrm/templates/author/author.html:38
+#: bookwyrm/templates/author/author.html:45
msgid "Born:"
msgstr ""
-#: bookwyrm/templates/author/author.html:44
+#: bookwyrm/templates/author/author.html:52
msgid "Died:"
msgstr ""
-#: bookwyrm/templates/author/author.html:51
+#: bookwyrm/templates/author/author.html:61
msgid "Wikipedia"
msgstr ""
-#: bookwyrm/templates/author/author.html:55
-#: bookwyrm/templates/book/book.html:78
+#: bookwyrm/templates/author/author.html:69
+#: bookwyrm/templates/book/book.html:95
msgid "View on OpenLibrary"
msgstr "In OpenLibrary ansehen"
-#: bookwyrm/templates/author/author.html:60
-#: bookwyrm/templates/book/book.html:81
+#: bookwyrm/templates/author/author.html:77
+#: bookwyrm/templates/book/book.html:98
#, fuzzy
#| msgid "View on OpenLibrary"
msgid "View on Inventaire"
msgstr "In OpenLibrary ansehen"
-#: bookwyrm/templates/author/author.html:74
+#: bookwyrm/templates/author/author.html:85
+#, fuzzy
+#| msgid "View on OpenLibrary"
+msgid "View on LibraryThing"
+msgstr "In OpenLibrary ansehen"
+
+#: bookwyrm/templates/author/author.html:93
+msgid "View on Goodreads"
+msgstr ""
+
+#: bookwyrm/templates/author/author.html:108
#, python-format
msgid "Books by %(name)s"
msgstr "Bücher von %(name)s"
@@ -187,232 +223,232 @@ msgid "Edit Author:"
msgstr "Autor*in editieren"
#: bookwyrm/templates/author/edit_author.html:13
-#: bookwyrm/templates/book/edit_book.html:18
+#: bookwyrm/templates/book/edit_book.html:19
msgid "Added:"
msgstr "Hinzugefügt:"
#: bookwyrm/templates/author/edit_author.html:14
-#: bookwyrm/templates/book/edit_book.html:19
+#: bookwyrm/templates/book/edit_book.html:24
msgid "Updated:"
msgstr "Aktualisiert:"
#: bookwyrm/templates/author/edit_author.html:15
-#: bookwyrm/templates/book/edit_book.html:20
+#: bookwyrm/templates/book/edit_book.html:30
msgid "Last edited by:"
msgstr "Zuletzt bearbeitet von:"
#: bookwyrm/templates/author/edit_author.html:31
-#: bookwyrm/templates/book/edit_book.html:90
+#: bookwyrm/templates/book/edit_book.html:117
msgid "Metadata"
msgstr "Metadaten"
-#: bookwyrm/templates/author/edit_author.html:32
+#: bookwyrm/templates/author/edit_author.html:33
#: bookwyrm/templates/lists/form.html:8
#: bookwyrm/templates/user/shelf/create_shelf_form.html:13
#: bookwyrm/templates/user/shelf/edit_shelf_form.html:14
msgid "Name:"
msgstr ""
-#: bookwyrm/templates/author/edit_author.html:40
-#: bookwyrm/templates/book/edit_book.html:132
-#: bookwyrm/templates/book/edit_book.html:141
-#: bookwyrm/templates/book/edit_book.html:178
+#: bookwyrm/templates/author/edit_author.html:43
+#: bookwyrm/templates/book/edit_book.html:162
+#: bookwyrm/templates/book/edit_book.html:171
+#: bookwyrm/templates/book/edit_book.html:214
#, fuzzy
#| msgid "Separate multiple publishers with commas."
msgid "Separate multiple values with commas."
msgstr "Mehrere Herausgeber:innen durch Kommata trennen"
-#: bookwyrm/templates/author/edit_author.html:46
+#: bookwyrm/templates/author/edit_author.html:50
msgid "Bio:"
msgstr ""
-#: bookwyrm/templates/author/edit_author.html:51
+#: bookwyrm/templates/author/edit_author.html:57
msgid "Wikipedia link:"
msgstr "Wikipedialink:"
-#: bookwyrm/templates/author/edit_author.html:57
+#: bookwyrm/templates/author/edit_author.html:63
msgid "Birth date:"
msgstr "Geburtsdatum:"
-#: bookwyrm/templates/author/edit_author.html:65
+#: bookwyrm/templates/author/edit_author.html:71
msgid "Death date:"
msgstr "Todesdatum:"
-#: bookwyrm/templates/author/edit_author.html:73
+#: bookwyrm/templates/author/edit_author.html:79
msgid "Author Identifiers"
msgstr "Autor*innenidentifikatoren"
-#: bookwyrm/templates/author/edit_author.html:74
+#: bookwyrm/templates/author/edit_author.html:81
msgid "Openlibrary key:"
msgstr ""
-#: bookwyrm/templates/author/edit_author.html:79
-#: bookwyrm/templates/book/edit_book.html:243
+#: bookwyrm/templates/author/edit_author.html:89
+#: bookwyrm/templates/book/edit_book.html:293
#, fuzzy
#| msgid "View on OpenLibrary"
msgid "Inventaire ID:"
msgstr "In OpenLibrary ansehen"
-#: bookwyrm/templates/author/edit_author.html:84
+#: bookwyrm/templates/author/edit_author.html:97
msgid "Librarything key:"
msgstr ""
-#: bookwyrm/templates/author/edit_author.html:89
+#: bookwyrm/templates/author/edit_author.html:105
msgid "Goodreads key:"
msgstr ""
-#: bookwyrm/templates/author/edit_author.html:98
-#: bookwyrm/templates/book/book.html:124
-#: bookwyrm/templates/book/edit_book.html:263
+#: bookwyrm/templates/author/edit_author.html:116
+#: bookwyrm/templates/book/book.html:141
+#: bookwyrm/templates/book/edit_book.html:321
+#: bookwyrm/templates/book/readthrough.html:77
#: bookwyrm/templates/lists/form.html:42
-#: bookwyrm/templates/preferences/edit_user.html:70
+#: bookwyrm/templates/preferences/edit_user.html:78
#: bookwyrm/templates/settings/announcement_form.html:69
#: bookwyrm/templates/settings/edit_server.html:68
#: bookwyrm/templates/settings/federated_server.html:98
-#: bookwyrm/templates/settings/site.html:97
-#: bookwyrm/templates/snippets/readthrough.html:77
+#: bookwyrm/templates/settings/site.html:101
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:42
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:42
-#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:34
-#: bookwyrm/templates/user_admin/user_moderation_actions.html:38
+#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:36
+#: bookwyrm/templates/user_admin/user_moderation_actions.html:45
msgid "Save"
msgstr "Speichern"
-#: bookwyrm/templates/author/edit_author.html:99
-#: bookwyrm/templates/book/book.html:125 bookwyrm/templates/book/book.html:174
+#: bookwyrm/templates/author/edit_author.html:117
+#: bookwyrm/templates/book/book.html:142 bookwyrm/templates/book/book.html:191
#: bookwyrm/templates/book/cover_modal.html:32
-#: bookwyrm/templates/book/edit_book.html:264
+#: bookwyrm/templates/book/edit_book.html:322
+#: bookwyrm/templates/book/readthrough.html:78
#: bookwyrm/templates/moderation/report_modal.html:34
#: bookwyrm/templates/settings/federated_server.html:99
#: bookwyrm/templates/snippets/delete_readthrough_modal.html:17
#: bookwyrm/templates/snippets/goal_form.html:32
-#: bookwyrm/templates/snippets/readthrough.html:78
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:43
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:43
-#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:35
+#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:37
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:28
msgid "Cancel"
msgstr "Abbrechen"
-#: bookwyrm/templates/book/book.html:31
+#: bookwyrm/templates/book/book.html:48
#: bookwyrm/templates/discover/large-book.html:25
#: bookwyrm/templates/discover/small-book.html:19
msgid "by"
msgstr "von"
-#: bookwyrm/templates/book/book.html:39 bookwyrm/templates/book/book.html:40
+#: bookwyrm/templates/book/book.html:56 bookwyrm/templates/book/book.html:57
msgid "Edit Book"
msgstr "Buch editieren"
-#: bookwyrm/templates/book/book.html:57
+#: bookwyrm/templates/book/book.html:74
#: bookwyrm/templates/book/cover_modal.html:5
msgid "Add cover"
msgstr "Cover hinzufügen"
-#: bookwyrm/templates/book/book.html:61
+#: bookwyrm/templates/book/book.html:78
#, fuzzy
#| msgid "Failed to load"
msgid "Failed to load cover"
msgstr "Laden fehlgeschlagen"
-#: bookwyrm/templates/book/book.html:101
+#: bookwyrm/templates/book/book.html:118
#, python-format
msgid "(%(review_count)s review)"
msgid_plural "(%(review_count)s reviews)"
msgstr[0] "(%(review_count)s Bewertung)"
msgstr[1] "(%(review_count)s Bewertungen)"
-#: bookwyrm/templates/book/book.html:113
+#: bookwyrm/templates/book/book.html:130
msgid "Add Description"
msgstr "Beschreibung hinzufügen"
-#: bookwyrm/templates/book/book.html:120
-#: bookwyrm/templates/book/edit_book.html:108
+#: bookwyrm/templates/book/book.html:137
+#: bookwyrm/templates/book/edit_book.html:136
#: bookwyrm/templates/lists/form.html:12
msgid "Description:"
msgstr "Beschreibung:"
-#: bookwyrm/templates/book/book.html:134
+#: bookwyrm/templates/book/book.html:151
#, fuzzy, python-format
#| msgid "%(title)s by "
msgid "%(count)s editions"
msgstr "%(title)s von"
-#: bookwyrm/templates/book/book.html:142
+#: bookwyrm/templates/book/book.html:159
#, fuzzy, python-format
#| msgid "Direct Messages with %(username)s"
msgid "This edition is on your %(shelf_name)s shelf."
msgstr "Direktnachrichten mit %(username)s"
-#: bookwyrm/templates/book/book.html:148
+#: bookwyrm/templates/book/book.html:165
#, fuzzy, python-format
#| msgid " added %(book_title)s to your list \"%(list_name)s\""
msgid "A different edition of this book is on your %(shelf_name)s shelf."
msgstr "hat %(book_title)s zu deiner Liste \"%(list_name)s\" Hinzugefügt"
-#: bookwyrm/templates/book/book.html:159
+#: bookwyrm/templates/book/book.html:176
msgid "Your reading activity"
msgstr "Deine Leseaktivität"
-#: bookwyrm/templates/book/book.html:162
+#: bookwyrm/templates/book/book.html:179
msgid "Add read dates"
msgstr "Lesedaten hinzufügen"
-#: bookwyrm/templates/book/book.html:171
+#: bookwyrm/templates/book/book.html:188
msgid "Create"
msgstr "Erstellen"
-#: bookwyrm/templates/book/book.html:181
+#: bookwyrm/templates/book/book.html:198
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:200
+#: bookwyrm/templates/book/book.html:217
#, fuzzy
#| msgid "Review"
msgid "Reviews"
msgstr "Bewerten"
-#: bookwyrm/templates/book/book.html:205
+#: bookwyrm/templates/book/book.html:222
#, fuzzy
#| msgid "Your shelves"
msgid "Your reviews"
msgstr "Deine Regale"
-#: bookwyrm/templates/book/book.html:211
+#: bookwyrm/templates/book/book.html:228
#, fuzzy
#| msgid "Your Account"
msgid "Your comments"
msgstr "Dein Account"
-#: bookwyrm/templates/book/book.html:217
+#: bookwyrm/templates/book/book.html:234
#, fuzzy
#| msgid "Your books"
msgid "Your quotes"
msgstr "Deine Bücher"
-#: bookwyrm/templates/book/book.html:253
+#: bookwyrm/templates/book/book.html:270
msgid "Subjects"
msgstr "Themen"
-#: bookwyrm/templates/book/book.html:265
+#: bookwyrm/templates/book/book.html:282
msgid "Places"
msgstr "Orte"
-#: bookwyrm/templates/book/book.html:276 bookwyrm/templates/layout.html:61
+#: bookwyrm/templates/book/book.html:293 bookwyrm/templates/layout.html:68
#: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:25
#: bookwyrm/templates/search/layout.html:50
-#: bookwyrm/templates/user/layout.html:68
+#: bookwyrm/templates/user/layout.html:75
msgid "Lists"
msgstr "Listen"
-#: bookwyrm/templates/book/book.html:287
+#: bookwyrm/templates/book/book.html:304
#, fuzzy
#| msgid "Go to list"
msgid "Add to list"
msgstr "Zur Liste"
-#: bookwyrm/templates/book/book.html:297
+#: bookwyrm/templates/book/book.html:314
#: bookwyrm/templates/book/cover_modal.html:31
#: bookwyrm/templates/lists/list.html:179
msgid "Add"
@@ -423,24 +459,24 @@ msgid "ISBN:"
msgstr ""
#: bookwyrm/templates/book/book_identifiers.html:14
-#: bookwyrm/templates/book/edit_book.html:248
+#: bookwyrm/templates/book/edit_book.html:301
msgid "OCLC Number:"
msgstr "OCLC Nummer:"
#: bookwyrm/templates/book/book_identifiers.html:21
-#: bookwyrm/templates/book/edit_book.html:253
+#: bookwyrm/templates/book/edit_book.html:309
msgid "ASIN:"
msgstr ""
#: bookwyrm/templates/book/cover_modal.html:17
-#: bookwyrm/templates/book/edit_book.html:192
+#: bookwyrm/templates/book/edit_book.html:229
#, fuzzy
#| msgid "Add cover"
msgid "Upload cover:"
msgstr "Cover hinzufügen"
#: bookwyrm/templates/book/cover_modal.html:23
-#: bookwyrm/templates/book/edit_book.html:198
+#: bookwyrm/templates/book/edit_book.html:235
msgid "Load cover from url:"
msgstr "Cover von URL laden:"
@@ -458,137 +494,143 @@ msgstr "Editionen von %(book_title)s"
msgid "Add Book"
msgstr "Bücher hinzufügen"
-#: bookwyrm/templates/book/edit_book.html:40
+#: bookwyrm/templates/book/edit_book.html:54
msgid "Confirm Book Info"
msgstr "Buchinfo bestätigen"
-#: bookwyrm/templates/book/edit_book.html:47
+#: bookwyrm/templates/book/edit_book.html:62
#, python-format
msgid "Is \"%(name)s\" an existing author?"
msgstr "Existiert \"%(name)s\" bereits als Autor:in?"
-#: bookwyrm/templates/book/edit_book.html:52
+#: bookwyrm/templates/book/edit_book.html:71
#, fuzzy, python-format
#| msgid "Start \"%(book_title)s\""
msgid "Author of %(book_title)s"
msgstr "\"%(book_title)s\" beginnen"
-#: bookwyrm/templates/book/edit_book.html:55
+#: bookwyrm/templates/book/edit_book.html:75
msgid "This is a new author"
msgstr "Neue:r Autor:in"
-#: bookwyrm/templates/book/edit_book.html:61
+#: bookwyrm/templates/book/edit_book.html:82
#, python-format
msgid "Creating a new author: %(name)s"
msgstr "Neu als Autor:in erstellen: %(name)s"
-#: bookwyrm/templates/book/edit_book.html:67
+#: bookwyrm/templates/book/edit_book.html:89
msgid "Is this an edition of an existing work?"
msgstr "Ist das eine Edition eines vorhandenen Werkes?"
-#: bookwyrm/templates/book/edit_book.html:71
+#: bookwyrm/templates/book/edit_book.html:97
msgid "This is a new work"
msgstr "Dies ist ein neues Werk."
-#: bookwyrm/templates/book/edit_book.html:77
+#: bookwyrm/templates/book/edit_book.html:104
#: bookwyrm/templates/password_reset.html:30
msgid "Confirm"
msgstr "Bestätigen"
-#: bookwyrm/templates/book/edit_book.html:79
+#: bookwyrm/templates/book/edit_book.html:106
#: bookwyrm/templates/feed/status.html:8
msgid "Back"
msgstr "Zurück"
-#: bookwyrm/templates/book/edit_book.html:93
+#: bookwyrm/templates/book/edit_book.html:120
msgid "Title:"
msgstr "Titel:"
-#: bookwyrm/templates/book/edit_book.html:101
+#: bookwyrm/templates/book/edit_book.html:128
msgid "Subtitle:"
msgstr "Untertitel:"
-#: bookwyrm/templates/book/edit_book.html:114
+#: bookwyrm/templates/book/edit_book.html:144
msgid "Series:"
msgstr "Serie:"
-#: bookwyrm/templates/book/edit_book.html:122
+#: bookwyrm/templates/book/edit_book.html:152
msgid "Series number:"
msgstr "Seriennummer:"
-#: bookwyrm/templates/book/edit_book.html:130
+#: bookwyrm/templates/book/edit_book.html:160
#, fuzzy
#| msgid "Pages:"
msgid "Languages:"
msgstr "Seiten:"
-#: bookwyrm/templates/book/edit_book.html:139
+#: bookwyrm/templates/book/edit_book.html:169
#, fuzzy
#| msgid "Published"
msgid "Publisher:"
msgstr "Veröffentlicht"
-#: bookwyrm/templates/book/edit_book.html:148
+#: bookwyrm/templates/book/edit_book.html:178
msgid "First published date:"
msgstr "Erstveröffentlichungsdatum:"
-#: bookwyrm/templates/book/edit_book.html:156
+#: bookwyrm/templates/book/edit_book.html:186
msgid "Published date:"
msgstr "Veröffentlichungsdatum:"
-#: bookwyrm/templates/book/edit_book.html:165
+#: bookwyrm/templates/book/edit_book.html:195
#, fuzzy
#| msgid "Author"
msgid "Authors"
msgstr "Autor*in"
-#: bookwyrm/templates/book/edit_book.html:171
+#: bookwyrm/templates/book/edit_book.html:202
#, fuzzy, python-format
-#| msgid "Direct Messages with %(username)s"
-msgid "Remove %(name)s"
-msgstr "Direktnachrichten mit %(username)s"
+#| msgid "Lists: %(username)s"
+msgid "Remove %(name)s"
+msgstr "Listen: %(username)s"
-#: bookwyrm/templates/book/edit_book.html:176
+#: bookwyrm/templates/book/edit_book.html:205
+#, fuzzy, python-format
+#| msgid "Lists: %(username)s"
+msgid "Author page for %(name)s"
+msgstr "Listen: %(username)s"
+
+#: bookwyrm/templates/book/edit_book.html:212
#, fuzzy
#| msgid "Edit Author"
msgid "Add Authors:"
msgstr "Autor*in editieren"
-#: bookwyrm/templates/book/edit_book.html:177
+#: bookwyrm/templates/book/edit_book.html:213
msgid "John Doe, Jane Smith"
msgstr ""
-#: bookwyrm/templates/book/edit_book.html:183
+#: bookwyrm/templates/book/edit_book.html:220
#: bookwyrm/templates/user/shelf/shelf.html:78
msgid "Cover"
msgstr ""
-#: bookwyrm/templates/book/edit_book.html:211
+#: bookwyrm/templates/book/edit_book.html:248
msgid "Physical Properties"
msgstr "Physikalische Eigenschaften"
-#: bookwyrm/templates/book/edit_book.html:212
+#: bookwyrm/templates/book/edit_book.html:250
#: bookwyrm/templates/book/format_filter.html:5
msgid "Format:"
msgstr ""
-#: bookwyrm/templates/book/edit_book.html:220
+#: bookwyrm/templates/book/edit_book.html:258
msgid "Pages:"
msgstr "Seiten:"
-#: bookwyrm/templates/book/edit_book.html:227
+#: bookwyrm/templates/book/edit_book.html:267
msgid "Book Identifiers"
msgstr "Buchidentifikatoren"
-#: bookwyrm/templates/book/edit_book.html:228
+#: bookwyrm/templates/book/edit_book.html:269
msgid "ISBN 13:"
msgstr ""
-#: bookwyrm/templates/book/edit_book.html:233
+#: bookwyrm/templates/book/edit_book.html:277
msgid "ISBN 10:"
msgstr ""
-#: bookwyrm/templates/book/edit_book.html:238
+#: bookwyrm/templates/book/edit_book.html:285
msgid "Openlibrary ID:"
msgstr ""
@@ -652,11 +694,40 @@ msgstr "Veröffentlicht von %(publisher)s."
msgid "rated it"
msgstr "bewertet"
+#: bookwyrm/templates/book/readthrough.html:8
+msgid "Progress Updates:"
+msgstr "Fortschrittsupdates:"
+
+#: bookwyrm/templates/book/readthrough.html:14
+msgid "finished"
+msgstr "Abgeschlossen"
+
+#: bookwyrm/templates/book/readthrough.html:25
+msgid "Show all updates"
+msgstr "Zeige alle Updates"
+
+#: bookwyrm/templates/book/readthrough.html:41
+msgid "Delete this progress update"
+msgstr "Dieses Fortschrittsupdate löschen"
+
+#: bookwyrm/templates/book/readthrough.html:52
+msgid "started"
+msgstr "Angefangen"
+
+#: bookwyrm/templates/book/readthrough.html:59
+#: bookwyrm/templates/book/readthrough.html:73
+msgid "Edit read dates"
+msgstr "Lesedaten bearbeiten"
+
+#: bookwyrm/templates/book/readthrough.html:63
+msgid "Delete these read dates"
+msgstr "Diese Lesedaten löschen"
+
#: bookwyrm/templates/components/inline_form.html:8
#: bookwyrm/templates/components/modal.html:11
-#: bookwyrm/templates/feed/feed_layout.html:69
-#: bookwyrm/templates/get_started/layout.html:19
-#: bookwyrm/templates/get_started/layout.html:52
+#: bookwyrm/templates/feed/layout.html:71
+#: bookwyrm/templates/get_started/layout.html:20
+#: bookwyrm/templates/get_started/layout.html:53
#: bookwyrm/templates/search/book.html:32
#: bookwyrm/templates/snippets/announcement.html:18
msgid "Close"
@@ -688,7 +759,7 @@ msgstr "Föderiert"
#: bookwyrm/templates/directory/directory.html:4
#: bookwyrm/templates/directory/directory.html:9
-#: bookwyrm/templates/layout.html:64
+#: bookwyrm/templates/layout.html:71
msgid "Directory"
msgstr ""
@@ -722,7 +793,16 @@ msgstr "Vorschlagen"
msgid "Recently active"
msgstr ""
-#: bookwyrm/templates/directory/user_card.html:33
+#: bookwyrm/templates/directory/user_card.html:17
+#: bookwyrm/templates/directory/user_card.html:18
+#: bookwyrm/templates/user/user_preview.html:16
+#: bookwyrm/templates/user/user_preview.html:17
+#, fuzzy
+#| msgid "Your Account"
+msgid "Locked account"
+msgstr "Dein Account"
+
+#: bookwyrm/templates/directory/user_card.html:40
#, fuzzy
#| msgid "followed you"
msgid "follower you follow"
@@ -730,7 +810,7 @@ msgid_plural "followers you follow"
msgstr[0] "folgt dir"
msgstr[1] "folgt dir"
-#: bookwyrm/templates/directory/user_card.html:40
+#: bookwyrm/templates/directory/user_card.html:47
#, fuzzy
#| msgid "Your shelves"
msgid "book on your shelves"
@@ -738,11 +818,11 @@ msgid_plural "books on your shelves"
msgstr[0] "Deine Regale"
msgstr[1] "Deine Regale"
-#: bookwyrm/templates/directory/user_card.html:48
+#: bookwyrm/templates/directory/user_card.html:55
msgid "posts"
msgstr ""
-#: bookwyrm/templates/directory/user_card.html:54
+#: bookwyrm/templates/directory/user_card.html:61
msgid "last active"
msgstr ""
@@ -780,7 +860,7 @@ msgid "Recent Books"
msgstr "Aktive Bücher"
#: bookwyrm/templates/discover/landing_layout.html:5
-#: bookwyrm/templates/get_started/layout.html:4
+#: bookwyrm/templates/get_started/layout.html:5
msgid "Welcome"
msgstr "Willkommen"
@@ -902,7 +982,7 @@ msgid "Direct Messages with %(username)s"
msgstr "Direktnachrichten mit %(username)s"
#: bookwyrm/templates/feed/direct_messages.html:10
-#: bookwyrm/templates/layout.html:92
+#: bookwyrm/templates/layout.html:99
msgid "Direct Messages"
msgstr "Direktnachrichten"
@@ -914,99 +994,58 @@ msgstr "Alle Nachrichten"
msgid "You have no messages right now."
msgstr "Du hast momentan keine Nachrichten."
-#: bookwyrm/templates/feed/feed.html:8
-msgid "Home Timeline"
-msgstr ""
-
-#: bookwyrm/templates/feed/feed.html:10
-msgid "Local Timeline"
-msgstr ""
-
-#: bookwyrm/templates/feed/feed.html:12
-#, fuzzy
-#| msgid "Federated Servers"
-msgid "Federated Timeline"
-msgstr "Föderierende Server"
-
-#: bookwyrm/templates/feed/feed.html:18
-msgid "Home"
-msgstr ""
-
-#: bookwyrm/templates/feed/feed.html:21
-msgid "Local"
-msgstr "Lokal"
-
-#: bookwyrm/templates/feed/feed.html:24
-#: bookwyrm/templates/settings/edit_server.html:40
-msgid "Federated"
-msgstr "Föderiert"
-
-#: bookwyrm/templates/feed/feed.html:32
+#: bookwyrm/templates/feed/feed.html:22
#, python-format
-msgid "load 0 unread status(es)"
+msgid "load 0 unread status(es)"
msgstr ""
-#: bookwyrm/templates/feed/feed.html:47
+#: bookwyrm/templates/feed/feed.html:38
msgid "There aren't any activities right now! Try following a user to get started"
msgstr "Hier sind noch keine Aktivitäten! Folge anderen, um loszulegen"
-#: bookwyrm/templates/feed/feed.html:55
-#: bookwyrm/templates/get_started/users.html:6
-msgid "Who to follow"
-msgstr ""
-
-#: bookwyrm/templates/feed/feed_layout.html:4
+#: bookwyrm/templates/feed/layout.html:5
msgid "Updates"
msgstr ""
-#: bookwyrm/templates/feed/feed_layout.html:10
+#: bookwyrm/templates/feed/layout.html:12
#: bookwyrm/templates/user/shelf/books_header.html:3
msgid "Your books"
msgstr "Deine Bücher"
-#: bookwyrm/templates/feed/feed_layout.html:12
+#: bookwyrm/templates/feed/layout.html:14
msgid "There are no books here right now! Try searching for a book to get started"
msgstr "Hier sind noch keine Bücher! Versuche nach Büchern zu suchen um loszulegen"
-#: bookwyrm/templates/feed/feed_layout.html:23
+#: bookwyrm/templates/feed/layout.html:25
#: bookwyrm/templates/user/shelf/shelf.html:29
#, fuzzy
#| msgid "Read"
msgid "To Read"
msgstr "Auf der Leseliste"
-#: bookwyrm/templates/feed/feed_layout.html:24
+#: bookwyrm/templates/feed/layout.html:26
#: bookwyrm/templates/user/shelf/shelf.html:29
#, fuzzy
#| msgid "Start reading"
msgid "Currently Reading"
msgstr "Gerade lesend"
-#: bookwyrm/templates/feed/feed_layout.html:25
-#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:13
+#: bookwyrm/templates/feed/layout.html:27
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:16
#: bookwyrm/templates/user/shelf/shelf.html:29
msgid "Read"
msgstr "Gelesen"
-#: bookwyrm/templates/feed/feed_layout.html:87 bookwyrm/templates/goal.html:26
+#: bookwyrm/templates/feed/layout.html:90 bookwyrm/templates/goal.html:26
#: bookwyrm/templates/snippets/goal_card.html:6
#, python-format
msgid "%(year)s Reading Goal"
msgstr "%(year)s Leseziel"
-#: bookwyrm/templates/feed/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/feed/suggested_users.html:19
-#, 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/feed/suggested_users.html:3
+#: bookwyrm/templates/get_started/users.html:6
+msgid "Who to follow"
+msgstr ""
#: bookwyrm/templates/get_started/book_preview.html:6
#, fuzzy, python-format
@@ -1040,7 +1079,7 @@ msgstr ""
#: bookwyrm/templates/get_started/books.html:17
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
-#: bookwyrm/templates/layout.html:37 bookwyrm/templates/layout.html:38
+#: bookwyrm/templates/layout.html:44 bookwyrm/templates/layout.html:45
#: bookwyrm/templates/lists/list.html:139
#: bookwyrm/templates/search/layout.html:4
#: bookwyrm/templates/search/layout.html:9
@@ -1069,40 +1108,40 @@ msgstr "Keine Bücher gefunden"
msgid "Save & continue"
msgstr ""
-#: bookwyrm/templates/get_started/layout.html:14
+#: bookwyrm/templates/get_started/layout.html:15
#, fuzzy, python-format
#| msgid "About %(site_name)s"
msgid "Welcome to %(site_name)s!"
msgstr "Über %(site_name)s"
-#: bookwyrm/templates/get_started/layout.html:16
+#: bookwyrm/templates/get_started/layout.html:17
msgid "These are some first steps to get you started."
msgstr ""
-#: bookwyrm/templates/get_started/layout.html:30
+#: bookwyrm/templates/get_started/layout.html:31
#: bookwyrm/templates/get_started/profile.html:6
#, fuzzy
#| msgid "User Profile"
msgid "Create your profile"
msgstr "Benutzerprofil"
-#: bookwyrm/templates/get_started/layout.html:34
+#: bookwyrm/templates/get_started/layout.html:35
#, fuzzy
#| msgid "Add Books"
msgid "Add books"
msgstr "Bücher hinzufügen"
-#: bookwyrm/templates/get_started/layout.html:38
+#: bookwyrm/templates/get_started/layout.html:39
#, fuzzy
#| msgid "Friendly"
msgid "Find friends"
msgstr "Freundlich"
-#: bookwyrm/templates/get_started/layout.html:44
+#: bookwyrm/templates/get_started/layout.html:45
msgid "Skip this step"
msgstr ""
-#: bookwyrm/templates/get_started/layout.html:48
+#: bookwyrm/templates/get_started/layout.html:49
#, fuzzy
#| msgid "Finished"
msgid "Finish"
@@ -1133,7 +1172,7 @@ msgid "Manually approve followers:"
msgstr "Folgende manuell bestätigen"
#: bookwyrm/templates/get_started/profile.html:48
-#: bookwyrm/templates/preferences/edit_user.html:58
+#: bookwyrm/templates/preferences/edit_user.html:66
msgid "Show this account in suggested users:"
msgstr ""
@@ -1218,70 +1257,87 @@ msgstr "Aktuelle Importe"
msgid "No recent imports"
msgstr "Keine aktuellen Importe"
-#: bookwyrm/templates/import_status.html:5
-#: bookwyrm/templates/import_status.html:9
+#: bookwyrm/templates/import_status.html:6
+#: bookwyrm/templates/import_status.html:10
msgid "Import Status"
msgstr "Importstatus"
-#: bookwyrm/templates/import_status.html:12
+#: bookwyrm/templates/import_status.html:11
+#, fuzzy
+#| msgid "Back to reports"
+msgid "Back to imports"
+msgstr "Zurück zu den Meldungen"
+
+#: bookwyrm/templates/import_status.html:15
msgid "Import started:"
msgstr "Import gestartet:"
-#: bookwyrm/templates/import_status.html:16
+#: bookwyrm/templates/import_status.html:20
msgid "Import completed:"
msgstr "Import abgeschlossen:"
-#: bookwyrm/templates/import_status.html:19
+#: bookwyrm/templates/import_status.html:25
msgid "TASK FAILED"
msgstr "AUFGABE GESCHEITERT"
-#: bookwyrm/templates/import_status.html:25
+#: bookwyrm/templates/import_status.html:32
msgid "Import still in progress."
msgstr "Import läuft noch."
-#: bookwyrm/templates/import_status.html:27
+#: bookwyrm/templates/import_status.html:34
msgid "(Hit reload to update!)"
msgstr "(Aktualisiere für ein Update!)"
-#: bookwyrm/templates/import_status.html:34
+#: bookwyrm/templates/import_status.html:41
msgid "Failed to load"
msgstr "Laden fehlgeschlagen"
-#: bookwyrm/templates/import_status.html:43
+#: bookwyrm/templates/import_status.html:50
#, python-format
msgid "Jump to the bottom of the list to select the %(failed_count)s items which failed to import."
msgstr "Zum Ende der Liste springen, um die %(failed_count)s Einträge, deren Import fehlschlug, auszuwählen."
-#: bookwyrm/templates/import_status.html:78
+#: bookwyrm/templates/import_status.html:62
+#, python-format
+msgid "Line %(index)s: %(title)s by %(author)s"
+msgstr ""
+
+#: bookwyrm/templates/import_status.html:82
msgid "Select all"
msgstr "Alle auswählen"
-#: bookwyrm/templates/import_status.html:81
+#: bookwyrm/templates/import_status.html:85
msgid "Retry items"
msgstr "Punkte erneut versuchen"
-#: bookwyrm/templates/import_status.html:107
+#: bookwyrm/templates/import_status.html:112
msgid "Successfully imported"
msgstr "Erfolgreich importiert"
-#: bookwyrm/templates/import_status.html:111
+#: bookwyrm/templates/import_status.html:114
+#, fuzzy
+#| msgid "Import still in progress."
+msgid "Import Progress"
+msgstr "Import läuft noch."
+
+#: bookwyrm/templates/import_status.html:119
msgid "Book"
msgstr "Buch"
-#: bookwyrm/templates/import_status.html:114
+#: bookwyrm/templates/import_status.html:122
#: bookwyrm/templates/snippets/create_status_form.html:13
#: bookwyrm/templates/user/shelf/shelf.html:79
#: bookwyrm/templates/user/shelf/shelf.html:99
msgid "Title"
msgstr "Titel"
-#: bookwyrm/templates/import_status.html:117
+#: bookwyrm/templates/import_status.html:125
#: bookwyrm/templates/user/shelf/shelf.html:80
#: bookwyrm/templates/user/shelf/shelf.html:102
msgid "Author"
msgstr "Autor*in"
-#: bookwyrm/templates/import_status.html:140
+#: bookwyrm/templates/import_status.html:148
msgid "Imported"
msgstr "Importiert"
@@ -1311,29 +1367,29 @@ msgstr "Suchergebnisse für \"%(query)s\""
msgid "Matching Books"
msgstr "Passende Bücher"
-#: bookwyrm/templates/layout.html:33
+#: bookwyrm/templates/layout.html:40
msgid "Search for a book or user"
msgstr "Suche nach Buch oder Benutzer*in"
-#: bookwyrm/templates/layout.html:47 bookwyrm/templates/layout.html:48
+#: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55
msgid "Main navigation menu"
msgstr "Navigationshauptmenü"
-#: bookwyrm/templates/layout.html:58
+#: bookwyrm/templates/layout.html:65
msgid "Feed"
msgstr ""
-#: bookwyrm/templates/layout.html:87
+#: bookwyrm/templates/layout.html:94
#, fuzzy
#| msgid "Your books"
msgid "Your Books"
msgstr "Deine Bücher"
-#: bookwyrm/templates/layout.html:97
+#: bookwyrm/templates/layout.html:104
msgid "Settings"
msgstr "Einstellungen"
-#: bookwyrm/templates/layout.html:106
+#: bookwyrm/templates/layout.html:113
#: bookwyrm/templates/settings/admin_layout.html:31
#: bookwyrm/templates/settings/manage_invite_requests.html:15
#: bookwyrm/templates/settings/manage_invites.html:3
@@ -1341,65 +1397,65 @@ msgstr "Einstellungen"
msgid "Invites"
msgstr "Einladungen"
-#: bookwyrm/templates/layout.html:113
+#: bookwyrm/templates/layout.html:120
msgid "Admin"
msgstr ""
-#: bookwyrm/templates/layout.html:120
+#: bookwyrm/templates/layout.html:127
msgid "Log out"
msgstr "Abmelden"
-#: bookwyrm/templates/layout.html:128 bookwyrm/templates/layout.html:129
+#: bookwyrm/templates/layout.html:135 bookwyrm/templates/layout.html:136
#: bookwyrm/templates/notifications.html:6
#: bookwyrm/templates/notifications.html:11
msgid "Notifications"
msgstr "Benachrichtigungen"
-#: bookwyrm/templates/layout.html:151 bookwyrm/templates/layout.html:155
+#: bookwyrm/templates/layout.html:158 bookwyrm/templates/layout.html:162
#: bookwyrm/templates/login.html:17
#: bookwyrm/templates/snippets/register_form.html:4
msgid "Username:"
msgstr ""
-#: bookwyrm/templates/layout.html:156
+#: bookwyrm/templates/layout.html:163
msgid "password"
msgstr "Passwort"
-#: bookwyrm/templates/layout.html:157 bookwyrm/templates/login.html:36
+#: bookwyrm/templates/layout.html:164 bookwyrm/templates/login.html:36
msgid "Forgot your password?"
msgstr "Passwort vergessen?"
-#: bookwyrm/templates/layout.html:160 bookwyrm/templates/login.html:10
+#: bookwyrm/templates/layout.html:167 bookwyrm/templates/login.html:10
#: bookwyrm/templates/login.html:33
msgid "Log in"
msgstr "Anmelden"
-#: bookwyrm/templates/layout.html:168
+#: bookwyrm/templates/layout.html:175
msgid "Join"
msgstr ""
-#: bookwyrm/templates/layout.html:206
+#: bookwyrm/templates/layout.html:213
#, fuzzy
#| msgid "About this server"
msgid "About this instance"
msgstr "Über diesen Server"
-#: bookwyrm/templates/layout.html:210
+#: bookwyrm/templates/layout.html:217
msgid "Contact site admin"
msgstr "Admin kontaktieren"
-#: bookwyrm/templates/layout.html:214
+#: bookwyrm/templates/layout.html:221
#, fuzzy
#| msgid "List curation:"
msgid "Documentation"
msgstr "Listenkuratierung:"
-#: bookwyrm/templates/layout.html:221
+#: bookwyrm/templates/layout.html:228
#, python-format
msgid "Support %(site_name)s on %(support_title)s"
msgstr "%(site_name)s auf %(support_title)s unterstützen"
-#: bookwyrm/templates/layout.html:225
+#: bookwyrm/templates/layout.html:232
msgid "BookWyrm's source code is freely available. You can contribute or report issues on GitHub."
msgstr "BookWyrm ist open source Software. Du kannst dich auf GitHub beteiligen oder etwas melden."
@@ -1809,6 +1865,7 @@ msgstr "Du bist auf dem neusten Stand!"
#: bookwyrm/templates/password_reset.html:23
#: bookwyrm/templates/preferences/change_password.html:18
+#: bookwyrm/templates/preferences/delete_user.html:20
msgid "Confirm password:"
msgstr "Passwort bestätigen:"
@@ -1822,7 +1879,7 @@ msgstr "Passwort zurücksetzen"
#: bookwyrm/templates/preferences/blocks.html:4
#: bookwyrm/templates/preferences/blocks.html:7
-#: bookwyrm/templates/preferences/preferences_layout.html:26
+#: bookwyrm/templates/preferences/layout.html:30
msgid "Blocked Users"
msgstr "Blockierte Nutzer*innen"
@@ -1833,7 +1890,7 @@ msgstr "Momentan keine Nutzer*innen blockiert."
#: bookwyrm/templates/preferences/change_password.html:4
#: bookwyrm/templates/preferences/change_password.html:7
#: bookwyrm/templates/preferences/change_password.html:21
-#: bookwyrm/templates/preferences/preferences_layout.html:19
+#: bookwyrm/templates/preferences/layout.html:19
msgid "Change Password"
msgstr "Passwort ändern"
@@ -1841,6 +1898,23 @@ msgstr "Passwort ändern"
msgid "New password:"
msgstr "Neues Passwort:"
+#: bookwyrm/templates/preferences/delete_user.html:4
+#: bookwyrm/templates/preferences/delete_user.html:7
+#: bookwyrm/templates/preferences/delete_user.html:26
+#: bookwyrm/templates/preferences/layout.html:23
+#, fuzzy
+#| msgid "Create an Account"
+msgid "Delete Account"
+msgstr "Erstelle einen Account"
+
+#: bookwyrm/templates/preferences/delete_user.html:12
+msgid "Permanently delete account"
+msgstr ""
+
+#: bookwyrm/templates/preferences/delete_user.html:14
+msgid "Deleting your account cannot be undone. The username will not be available to register in the future."
+msgstr ""
+
#: bookwyrm/templates/preferences/edit_user.html:4
#: bookwyrm/templates/preferences/edit_user.html:7
msgid "Edit Profile"
@@ -1850,44 +1924,68 @@ msgstr "Profil bearbeiten:"
msgid "Show set reading goal prompt in feed:"
msgstr "Angegebenes Leseziel im Feed anzeigen."
-#: bookwyrm/templates/preferences/edit_user.html:62
+#: bookwyrm/templates/preferences/edit_user.html:58
+#, fuzzy
+#| msgid "Goal privacy:"
+msgid "Default post privacy:"
+msgstr "Sichtbarkeit des Ziels"
+
+#: bookwyrm/templates/preferences/edit_user.html:70
#, 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:65
+#: bookwyrm/templates/preferences/edit_user.html:73
msgid "Preferred Timezone: "
msgstr ""
-#: bookwyrm/templates/preferences/preferences_layout.html:11
+#: bookwyrm/templates/preferences/layout.html:11
msgid "Account"
msgstr ""
-#: bookwyrm/templates/preferences/preferences_layout.html:15
+#: bookwyrm/templates/preferences/layout.html:15
msgid "Profile"
msgstr "Profil"
-#: bookwyrm/templates/preferences/preferences_layout.html:22
+#: bookwyrm/templates/preferences/layout.html:26
msgid "Relationships"
msgstr "Beziehungen"
+#: bookwyrm/templates/reading_progress/finish.html:5
+#, fuzzy, python-format
+#| msgid "Finish \"%(book_title)s\""
+msgid "Finish \"%(book_title)s\""
+msgstr "\"%(book_title)s\" abschließen"
+
+#: bookwyrm/templates/reading_progress/start.html:5
+#, fuzzy, python-format
+#| msgid "Editions of %(book_title)s"
+msgid "Start \"%(book_title)s\""
+msgstr "Editionen von %(book_title)s"
+
+#: bookwyrm/templates/reading_progress/want.html:5
+#, fuzzy, python-format
+#| msgid "Want to Read \"%(book_title)s\""
+msgid "Want to Read \"%(book_title)s\""
+msgstr "\"%(book_title)s\" auf Leseliste setzen"
+
#: bookwyrm/templates/rss/title.html:5
-#: bookwyrm/templates/snippets/status/status_header.html:35
+#: bookwyrm/templates/snippets/status/status_header.html:36
msgid "rated"
msgstr ""
#: bookwyrm/templates/rss/title.html:7
-#: bookwyrm/templates/snippets/status/status_header.html:37
+#: bookwyrm/templates/snippets/status/status_header.html:38
msgid "reviewed"
msgstr "bewertete"
#: bookwyrm/templates/rss/title.html:9
-#: bookwyrm/templates/snippets/status/status_header.html:39
+#: bookwyrm/templates/snippets/status/status_header.html:40
msgid "commented on"
msgstr "kommentierte"
#: bookwyrm/templates/rss/title.html:11
-#: bookwyrm/templates/snippets/status/status_header.html:41
+#: bookwyrm/templates/snippets/status/status_header.html:42
msgid "quoted"
msgstr "zitierte"
@@ -1917,14 +2015,6 @@ msgstr "Suche nach Buch oder Benutzer*in"
msgid "Search type"
msgstr "Suche"
-#: bookwyrm/templates/search/layout.html:21
-#: bookwyrm/templates/search/layout.html:42
-#: bookwyrm/templates/user/layout.html:74
-#, fuzzy
-#| msgid "Book"
-msgid "Books"
-msgstr "Buch"
-
#: bookwyrm/templates/search/layout.html:23
#: bookwyrm/templates/search/layout.html:46
#: bookwyrm/templates/settings/admin_layout.html:26
@@ -2139,6 +2229,10 @@ msgstr "Instanzname"
msgid "Status:"
msgstr "Importstatus"
+#: bookwyrm/templates/settings/edit_server.html:40
+msgid "Federated"
+msgstr "Föderiert"
+
#: bookwyrm/templates/settings/edit_server.html:41
#: bookwyrm/templates/settings/federated_server.html:10
#, fuzzy
@@ -2169,7 +2263,7 @@ msgid "Details"
msgstr ""
#: bookwyrm/templates/settings/federated_server.html:39
-#: bookwyrm/templates/user/layout.html:56
+#: bookwyrm/templates/user/layout.html:63
msgid "Activity"
msgstr "Aktivität"
@@ -2218,7 +2312,7 @@ msgid "Edit"
msgstr "Buch editieren"
#: bookwyrm/templates/settings/federated_server.html:105
-#: bookwyrm/templates/user_admin/user_moderation_actions.html:3
+#: bookwyrm/templates/user_admin/user_moderation_actions.html:8
#, fuzzy
#| msgid "Notifications"
msgid "Actions"
@@ -2448,17 +2542,19 @@ msgstr ""
msgid "Additional info:"
msgstr ""
-#: bookwyrm/templates/settings/site.html:83
-msgid "Allow registration:"
+#: bookwyrm/templates/settings/site.html:85
+#, fuzzy
+#| msgid "Allow registration:"
+msgid "Allow registration"
msgstr "Registrierungen erlauben"
-#: bookwyrm/templates/settings/site.html:87
+#: bookwyrm/templates/settings/site.html:91
#, fuzzy
#| msgid "Follow Requests"
-msgid "Allow invite requests:"
+msgid "Allow invite requests"
msgstr "Folgeanfragen"
-#: bookwyrm/templates/settings/site.html:91
+#: bookwyrm/templates/settings/site.html:95
msgid "Registration closed text:"
msgstr "Registrierungen geschlossen text"
@@ -2468,15 +2564,23 @@ msgstr "Registrierungen geschlossen text"
msgid "Posted by %(username)s"
msgstr "Direktnachrichten mit %(username)s"
-#: bookwyrm/templates/snippets/book_cover.html:31
+#: bookwyrm/templates/snippets/authors.html:22
+#, python-format
+msgid "and %(remainder_count_display)s other"
+msgid_plural "and %(remainder_count_display)s others"
+msgstr[0] ""
+msgstr[1] ""
+
+#: bookwyrm/templates/snippets/book_cover.html:32
#, fuzzy
#| msgid "Add cover"
msgid "No cover"
msgstr "Cover hinzufügen"
-#: bookwyrm/templates/snippets/book_titleby.html:4
-#, python-format
-msgid "%(title)s by "
+#: bookwyrm/templates/snippets/book_titleby.html:6
+#, fuzzy, python-format
+#| msgid "%(title)s by "
+msgid "%(title)s by"
msgstr "%(title)s von "
#: bookwyrm/templates/snippets/boost_button.html:20
@@ -2570,7 +2674,7 @@ msgstr "Spoileralarm aktivieren"
#: bookwyrm/templates/snippets/create_status_form.html:117
#: bookwyrm/templates/snippets/privacy-icons.html:15
#: bookwyrm/templates/snippets/privacy-icons.html:16
-#: bookwyrm/templates/snippets/privacy_select.html:19
+#: bookwyrm/templates/snippets/privacy_select.html:20
msgid "Private"
msgstr "Privat"
@@ -2696,7 +2800,7 @@ msgstr "Sichtbarkeit des Ziels"
#: bookwyrm/templates/snippets/goal_form.html:26
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:37
-#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:29
+#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:31
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:20
msgid "Post to feed"
msgstr "Posten"
@@ -2742,13 +2846,13 @@ msgstr "Weiter"
#: bookwyrm/templates/snippets/privacy-icons.html:3
#: bookwyrm/templates/snippets/privacy-icons.html:4
-#: bookwyrm/templates/snippets/privacy_select.html:10
+#: bookwyrm/templates/snippets/privacy_select.html:11
msgid "Public"
msgstr "Öffentlich"
#: bookwyrm/templates/snippets/privacy-icons.html:7
#: bookwyrm/templates/snippets/privacy-icons.html:8
-#: bookwyrm/templates/snippets/privacy_select.html:13
+#: bookwyrm/templates/snippets/privacy_select.html:14
msgid "Unlisted"
msgstr "Ungelistet"
@@ -2760,7 +2864,7 @@ msgstr "Nur für Folgende"
msgid "Post privacy"
msgstr ""
-#: bookwyrm/templates/snippets/privacy_select.html:16
+#: bookwyrm/templates/snippets/privacy_select.html:17
#: bookwyrm/templates/user/relationships/followers.html:6
#: bookwyrm/templates/user/relationships/layout.html:11
msgid "Followers"
@@ -2774,38 +2878,9 @@ msgstr "Raten"
msgid "Rate"
msgstr ""
-#: bookwyrm/templates/snippets/readthrough.html:8
-msgid "Progress Updates:"
-msgstr "Fortschrittsupdates:"
-
-#: bookwyrm/templates/snippets/readthrough.html:14
-msgid "finished"
-msgstr "Abgeschlossen"
-
-#: bookwyrm/templates/snippets/readthrough.html:25
-msgid "Show all updates"
-msgstr "Zeige alle Updates"
-
-#: bookwyrm/templates/snippets/readthrough.html:41
-msgid "Delete this progress update"
-msgstr "Dieses Fortschrittsupdate löschen"
-
-#: bookwyrm/templates/snippets/readthrough.html:52
-msgid "started"
-msgstr "Angefangen"
-
-#: bookwyrm/templates/snippets/readthrough.html:59
-#: bookwyrm/templates/snippets/readthrough.html:73
-msgid "Edit read dates"
-msgstr "Lesedaten bearbeiten"
-
-#: bookwyrm/templates/snippets/readthrough.html:63
-msgid "Delete these read dates"
-msgstr "Diese Lesedaten löschen"
-
#: bookwyrm/templates/snippets/readthrough_form.html:7
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:19
-#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:17
+#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:19
msgid "Started reading"
msgstr "Zu lesen angefangen"
@@ -2844,7 +2919,7 @@ msgid "Finish \"%(book_title)s\""
msgstr "\"%(book_title)s\" abschließen"
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:5
-#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:36
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:45
#, fuzzy
#| msgid "Progress"
msgid "Update progress"
@@ -2854,20 +2929,20 @@ msgstr "Fortschritt"
msgid "More shelves"
msgstr "Mehr Regale"
-#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:10
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:11
msgid "Start reading"
msgstr "Zu lesen beginnen"
-#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:15
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:19
msgid "Finish reading"
msgstr "Lesen abschließen"
-#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:18
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:25
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:26
msgid "Want to read"
msgstr "Auf Leseliste setzen"
-#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:47
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:57
#, fuzzy, python-format
#| msgid "Lists: %(username)s"
msgid "Remove from %(name)s"
@@ -2883,17 +2958,17 @@ msgstr "\"%(book_title)s\" beginnen"
msgid "Want to Read \"%(book_title)s\""
msgstr "\"%(book_title)s\" auf Leseliste setzen"
-#: bookwyrm/templates/snippets/status/content_status.html:71
+#: bookwyrm/templates/snippets/status/content_status.html:72
#: bookwyrm/templates/snippets/trimmed_text.html:15
msgid "Show more"
msgstr "Mehr anzeigen"
-#: bookwyrm/templates/snippets/status/content_status.html:86
+#: bookwyrm/templates/snippets/status/content_status.html:87
#: bookwyrm/templates/snippets/trimmed_text.html:30
msgid "Show less"
msgstr "Weniger anzeigen"
-#: bookwyrm/templates/snippets/status/content_status.html:116
+#: bookwyrm/templates/snippets/status/content_status.html:117
msgid "Open image in new window"
msgstr "Bild in neuem Fenster öffnen"
@@ -2916,7 +2991,7 @@ msgstr "Status favorisieren"
msgid "boosted"
msgstr "teilt"
-#: bookwyrm/templates/snippets/status/status_header.html:45
+#: bookwyrm/templates/snippets/status/status_header.html:46
#, fuzzy, python-format
#| msgid "replied to your status"
msgid "replied to %(username)s's status"
@@ -2935,10 +3010,31 @@ msgstr "Diese Lesedaten löschen"
#: bookwyrm/templates/snippets/status/status_options.html:35
#: bookwyrm/templates/snippets/user_options.html:13
-#: bookwyrm/templates/user_admin/user_moderation_actions.html:6
+#: bookwyrm/templates/user_admin/user_moderation_actions.html:12
msgid "Send direct message"
msgstr "Direktnachricht senden"
+#: 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/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/snippets/suggested_users.html:31
+#: bookwyrm/templates/user/user_preview.html:36
+#, fuzzy
+#| msgid "followed you"
+msgid "Follows you"
+msgstr "folgt dir"
+
#: bookwyrm/templates/snippets/switch_edition_button.html:5
msgid "Switch to this edition"
msgstr "Zu dieser Edition wechseln"
@@ -2955,15 +3051,15 @@ msgstr "Zu lesen angefangen"
msgid "Sorted descending"
msgstr "Zu lesen angefangen"
-#: bookwyrm/templates/user/layout.html:13 bookwyrm/templates/user/user.html:10
+#: bookwyrm/templates/user/layout.html:18 bookwyrm/templates/user/user.html:10
msgid "User Profile"
msgstr "Benutzerprofil"
-#: bookwyrm/templates/user/layout.html:37
+#: bookwyrm/templates/user/layout.html:44
msgid "Follow Requests"
msgstr "Folgeanfragen"
-#: bookwyrm/templates/user/layout.html:62
+#: bookwyrm/templates/user/layout.html:69
msgid "Reading Goal"
msgstr "Leseziel"
@@ -3073,24 +3169,24 @@ msgstr ""
msgid "No activities yet!"
msgstr "Noch keine Aktivitäten!"
-#: bookwyrm/templates/user/user_preview.html:15
+#: bookwyrm/templates/user/user_preview.html:22
#, python-format
msgid "Joined %(date)s"
msgstr "Beigetreten %(date)s"
-#: bookwyrm/templates/user/user_preview.html:19
+#: bookwyrm/templates/user/user_preview.html:26
#, python-format
msgid "%(counter)s follower"
msgid_plural "%(counter)s followers"
msgstr[0] "%(counter)s Folgende*r"
msgstr[1] "%(counter)s Folgende"
-#: bookwyrm/templates/user/user_preview.html:20
+#: bookwyrm/templates/user/user_preview.html:27
#, python-format
msgid "%(counter)s following"
msgstr "Folgt %(counter)s"
-#: bookwyrm/templates/user/user_preview.html:26
+#: bookwyrm/templates/user/user_preview.html:34
#, fuzzy, python-format
#| msgid "followed you"
msgid "%(mutuals_display)s follower you follow"
@@ -3098,6 +3194,12 @@ msgid_plural "%(mutuals_display)s followers you follow"
msgstr[0] "folgt dir"
msgstr[1] "folgt dir"
+#: bookwyrm/templates/user/user_preview.html:38
+#, fuzzy
+#| msgid "followed you"
+msgid "No followers you follow"
+msgstr "folgt dir"
+
#: bookwyrm/templates/user_admin/user.html:9
#, fuzzy
#| msgid "Back to reports"
@@ -3168,22 +3270,31 @@ msgstr "Instanzeinstellungen"
msgid "View instance"
msgstr ""
-#: bookwyrm/templates/user_admin/user_moderation_actions.html:11
+#: bookwyrm/templates/user_admin/user_moderation_actions.html:5
+msgid "Permanently deleted"
+msgstr ""
+
+#: bookwyrm/templates/user_admin/user_moderation_actions.html:17
msgid "Suspend user"
msgstr ""
-#: bookwyrm/templates/user_admin/user_moderation_actions.html:13
+#: bookwyrm/templates/user_admin/user_moderation_actions.html:19
msgid "Un-suspend user"
msgstr ""
-#: bookwyrm/templates/user_admin/user_moderation_actions.html:21
+#: bookwyrm/templates/user_admin/user_moderation_actions.html:28
msgid "Access level:"
msgstr ""
-#: bookwyrm/templates/widgets/clearable_file_input_with_warning.html:3
+#: bookwyrm/templates/widgets/clearable_file_input_with_warning.html:22
msgid "File exceeds maximum size: 10MB"
msgstr ""
+#: bookwyrm/templatetags/utilities.py:30
+#, python-format
+msgid "%(title)s: %(subtitle)s"
+msgstr ""
+
#: bookwyrm/views/import_data.py:67
#, fuzzy
#| msgid "Email address:"
@@ -3201,6 +3312,19 @@ msgstr "Dieser Benutzename ist bereits vergeben."
msgid "A password reset link sent to %s"
msgstr ""
+#, fuzzy
+#~| msgid "Federated Servers"
+#~ msgid "Federated Timeline"
+#~ msgstr "Föderierende Server"
+
+#~ msgid "Local"
+#~ msgstr "Lokal"
+
+#, fuzzy
+#~| msgid "Direct Messages with %(username)s"
+#~ msgid "Remove %(name)s"
+#~ msgstr "Direktnachrichten mit %(username)s"
+
#, fuzzy
#~| msgid "Lists: %(username)s"
#~ msgid "Reports: %(server_name)s"
diff --git a/locale/en_US/LC_MESSAGES/django.po b/locale/en_US/LC_MESSAGES/django.po
index 8c36a2cb3..153d8b9a1 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-06-06 20:52+0000\n"
+"POT-Creation-Date: 2021-08-05 01:33+0000\n"
"PO-Revision-Date: 2021-02-28 17:19-0800\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: English \n"
@@ -18,99 +18,121 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: bookwyrm/forms.py:224
+#: bookwyrm/forms.py:232
msgid "A user with this email already exists."
msgstr ""
-#: bookwyrm/forms.py:238
+#: bookwyrm/forms.py:246
msgid "One Day"
msgstr ""
-#: bookwyrm/forms.py:239
+#: bookwyrm/forms.py:247
msgid "One Week"
msgstr ""
-#: bookwyrm/forms.py:240
+#: bookwyrm/forms.py:248
msgid "One Month"
msgstr ""
-#: bookwyrm/forms.py:241
+#: bookwyrm/forms.py:249
msgid "Does Not Expire"
msgstr ""
-#: bookwyrm/forms.py:246
+#: bookwyrm/forms.py:254
#, python-format
msgid "%(count)d uses"
msgstr ""
-#: bookwyrm/forms.py:249
+#: bookwyrm/forms.py:257
msgid "Unlimited"
msgstr ""
-#: bookwyrm/forms.py:299
+#: bookwyrm/forms.py:307
msgid "List Order"
msgstr ""
-#: bookwyrm/forms.py:300
+#: bookwyrm/forms.py:308
msgid "Book Title"
msgstr ""
-#: bookwyrm/forms.py:301 bookwyrm/templates/snippets/create_status_form.html:34
+#: bookwyrm/forms.py:309 bookwyrm/templates/snippets/create_status_form.html:34
#: bookwyrm/templates/user/shelf/shelf.html:85
#: bookwyrm/templates/user/shelf/shelf.html:116
msgid "Rating"
msgstr ""
-#: bookwyrm/forms.py:303 bookwyrm/templates/lists/list.html:107
+#: bookwyrm/forms.py:311 bookwyrm/templates/lists/list.html:107
msgid "Sort By"
msgstr ""
-#: bookwyrm/forms.py:307
+#: bookwyrm/forms.py:315
msgid "Ascending"
msgstr ""
-#: bookwyrm/forms.py:308
+#: bookwyrm/forms.py:316
msgid "Descending"
msgstr ""
-#: bookwyrm/models/fields.py:25
+#: bookwyrm/models/fields.py:27
#, python-format
msgid "%(value)s is not a valid remote_id"
msgstr ""
-#: bookwyrm/models/fields.py:34 bookwyrm/models/fields.py:43
+#: bookwyrm/models/fields.py:36 bookwyrm/models/fields.py:45
#, python-format
msgid "%(value)s is not a valid username"
msgstr ""
-#: bookwyrm/models/fields.py:166 bookwyrm/templates/layout.html:152
+#: bookwyrm/models/fields.py:174 bookwyrm/templates/layout.html:159
msgid "username"
msgstr ""
-#: bookwyrm/models/fields.py:171
+#: bookwyrm/models/fields.py:179
msgid "A user with that username already exists."
msgstr ""
-#: bookwyrm/settings.py:156
+#: bookwyrm/settings.py:123
+msgid "Home Timeline"
+msgstr ""
+
+#: bookwyrm/settings.py:123
+msgid "Home"
+msgstr ""
+
+#: bookwyrm/settings.py:124
+msgid "Books Timeline"
+msgstr ""
+
+#: bookwyrm/settings.py:124 bookwyrm/templates/search/layout.html:21
+#: bookwyrm/templates/search/layout.html:42
+#: bookwyrm/templates/user/layout.html:81
+msgid "Books"
+msgstr ""
+
+#: bookwyrm/settings.py:170
msgid "English"
msgstr ""
-#: bookwyrm/settings.py:157
+#: bookwyrm/settings.py:171
msgid "German"
msgstr ""
-#: bookwyrm/settings.py:158
+#: bookwyrm/settings.py:172
msgid "Spanish"
msgstr ""
-#: bookwyrm/settings.py:159
+#: bookwyrm/settings.py:173
msgid "French"
msgstr ""
-#: bookwyrm/settings.py:160
+#: bookwyrm/settings.py:174
msgid "Simplified Chinese"
msgstr ""
+#: bookwyrm/settings.py:175
+msgid "Traditional Chinese"
+msgstr ""
+
#: bookwyrm/templates/404.html:4 bookwyrm/templates/404.html:8
msgid "Not Found"
msgstr ""
@@ -136,34 +158,42 @@ msgstr ""
msgid "Edit Author"
msgstr ""
-#: bookwyrm/templates/author/author.html:32
-#: bookwyrm/templates/author/edit_author.html:38
+#: bookwyrm/templates/author/author.html:34
+#: bookwyrm/templates/author/edit_author.html:41
msgid "Aliases:"
msgstr ""
-#: bookwyrm/templates/author/author.html:38
+#: bookwyrm/templates/author/author.html:45
msgid "Born:"
msgstr ""
-#: bookwyrm/templates/author/author.html:44
+#: bookwyrm/templates/author/author.html:52
msgid "Died:"
msgstr ""
-#: bookwyrm/templates/author/author.html:51
+#: bookwyrm/templates/author/author.html:61
msgid "Wikipedia"
msgstr ""
-#: bookwyrm/templates/author/author.html:55
-#: bookwyrm/templates/book/book.html:78
+#: bookwyrm/templates/author/author.html:69
+#: bookwyrm/templates/book/book.html:95
msgid "View on OpenLibrary"
msgstr ""
-#: bookwyrm/templates/author/author.html:60
-#: bookwyrm/templates/book/book.html:81
+#: bookwyrm/templates/author/author.html:77
+#: bookwyrm/templates/book/book.html:98
msgid "View on Inventaire"
msgstr ""
-#: bookwyrm/templates/author/author.html:74
+#: bookwyrm/templates/author/author.html:85
+msgid "View on LibraryThing"
+msgstr ""
+
+#: bookwyrm/templates/author/author.html:93
+msgid "View on Goodreads"
+msgstr ""
+
+#: bookwyrm/templates/author/author.html:108
#, python-format
msgid "Books by %(name)s"
msgstr ""
@@ -173,213 +203,213 @@ msgid "Edit Author:"
msgstr ""
#: bookwyrm/templates/author/edit_author.html:13
-#: bookwyrm/templates/book/edit_book.html:18
+#: bookwyrm/templates/book/edit_book.html:19
msgid "Added:"
msgstr ""
#: bookwyrm/templates/author/edit_author.html:14
-#: bookwyrm/templates/book/edit_book.html:19
+#: bookwyrm/templates/book/edit_book.html:24
msgid "Updated:"
msgstr ""
#: bookwyrm/templates/author/edit_author.html:15
-#: bookwyrm/templates/book/edit_book.html:20
+#: bookwyrm/templates/book/edit_book.html:30
msgid "Last edited by:"
msgstr ""
#: bookwyrm/templates/author/edit_author.html:31
-#: bookwyrm/templates/book/edit_book.html:90
+#: bookwyrm/templates/book/edit_book.html:117
msgid "Metadata"
msgstr ""
-#: bookwyrm/templates/author/edit_author.html:32
+#: bookwyrm/templates/author/edit_author.html:33
#: bookwyrm/templates/lists/form.html:8
#: bookwyrm/templates/user/shelf/create_shelf_form.html:13
#: bookwyrm/templates/user/shelf/edit_shelf_form.html:14
msgid "Name:"
msgstr ""
-#: bookwyrm/templates/author/edit_author.html:40
-#: bookwyrm/templates/book/edit_book.html:132
-#: bookwyrm/templates/book/edit_book.html:141
-#: bookwyrm/templates/book/edit_book.html:178
+#: bookwyrm/templates/author/edit_author.html:43
+#: bookwyrm/templates/book/edit_book.html:162
+#: bookwyrm/templates/book/edit_book.html:171
+#: bookwyrm/templates/book/edit_book.html:214
msgid "Separate multiple values with commas."
msgstr ""
-#: bookwyrm/templates/author/edit_author.html:46
+#: bookwyrm/templates/author/edit_author.html:50
msgid "Bio:"
msgstr ""
-#: bookwyrm/templates/author/edit_author.html:51
+#: bookwyrm/templates/author/edit_author.html:57
msgid "Wikipedia link:"
msgstr ""
-#: bookwyrm/templates/author/edit_author.html:57
+#: bookwyrm/templates/author/edit_author.html:63
msgid "Birth date:"
msgstr ""
-#: bookwyrm/templates/author/edit_author.html:65
+#: bookwyrm/templates/author/edit_author.html:71
msgid "Death date:"
msgstr ""
-#: bookwyrm/templates/author/edit_author.html:73
+#: bookwyrm/templates/author/edit_author.html:79
msgid "Author Identifiers"
msgstr ""
-#: bookwyrm/templates/author/edit_author.html:74
+#: bookwyrm/templates/author/edit_author.html:81
msgid "Openlibrary key:"
msgstr ""
-#: bookwyrm/templates/author/edit_author.html:79
-#: bookwyrm/templates/book/edit_book.html:243
+#: bookwyrm/templates/author/edit_author.html:89
+#: bookwyrm/templates/book/edit_book.html:293
msgid "Inventaire ID:"
msgstr ""
-#: bookwyrm/templates/author/edit_author.html:84
+#: bookwyrm/templates/author/edit_author.html:97
msgid "Librarything key:"
msgstr ""
-#: bookwyrm/templates/author/edit_author.html:89
+#: bookwyrm/templates/author/edit_author.html:105
msgid "Goodreads key:"
msgstr ""
-#: bookwyrm/templates/author/edit_author.html:98
-#: bookwyrm/templates/book/book.html:124
-#: bookwyrm/templates/book/edit_book.html:263
+#: bookwyrm/templates/author/edit_author.html:116
+#: bookwyrm/templates/book/book.html:141
+#: bookwyrm/templates/book/edit_book.html:321
+#: bookwyrm/templates/book/readthrough.html:77
#: bookwyrm/templates/lists/form.html:42
-#: bookwyrm/templates/preferences/edit_user.html:70
+#: bookwyrm/templates/preferences/edit_user.html:78
#: bookwyrm/templates/settings/announcement_form.html:69
#: bookwyrm/templates/settings/edit_server.html:68
#: bookwyrm/templates/settings/federated_server.html:98
-#: bookwyrm/templates/settings/site.html:97
-#: bookwyrm/templates/snippets/readthrough.html:77
+#: bookwyrm/templates/settings/site.html:101
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:42
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:42
-#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:34
-#: bookwyrm/templates/user_admin/user_moderation_actions.html:38
+#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:36
+#: bookwyrm/templates/user_admin/user_moderation_actions.html:45
msgid "Save"
msgstr ""
-#: bookwyrm/templates/author/edit_author.html:99
-#: bookwyrm/templates/book/book.html:125 bookwyrm/templates/book/book.html:174
+#: bookwyrm/templates/author/edit_author.html:117
+#: bookwyrm/templates/book/book.html:142 bookwyrm/templates/book/book.html:191
#: bookwyrm/templates/book/cover_modal.html:32
-#: bookwyrm/templates/book/edit_book.html:264
+#: bookwyrm/templates/book/edit_book.html:322
+#: bookwyrm/templates/book/readthrough.html:78
#: bookwyrm/templates/moderation/report_modal.html:34
#: bookwyrm/templates/settings/federated_server.html:99
#: bookwyrm/templates/snippets/delete_readthrough_modal.html:17
#: bookwyrm/templates/snippets/goal_form.html:32
-#: bookwyrm/templates/snippets/readthrough.html:78
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:43
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:43
-#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:35
+#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:37
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:28
msgid "Cancel"
msgstr ""
-#: bookwyrm/templates/book/book.html:31
+#: bookwyrm/templates/book/book.html:48
#: bookwyrm/templates/discover/large-book.html:25
#: bookwyrm/templates/discover/small-book.html:19
msgid "by"
msgstr ""
-#: bookwyrm/templates/book/book.html:39 bookwyrm/templates/book/book.html:40
+#: bookwyrm/templates/book/book.html:56 bookwyrm/templates/book/book.html:57
msgid "Edit Book"
msgstr ""
-#: bookwyrm/templates/book/book.html:57
+#: bookwyrm/templates/book/book.html:74
#: bookwyrm/templates/book/cover_modal.html:5
msgid "Add cover"
msgstr ""
-#: bookwyrm/templates/book/book.html:61
+#: bookwyrm/templates/book/book.html:78
msgid "Failed to load cover"
msgstr ""
-#: bookwyrm/templates/book/book.html:101
+#: bookwyrm/templates/book/book.html:118
#, python-format
msgid "(%(review_count)s review)"
msgid_plural "(%(review_count)s reviews)"
msgstr[0] ""
msgstr[1] ""
-#: bookwyrm/templates/book/book.html:113
+#: bookwyrm/templates/book/book.html:130
msgid "Add Description"
msgstr ""
-#: bookwyrm/templates/book/book.html:120
-#: bookwyrm/templates/book/edit_book.html:108
+#: bookwyrm/templates/book/book.html:137
+#: bookwyrm/templates/book/edit_book.html:136
#: bookwyrm/templates/lists/form.html:12
msgid "Description:"
msgstr ""
-#: bookwyrm/templates/book/book.html:134
+#: bookwyrm/templates/book/book.html:151
#, python-format
msgid "%(count)s editions"
msgstr ""
-#: bookwyrm/templates/book/book.html:142
+#: bookwyrm/templates/book/book.html:159
#, python-format
msgid "This edition is on your %(shelf_name)s shelf."
msgstr ""
-#: bookwyrm/templates/book/book.html:148
+#: bookwyrm/templates/book/book.html:165
#, python-format
msgid "A different edition of this book is on your %(shelf_name)s shelf."
msgstr ""
-#: bookwyrm/templates/book/book.html:159
+#: bookwyrm/templates/book/book.html:176
msgid "Your reading activity"
msgstr ""
-#: bookwyrm/templates/book/book.html:162
+#: bookwyrm/templates/book/book.html:179
msgid "Add read dates"
msgstr ""
-#: bookwyrm/templates/book/book.html:171
+#: bookwyrm/templates/book/book.html:188
msgid "Create"
msgstr ""
-#: bookwyrm/templates/book/book.html:181
+#: bookwyrm/templates/book/book.html:198
msgid "You don't have any reading activity for this book."
msgstr ""
-#: bookwyrm/templates/book/book.html:200
+#: bookwyrm/templates/book/book.html:217
msgid "Reviews"
msgstr ""
-#: bookwyrm/templates/book/book.html:205
+#: bookwyrm/templates/book/book.html:222
msgid "Your reviews"
msgstr ""
-#: bookwyrm/templates/book/book.html:211
+#: bookwyrm/templates/book/book.html:228
msgid "Your comments"
msgstr ""
-#: bookwyrm/templates/book/book.html:217
+#: bookwyrm/templates/book/book.html:234
msgid "Your quotes"
msgstr ""
-#: bookwyrm/templates/book/book.html:253
+#: bookwyrm/templates/book/book.html:270
msgid "Subjects"
msgstr ""
-#: bookwyrm/templates/book/book.html:265
+#: bookwyrm/templates/book/book.html:282
msgid "Places"
msgstr ""
-#: bookwyrm/templates/book/book.html:276 bookwyrm/templates/layout.html:61
+#: bookwyrm/templates/book/book.html:293 bookwyrm/templates/layout.html:68
#: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:25
#: bookwyrm/templates/search/layout.html:50
-#: bookwyrm/templates/user/layout.html:68
+#: bookwyrm/templates/user/layout.html:75
msgid "Lists"
msgstr ""
-#: bookwyrm/templates/book/book.html:287
+#: bookwyrm/templates/book/book.html:304
msgid "Add to list"
msgstr ""
-#: bookwyrm/templates/book/book.html:297
+#: bookwyrm/templates/book/book.html:314
#: bookwyrm/templates/book/cover_modal.html:31
#: bookwyrm/templates/lists/list.html:179
msgid "Add"
@@ -390,22 +420,22 @@ msgid "ISBN:"
msgstr ""
#: bookwyrm/templates/book/book_identifiers.html:14
-#: bookwyrm/templates/book/edit_book.html:248
+#: bookwyrm/templates/book/edit_book.html:301
msgid "OCLC Number:"
msgstr ""
#: bookwyrm/templates/book/book_identifiers.html:21
-#: bookwyrm/templates/book/edit_book.html:253
+#: bookwyrm/templates/book/edit_book.html:309
msgid "ASIN:"
msgstr ""
#: bookwyrm/templates/book/cover_modal.html:17
-#: bookwyrm/templates/book/edit_book.html:192
+#: bookwyrm/templates/book/edit_book.html:229
msgid "Upload cover:"
msgstr ""
#: bookwyrm/templates/book/cover_modal.html:23
-#: bookwyrm/templates/book/edit_book.html:198
+#: bookwyrm/templates/book/edit_book.html:235
msgid "Load cover from url:"
msgstr ""
@@ -420,127 +450,132 @@ msgstr ""
msgid "Add Book"
msgstr ""
-#: bookwyrm/templates/book/edit_book.html:40
+#: bookwyrm/templates/book/edit_book.html:54
msgid "Confirm Book Info"
msgstr ""
-#: bookwyrm/templates/book/edit_book.html:47
+#: bookwyrm/templates/book/edit_book.html:62
#, python-format
msgid "Is \"%(name)s\" an existing author?"
msgstr ""
-#: bookwyrm/templates/book/edit_book.html:52
+#: bookwyrm/templates/book/edit_book.html:71
#, python-format
msgid "Author of %(book_title)s"
msgstr ""
-#: bookwyrm/templates/book/edit_book.html:55
+#: bookwyrm/templates/book/edit_book.html:75
msgid "This is a new author"
msgstr ""
-#: bookwyrm/templates/book/edit_book.html:61
+#: bookwyrm/templates/book/edit_book.html:82
#, python-format
msgid "Creating a new author: %(name)s"
msgstr ""
-#: bookwyrm/templates/book/edit_book.html:67
+#: bookwyrm/templates/book/edit_book.html:89
msgid "Is this an edition of an existing work?"
msgstr ""
-#: bookwyrm/templates/book/edit_book.html:71
+#: bookwyrm/templates/book/edit_book.html:97
msgid "This is a new work"
msgstr ""
-#: bookwyrm/templates/book/edit_book.html:77
+#: bookwyrm/templates/book/edit_book.html:104
#: bookwyrm/templates/password_reset.html:30
msgid "Confirm"
msgstr ""
-#: bookwyrm/templates/book/edit_book.html:79
+#: bookwyrm/templates/book/edit_book.html:106
#: bookwyrm/templates/feed/status.html:8
msgid "Back"
msgstr ""
-#: bookwyrm/templates/book/edit_book.html:93
+#: bookwyrm/templates/book/edit_book.html:120
msgid "Title:"
msgstr ""
-#: bookwyrm/templates/book/edit_book.html:101
+#: bookwyrm/templates/book/edit_book.html:128
msgid "Subtitle:"
msgstr ""
-#: bookwyrm/templates/book/edit_book.html:114
+#: bookwyrm/templates/book/edit_book.html:144
msgid "Series:"
msgstr ""
-#: bookwyrm/templates/book/edit_book.html:122
+#: bookwyrm/templates/book/edit_book.html:152
msgid "Series number:"
msgstr ""
-#: bookwyrm/templates/book/edit_book.html:130
+#: bookwyrm/templates/book/edit_book.html:160
msgid "Languages:"
msgstr ""
-#: bookwyrm/templates/book/edit_book.html:139
+#: bookwyrm/templates/book/edit_book.html:169
msgid "Publisher:"
msgstr ""
-#: bookwyrm/templates/book/edit_book.html:148
+#: bookwyrm/templates/book/edit_book.html:178
msgid "First published date:"
msgstr ""
-#: bookwyrm/templates/book/edit_book.html:156
+#: bookwyrm/templates/book/edit_book.html:186
msgid "Published date:"
msgstr ""
-#: bookwyrm/templates/book/edit_book.html:165
+#: bookwyrm/templates/book/edit_book.html:195
msgid "Authors"
msgstr ""
-#: bookwyrm/templates/book/edit_book.html:171
+#: bookwyrm/templates/book/edit_book.html:202
#, python-format
-msgid "Remove %(name)s"
+msgid "Remove %(name)s"
msgstr ""
-#: bookwyrm/templates/book/edit_book.html:176
+#: bookwyrm/templates/book/edit_book.html:205
+#, python-format
+msgid "Author page for %(name)s"
+msgstr ""
+
+#: bookwyrm/templates/book/edit_book.html:212
msgid "Add Authors:"
msgstr ""
-#: bookwyrm/templates/book/edit_book.html:177
+#: bookwyrm/templates/book/edit_book.html:213
msgid "John Doe, Jane Smith"
msgstr ""
-#: bookwyrm/templates/book/edit_book.html:183
+#: bookwyrm/templates/book/edit_book.html:220
#: bookwyrm/templates/user/shelf/shelf.html:78
msgid "Cover"
msgstr ""
-#: bookwyrm/templates/book/edit_book.html:211
+#: bookwyrm/templates/book/edit_book.html:248
msgid "Physical Properties"
msgstr ""
-#: bookwyrm/templates/book/edit_book.html:212
+#: bookwyrm/templates/book/edit_book.html:250
#: bookwyrm/templates/book/format_filter.html:5
msgid "Format:"
msgstr ""
-#: bookwyrm/templates/book/edit_book.html:220
+#: bookwyrm/templates/book/edit_book.html:258
msgid "Pages:"
msgstr ""
-#: bookwyrm/templates/book/edit_book.html:227
+#: bookwyrm/templates/book/edit_book.html:267
msgid "Book Identifiers"
msgstr ""
-#: bookwyrm/templates/book/edit_book.html:228
+#: bookwyrm/templates/book/edit_book.html:269
msgid "ISBN 13:"
msgstr ""
-#: bookwyrm/templates/book/edit_book.html:233
+#: bookwyrm/templates/book/edit_book.html:277
msgid "ISBN 10:"
msgstr ""
-#: bookwyrm/templates/book/edit_book.html:238
+#: bookwyrm/templates/book/edit_book.html:285
msgid "Openlibrary ID:"
msgstr ""
@@ -602,11 +637,40 @@ msgstr ""
msgid "rated it"
msgstr ""
+#: bookwyrm/templates/book/readthrough.html:8
+msgid "Progress Updates:"
+msgstr ""
+
+#: bookwyrm/templates/book/readthrough.html:14
+msgid "finished"
+msgstr ""
+
+#: bookwyrm/templates/book/readthrough.html:25
+msgid "Show all updates"
+msgstr ""
+
+#: bookwyrm/templates/book/readthrough.html:41
+msgid "Delete this progress update"
+msgstr ""
+
+#: bookwyrm/templates/book/readthrough.html:52
+msgid "started"
+msgstr ""
+
+#: bookwyrm/templates/book/readthrough.html:59
+#: bookwyrm/templates/book/readthrough.html:73
+msgid "Edit read dates"
+msgstr ""
+
+#: bookwyrm/templates/book/readthrough.html:63
+msgid "Delete these read dates"
+msgstr ""
+
#: bookwyrm/templates/components/inline_form.html:8
#: bookwyrm/templates/components/modal.html:11
-#: bookwyrm/templates/feed/feed_layout.html:69
-#: bookwyrm/templates/get_started/layout.html:19
-#: bookwyrm/templates/get_started/layout.html:52
+#: bookwyrm/templates/feed/layout.html:71
+#: bookwyrm/templates/get_started/layout.html:20
+#: bookwyrm/templates/get_started/layout.html:53
#: bookwyrm/templates/search/book.html:32
#: bookwyrm/templates/snippets/announcement.html:18
msgid "Close"
@@ -630,7 +694,7 @@ msgstr ""
#: bookwyrm/templates/directory/directory.html:4
#: bookwyrm/templates/directory/directory.html:9
-#: bookwyrm/templates/layout.html:64
+#: bookwyrm/templates/layout.html:71
msgid "Directory"
msgstr ""
@@ -661,23 +725,30 @@ msgstr ""
msgid "Recently active"
msgstr ""
-#: bookwyrm/templates/directory/user_card.html:33
+#: bookwyrm/templates/directory/user_card.html:17
+#: bookwyrm/templates/directory/user_card.html:18
+#: bookwyrm/templates/user/user_preview.html:16
+#: bookwyrm/templates/user/user_preview.html:17
+msgid "Locked account"
+msgstr ""
+
+#: 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:40
+#: 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:48
+#: bookwyrm/templates/directory/user_card.html:55
msgid "posts"
msgstr ""
-#: bookwyrm/templates/directory/user_card.html:54
+#: bookwyrm/templates/directory/user_card.html:61
msgid "last active"
msgstr ""
@@ -713,7 +784,7 @@ msgid "Recent Books"
msgstr ""
#: bookwyrm/templates/discover/landing_layout.html:5
-#: bookwyrm/templates/get_started/layout.html:4
+#: bookwyrm/templates/get_started/layout.html:5
msgid "Welcome"
msgstr ""
@@ -831,7 +902,7 @@ msgid "Direct Messages with %(username)s"
msgstr ""
#: bookwyrm/templates/feed/direct_messages.html:10
-#: bookwyrm/templates/layout.html:92
+#: bookwyrm/templates/layout.html:99
msgid "Direct Messages"
msgstr ""
@@ -843,93 +914,54 @@ msgstr ""
msgid "You have no messages right now."
msgstr ""
-#: bookwyrm/templates/feed/feed.html:8
-msgid "Home Timeline"
-msgstr ""
-
-#: bookwyrm/templates/feed/feed.html:10
-msgid "Local Timeline"
-msgstr ""
-
-#: bookwyrm/templates/feed/feed.html:12
-msgid "Federated Timeline"
-msgstr ""
-
-#: bookwyrm/templates/feed/feed.html:18
-msgid "Home"
-msgstr ""
-
-#: bookwyrm/templates/feed/feed.html:21
-msgid "Local"
-msgstr ""
-
-#: bookwyrm/templates/feed/feed.html:24
-#: bookwyrm/templates/settings/edit_server.html:40
-msgid "Federated"
-msgstr ""
-
-#: bookwyrm/templates/feed/feed.html:32
+#: bookwyrm/templates/feed/feed.html:22
#, python-format
-msgid "load 0 unread status(es)"
+msgid "load 0 unread status(es)"
msgstr ""
-#: bookwyrm/templates/feed/feed.html:47
+#: bookwyrm/templates/feed/feed.html:38
msgid "There aren't any activities right now! Try following a user to get started"
msgstr ""
-#: bookwyrm/templates/feed/feed.html:55
-#: bookwyrm/templates/get_started/users.html:6
-msgid "Who to follow"
-msgstr ""
-
-#: bookwyrm/templates/feed/feed_layout.html:4
+#: bookwyrm/templates/feed/layout.html:5
msgid "Updates"
msgstr ""
-#: bookwyrm/templates/feed/feed_layout.html:10
+#: bookwyrm/templates/feed/layout.html:12
#: bookwyrm/templates/user/shelf/books_header.html:3
msgid "Your books"
msgstr ""
-#: bookwyrm/templates/feed/feed_layout.html:12
+#: bookwyrm/templates/feed/layout.html:14
msgid "There are no books here right now! Try searching for a book to get started"
msgstr ""
-#: bookwyrm/templates/feed/feed_layout.html:23
+#: bookwyrm/templates/feed/layout.html:25
#: bookwyrm/templates/user/shelf/shelf.html:29
msgid "To Read"
msgstr ""
-#: bookwyrm/templates/feed/feed_layout.html:24
+#: bookwyrm/templates/feed/layout.html:26
#: bookwyrm/templates/user/shelf/shelf.html:29
msgid "Currently Reading"
msgstr ""
-#: bookwyrm/templates/feed/feed_layout.html:25
-#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:13
+#: bookwyrm/templates/feed/layout.html:27
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:16
#: bookwyrm/templates/user/shelf/shelf.html:29
msgid "Read"
msgstr ""
-#: bookwyrm/templates/feed/feed_layout.html:87 bookwyrm/templates/goal.html:26
+#: bookwyrm/templates/feed/layout.html:90 bookwyrm/templates/goal.html:26
#: bookwyrm/templates/snippets/goal_card.html:6
#, python-format
msgid "%(year)s Reading Goal"
msgstr ""
-#: bookwyrm/templates/feed/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/feed/suggested_users.html:19
-#, 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/feed/suggested_users.html:3
+#: bookwyrm/templates/get_started/users.html:6
+msgid "Who to follow"
+msgstr ""
#: bookwyrm/templates/get_started/book_preview.html:6
#, python-format
@@ -960,7 +992,7 @@ msgstr ""
#: bookwyrm/templates/get_started/books.html:17
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
-#: bookwyrm/templates/layout.html:37 bookwyrm/templates/layout.html:38
+#: bookwyrm/templates/layout.html:44 bookwyrm/templates/layout.html:45
#: bookwyrm/templates/lists/list.html:139
#: bookwyrm/templates/search/layout.html:4
#: bookwyrm/templates/search/layout.html:9
@@ -986,33 +1018,33 @@ msgstr ""
msgid "Save & continue"
msgstr ""
-#: bookwyrm/templates/get_started/layout.html:14
+#: bookwyrm/templates/get_started/layout.html:15
#, python-format
msgid "Welcome to %(site_name)s!"
msgstr ""
-#: bookwyrm/templates/get_started/layout.html:16
+#: bookwyrm/templates/get_started/layout.html:17
msgid "These are some first steps to get you started."
msgstr ""
-#: bookwyrm/templates/get_started/layout.html:30
+#: bookwyrm/templates/get_started/layout.html:31
#: bookwyrm/templates/get_started/profile.html:6
msgid "Create your profile"
msgstr ""
-#: bookwyrm/templates/get_started/layout.html:34
+#: bookwyrm/templates/get_started/layout.html:35
msgid "Add books"
msgstr ""
-#: bookwyrm/templates/get_started/layout.html:38
+#: bookwyrm/templates/get_started/layout.html:39
msgid "Find friends"
msgstr ""
-#: bookwyrm/templates/get_started/layout.html:44
+#: bookwyrm/templates/get_started/layout.html:45
msgid "Skip this step"
msgstr ""
-#: bookwyrm/templates/get_started/layout.html:48
+#: bookwyrm/templates/get_started/layout.html:49
msgid "Finish"
msgstr ""
@@ -1041,7 +1073,7 @@ msgid "Manually approve followers:"
msgstr ""
#: bookwyrm/templates/get_started/profile.html:48
-#: bookwyrm/templates/preferences/edit_user.html:58
+#: bookwyrm/templates/preferences/edit_user.html:66
msgid "Show this account in suggested users:"
msgstr ""
@@ -1122,70 +1154,83 @@ msgstr ""
msgid "No recent imports"
msgstr ""
-#: bookwyrm/templates/import_status.html:5
-#: bookwyrm/templates/import_status.html:9
+#: bookwyrm/templates/import_status.html:6
+#: bookwyrm/templates/import_status.html:10
msgid "Import Status"
msgstr ""
-#: bookwyrm/templates/import_status.html:12
+#: bookwyrm/templates/import_status.html:11
+msgid "Back to imports"
+msgstr ""
+
+#: bookwyrm/templates/import_status.html:15
msgid "Import started:"
msgstr ""
-#: bookwyrm/templates/import_status.html:16
+#: bookwyrm/templates/import_status.html:20
msgid "Import completed:"
msgstr ""
-#: bookwyrm/templates/import_status.html:19
+#: bookwyrm/templates/import_status.html:25
msgid "TASK FAILED"
msgstr ""
-#: bookwyrm/templates/import_status.html:25
+#: bookwyrm/templates/import_status.html:32
msgid "Import still in progress."
msgstr ""
-#: bookwyrm/templates/import_status.html:27
+#: bookwyrm/templates/import_status.html:34
msgid "(Hit reload to update!)"
msgstr ""
-#: bookwyrm/templates/import_status.html:34
+#: bookwyrm/templates/import_status.html:41
msgid "Failed to load"
msgstr ""
-#: bookwyrm/templates/import_status.html:43
+#: bookwyrm/templates/import_status.html:50
#, python-format
msgid "Jump to the bottom of the list to select the %(failed_count)s items which failed to import."
msgstr ""
-#: bookwyrm/templates/import_status.html:78
+#: bookwyrm/templates/import_status.html:62
+#, python-format
+msgid "Line %(index)s: %(title)s by %(author)s"
+msgstr ""
+
+#: bookwyrm/templates/import_status.html:82
msgid "Select all"
msgstr ""
-#: bookwyrm/templates/import_status.html:81
+#: bookwyrm/templates/import_status.html:85
msgid "Retry items"
msgstr ""
-#: bookwyrm/templates/import_status.html:107
+#: bookwyrm/templates/import_status.html:112
msgid "Successfully imported"
msgstr ""
-#: bookwyrm/templates/import_status.html:111
+#: bookwyrm/templates/import_status.html:114
+msgid "Import Progress"
+msgstr ""
+
+#: bookwyrm/templates/import_status.html:119
msgid "Book"
msgstr ""
-#: bookwyrm/templates/import_status.html:114
+#: bookwyrm/templates/import_status.html:122
#: bookwyrm/templates/snippets/create_status_form.html:13
#: bookwyrm/templates/user/shelf/shelf.html:79
#: bookwyrm/templates/user/shelf/shelf.html:99
msgid "Title"
msgstr ""
-#: bookwyrm/templates/import_status.html:117
+#: bookwyrm/templates/import_status.html:125
#: bookwyrm/templates/user/shelf/shelf.html:80
#: bookwyrm/templates/user/shelf/shelf.html:102
msgid "Author"
msgstr ""
-#: bookwyrm/templates/import_status.html:140
+#: bookwyrm/templates/import_status.html:148
msgid "Imported"
msgstr ""
@@ -1215,27 +1260,27 @@ msgstr ""
msgid "Matching Books"
msgstr ""
-#: bookwyrm/templates/layout.html:33
+#: bookwyrm/templates/layout.html:40
msgid "Search for a book or user"
msgstr ""
-#: bookwyrm/templates/layout.html:47 bookwyrm/templates/layout.html:48
+#: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55
msgid "Main navigation menu"
msgstr ""
-#: bookwyrm/templates/layout.html:58
+#: bookwyrm/templates/layout.html:65
msgid "Feed"
msgstr ""
-#: bookwyrm/templates/layout.html:87
+#: bookwyrm/templates/layout.html:94
msgid "Your Books"
msgstr ""
-#: bookwyrm/templates/layout.html:97
+#: bookwyrm/templates/layout.html:104
msgid "Settings"
msgstr ""
-#: bookwyrm/templates/layout.html:106
+#: bookwyrm/templates/layout.html:113
#: bookwyrm/templates/settings/admin_layout.html:31
#: bookwyrm/templates/settings/manage_invite_requests.html:15
#: bookwyrm/templates/settings/manage_invites.html:3
@@ -1243,61 +1288,61 @@ msgstr ""
msgid "Invites"
msgstr ""
-#: bookwyrm/templates/layout.html:113
+#: bookwyrm/templates/layout.html:120
msgid "Admin"
msgstr ""
-#: bookwyrm/templates/layout.html:120
+#: bookwyrm/templates/layout.html:127
msgid "Log out"
msgstr ""
-#: bookwyrm/templates/layout.html:128 bookwyrm/templates/layout.html:129
+#: bookwyrm/templates/layout.html:135 bookwyrm/templates/layout.html:136
#: bookwyrm/templates/notifications.html:6
#: bookwyrm/templates/notifications.html:11
msgid "Notifications"
msgstr ""
-#: bookwyrm/templates/layout.html:151 bookwyrm/templates/layout.html:155
+#: bookwyrm/templates/layout.html:158 bookwyrm/templates/layout.html:162
#: bookwyrm/templates/login.html:17
#: bookwyrm/templates/snippets/register_form.html:4
msgid "Username:"
msgstr ""
-#: bookwyrm/templates/layout.html:156
+#: bookwyrm/templates/layout.html:163
msgid "password"
msgstr ""
-#: bookwyrm/templates/layout.html:157 bookwyrm/templates/login.html:36
+#: bookwyrm/templates/layout.html:164 bookwyrm/templates/login.html:36
msgid "Forgot your password?"
msgstr ""
-#: bookwyrm/templates/layout.html:160 bookwyrm/templates/login.html:10
+#: bookwyrm/templates/layout.html:167 bookwyrm/templates/login.html:10
#: bookwyrm/templates/login.html:33
msgid "Log in"
msgstr ""
-#: bookwyrm/templates/layout.html:168
+#: bookwyrm/templates/layout.html:175
msgid "Join"
msgstr ""
-#: bookwyrm/templates/layout.html:206
+#: bookwyrm/templates/layout.html:213
msgid "About this instance"
msgstr ""
-#: bookwyrm/templates/layout.html:210
+#: bookwyrm/templates/layout.html:217
msgid "Contact site admin"
msgstr ""
-#: bookwyrm/templates/layout.html:214
+#: bookwyrm/templates/layout.html:221
msgid "Documentation"
msgstr ""
-#: bookwyrm/templates/layout.html:221
+#: bookwyrm/templates/layout.html:228
#, python-format
msgid "Support %(site_name)s on %(support_title)s"
msgstr ""
-#: bookwyrm/templates/layout.html:225
+#: bookwyrm/templates/layout.html:232
msgid "BookWyrm's source code is freely available. You can contribute or report issues on GitHub."
msgstr ""
@@ -1675,6 +1720,7 @@ msgstr ""
#: bookwyrm/templates/password_reset.html:23
#: bookwyrm/templates/preferences/change_password.html:18
+#: bookwyrm/templates/preferences/delete_user.html:20
msgid "Confirm password:"
msgstr ""
@@ -1688,7 +1734,7 @@ msgstr ""
#: bookwyrm/templates/preferences/blocks.html:4
#: bookwyrm/templates/preferences/blocks.html:7
-#: bookwyrm/templates/preferences/preferences_layout.html:26
+#: bookwyrm/templates/preferences/layout.html:30
msgid "Blocked Users"
msgstr ""
@@ -1699,7 +1745,7 @@ msgstr ""
#: bookwyrm/templates/preferences/change_password.html:4
#: bookwyrm/templates/preferences/change_password.html:7
#: bookwyrm/templates/preferences/change_password.html:21
-#: bookwyrm/templates/preferences/preferences_layout.html:19
+#: bookwyrm/templates/preferences/layout.html:19
msgid "Change Password"
msgstr ""
@@ -1707,6 +1753,21 @@ msgstr ""
msgid "New password:"
msgstr ""
+#: bookwyrm/templates/preferences/delete_user.html:4
+#: bookwyrm/templates/preferences/delete_user.html:7
+#: bookwyrm/templates/preferences/delete_user.html:26
+#: bookwyrm/templates/preferences/layout.html:23
+msgid "Delete Account"
+msgstr ""
+
+#: bookwyrm/templates/preferences/delete_user.html:12
+msgid "Permanently delete account"
+msgstr ""
+
+#: bookwyrm/templates/preferences/delete_user.html:14
+msgid "Deleting your account cannot be undone. The username will not be available to register in the future."
+msgstr ""
+
#: bookwyrm/templates/preferences/edit_user.html:4
#: bookwyrm/templates/preferences/edit_user.html:7
msgid "Edit Profile"
@@ -1716,44 +1777,63 @@ msgstr ""
msgid "Show set reading goal prompt in feed:"
msgstr ""
-#: bookwyrm/templates/preferences/edit_user.html:62
+#: bookwyrm/templates/preferences/edit_user.html:58
+msgid "Default post privacy:"
+msgstr ""
+
+#: bookwyrm/templates/preferences/edit_user.html:70
#, 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:65
+#: bookwyrm/templates/preferences/edit_user.html:73
msgid "Preferred Timezone: "
msgstr ""
-#: bookwyrm/templates/preferences/preferences_layout.html:11
+#: bookwyrm/templates/preferences/layout.html:11
msgid "Account"
msgstr ""
-#: bookwyrm/templates/preferences/preferences_layout.html:15
+#: bookwyrm/templates/preferences/layout.html:15
msgid "Profile"
msgstr ""
-#: bookwyrm/templates/preferences/preferences_layout.html:22
+#: bookwyrm/templates/preferences/layout.html:26
msgid "Relationships"
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/want.html:5
+#, python-format
+msgid "Want to Read \"%(book_title)s\""
+msgstr ""
+
#: bookwyrm/templates/rss/title.html:5
-#: bookwyrm/templates/snippets/status/status_header.html:35
+#: bookwyrm/templates/snippets/status/status_header.html:36
msgid "rated"
msgstr ""
#: bookwyrm/templates/rss/title.html:7
-#: bookwyrm/templates/snippets/status/status_header.html:37
+#: bookwyrm/templates/snippets/status/status_header.html:38
msgid "reviewed"
msgstr ""
#: bookwyrm/templates/rss/title.html:9
-#: bookwyrm/templates/snippets/status/status_header.html:39
+#: bookwyrm/templates/snippets/status/status_header.html:40
msgid "commented on"
msgstr ""
#: bookwyrm/templates/rss/title.html:11
-#: bookwyrm/templates/snippets/status/status_header.html:41
+#: bookwyrm/templates/snippets/status/status_header.html:42
msgid "quoted"
msgstr ""
@@ -1777,12 +1857,6 @@ msgstr ""
msgid "Search type"
msgstr ""
-#: bookwyrm/templates/search/layout.html:21
-#: bookwyrm/templates/search/layout.html:42
-#: bookwyrm/templates/user/layout.html:74
-msgid "Books"
-msgstr ""
-
#: bookwyrm/templates/search/layout.html:23
#: bookwyrm/templates/search/layout.html:46
#: bookwyrm/templates/settings/admin_layout.html:26
@@ -1958,6 +2032,10 @@ msgstr ""
msgid "Status:"
msgstr ""
+#: bookwyrm/templates/settings/edit_server.html:40
+msgid "Federated"
+msgstr ""
+
#: bookwyrm/templates/settings/edit_server.html:41
#: bookwyrm/templates/settings/federated_server.html:10
msgid "Blocked"
@@ -1984,7 +2062,7 @@ msgid "Details"
msgstr ""
#: bookwyrm/templates/settings/federated_server.html:39
-#: bookwyrm/templates/user/layout.html:56
+#: bookwyrm/templates/user/layout.html:63
msgid "Activity"
msgstr ""
@@ -2023,7 +2101,7 @@ msgid "Edit"
msgstr ""
#: bookwyrm/templates/settings/federated_server.html:105
-#: bookwyrm/templates/user_admin/user_moderation_actions.html:3
+#: bookwyrm/templates/user_admin/user_moderation_actions.html:8
msgid "Actions"
msgstr ""
@@ -2229,15 +2307,15 @@ msgstr ""
msgid "Additional info:"
msgstr ""
-#: bookwyrm/templates/settings/site.html:83
-msgid "Allow registration:"
-msgstr ""
-
-#: bookwyrm/templates/settings/site.html:87
-msgid "Allow invite requests:"
+#: bookwyrm/templates/settings/site.html:85
+msgid "Allow registration"
msgstr ""
#: bookwyrm/templates/settings/site.html:91
+msgid "Allow invite requests"
+msgstr ""
+
+#: bookwyrm/templates/settings/site.html:95
msgid "Registration closed text:"
msgstr ""
@@ -2246,13 +2324,20 @@ msgstr ""
msgid "Posted by %(username)s"
msgstr ""
-#: bookwyrm/templates/snippets/book_cover.html:31
+#: bookwyrm/templates/snippets/authors.html:22
+#, python-format
+msgid "and %(remainder_count_display)s other"
+msgid_plural "and %(remainder_count_display)s others"
+msgstr[0] ""
+msgstr[1] ""
+
+#: bookwyrm/templates/snippets/book_cover.html:32
msgid "No cover"
msgstr ""
-#: bookwyrm/templates/snippets/book_titleby.html:4
+#: bookwyrm/templates/snippets/book_titleby.html:6
#, python-format
-msgid "%(title)s by "
+msgid "%(title)s by"
msgstr ""
#: bookwyrm/templates/snippets/boost_button.html:20
@@ -2334,7 +2419,7 @@ msgstr ""
#: bookwyrm/templates/snippets/create_status_form.html:117
#: bookwyrm/templates/snippets/privacy-icons.html:15
#: bookwyrm/templates/snippets/privacy-icons.html:16
-#: bookwyrm/templates/snippets/privacy_select.html:19
+#: bookwyrm/templates/snippets/privacy_select.html:20
msgid "Private"
msgstr ""
@@ -2451,7 +2536,7 @@ msgstr ""
#: bookwyrm/templates/snippets/goal_form.html:26
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:37
-#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:29
+#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:31
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:20
msgid "Post to feed"
msgstr ""
@@ -2495,13 +2580,13 @@ msgstr ""
#: bookwyrm/templates/snippets/privacy-icons.html:3
#: bookwyrm/templates/snippets/privacy-icons.html:4
-#: bookwyrm/templates/snippets/privacy_select.html:10
+#: bookwyrm/templates/snippets/privacy_select.html:11
msgid "Public"
msgstr ""
#: bookwyrm/templates/snippets/privacy-icons.html:7
#: bookwyrm/templates/snippets/privacy-icons.html:8
-#: bookwyrm/templates/snippets/privacy_select.html:13
+#: bookwyrm/templates/snippets/privacy_select.html:14
msgid "Unlisted"
msgstr ""
@@ -2513,7 +2598,7 @@ msgstr ""
msgid "Post privacy"
msgstr ""
-#: bookwyrm/templates/snippets/privacy_select.html:16
+#: bookwyrm/templates/snippets/privacy_select.html:17
#: bookwyrm/templates/user/relationships/followers.html:6
#: bookwyrm/templates/user/relationships/layout.html:11
msgid "Followers"
@@ -2527,38 +2612,9 @@ msgstr ""
msgid "Rate"
msgstr ""
-#: bookwyrm/templates/snippets/readthrough.html:8
-msgid "Progress Updates:"
-msgstr ""
-
-#: bookwyrm/templates/snippets/readthrough.html:14
-msgid "finished"
-msgstr ""
-
-#: bookwyrm/templates/snippets/readthrough.html:25
-msgid "Show all updates"
-msgstr ""
-
-#: bookwyrm/templates/snippets/readthrough.html:41
-msgid "Delete this progress update"
-msgstr ""
-
-#: bookwyrm/templates/snippets/readthrough.html:52
-msgid "started"
-msgstr ""
-
-#: bookwyrm/templates/snippets/readthrough.html:59
-#: bookwyrm/templates/snippets/readthrough.html:73
-msgid "Edit read dates"
-msgstr ""
-
-#: bookwyrm/templates/snippets/readthrough.html:63
-msgid "Delete these read dates"
-msgstr ""
-
#: bookwyrm/templates/snippets/readthrough_form.html:7
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:19
-#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:17
+#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:19
msgid "Started reading"
msgstr ""
@@ -2593,7 +2649,7 @@ msgid "Finish \"%(book_title)s\""
msgstr ""
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:5
-#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:36
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:45
msgid "Update progress"
msgstr ""
@@ -2601,20 +2657,20 @@ msgstr ""
msgid "More shelves"
msgstr ""
-#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:10
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:11
msgid "Start reading"
msgstr ""
-#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:15
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:19
msgid "Finish reading"
msgstr ""
-#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:18
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:25
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:26
msgid "Want to read"
msgstr ""
-#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:47
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:57
#, python-format
msgid "Remove from %(name)s"
msgstr ""
@@ -2629,17 +2685,17 @@ msgstr ""
msgid "Want to Read \"%(book_title)s\""
msgstr ""
-#: bookwyrm/templates/snippets/status/content_status.html:71
+#: bookwyrm/templates/snippets/status/content_status.html:72
#: bookwyrm/templates/snippets/trimmed_text.html:15
msgid "Show more"
msgstr ""
-#: bookwyrm/templates/snippets/status/content_status.html:86
+#: bookwyrm/templates/snippets/status/content_status.html:87
#: bookwyrm/templates/snippets/trimmed_text.html:30
msgid "Show less"
msgstr ""
-#: bookwyrm/templates/snippets/status/content_status.html:116
+#: bookwyrm/templates/snippets/status/content_status.html:117
msgid "Open image in new window"
msgstr ""
@@ -2662,7 +2718,7 @@ msgstr ""
msgid "boosted"
msgstr ""
-#: bookwyrm/templates/snippets/status/status_header.html:45
+#: bookwyrm/templates/snippets/status/status_header.html:46
#, python-format
msgid "replied to %(username)s's status"
msgstr ""
@@ -2678,10 +2734,29 @@ msgstr ""
#: bookwyrm/templates/snippets/status/status_options.html:35
#: bookwyrm/templates/snippets/user_options.html:13
-#: bookwyrm/templates/user_admin/user_moderation_actions.html:6
+#: bookwyrm/templates/user_admin/user_moderation_actions.html:12
msgid "Send direct message"
msgstr ""
+#: bookwyrm/templates/snippets/suggested_users.html:16
+#, python-format
+msgid "%(mutuals)s follower you follow"
+msgid_plural "%(mutuals)s followers you follow"
+msgstr[0] ""
+msgstr[1] ""
+
+#: 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/snippets/suggested_users.html:31
+#: bookwyrm/templates/user/user_preview.html:36
+msgid "Follows you"
+msgstr ""
+
#: bookwyrm/templates/snippets/switch_edition_button.html:5
msgid "Switch to this edition"
msgstr ""
@@ -2694,15 +2769,15 @@ msgstr ""
msgid "Sorted descending"
msgstr ""
-#: bookwyrm/templates/user/layout.html:13 bookwyrm/templates/user/user.html:10
+#: bookwyrm/templates/user/layout.html:18 bookwyrm/templates/user/user.html:10
msgid "User Profile"
msgstr ""
-#: bookwyrm/templates/user/layout.html:37
+#: bookwyrm/templates/user/layout.html:44
msgid "Follow Requests"
msgstr ""
-#: bookwyrm/templates/user/layout.html:62
+#: bookwyrm/templates/user/layout.html:69
msgid "Reading Goal"
msgstr ""
@@ -2808,30 +2883,34 @@ msgstr ""
msgid "No activities yet!"
msgstr ""
-#: bookwyrm/templates/user/user_preview.html:15
+#: bookwyrm/templates/user/user_preview.html:22
#, python-format
msgid "Joined %(date)s"
msgstr ""
-#: bookwyrm/templates/user/user_preview.html:19
+#: bookwyrm/templates/user/user_preview.html:26
#, python-format
msgid "%(counter)s follower"
msgid_plural "%(counter)s followers"
msgstr[0] ""
msgstr[1] ""
-#: bookwyrm/templates/user/user_preview.html:20
+#: bookwyrm/templates/user/user_preview.html:27
#, python-format
msgid "%(counter)s following"
msgstr ""
-#: bookwyrm/templates/user/user_preview.html:26
+#: bookwyrm/templates/user/user_preview.html:34
#, python-format
msgid "%(mutuals_display)s follower you follow"
msgid_plural "%(mutuals_display)s followers you follow"
msgstr[0] ""
msgstr[1] ""
+#: bookwyrm/templates/user/user_preview.html:38
+msgid "No followers you follow"
+msgstr ""
+
#: bookwyrm/templates/user_admin/user.html:9
msgid "Back to users"
msgstr ""
@@ -2887,22 +2966,31 @@ msgstr ""
msgid "View instance"
msgstr ""
-#: bookwyrm/templates/user_admin/user_moderation_actions.html:11
+#: bookwyrm/templates/user_admin/user_moderation_actions.html:5
+msgid "Permanently deleted"
+msgstr ""
+
+#: bookwyrm/templates/user_admin/user_moderation_actions.html:17
msgid "Suspend user"
msgstr ""
-#: bookwyrm/templates/user_admin/user_moderation_actions.html:13
+#: bookwyrm/templates/user_admin/user_moderation_actions.html:19
msgid "Un-suspend user"
msgstr ""
-#: bookwyrm/templates/user_admin/user_moderation_actions.html:21
+#: bookwyrm/templates/user_admin/user_moderation_actions.html:28
msgid "Access level:"
msgstr ""
-#: bookwyrm/templates/widgets/clearable_file_input_with_warning.html:3
+#: bookwyrm/templates/widgets/clearable_file_input_with_warning.html:22
msgid "File exceeds maximum size: 10MB"
msgstr ""
+#: bookwyrm/templatetags/utilities.py:30
+#, python-format
+msgid "%(title)s: %(subtitle)s"
+msgstr ""
+
#: bookwyrm/views/import_data.py:67
msgid "Not a valid csv file"
msgstr ""
diff --git a/locale/es/LC_MESSAGES/django.mo b/locale/es/LC_MESSAGES/django.mo
index 54adfb570..23869cf45 100644
Binary files a/locale/es/LC_MESSAGES/django.mo and b/locale/es/LC_MESSAGES/django.mo differ
diff --git a/locale/es/LC_MESSAGES/django.po b/locale/es/LC_MESSAGES/django.po
index c9a19a4df..5bae4d7e2 100644
--- a/locale/es/LC_MESSAGES/django.po
+++ b/locale/es/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-06-06 20:52+0000\n"
+"POT-Creation-Date: 2021-08-05 01:33+0000\n"
"PO-Revision-Date: 2021-03-19 11:49+0800\n"
"Last-Translator: FULL NAME \n"
"Language-Team: LANGUAGE \n"
@@ -18,99 +18,125 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: bookwyrm/forms.py:224
+#: bookwyrm/forms.py:232
msgid "A user with this email already exists."
msgstr "Ya existe un usuario con ese correo electrónico."
-#: bookwyrm/forms.py:238
+#: bookwyrm/forms.py:246
msgid "One Day"
msgstr "Un día"
-#: bookwyrm/forms.py:239
+#: bookwyrm/forms.py:247
msgid "One Week"
msgstr "Una semana"
-#: bookwyrm/forms.py:240
+#: bookwyrm/forms.py:248
msgid "One Month"
msgstr "Un mes"
-#: bookwyrm/forms.py:241
+#: bookwyrm/forms.py:249
msgid "Does Not Expire"
msgstr "Nunca se vence"
-#: bookwyrm/forms.py:246
+#: bookwyrm/forms.py:254
#, python-format
msgid "%(count)d uses"
msgstr "%(count)d usos"
-#: bookwyrm/forms.py:249
+#: bookwyrm/forms.py:257
msgid "Unlimited"
msgstr "Sin límite"
-#: bookwyrm/forms.py:299
+#: bookwyrm/forms.py:307
msgid "List Order"
msgstr "Orden de la lista"
-#: bookwyrm/forms.py:300
+#: bookwyrm/forms.py:308
msgid "Book Title"
msgstr "Título"
-#: bookwyrm/forms.py:301 bookwyrm/templates/snippets/create_status_form.html:34
+#: bookwyrm/forms.py:309 bookwyrm/templates/snippets/create_status_form.html:34
#: bookwyrm/templates/user/shelf/shelf.html:85
#: bookwyrm/templates/user/shelf/shelf.html:116
msgid "Rating"
msgstr "Calificación"
-#: bookwyrm/forms.py:303 bookwyrm/templates/lists/list.html:107
+#: bookwyrm/forms.py:311 bookwyrm/templates/lists/list.html:107
msgid "Sort By"
msgstr "Ordenar por"
-#: bookwyrm/forms.py:307
+#: bookwyrm/forms.py:315
msgid "Ascending"
msgstr "Ascendente"
-#: bookwyrm/forms.py:308
+#: bookwyrm/forms.py:316
msgid "Descending"
msgstr "Descendente"
-#: bookwyrm/models/fields.py:25
+#: bookwyrm/models/fields.py:27
#, python-format
msgid "%(value)s is not a valid remote_id"
msgstr "%(value)s no es un remote_id válido"
-#: bookwyrm/models/fields.py:34 bookwyrm/models/fields.py:43
+#: bookwyrm/models/fields.py:36 bookwyrm/models/fields.py:45
#, python-format
msgid "%(value)s is not a valid username"
msgstr "%(value)s no es un usuario válido"
-#: bookwyrm/models/fields.py:166 bookwyrm/templates/layout.html:152
+#: bookwyrm/models/fields.py:174 bookwyrm/templates/layout.html:159
msgid "username"
msgstr "nombre de usuario"
-#: bookwyrm/models/fields.py:171
+#: bookwyrm/models/fields.py:179
msgid "A user with that username already exists."
msgstr "Ya existe un usuario con ese nombre."
-#: bookwyrm/settings.py:156
+#: bookwyrm/settings.py:123
+msgid "Home Timeline"
+msgstr "Línea temporal de hogar"
+
+#: bookwyrm/settings.py:123
+msgid "Home"
+msgstr "Hogar"
+
+#: bookwyrm/settings.py:124
+#, fuzzy
+#| msgid "Book Title"
+msgid "Books Timeline"
+msgstr "Título"
+
+#: bookwyrm/settings.py:124 bookwyrm/templates/search/layout.html:21
+#: bookwyrm/templates/search/layout.html:42
+#: bookwyrm/templates/user/layout.html:81
+msgid "Books"
+msgstr "Libros"
+
+#: bookwyrm/settings.py:170
msgid "English"
msgstr "Inglés"
-#: bookwyrm/settings.py:157
+#: bookwyrm/settings.py:171
msgid "German"
msgstr "Aléman"
-#: bookwyrm/settings.py:158
+#: bookwyrm/settings.py:172
msgid "Spanish"
msgstr "Español"
-#: bookwyrm/settings.py:159
+#: bookwyrm/settings.py:173
msgid "French"
msgstr "Francés"
-#: bookwyrm/settings.py:160
+#: bookwyrm/settings.py:174
msgid "Simplified Chinese"
msgstr "Chino simplificado"
+#: bookwyrm/settings.py:175
+#, fuzzy
+#| msgid "Additional info:"
+msgid "Traditional Chinese"
+msgstr "Más informacion:"
+
#: bookwyrm/templates/404.html:4 bookwyrm/templates/404.html:8
msgid "Not Found"
msgstr "No encontrado"
@@ -136,34 +162,44 @@ msgstr "¡Algo salió mal! Disculpa."
msgid "Edit Author"
msgstr "Editar Autor/Autora"
-#: bookwyrm/templates/author/author.html:32
-#: bookwyrm/templates/author/edit_author.html:38
+#: bookwyrm/templates/author/author.html:34
+#: bookwyrm/templates/author/edit_author.html:41
msgid "Aliases:"
msgstr "Aliases:"
-#: bookwyrm/templates/author/author.html:38
+#: bookwyrm/templates/author/author.html:45
msgid "Born:"
msgstr "Nacido:"
-#: bookwyrm/templates/author/author.html:44
+#: bookwyrm/templates/author/author.html:52
msgid "Died:"
msgstr "Muerto:"
-#: bookwyrm/templates/author/author.html:51
+#: bookwyrm/templates/author/author.html:61
msgid "Wikipedia"
msgstr "Wikipedia"
-#: bookwyrm/templates/author/author.html:55
-#: bookwyrm/templates/book/book.html:78
+#: bookwyrm/templates/author/author.html:69
+#: bookwyrm/templates/book/book.html:95
msgid "View on OpenLibrary"
msgstr "Ver en OpenLibrary"
-#: bookwyrm/templates/author/author.html:60
-#: bookwyrm/templates/book/book.html:81
+#: bookwyrm/templates/author/author.html:77
+#: bookwyrm/templates/book/book.html:98
msgid "View on Inventaire"
msgstr "Ver en Inventaire"
-#: bookwyrm/templates/author/author.html:74
+#: bookwyrm/templates/author/author.html:85
+#, fuzzy
+#| msgid "View on OpenLibrary"
+msgid "View on LibraryThing"
+msgstr "Ver en OpenLibrary"
+
+#: bookwyrm/templates/author/author.html:93
+msgid "View on Goodreads"
+msgstr ""
+
+#: bookwyrm/templates/author/author.html:108
#, python-format
msgid "Books by %(name)s"
msgstr "Libros de %(name)s"
@@ -173,213 +209,213 @@ msgid "Edit Author:"
msgstr "Editar Autor/Autora/Autore:"
#: bookwyrm/templates/author/edit_author.html:13
-#: bookwyrm/templates/book/edit_book.html:18
+#: bookwyrm/templates/book/edit_book.html:19
msgid "Added:"
msgstr "Agregado:"
#: bookwyrm/templates/author/edit_author.html:14
-#: bookwyrm/templates/book/edit_book.html:19
+#: bookwyrm/templates/book/edit_book.html:24
msgid "Updated:"
msgstr "Actualizado:"
#: bookwyrm/templates/author/edit_author.html:15
-#: bookwyrm/templates/book/edit_book.html:20
+#: bookwyrm/templates/book/edit_book.html:30
msgid "Last edited by:"
msgstr "Editado más recientemente por:"
#: bookwyrm/templates/author/edit_author.html:31
-#: bookwyrm/templates/book/edit_book.html:90
+#: bookwyrm/templates/book/edit_book.html:117
msgid "Metadata"
msgstr "Metadatos"
-#: bookwyrm/templates/author/edit_author.html:32
+#: bookwyrm/templates/author/edit_author.html:33
#: bookwyrm/templates/lists/form.html:8
#: bookwyrm/templates/user/shelf/create_shelf_form.html:13
#: bookwyrm/templates/user/shelf/edit_shelf_form.html:14
msgid "Name:"
msgstr "Nombre:"
-#: bookwyrm/templates/author/edit_author.html:40
-#: bookwyrm/templates/book/edit_book.html:132
-#: bookwyrm/templates/book/edit_book.html:141
-#: bookwyrm/templates/book/edit_book.html:178
+#: bookwyrm/templates/author/edit_author.html:43
+#: bookwyrm/templates/book/edit_book.html:162
+#: bookwyrm/templates/book/edit_book.html:171
+#: bookwyrm/templates/book/edit_book.html:214
msgid "Separate multiple values with commas."
msgstr "Separar varios valores con comas."
-#: bookwyrm/templates/author/edit_author.html:46
+#: bookwyrm/templates/author/edit_author.html:50
msgid "Bio:"
msgstr "Bio:"
-#: bookwyrm/templates/author/edit_author.html:51
+#: bookwyrm/templates/author/edit_author.html:57
msgid "Wikipedia link:"
msgstr "Enlace de Wikipedia:"
-#: bookwyrm/templates/author/edit_author.html:57
+#: bookwyrm/templates/author/edit_author.html:63
msgid "Birth date:"
msgstr "Fecha de nacimiento:"
-#: bookwyrm/templates/author/edit_author.html:65
+#: bookwyrm/templates/author/edit_author.html:71
msgid "Death date:"
msgstr "Fecha de muerte:"
-#: bookwyrm/templates/author/edit_author.html:73
+#: bookwyrm/templates/author/edit_author.html:79
msgid "Author Identifiers"
msgstr "Identificadores de autor/autora"
-#: bookwyrm/templates/author/edit_author.html:74
+#: bookwyrm/templates/author/edit_author.html:81
msgid "Openlibrary key:"
msgstr "Clave OpenLibrary:"
-#: bookwyrm/templates/author/edit_author.html:79
-#: bookwyrm/templates/book/edit_book.html:243
+#: bookwyrm/templates/author/edit_author.html:89
+#: bookwyrm/templates/book/edit_book.html:293
msgid "Inventaire ID:"
msgstr "ID Inventaire:"
-#: bookwyrm/templates/author/edit_author.html:84
+#: bookwyrm/templates/author/edit_author.html:97
msgid "Librarything key:"
msgstr "Clave Librarything:"
-#: bookwyrm/templates/author/edit_author.html:89
+#: bookwyrm/templates/author/edit_author.html:105
msgid "Goodreads key:"
msgstr "Clave Goodreads:"
-#: bookwyrm/templates/author/edit_author.html:98
-#: bookwyrm/templates/book/book.html:124
-#: bookwyrm/templates/book/edit_book.html:263
+#: bookwyrm/templates/author/edit_author.html:116
+#: bookwyrm/templates/book/book.html:141
+#: bookwyrm/templates/book/edit_book.html:321
+#: bookwyrm/templates/book/readthrough.html:77
#: bookwyrm/templates/lists/form.html:42
-#: bookwyrm/templates/preferences/edit_user.html:70
+#: bookwyrm/templates/preferences/edit_user.html:78
#: bookwyrm/templates/settings/announcement_form.html:69
#: bookwyrm/templates/settings/edit_server.html:68
#: bookwyrm/templates/settings/federated_server.html:98
-#: bookwyrm/templates/settings/site.html:97
-#: bookwyrm/templates/snippets/readthrough.html:77
+#: bookwyrm/templates/settings/site.html:101
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:42
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:42
-#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:34
-#: bookwyrm/templates/user_admin/user_moderation_actions.html:38
+#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:36
+#: bookwyrm/templates/user_admin/user_moderation_actions.html:45
msgid "Save"
msgstr "Guardar"
-#: bookwyrm/templates/author/edit_author.html:99
-#: bookwyrm/templates/book/book.html:125 bookwyrm/templates/book/book.html:174
+#: bookwyrm/templates/author/edit_author.html:117
+#: bookwyrm/templates/book/book.html:142 bookwyrm/templates/book/book.html:191
#: bookwyrm/templates/book/cover_modal.html:32
-#: bookwyrm/templates/book/edit_book.html:264
+#: bookwyrm/templates/book/edit_book.html:322
+#: bookwyrm/templates/book/readthrough.html:78
#: bookwyrm/templates/moderation/report_modal.html:34
#: bookwyrm/templates/settings/federated_server.html:99
#: bookwyrm/templates/snippets/delete_readthrough_modal.html:17
#: bookwyrm/templates/snippets/goal_form.html:32
-#: bookwyrm/templates/snippets/readthrough.html:78
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:43
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:43
-#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:35
+#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:37
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:28
msgid "Cancel"
msgstr "Cancelar"
-#: bookwyrm/templates/book/book.html:31
+#: bookwyrm/templates/book/book.html:48
#: bookwyrm/templates/discover/large-book.html:25
#: bookwyrm/templates/discover/small-book.html:19
msgid "by"
msgstr "por"
-#: bookwyrm/templates/book/book.html:39 bookwyrm/templates/book/book.html:40
+#: bookwyrm/templates/book/book.html:56 bookwyrm/templates/book/book.html:57
msgid "Edit Book"
msgstr "Editar Libro"
-#: bookwyrm/templates/book/book.html:57
+#: bookwyrm/templates/book/book.html:74
#: bookwyrm/templates/book/cover_modal.html:5
msgid "Add cover"
msgstr "Agregar portada"
-#: bookwyrm/templates/book/book.html:61
+#: bookwyrm/templates/book/book.html:78
msgid "Failed to load cover"
msgstr "No se pudo cargar la portada"
-#: bookwyrm/templates/book/book.html:101
+#: bookwyrm/templates/book/book.html:118
#, 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:113
+#: bookwyrm/templates/book/book.html:130
msgid "Add Description"
msgstr "Agregar descripción"
-#: bookwyrm/templates/book/book.html:120
-#: bookwyrm/templates/book/edit_book.html:108
+#: bookwyrm/templates/book/book.html:137
+#: bookwyrm/templates/book/edit_book.html:136
#: bookwyrm/templates/lists/form.html:12
msgid "Description:"
msgstr "Descripción:"
-#: bookwyrm/templates/book/book.html:134
+#: bookwyrm/templates/book/book.html:151
#, python-format
msgid "%(count)s editions"
msgstr "%(count)s ediciones"
-#: bookwyrm/templates/book/book.html:142
+#: bookwyrm/templates/book/book.html:159
#, python-format
msgid "This edition is on your %(shelf_name)s shelf."
msgstr "Esta edición está en tu %(shelf_name)s estante."
-#: bookwyrm/templates/book/book.html:148
+#: bookwyrm/templates/book/book.html:165
#, 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 %(shelf_name)s estante."
-#: bookwyrm/templates/book/book.html:159
+#: bookwyrm/templates/book/book.html:176
msgid "Your reading activity"
msgstr "Tu actividad de lectura"
-#: bookwyrm/templates/book/book.html:162
+#: bookwyrm/templates/book/book.html:179
msgid "Add read dates"
msgstr "Agregar fechas de lectura"
-#: bookwyrm/templates/book/book.html:171
+#: bookwyrm/templates/book/book.html:188
msgid "Create"
msgstr "Crear"
-#: bookwyrm/templates/book/book.html:181
+#: bookwyrm/templates/book/book.html:198
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:200
+#: bookwyrm/templates/book/book.html:217
msgid "Reviews"
msgstr "Reseñas"
-#: bookwyrm/templates/book/book.html:205
+#: bookwyrm/templates/book/book.html:222
msgid "Your reviews"
msgstr "Tus reseñas"
-#: bookwyrm/templates/book/book.html:211
+#: bookwyrm/templates/book/book.html:228
msgid "Your comments"
msgstr "Tus comentarios"
-#: bookwyrm/templates/book/book.html:217
+#: bookwyrm/templates/book/book.html:234
msgid "Your quotes"
msgstr "Tus citas"
-#: bookwyrm/templates/book/book.html:253
+#: bookwyrm/templates/book/book.html:270
msgid "Subjects"
msgstr "Sujetos"
-#: bookwyrm/templates/book/book.html:265
+#: bookwyrm/templates/book/book.html:282
msgid "Places"
msgstr "Lugares"
-#: bookwyrm/templates/book/book.html:276 bookwyrm/templates/layout.html:61
+#: bookwyrm/templates/book/book.html:293 bookwyrm/templates/layout.html:68
#: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:25
#: bookwyrm/templates/search/layout.html:50
-#: bookwyrm/templates/user/layout.html:68
+#: bookwyrm/templates/user/layout.html:75
msgid "Lists"
msgstr "Listas"
-#: bookwyrm/templates/book/book.html:287
+#: bookwyrm/templates/book/book.html:304
msgid "Add to list"
msgstr "Agregar a lista"
-#: bookwyrm/templates/book/book.html:297
+#: bookwyrm/templates/book/book.html:314
#: bookwyrm/templates/book/cover_modal.html:31
#: bookwyrm/templates/lists/list.html:179
msgid "Add"
@@ -390,22 +426,22 @@ msgid "ISBN:"
msgstr "ISBN:"
#: bookwyrm/templates/book/book_identifiers.html:14
-#: bookwyrm/templates/book/edit_book.html:248
+#: bookwyrm/templates/book/edit_book.html:301
msgid "OCLC Number:"
msgstr "Número OCLC:"
#: bookwyrm/templates/book/book_identifiers.html:21
-#: bookwyrm/templates/book/edit_book.html:253
+#: bookwyrm/templates/book/edit_book.html:309
msgid "ASIN:"
msgstr "ASIN:"
#: bookwyrm/templates/book/cover_modal.html:17
-#: bookwyrm/templates/book/edit_book.html:192
+#: bookwyrm/templates/book/edit_book.html:229
msgid "Upload cover:"
msgstr "Subir portada:"
#: bookwyrm/templates/book/cover_modal.html:23
-#: bookwyrm/templates/book/edit_book.html:198
+#: bookwyrm/templates/book/edit_book.html:235
msgid "Load cover from url:"
msgstr "Agregar portada de url:"
@@ -420,127 +456,134 @@ msgstr "Editar \"%(book_title)s\""
msgid "Add Book"
msgstr "Agregar libro"
-#: bookwyrm/templates/book/edit_book.html:40
+#: bookwyrm/templates/book/edit_book.html:54
msgid "Confirm Book Info"
msgstr "Confirmar información de libro"
-#: bookwyrm/templates/book/edit_book.html:47
+#: bookwyrm/templates/book/edit_book.html:62
#, python-format
msgid "Is \"%(name)s\" an existing author?"
msgstr "¿Es \"%(name)s\" un autor ya existente?"
-#: bookwyrm/templates/book/edit_book.html:52
+#: bookwyrm/templates/book/edit_book.html:71
#, python-format
msgid "Author of %(book_title)s"
msgstr "Autor de %(book_title)s"
-#: bookwyrm/templates/book/edit_book.html:55
+#: bookwyrm/templates/book/edit_book.html:75
msgid "This is a new author"
msgstr "Este es un autor nuevo"
-#: bookwyrm/templates/book/edit_book.html:61
+#: bookwyrm/templates/book/edit_book.html:82
#, python-format
msgid "Creating a new author: %(name)s"
msgstr "Creando un autor nuevo: %(name)s"
-#: bookwyrm/templates/book/edit_book.html:67
+#: bookwyrm/templates/book/edit_book.html:89
msgid "Is this an edition of an existing work?"
msgstr "¿Es esta una edición de una obra ya existente?"
-#: bookwyrm/templates/book/edit_book.html:71
+#: bookwyrm/templates/book/edit_book.html:97
msgid "This is a new work"
msgstr "Esta es una obra nueva"
-#: bookwyrm/templates/book/edit_book.html:77
+#: bookwyrm/templates/book/edit_book.html:104
#: bookwyrm/templates/password_reset.html:30
msgid "Confirm"
msgstr "Confirmar"
-#: bookwyrm/templates/book/edit_book.html:79
+#: bookwyrm/templates/book/edit_book.html:106
#: bookwyrm/templates/feed/status.html:8
msgid "Back"
msgstr "Volver"
-#: bookwyrm/templates/book/edit_book.html:93
+#: bookwyrm/templates/book/edit_book.html:120
msgid "Title:"
msgstr "Título:"
-#: bookwyrm/templates/book/edit_book.html:101
+#: bookwyrm/templates/book/edit_book.html:128
msgid "Subtitle:"
msgstr "Subtítulo:"
-#: bookwyrm/templates/book/edit_book.html:114
+#: bookwyrm/templates/book/edit_book.html:144
msgid "Series:"
msgstr "Serie:"
-#: bookwyrm/templates/book/edit_book.html:122
+#: bookwyrm/templates/book/edit_book.html:152
msgid "Series number:"
msgstr "Número de serie:"
-#: bookwyrm/templates/book/edit_book.html:130
+#: bookwyrm/templates/book/edit_book.html:160
msgid "Languages:"
msgstr "Idiomas:"
-#: bookwyrm/templates/book/edit_book.html:139
+#: bookwyrm/templates/book/edit_book.html:169
msgid "Publisher:"
msgstr "Editorial:"
-#: bookwyrm/templates/book/edit_book.html:148
+#: bookwyrm/templates/book/edit_book.html:178
msgid "First published date:"
msgstr "Fecha de primera publicación:"
-#: bookwyrm/templates/book/edit_book.html:156
+#: bookwyrm/templates/book/edit_book.html:186
msgid "Published date:"
msgstr "Fecha de publicación:"
-#: bookwyrm/templates/book/edit_book.html:165
+#: bookwyrm/templates/book/edit_book.html:195
msgid "Authors"
msgstr "Autores"
-#: bookwyrm/templates/book/edit_book.html:171
-#, python-format
-msgid "Remove %(name)s"
-msgstr "Eliminar %(name)s"
+#: bookwyrm/templates/book/edit_book.html:202
+#, fuzzy, python-format
+#| msgid "Remove from %(name)s"
+msgid "Remove %(name)s"
+msgstr "Quitar de %(name)s"
-#: bookwyrm/templates/book/edit_book.html:176
+#: bookwyrm/templates/book/edit_book.html:205
+#, fuzzy, python-format
+#| msgid "Remove from %(name)s"
+msgid "Author page for %(name)s"
+msgstr "Quitar de %(name)s"
+
+#: bookwyrm/templates/book/edit_book.html:212
msgid "Add Authors:"
msgstr "Agregar Autores:"
-#: bookwyrm/templates/book/edit_book.html:177
+#: bookwyrm/templates/book/edit_book.html:213
msgid "John Doe, Jane Smith"
msgstr "Juan Nadie, Natalia Natalia"
-#: bookwyrm/templates/book/edit_book.html:183
+#: bookwyrm/templates/book/edit_book.html:220
#: bookwyrm/templates/user/shelf/shelf.html:78
msgid "Cover"
msgstr "Portada:"
-#: bookwyrm/templates/book/edit_book.html:211
+#: bookwyrm/templates/book/edit_book.html:248
msgid "Physical Properties"
msgstr "Propiedades físicas:"
-#: bookwyrm/templates/book/edit_book.html:212
+#: bookwyrm/templates/book/edit_book.html:250
#: bookwyrm/templates/book/format_filter.html:5
msgid "Format:"
msgstr "Formato:"
-#: bookwyrm/templates/book/edit_book.html:220
+#: bookwyrm/templates/book/edit_book.html:258
msgid "Pages:"
msgstr "Páginas:"
-#: bookwyrm/templates/book/edit_book.html:227
+#: bookwyrm/templates/book/edit_book.html:267
msgid "Book Identifiers"
msgstr "Identificadores de libro"
-#: bookwyrm/templates/book/edit_book.html:228
+#: bookwyrm/templates/book/edit_book.html:269
msgid "ISBN 13:"
msgstr "ISBN 13:"
-#: bookwyrm/templates/book/edit_book.html:233
+#: bookwyrm/templates/book/edit_book.html:277
msgid "ISBN 10:"
msgstr "ISBN 10:"
-#: bookwyrm/templates/book/edit_book.html:238
+#: bookwyrm/templates/book/edit_book.html:285
msgid "Openlibrary ID:"
msgstr "ID OpenLibrary:"
@@ -602,11 +645,40 @@ msgstr "Publicado por %(publisher)s."
msgid "rated it"
msgstr "lo calificó con"
+#: bookwyrm/templates/book/readthrough.html:8
+msgid "Progress Updates:"
+msgstr "Actualizaciones de progreso:"
+
+#: bookwyrm/templates/book/readthrough.html:14
+msgid "finished"
+msgstr "terminado"
+
+#: bookwyrm/templates/book/readthrough.html:25
+msgid "Show all updates"
+msgstr "Mostrar todas las actualizaciones"
+
+#: bookwyrm/templates/book/readthrough.html:41
+msgid "Delete this progress update"
+msgstr "Eliminar esta actualización de progreso"
+
+#: bookwyrm/templates/book/readthrough.html:52
+msgid "started"
+msgstr "empezado"
+
+#: bookwyrm/templates/book/readthrough.html:59
+#: bookwyrm/templates/book/readthrough.html:73
+msgid "Edit read dates"
+msgstr "Editar fechas de lectura"
+
+#: bookwyrm/templates/book/readthrough.html:63
+msgid "Delete these read dates"
+msgstr "Eliminar estas fechas de lectura"
+
#: bookwyrm/templates/components/inline_form.html:8
#: bookwyrm/templates/components/modal.html:11
-#: bookwyrm/templates/feed/feed_layout.html:69
-#: bookwyrm/templates/get_started/layout.html:19
-#: bookwyrm/templates/get_started/layout.html:52
+#: bookwyrm/templates/feed/layout.html:71
+#: bookwyrm/templates/get_started/layout.html:20
+#: bookwyrm/templates/get_started/layout.html:53
#: bookwyrm/templates/search/book.html:32
#: bookwyrm/templates/snippets/announcement.html:18
msgid "Close"
@@ -630,7 +702,7 @@ msgstr "Comunidad federalizada"
#: bookwyrm/templates/directory/directory.html:4
#: bookwyrm/templates/directory/directory.html:9
-#: bookwyrm/templates/layout.html:64
+#: bookwyrm/templates/layout.html:71
msgid "Directory"
msgstr "Directorio"
@@ -661,23 +733,32 @@ msgstr "Sugerido"
msgid "Recently active"
msgstr "Activ@ recientemente"
-#: bookwyrm/templates/directory/user_card.html:33
+#: bookwyrm/templates/directory/user_card.html:17
+#: bookwyrm/templates/directory/user_card.html:18
+#: bookwyrm/templates/user/user_preview.html:16
+#: bookwyrm/templates/user/user_preview.html:17
+#, fuzzy
+#| msgid "Your Account"
+msgid "Locked account"
+msgstr "Tu cuenta"
+
+#: bookwyrm/templates/directory/user_card.html:40
msgid "follower you follow"
msgid_plural "followers you follow"
msgstr[0] "seguidor que tu sigues"
msgstr[1] "seguidores que tu sigues"
-#: bookwyrm/templates/directory/user_card.html:40
+#: bookwyrm/templates/directory/user_card.html:47
msgid "book on your shelves"
msgid_plural "books on your shelves"
msgstr[0] "libro en tus estantes"
msgstr[1] "libro en tus estantes"
-#: bookwyrm/templates/directory/user_card.html:48
+#: bookwyrm/templates/directory/user_card.html:55
msgid "posts"
msgstr "publicaciones"
-#: bookwyrm/templates/directory/user_card.html:54
+#: bookwyrm/templates/directory/user_card.html:61
msgid "last active"
msgstr "actividad reciente"
@@ -713,7 +794,7 @@ msgid "Recent Books"
msgstr "Libros recientes"
#: bookwyrm/templates/discover/landing_layout.html:5
-#: bookwyrm/templates/get_started/layout.html:4
+#: bookwyrm/templates/get_started/layout.html:5
msgid "Welcome"
msgstr "Bienvenidos"
@@ -831,7 +912,7 @@ msgid "Direct Messages with %(username)s"
msgstr "Mensajes directos con %(username)s"
#: bookwyrm/templates/feed/direct_messages.html:10
-#: bookwyrm/templates/layout.html:92
+#: bookwyrm/templates/layout.html:99
msgid "Direct Messages"
msgstr "Mensajes directos"
@@ -843,93 +924,55 @@ msgstr "Todos los mensajes"
msgid "You have no messages right now."
msgstr "No tienes ningún mensaje en este momento."
-#: bookwyrm/templates/feed/feed.html:8
-msgid "Home Timeline"
-msgstr "Línea temporal de hogar"
-
-#: bookwyrm/templates/feed/feed.html:10
-msgid "Local Timeline"
-msgstr "Línea temporal local"
-
-#: bookwyrm/templates/feed/feed.html:12
-msgid "Federated Timeline"
-msgstr "Línea temporal federalizado"
-
-#: bookwyrm/templates/feed/feed.html:18
-msgid "Home"
-msgstr "Hogar"
-
-#: bookwyrm/templates/feed/feed.html:21
-msgid "Local"
-msgstr "Local"
-
-#: bookwyrm/templates/feed/feed.html:24
-#: bookwyrm/templates/settings/edit_server.html:40
-msgid "Federated"
-msgstr "Federalizado"
-
-#: bookwyrm/templates/feed/feed.html:32
-#, python-format
-msgid "load 0 unread status(es)"
+#: bookwyrm/templates/feed/feed.html:22
+#, fuzzy, python-format
+#| msgid "load 0 unread status(es)"
+msgid "load 0 unread status(es)"
msgstr "cargar 0 status(es) no leídos"
-#: bookwyrm/templates/feed/feed.html:47
+#: bookwyrm/templates/feed/feed.html:38
msgid "There aren't any activities right now! Try following a user to get started"
msgstr "¡No hay actividad ahora mismo! Sigue a otro usuario para empezar"
-#: bookwyrm/templates/feed/feed.html:55
-#: bookwyrm/templates/get_started/users.html:6
-msgid "Who to follow"
-msgstr "A quién seguir"
-
-#: bookwyrm/templates/feed/feed_layout.html:4
+#: bookwyrm/templates/feed/layout.html:5
msgid "Updates"
msgstr "Actualizaciones"
-#: bookwyrm/templates/feed/feed_layout.html:10
+#: bookwyrm/templates/feed/layout.html:12
#: bookwyrm/templates/user/shelf/books_header.html:3
msgid "Your books"
msgstr "Tus libros"
-#: bookwyrm/templates/feed/feed_layout.html:12
+#: bookwyrm/templates/feed/layout.html:14
msgid "There are no books here right now! Try searching for a book to get started"
msgstr "¡No hay ningún libro aqui ahorita! Busca a un libro para empezar"
-#: bookwyrm/templates/feed/feed_layout.html:23
+#: bookwyrm/templates/feed/layout.html:25
#: bookwyrm/templates/user/shelf/shelf.html:29
msgid "To Read"
msgstr "Para leer"
-#: bookwyrm/templates/feed/feed_layout.html:24
+#: bookwyrm/templates/feed/layout.html:26
#: bookwyrm/templates/user/shelf/shelf.html:29
msgid "Currently Reading"
msgstr "Leyendo actualmente"
-#: bookwyrm/templates/feed/feed_layout.html:25
-#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:13
+#: bookwyrm/templates/feed/layout.html:27
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:16
#: bookwyrm/templates/user/shelf/shelf.html:29
msgid "Read"
msgstr "Leido"
-#: bookwyrm/templates/feed/feed_layout.html:87 bookwyrm/templates/goal.html:26
+#: bookwyrm/templates/feed/layout.html:90 bookwyrm/templates/goal.html:26
#: bookwyrm/templates/snippets/goal_card.html:6
#, python-format
msgid "%(year)s Reading Goal"
msgstr "%(year)s Meta de lectura"
-#: bookwyrm/templates/feed/suggested_users.html:16
-#, python-format
-msgid "%(mutuals)s follower you follow"
-msgid_plural "%(mutuals)s followers you follow"
-msgstr[0] "%(mutuals)s seguidor que sigues"
-msgstr[1] "%(mutuals)s seguidores que sigues"
-
-#: bookwyrm/templates/feed/suggested_users.html:19
-#, python-format
-msgid "%(shared_books)s book on your shelves"
-msgid_plural "%(shared_books)s books on your shelves"
-msgstr[0] "%(shared_books)s libro en tus estantes"
-msgstr[1] "%(shared_books)s libros en tus estantes"
+#: bookwyrm/templates/feed/suggested_users.html:3
+#: bookwyrm/templates/get_started/users.html:6
+msgid "Who to follow"
+msgstr "A quién seguir"
#: bookwyrm/templates/get_started/book_preview.html:6
#, python-format
@@ -960,7 +1003,7 @@ msgstr "Puedes agregar libros cuando comiences a usar %(site_name)s."
#: bookwyrm/templates/get_started/books.html:17
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
-#: bookwyrm/templates/layout.html:37 bookwyrm/templates/layout.html:38
+#: bookwyrm/templates/layout.html:44 bookwyrm/templates/layout.html:45
#: bookwyrm/templates/lists/list.html:139
#: bookwyrm/templates/search/layout.html:4
#: bookwyrm/templates/search/layout.html:9
@@ -986,33 +1029,33 @@ msgstr "No se encontró ningún libro"
msgid "Save & continue"
msgstr "Guardar & continuar"
-#: bookwyrm/templates/get_started/layout.html:14
+#: bookwyrm/templates/get_started/layout.html:15
#, python-format
msgid "Welcome to %(site_name)s!"
msgstr "¡Bienvenido a %(site_name)s!"
-#: bookwyrm/templates/get_started/layout.html:16
+#: bookwyrm/templates/get_started/layout.html:17
msgid "These are some first steps to get you started."
msgstr "Estos son unos primeros pasos para empezar."
-#: bookwyrm/templates/get_started/layout.html:30
+#: bookwyrm/templates/get_started/layout.html:31
#: bookwyrm/templates/get_started/profile.html:6
msgid "Create your profile"
msgstr "Crear tu perfil"
-#: bookwyrm/templates/get_started/layout.html:34
+#: bookwyrm/templates/get_started/layout.html:35
msgid "Add books"
msgstr "Agregar libros"
-#: bookwyrm/templates/get_started/layout.html:38
+#: bookwyrm/templates/get_started/layout.html:39
msgid "Find friends"
msgstr "Encontrar amigos"
-#: bookwyrm/templates/get_started/layout.html:44
+#: bookwyrm/templates/get_started/layout.html:45
msgid "Skip this step"
msgstr "Saltar este paso"
-#: bookwyrm/templates/get_started/layout.html:48
+#: bookwyrm/templates/get_started/layout.html:49
msgid "Finish"
msgstr "Terminar"
@@ -1041,7 +1084,7 @@ msgid "Manually approve followers:"
msgstr "Aprobar seguidores a mano:"
#: bookwyrm/templates/get_started/profile.html:48
-#: bookwyrm/templates/preferences/edit_user.html:58
+#: bookwyrm/templates/preferences/edit_user.html:66
msgid "Show this account in suggested users:"
msgstr "Mostrar esta cuenta en los usuarios sugeridos:"
@@ -1122,70 +1165,87 @@ msgstr "Importaciones recientes"
msgid "No recent imports"
msgstr "No hay ninguna importación reciente"
-#: bookwyrm/templates/import_status.html:5
-#: bookwyrm/templates/import_status.html:9
+#: bookwyrm/templates/import_status.html:6
+#: bookwyrm/templates/import_status.html:10
msgid "Import Status"
msgstr "Status de importación"
-#: bookwyrm/templates/import_status.html:12
+#: bookwyrm/templates/import_status.html:11
+#, fuzzy
+#| msgid "Back to reports"
+msgid "Back to imports"
+msgstr "Volver a los informes"
+
+#: bookwyrm/templates/import_status.html:15
msgid "Import started:"
msgstr "Importación ha empezado:"
-#: bookwyrm/templates/import_status.html:16
+#: bookwyrm/templates/import_status.html:20
msgid "Import completed:"
msgstr "Importación ha terminado:"
-#: bookwyrm/templates/import_status.html:19
+#: bookwyrm/templates/import_status.html:25
msgid "TASK FAILED"
msgstr "TAREA FALLÓ"
-#: bookwyrm/templates/import_status.html:25
+#: bookwyrm/templates/import_status.html:32
msgid "Import still in progress."
msgstr "Importación todavia en progreso"
-#: bookwyrm/templates/import_status.html:27
+#: bookwyrm/templates/import_status.html:34
msgid "(Hit reload to update!)"
msgstr "(¡Refresca para actualizar!)"
-#: bookwyrm/templates/import_status.html:34
+#: bookwyrm/templates/import_status.html:41
msgid "Failed to load"
msgstr "No se pudo cargar"
-#: bookwyrm/templates/import_status.html:43
+#: bookwyrm/templates/import_status.html:50
#, python-format
msgid "Jump to the bottom of the list to select the %(failed_count)s items which failed to import."
msgstr "Saltar al final de la lista para seleccionar los %(failed_count)s artículos que no se pudieron importar."
-#: bookwyrm/templates/import_status.html:78
+#: bookwyrm/templates/import_status.html:62
+#, python-format
+msgid "Line %(index)s: %(title)s by %(author)s"
+msgstr ""
+
+#: bookwyrm/templates/import_status.html:82
msgid "Select all"
msgstr "Seleccionar todo"
-#: bookwyrm/templates/import_status.html:81
+#: bookwyrm/templates/import_status.html:85
msgid "Retry items"
msgstr "Reintentar ítems"
-#: bookwyrm/templates/import_status.html:107
+#: bookwyrm/templates/import_status.html:112
msgid "Successfully imported"
msgstr "Importado exitosamente"
-#: bookwyrm/templates/import_status.html:111
+#: bookwyrm/templates/import_status.html:114
+#, fuzzy
+#| msgid "Import still in progress."
+msgid "Import Progress"
+msgstr "Importación todavia en progreso"
+
+#: bookwyrm/templates/import_status.html:119
msgid "Book"
msgstr "Libro"
-#: bookwyrm/templates/import_status.html:114
+#: bookwyrm/templates/import_status.html:122
#: bookwyrm/templates/snippets/create_status_form.html:13
#: bookwyrm/templates/user/shelf/shelf.html:79
#: bookwyrm/templates/user/shelf/shelf.html:99
msgid "Title"
msgstr "Título"
-#: bookwyrm/templates/import_status.html:117
+#: bookwyrm/templates/import_status.html:125
#: bookwyrm/templates/user/shelf/shelf.html:80
#: bookwyrm/templates/user/shelf/shelf.html:102
msgid "Author"
msgstr "Autor/Autora"
-#: bookwyrm/templates/import_status.html:140
+#: bookwyrm/templates/import_status.html:148
msgid "Imported"
msgstr "Importado"
@@ -1215,27 +1275,27 @@ msgstr "Resultados de búsqueda por \"%(query)s\""
msgid "Matching Books"
msgstr "Libros correspondientes"
-#: bookwyrm/templates/layout.html:33
+#: bookwyrm/templates/layout.html:40
msgid "Search for a book or user"
msgstr "Buscar un libro o un usuario"
-#: bookwyrm/templates/layout.html:47 bookwyrm/templates/layout.html:48
+#: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55
msgid "Main navigation menu"
msgstr "Menú de navigación central"
-#: bookwyrm/templates/layout.html:58
+#: bookwyrm/templates/layout.html:65
msgid "Feed"
msgstr "Actividad"
-#: bookwyrm/templates/layout.html:87
+#: bookwyrm/templates/layout.html:94
msgid "Your Books"
msgstr "Tus libros"
-#: bookwyrm/templates/layout.html:97
+#: bookwyrm/templates/layout.html:104
msgid "Settings"
msgstr "Configuración"
-#: bookwyrm/templates/layout.html:106
+#: bookwyrm/templates/layout.html:113
#: bookwyrm/templates/settings/admin_layout.html:31
#: bookwyrm/templates/settings/manage_invite_requests.html:15
#: bookwyrm/templates/settings/manage_invites.html:3
@@ -1243,63 +1303,63 @@ msgstr "Configuración"
msgid "Invites"
msgstr "Invitaciones"
-#: bookwyrm/templates/layout.html:113
+#: bookwyrm/templates/layout.html:120
msgid "Admin"
msgstr "Admin"
-#: bookwyrm/templates/layout.html:120
+#: bookwyrm/templates/layout.html:127
msgid "Log out"
msgstr "Cerrar sesión"
-#: bookwyrm/templates/layout.html:128 bookwyrm/templates/layout.html:129
+#: bookwyrm/templates/layout.html:135 bookwyrm/templates/layout.html:136
#: bookwyrm/templates/notifications.html:6
#: bookwyrm/templates/notifications.html:11
msgid "Notifications"
msgstr "Notificaciones"
-#: bookwyrm/templates/layout.html:151 bookwyrm/templates/layout.html:155
+#: bookwyrm/templates/layout.html:158 bookwyrm/templates/layout.html:162
#: bookwyrm/templates/login.html:17
#: bookwyrm/templates/snippets/register_form.html:4
msgid "Username:"
msgstr "Nombre de usuario:"
-#: bookwyrm/templates/layout.html:156
+#: bookwyrm/templates/layout.html:163
msgid "password"
msgstr "contraseña"
-#: bookwyrm/templates/layout.html:157 bookwyrm/templates/login.html:36
+#: bookwyrm/templates/layout.html:164 bookwyrm/templates/login.html:36
msgid "Forgot your password?"
msgstr "¿Olvidaste tu contraseña?"
-#: bookwyrm/templates/layout.html:160 bookwyrm/templates/login.html:10
+#: bookwyrm/templates/layout.html:167 bookwyrm/templates/login.html:10
#: bookwyrm/templates/login.html:33
msgid "Log in"
msgstr "Iniciar sesión"
-#: bookwyrm/templates/layout.html:168
+#: bookwyrm/templates/layout.html:175
msgid "Join"
msgstr "Unirse"
-#: bookwyrm/templates/layout.html:206
+#: bookwyrm/templates/layout.html:213
#, fuzzy
#| msgid "About this server"
msgid "About this instance"
msgstr "Sobre este servidor"
-#: bookwyrm/templates/layout.html:210
+#: bookwyrm/templates/layout.html:217
msgid "Contact site admin"
msgstr "Contactarse con administradores del sitio"
-#: bookwyrm/templates/layout.html:214
+#: bookwyrm/templates/layout.html:221
msgid "Documentation"
msgstr "Documentación de Django"
-#: bookwyrm/templates/layout.html:221
+#: bookwyrm/templates/layout.html:228
#, python-format
msgid "Support %(site_name)s on %(support_title)s"
msgstr "Apoyar %(site_name)s en %(support_title)s"
-#: bookwyrm/templates/layout.html:225
+#: bookwyrm/templates/layout.html:232
msgid "BookWyrm's source code is freely available. You can contribute or report issues on GitHub."
msgstr "BookWyrm es software de código abierto. Puedes contribuir o reportar problemas en GitHub."
@@ -1677,6 +1737,7 @@ msgstr "¡Estás al día!"
#: bookwyrm/templates/password_reset.html:23
#: bookwyrm/templates/preferences/change_password.html:18
+#: bookwyrm/templates/preferences/delete_user.html:20
msgid "Confirm password:"
msgstr "Confirmar contraseña:"
@@ -1690,7 +1751,7 @@ msgstr "Restablecer contraseña"
#: bookwyrm/templates/preferences/blocks.html:4
#: bookwyrm/templates/preferences/blocks.html:7
-#: bookwyrm/templates/preferences/preferences_layout.html:26
+#: bookwyrm/templates/preferences/layout.html:30
msgid "Blocked Users"
msgstr "Usuarios bloqueados"
@@ -1701,7 +1762,7 @@ msgstr "No hay ningún usuario bloqueado actualmente."
#: bookwyrm/templates/preferences/change_password.html:4
#: bookwyrm/templates/preferences/change_password.html:7
#: bookwyrm/templates/preferences/change_password.html:21
-#: bookwyrm/templates/preferences/preferences_layout.html:19
+#: bookwyrm/templates/preferences/layout.html:19
msgid "Change Password"
msgstr "Cambiar contraseña"
@@ -1709,6 +1770,23 @@ msgstr "Cambiar contraseña"
msgid "New password:"
msgstr "Nueva contraseña:"
+#: bookwyrm/templates/preferences/delete_user.html:4
+#: bookwyrm/templates/preferences/delete_user.html:7
+#: bookwyrm/templates/preferences/delete_user.html:26
+#: bookwyrm/templates/preferences/layout.html:23
+#, fuzzy
+#| msgid "Create an Account"
+msgid "Delete Account"
+msgstr "Crear una cuenta"
+
+#: bookwyrm/templates/preferences/delete_user.html:12
+msgid "Permanently delete account"
+msgstr ""
+
+#: bookwyrm/templates/preferences/delete_user.html:14
+msgid "Deleting your account cannot be undone. The username will not be available to register in the future."
+msgstr ""
+
#: bookwyrm/templates/preferences/edit_user.html:4
#: bookwyrm/templates/preferences/edit_user.html:7
msgid "Edit Profile"
@@ -1718,44 +1796,68 @@ msgstr "Editar perfil"
msgid "Show set reading goal prompt in feed:"
msgstr "Mostrar meta de lectura en el feed:"
-#: bookwyrm/templates/preferences/edit_user.html:62
+#: bookwyrm/templates/preferences/edit_user.html:58
+#, fuzzy
+#| msgid "Post privacy"
+msgid "Default post privacy:"
+msgstr "Privacidad de publicación"
+
+#: bookwyrm/templates/preferences/edit_user.html:70
#, python-format
msgid "Your account will show up in the directory, and may be recommended to other BookWyrm users."
msgstr "Tu cuenta se aparecerá en el directorio, y puede ser recomendado a otros usuarios de BookWyrm."
-#: bookwyrm/templates/preferences/edit_user.html:65
+#: bookwyrm/templates/preferences/edit_user.html:73
msgid "Preferred Timezone: "
msgstr "Huso horario preferido"
-#: bookwyrm/templates/preferences/preferences_layout.html:11
+#: bookwyrm/templates/preferences/layout.html:11
msgid "Account"
msgstr "Cuenta"
-#: bookwyrm/templates/preferences/preferences_layout.html:15
+#: bookwyrm/templates/preferences/layout.html:15
msgid "Profile"
msgstr "Perfil"
-#: bookwyrm/templates/preferences/preferences_layout.html:22
+#: bookwyrm/templates/preferences/layout.html:26
msgid "Relationships"
msgstr "Relaciones"
+#: bookwyrm/templates/reading_progress/finish.html:5
+#, fuzzy, python-format
+#| msgid "Finish \"%(book_title)s\""
+msgid "Finish \"%(book_title)s\""
+msgstr "Terminar \"%(book_title)s\""
+
+#: bookwyrm/templates/reading_progress/start.html:5
+#, fuzzy, python-format
+#| msgid "Edit \"%(book_title)s\""
+msgid "Start \"%(book_title)s\""
+msgstr "Editar \"%(book_title)s\""
+
+#: bookwyrm/templates/reading_progress/want.html:5
+#, fuzzy, python-format
+#| msgid "Want to Read \"%(book_title)s\""
+msgid "Want to Read \"%(book_title)s\""
+msgstr "Quiero leer \"%(book_title)s\""
+
#: bookwyrm/templates/rss/title.html:5
-#: bookwyrm/templates/snippets/status/status_header.html:35
+#: bookwyrm/templates/snippets/status/status_header.html:36
msgid "rated"
msgstr "calificó"
#: bookwyrm/templates/rss/title.html:7
-#: bookwyrm/templates/snippets/status/status_header.html:37
+#: bookwyrm/templates/snippets/status/status_header.html:38
msgid "reviewed"
msgstr "reseñó"
#: bookwyrm/templates/rss/title.html:9
-#: bookwyrm/templates/snippets/status/status_header.html:39
+#: bookwyrm/templates/snippets/status/status_header.html:40
msgid "commented on"
msgstr "comentó en"
#: bookwyrm/templates/rss/title.html:11
-#: bookwyrm/templates/snippets/status/status_header.html:41
+#: bookwyrm/templates/snippets/status/status_header.html:42
msgid "quoted"
msgstr "citó"
@@ -1779,12 +1881,6 @@ msgstr "Búsqueda"
msgid "Search type"
msgstr "Tipo de búsqueda"
-#: bookwyrm/templates/search/layout.html:21
-#: bookwyrm/templates/search/layout.html:42
-#: bookwyrm/templates/user/layout.html:74
-msgid "Books"
-msgstr "Libros"
-
#: bookwyrm/templates/search/layout.html:23
#: bookwyrm/templates/search/layout.html:46
#: bookwyrm/templates/settings/admin_layout.html:26
@@ -1966,6 +2062,10 @@ msgstr "Instancia:"
msgid "Status:"
msgstr "Status:"
+#: bookwyrm/templates/settings/edit_server.html:40
+msgid "Federated"
+msgstr "Federalizado"
+
#: bookwyrm/templates/settings/edit_server.html:41
#: bookwyrm/templates/settings/federated_server.html:10
msgid "Blocked"
@@ -1992,7 +2092,7 @@ msgid "Details"
msgstr "Detalles"
#: bookwyrm/templates/settings/federated_server.html:39
-#: bookwyrm/templates/user/layout.html:56
+#: bookwyrm/templates/user/layout.html:63
msgid "Activity"
msgstr "Actividad"
@@ -2031,7 +2131,7 @@ msgid "Edit"
msgstr "Editar"
#: bookwyrm/templates/settings/federated_server.html:105
-#: bookwyrm/templates/user_admin/user_moderation_actions.html:3
+#: bookwyrm/templates/user_admin/user_moderation_actions.html:8
msgid "Actions"
msgstr "Acciones"
@@ -2239,15 +2339,19 @@ msgstr "Correo electrónico de administradorx:"
msgid "Additional info:"
msgstr "Más informacion:"
-#: bookwyrm/templates/settings/site.html:83
-msgid "Allow registration:"
+#: bookwyrm/templates/settings/site.html:85
+#, fuzzy
+#| msgid "Allow registration:"
+msgid "Allow registration"
msgstr "Permitir registración:"
-#: bookwyrm/templates/settings/site.html:87
-msgid "Allow invite requests:"
+#: bookwyrm/templates/settings/site.html:91
+#, fuzzy
+#| msgid "Allow invite requests:"
+msgid "Allow invite requests"
msgstr "Permitir solicitudes de invitación:"
-#: bookwyrm/templates/settings/site.html:91
+#: bookwyrm/templates/settings/site.html:95
msgid "Registration closed text:"
msgstr "Texto de registración cerrada:"
@@ -2256,13 +2360,21 @@ msgstr "Texto de registración cerrada:"
msgid "Posted by %(username)s"
msgstr "Publicado por %(username)s"
-#: bookwyrm/templates/snippets/book_cover.html:31
+#: bookwyrm/templates/snippets/authors.html:22
+#, python-format
+msgid "and %(remainder_count_display)s other"
+msgid_plural "and %(remainder_count_display)s others"
+msgstr[0] ""
+msgstr[1] ""
+
+#: bookwyrm/templates/snippets/book_cover.html:32
msgid "No cover"
msgstr "Sin portada"
-#: bookwyrm/templates/snippets/book_titleby.html:4
-#, python-format
-msgid "%(title)s by "
+#: bookwyrm/templates/snippets/book_titleby.html:6
+#, fuzzy, python-format
+#| msgid "%(title)s by "
+msgid "%(title)s by"
msgstr "%(title)s por "
#: bookwyrm/templates/snippets/boost_button.html:20
@@ -2344,7 +2456,7 @@ msgstr "Incluir alerta de spoiler"
#: bookwyrm/templates/snippets/create_status_form.html:117
#: bookwyrm/templates/snippets/privacy-icons.html:15
#: bookwyrm/templates/snippets/privacy-icons.html:16
-#: bookwyrm/templates/snippets/privacy_select.html:19
+#: bookwyrm/templates/snippets/privacy_select.html:20
msgid "Private"
msgstr "Privada"
@@ -2461,7 +2573,7 @@ msgstr "Privacidad de meta:"
#: bookwyrm/templates/snippets/goal_form.html:26
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:37
-#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:29
+#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:31
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:20
msgid "Post to feed"
msgstr "Compartir con tu feed"
@@ -2506,13 +2618,13 @@ msgstr "Siguiente"
#: bookwyrm/templates/snippets/privacy-icons.html:3
#: bookwyrm/templates/snippets/privacy-icons.html:4
-#: bookwyrm/templates/snippets/privacy_select.html:10
+#: bookwyrm/templates/snippets/privacy_select.html:11
msgid "Public"
msgstr "Público"
#: bookwyrm/templates/snippets/privacy-icons.html:7
#: bookwyrm/templates/snippets/privacy-icons.html:8
-#: bookwyrm/templates/snippets/privacy_select.html:13
+#: bookwyrm/templates/snippets/privacy_select.html:14
msgid "Unlisted"
msgstr "Privado"
@@ -2524,7 +2636,7 @@ msgstr "Solo seguidores"
msgid "Post privacy"
msgstr "Privacidad de publicación"
-#: bookwyrm/templates/snippets/privacy_select.html:16
+#: bookwyrm/templates/snippets/privacy_select.html:17
#: bookwyrm/templates/user/relationships/followers.html:6
#: bookwyrm/templates/user/relationships/layout.html:11
msgid "Followers"
@@ -2538,38 +2650,9 @@ msgstr "Da una calificación"
msgid "Rate"
msgstr "Calificar"
-#: bookwyrm/templates/snippets/readthrough.html:8
-msgid "Progress Updates:"
-msgstr "Actualizaciones de progreso:"
-
-#: bookwyrm/templates/snippets/readthrough.html:14
-msgid "finished"
-msgstr "terminado"
-
-#: bookwyrm/templates/snippets/readthrough.html:25
-msgid "Show all updates"
-msgstr "Mostrar todas las actualizaciones"
-
-#: bookwyrm/templates/snippets/readthrough.html:41
-msgid "Delete this progress update"
-msgstr "Eliminar esta actualización de progreso"
-
-#: bookwyrm/templates/snippets/readthrough.html:52
-msgid "started"
-msgstr "empezado"
-
-#: bookwyrm/templates/snippets/readthrough.html:59
-#: bookwyrm/templates/snippets/readthrough.html:73
-msgid "Edit read dates"
-msgstr "Editar fechas de lectura"
-
-#: bookwyrm/templates/snippets/readthrough.html:63
-msgid "Delete these read dates"
-msgstr "Eliminar estas fechas de lectura"
-
#: bookwyrm/templates/snippets/readthrough_form.html:7
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:19
-#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:17
+#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:19
msgid "Started reading"
msgstr "Lectura se empezó"
@@ -2604,7 +2687,7 @@ msgid "Finish \"%(book_title)s\""
msgstr "Terminar \"%(book_title)s\""
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:5
-#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:36
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:45
msgid "Update progress"
msgstr "Progreso de actualización"
@@ -2612,20 +2695,20 @@ msgstr "Progreso de actualización"
msgid "More shelves"
msgstr "Más estantes"
-#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:10
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:11
msgid "Start reading"
msgstr "Empezar leer"
-#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:15
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:19
msgid "Finish reading"
msgstr "Terminar de leer"
-#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:18
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:25
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:26
msgid "Want to read"
msgstr "Quiero leer"
-#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:47
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:57
#, python-format
msgid "Remove from %(name)s"
msgstr "Quitar de %(name)s"
@@ -2640,17 +2723,17 @@ msgstr "Empezar \"%(book_title)s\""
msgid "Want to Read \"%(book_title)s\""
msgstr "Quiero leer \"%(book_title)s\""
-#: bookwyrm/templates/snippets/status/content_status.html:71
+#: bookwyrm/templates/snippets/status/content_status.html:72
#: bookwyrm/templates/snippets/trimmed_text.html:15
msgid "Show more"
msgstr "Mostrar más"
-#: bookwyrm/templates/snippets/status/content_status.html:86
+#: bookwyrm/templates/snippets/status/content_status.html:87
#: bookwyrm/templates/snippets/trimmed_text.html:30
msgid "Show less"
msgstr "Mostrar menos"
-#: bookwyrm/templates/snippets/status/content_status.html:116
+#: bookwyrm/templates/snippets/status/content_status.html:117
msgid "Open image in new window"
msgstr "Abrir imagen en una nueva ventana"
@@ -2673,7 +2756,7 @@ msgstr "Me gusta status"
msgid "boosted"
msgstr "respaldó"
-#: bookwyrm/templates/snippets/status/status_header.html:45
+#: bookwyrm/templates/snippets/status/status_header.html:46
#, python-format
msgid "replied to %(username)s's status"
msgstr "respondió al status de %(username)s "
@@ -2689,10 +2772,31 @@ msgstr "Eliminar y recomponer"
#: bookwyrm/templates/snippets/status/status_options.html:35
#: bookwyrm/templates/snippets/user_options.html:13
-#: bookwyrm/templates/user_admin/user_moderation_actions.html:6
+#: bookwyrm/templates/user_admin/user_moderation_actions.html:12
msgid "Send direct message"
msgstr "Enviar mensaje directo"
+#: bookwyrm/templates/snippets/suggested_users.html:16
+#, python-format
+msgid "%(mutuals)s follower you follow"
+msgid_plural "%(mutuals)s followers you follow"
+msgstr[0] "%(mutuals)s seguidor que sigues"
+msgstr[1] "%(mutuals)s seguidores que sigues"
+
+#: bookwyrm/templates/snippets/suggested_users.html:23
+#, python-format
+msgid "%(shared_books)s book on your shelves"
+msgid_plural "%(shared_books)s books on your shelves"
+msgstr[0] "%(shared_books)s libro en tus estantes"
+msgstr[1] "%(shared_books)s libros en tus estantes"
+
+#: bookwyrm/templates/snippets/suggested_users.html:31
+#: bookwyrm/templates/user/user_preview.html:36
+#, fuzzy
+#| msgid "followed you"
+msgid "Follows you"
+msgstr "te siguió"
+
#: bookwyrm/templates/snippets/switch_edition_button.html:5
msgid "Switch to this edition"
msgstr "Cambiar a esta edición"
@@ -2705,15 +2809,15 @@ msgstr "En orden ascendente"
msgid "Sorted descending"
msgstr "En orden descendente"
-#: bookwyrm/templates/user/layout.html:13 bookwyrm/templates/user/user.html:10
+#: bookwyrm/templates/user/layout.html:18 bookwyrm/templates/user/user.html:10
msgid "User Profile"
msgstr "Perfil de usuario"
-#: bookwyrm/templates/user/layout.html:37
+#: bookwyrm/templates/user/layout.html:44
msgid "Follow Requests"
msgstr "Solicitudes de seguidor"
-#: bookwyrm/templates/user/layout.html:62
+#: bookwyrm/templates/user/layout.html:69
msgid "Reading Goal"
msgstr "Meta de lectura"
@@ -2819,30 +2923,37 @@ msgstr "Feed RSS"
msgid "No activities yet!"
msgstr "¡Aún no actividades!"
-#: bookwyrm/templates/user/user_preview.html:15
+#: bookwyrm/templates/user/user_preview.html:22
#, python-format
msgid "Joined %(date)s"
msgstr "Unido %(date)s"
-#: bookwyrm/templates/user/user_preview.html:19
+#: bookwyrm/templates/user/user_preview.html:26
#, python-format
msgid "%(counter)s follower"
msgid_plural "%(counter)s followers"
msgstr[0] "%(counter)s seguidor"
msgstr[1] "%(counter)s seguidores"
-#: bookwyrm/templates/user/user_preview.html:20
+#: bookwyrm/templates/user/user_preview.html:27
#, python-format
msgid "%(counter)s following"
msgstr "%(counter)s siguiendo"
-#: bookwyrm/templates/user/user_preview.html:26
+#: bookwyrm/templates/user/user_preview.html:34
#, python-format
msgid "%(mutuals_display)s follower you follow"
msgid_plural "%(mutuals_display)s followers you follow"
msgstr[0] "%(mutuals_display)s seguidor que sigues"
msgstr[1] "%(mutuals_display)s seguidores que sigues"
+#: bookwyrm/templates/user/user_preview.html:38
+#, fuzzy
+#| msgid "follower you follow"
+#| msgid_plural "followers you follow"
+msgid "No followers you follow"
+msgstr "seguidor que tu sigues"
+
#: bookwyrm/templates/user_admin/user.html:9
msgid "Back to users"
msgstr "Volver a usuarios"
@@ -2900,22 +3011,31 @@ msgstr "Detalles de instancia"
msgid "View instance"
msgstr "Ver instancia"
-#: bookwyrm/templates/user_admin/user_moderation_actions.html:11
+#: bookwyrm/templates/user_admin/user_moderation_actions.html:5
+msgid "Permanently deleted"
+msgstr ""
+
+#: bookwyrm/templates/user_admin/user_moderation_actions.html:17
msgid "Suspend user"
msgstr "Suspender usuario"
-#: bookwyrm/templates/user_admin/user_moderation_actions.html:13
+#: bookwyrm/templates/user_admin/user_moderation_actions.html:19
msgid "Un-suspend user"
msgstr "Des-suspender usuario"
-#: bookwyrm/templates/user_admin/user_moderation_actions.html:21
+#: bookwyrm/templates/user_admin/user_moderation_actions.html:28
msgid "Access level:"
msgstr "Nivel de acceso:"
-#: bookwyrm/templates/widgets/clearable_file_input_with_warning.html:3
+#: bookwyrm/templates/widgets/clearable_file_input_with_warning.html:22
msgid "File exceeds maximum size: 10MB"
msgstr ""
+#: bookwyrm/templatetags/utilities.py:30
+#, python-format
+msgid "%(title)s: %(subtitle)s"
+msgstr ""
+
#: bookwyrm/views/import_data.py:67
msgid "Not a valid csv file"
msgstr "No un archivo csv válido"
@@ -2929,6 +3049,18 @@ msgstr "No se pudo encontrar un usuario con esa dirección de correo electrónic
msgid "A password reset link sent to %s"
msgstr "Un enlace para reestablecer tu contraseña se enviará a %s"
+#~ msgid "Local Timeline"
+#~ msgstr "Línea temporal local"
+
+#~ msgid "Federated Timeline"
+#~ msgstr "Línea temporal federalizado"
+
+#~ msgid "Local"
+#~ msgstr "Local"
+
+#~ msgid "Remove %(name)s"
+#~ msgstr "Eliminar %(name)s"
+
#~ msgid "Federated Servers"
#~ msgstr "Servidores federalizados"
diff --git a/locale/fr_FR/LC_MESSAGES/django.mo b/locale/fr_FR/LC_MESSAGES/django.mo
index 3d622ac66..f8ade2a39 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 d29afc1cf..399e40563 100644
--- a/locale/fr_FR/LC_MESSAGES/django.po
+++ b/locale/fr_FR/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.1.1\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-06-09 16:46+0000\n"
+"POT-Creation-Date: 2021-08-05 01:33+0000\n"
"PO-Revision-Date: 2021-04-05 12:44+0100\n"
"Last-Translator: Fabien Basmaison \n"
"Language-Team: Mouse Reeve \n"
@@ -18,99 +18,125 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-#: bookwyrm/forms.py:224
+#: bookwyrm/forms.py:232
msgid "A user with this email already exists."
msgstr "Cet email est déjà associé à un compte."
-#: bookwyrm/forms.py:238
+#: bookwyrm/forms.py:246
msgid "One Day"
msgstr "Un jour"
-#: bookwyrm/forms.py:239
+#: bookwyrm/forms.py:247
msgid "One Week"
msgstr "Une semaine"
-#: bookwyrm/forms.py:240
+#: bookwyrm/forms.py:248
msgid "One Month"
msgstr "Un mois"
-#: bookwyrm/forms.py:241
+#: bookwyrm/forms.py:249
msgid "Does Not Expire"
msgstr "Sans expiration"
-#: bookwyrm/forms.py:246
+#: bookwyrm/forms.py:254
#, python-format
msgid "%(count)d uses"
msgstr "%(count)d utilisations"
-#: bookwyrm/forms.py:249
+#: bookwyrm/forms.py:257
msgid "Unlimited"
msgstr "Sans limite"
-#: bookwyrm/forms.py:299
+#: bookwyrm/forms.py:307
msgid "List Order"
msgstr "Ordre de la liste"
-#: bookwyrm/forms.py:300
+#: bookwyrm/forms.py:308
msgid "Book Title"
msgstr "Titre du livre"
-#: bookwyrm/forms.py:301 bookwyrm/templates/snippets/create_status_form.html:34
+#: bookwyrm/forms.py:309 bookwyrm/templates/snippets/create_status_form.html:34
#: bookwyrm/templates/user/shelf/shelf.html:85
#: bookwyrm/templates/user/shelf/shelf.html:116
msgid "Rating"
msgstr "Note"
-#: bookwyrm/forms.py:303 bookwyrm/templates/lists/list.html:107
+#: bookwyrm/forms.py:311 bookwyrm/templates/lists/list.html:107
msgid "Sort By"
msgstr "Trier par"
-#: bookwyrm/forms.py:307
+#: bookwyrm/forms.py:315
msgid "Ascending"
msgstr "Ordre croissant"
-#: bookwyrm/forms.py:308
+#: bookwyrm/forms.py:316
msgid "Descending"
msgstr "Ordre décroissant"
-#: bookwyrm/models/fields.py:25
+#: bookwyrm/models/fields.py:27
#, python-format
msgid "%(value)s is not a valid remote_id"
msgstr "%(value)s n’est pas une remote_id valide."
-#: bookwyrm/models/fields.py:34 bookwyrm/models/fields.py:43
+#: bookwyrm/models/fields.py:36 bookwyrm/models/fields.py:45
#, python-format
msgid "%(value)s is not a valid username"
msgstr "%(value)s n’est pas un nom de compte valide."
-#: bookwyrm/models/fields.py:166 bookwyrm/templates/layout.html:152
+#: bookwyrm/models/fields.py:174 bookwyrm/templates/layout.html:159
msgid "username"
msgstr "nom du compte :"
-#: bookwyrm/models/fields.py:171
+#: bookwyrm/models/fields.py:179
msgid "A user with that username already exists."
msgstr "Ce nom est déjà associé à un compte."
-#: bookwyrm/settings.py:156
+#: bookwyrm/settings.py:123
+msgid "Home Timeline"
+msgstr "Mon fil d’actualité"
+
+#: bookwyrm/settings.py:123
+msgid "Home"
+msgstr "Accueil"
+
+#: bookwyrm/settings.py:124
+#, fuzzy
+#| msgid "Book Title"
+msgid "Books Timeline"
+msgstr "Titre du livre"
+
+#: bookwyrm/settings.py:124 bookwyrm/templates/search/layout.html:21
+#: bookwyrm/templates/search/layout.html:42
+#: bookwyrm/templates/user/layout.html:81
+msgid "Books"
+msgstr "Livres"
+
+#: bookwyrm/settings.py:170
msgid "English"
msgstr "English"
-#: bookwyrm/settings.py:157
+#: bookwyrm/settings.py:171
msgid "German"
msgstr "Deutsch"
-#: bookwyrm/settings.py:158
+#: bookwyrm/settings.py:172
msgid "Spanish"
msgstr "Español"
-#: bookwyrm/settings.py:159
+#: bookwyrm/settings.py:173
msgid "French"
msgstr "Français"
-#: bookwyrm/settings.py:160
+#: bookwyrm/settings.py:174
msgid "Simplified Chinese"
msgstr "简化字"
+#: bookwyrm/settings.py:175
+#, fuzzy
+#| msgid "Additional info:"
+msgid "Traditional Chinese"
+msgstr "Infos supplémentaires :"
+
#: bookwyrm/templates/404.html:4 bookwyrm/templates/404.html:8
msgid "Not Found"
msgstr "Introuvable"
@@ -154,12 +180,12 @@ msgid "Wikipedia"
msgstr "Wikipedia"
#: bookwyrm/templates/author/author.html:69
-#: bookwyrm/templates/book/book.html:87
+#: bookwyrm/templates/book/book.html:95
msgid "View on OpenLibrary"
msgstr "Voir sur OpenLibrary"
#: bookwyrm/templates/author/author.html:77
-#: bookwyrm/templates/book/book.html:90
+#: bookwyrm/templates/book/book.html:98
msgid "View on Inventaire"
msgstr "Voir sur Inventaire"
@@ -252,142 +278,142 @@ msgid "Goodreads key:"
msgstr "Clé Goodreads :"
#: bookwyrm/templates/author/edit_author.html:116
-#: bookwyrm/templates/book/book.html:133
+#: bookwyrm/templates/book/book.html:141
#: bookwyrm/templates/book/edit_book.html:321
+#: bookwyrm/templates/book/readthrough.html:77
#: bookwyrm/templates/lists/form.html:42
-#: bookwyrm/templates/preferences/edit_user.html:70
+#: bookwyrm/templates/preferences/edit_user.html:78
#: bookwyrm/templates/settings/announcement_form.html:69
#: bookwyrm/templates/settings/edit_server.html:68
#: bookwyrm/templates/settings/federated_server.html:98
#: bookwyrm/templates/settings/site.html:101
-#: bookwyrm/templates/snippets/readthrough.html:77
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:42
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:42
-#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:34
-#: bookwyrm/templates/user_admin/user_moderation_actions.html:38
+#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:36
+#: bookwyrm/templates/user_admin/user_moderation_actions.html:45
msgid "Save"
msgstr "Enregistrer"
#: bookwyrm/templates/author/edit_author.html:117
-#: bookwyrm/templates/book/book.html:134 bookwyrm/templates/book/book.html:183
+#: bookwyrm/templates/book/book.html:142 bookwyrm/templates/book/book.html:191
#: bookwyrm/templates/book/cover_modal.html:32
#: bookwyrm/templates/book/edit_book.html:322
+#: bookwyrm/templates/book/readthrough.html:78
#: bookwyrm/templates/moderation/report_modal.html:34
#: bookwyrm/templates/settings/federated_server.html:99
#: bookwyrm/templates/snippets/delete_readthrough_modal.html:17
#: bookwyrm/templates/snippets/goal_form.html:32
-#: bookwyrm/templates/snippets/readthrough.html:78
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:43
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:43
-#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:35
+#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:37
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:28
msgid "Cancel"
msgstr "Annuler"
-#: bookwyrm/templates/book/book.html:40
+#: bookwyrm/templates/book/book.html:48
#: bookwyrm/templates/discover/large-book.html:25
#: bookwyrm/templates/discover/small-book.html:19
msgid "by"
msgstr "par"
-#: bookwyrm/templates/book/book.html:48 bookwyrm/templates/book/book.html:49
+#: bookwyrm/templates/book/book.html:56 bookwyrm/templates/book/book.html:57
msgid "Edit Book"
msgstr "Modifier le livre"
-#: bookwyrm/templates/book/book.html:66
+#: bookwyrm/templates/book/book.html:74
#: bookwyrm/templates/book/cover_modal.html:5
msgid "Add cover"
msgstr "Ajouter une couverture"
-#: bookwyrm/templates/book/book.html:70
+#: bookwyrm/templates/book/book.html:78
msgid "Failed to load cover"
msgstr "La couverture n’a pu être chargée"
-#: bookwyrm/templates/book/book.html:110
+#: bookwyrm/templates/book/book.html:118
#, 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:122
+#: bookwyrm/templates/book/book.html:130
msgid "Add Description"
msgstr "Ajouter une description"
-#: bookwyrm/templates/book/book.html:129
+#: bookwyrm/templates/book/book.html:137
#: bookwyrm/templates/book/edit_book.html:136
#: bookwyrm/templates/lists/form.html:12
msgid "Description:"
msgstr "Description :"
-#: bookwyrm/templates/book/book.html:143
+#: bookwyrm/templates/book/book.html:151
#, python-format
msgid "%(count)s editions"
msgstr "%(count)s éditions"
-#: bookwyrm/templates/book/book.html:151
+#: bookwyrm/templates/book/book.html:159
#, python-format
msgid "This edition is on your %(shelf_name)s shelf."
msgstr "Cette édition est sur votre étagère %(shelf_name)s."
-#: bookwyrm/templates/book/book.html:157
+#: bookwyrm/templates/book/book.html:165
#, 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:168
+#: bookwyrm/templates/book/book.html:176
msgid "Your reading activity"
msgstr "Votre activité de lecture"
-#: bookwyrm/templates/book/book.html:171
+#: bookwyrm/templates/book/book.html:179
msgid "Add read dates"
msgstr "Ajouter des dates de lecture"
-#: bookwyrm/templates/book/book.html:180
+#: bookwyrm/templates/book/book.html:188
msgid "Create"
msgstr "Créer"
-#: bookwyrm/templates/book/book.html:190
+#: bookwyrm/templates/book/book.html:198
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:209
+#: bookwyrm/templates/book/book.html:217
msgid "Reviews"
msgstr "Critiques"
-#: bookwyrm/templates/book/book.html:214
+#: bookwyrm/templates/book/book.html:222
msgid "Your reviews"
msgstr "Vos critiques"
-#: bookwyrm/templates/book/book.html:220
+#: bookwyrm/templates/book/book.html:228
msgid "Your comments"
msgstr "Vos commentaires"
-#: bookwyrm/templates/book/book.html:226
+#: bookwyrm/templates/book/book.html:234
msgid "Your quotes"
msgstr "Vos citations"
-#: bookwyrm/templates/book/book.html:262
+#: bookwyrm/templates/book/book.html:270
msgid "Subjects"
msgstr "Sujets"
-#: bookwyrm/templates/book/book.html:274
+#: bookwyrm/templates/book/book.html:282
msgid "Places"
msgstr "Lieux"
-#: bookwyrm/templates/book/book.html:285 bookwyrm/templates/layout.html:61
+#: bookwyrm/templates/book/book.html:293 bookwyrm/templates/layout.html:68
#: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:25
#: bookwyrm/templates/search/layout.html:50
-#: bookwyrm/templates/user/layout.html:68
+#: bookwyrm/templates/user/layout.html:75
msgid "Lists"
msgstr "Listes"
-#: bookwyrm/templates/book/book.html:296
+#: bookwyrm/templates/book/book.html:304
msgid "Add to list"
msgstr "Ajouter à la liste"
-#: bookwyrm/templates/book/book.html:306
+#: bookwyrm/templates/book/book.html:314
#: bookwyrm/templates/book/cover_modal.html:31
#: bookwyrm/templates/lists/list.html:179
msgid "Add"
@@ -615,11 +641,40 @@ msgstr "Publié par %(publisher)s."
msgid "rated it"
msgstr "l’a noté"
+#: bookwyrm/templates/book/readthrough.html:8
+msgid "Progress Updates:"
+msgstr "Progression :"
+
+#: bookwyrm/templates/book/readthrough.html:14
+msgid "finished"
+msgstr "terminé"
+
+#: bookwyrm/templates/book/readthrough.html:25
+msgid "Show all updates"
+msgstr "Montrer toutes les progressions"
+
+#: bookwyrm/templates/book/readthrough.html:41
+msgid "Delete this progress update"
+msgstr "Supprimer cette mise à jour"
+
+#: bookwyrm/templates/book/readthrough.html:52
+msgid "started"
+msgstr "commencé"
+
+#: bookwyrm/templates/book/readthrough.html:59
+#: bookwyrm/templates/book/readthrough.html:73
+msgid "Edit read dates"
+msgstr "Modifier les date de lecture"
+
+#: bookwyrm/templates/book/readthrough.html:63
+msgid "Delete these read dates"
+msgstr "Supprimer ces dates de lecture"
+
#: bookwyrm/templates/components/inline_form.html:8
#: bookwyrm/templates/components/modal.html:11
-#: bookwyrm/templates/feed/feed_layout.html:69
-#: bookwyrm/templates/get_started/layout.html:19
-#: bookwyrm/templates/get_started/layout.html:52
+#: bookwyrm/templates/feed/layout.html:71
+#: bookwyrm/templates/get_started/layout.html:20
+#: bookwyrm/templates/get_started/layout.html:53
#: bookwyrm/templates/search/book.html:32
#: bookwyrm/templates/snippets/announcement.html:18
msgid "Close"
@@ -643,7 +698,7 @@ msgstr "Communauté fédérée"
#: bookwyrm/templates/directory/directory.html:4
#: bookwyrm/templates/directory/directory.html:9
-#: bookwyrm/templates/layout.html:64
+#: bookwyrm/templates/layout.html:71
msgid "Directory"
msgstr "Répertoire"
@@ -674,23 +729,32 @@ msgstr "Suggéré"
msgid "Recently active"
msgstr "Actif récemment"
-#: bookwyrm/templates/directory/user_card.html:33
+#: bookwyrm/templates/directory/user_card.html:17
+#: bookwyrm/templates/directory/user_card.html:18
+#: bookwyrm/templates/user/user_preview.html:16
+#: bookwyrm/templates/user/user_preview.html:17
+#, fuzzy
+#| msgid "Your Account"
+msgid "Locked account"
+msgstr "Votre compte"
+
+#: bookwyrm/templates/directory/user_card.html:40
msgid "follower you follow"
msgid_plural "followers you follow"
msgstr[0] "compte que vous suivez"
msgstr[1] "comptes que vous suivez"
-#: bookwyrm/templates/directory/user_card.html:40
+#: bookwyrm/templates/directory/user_card.html:47
msgid "book on your shelves"
msgid_plural "books on your shelves"
msgstr[0] "livre sur vos étagères"
msgstr[1] "livres sur vos étagères"
-#: bookwyrm/templates/directory/user_card.html:48
+#: bookwyrm/templates/directory/user_card.html:55
msgid "posts"
msgstr "publications"
-#: bookwyrm/templates/directory/user_card.html:54
+#: bookwyrm/templates/directory/user_card.html:61
msgid "last active"
msgstr "dernière activité"
@@ -726,7 +790,7 @@ msgid "Recent Books"
msgstr "Livres récents"
#: bookwyrm/templates/discover/landing_layout.html:5
-#: bookwyrm/templates/get_started/layout.html:4
+#: bookwyrm/templates/get_started/layout.html:5
msgid "Welcome"
msgstr "Bienvenue"
@@ -844,7 +908,7 @@ msgid "Direct Messages with %(username)s"
msgstr "Messages directs avec %(username)s"
#: bookwyrm/templates/feed/direct_messages.html:10
-#: bookwyrm/templates/layout.html:92
+#: bookwyrm/templates/layout.html:99
msgid "Direct Messages"
msgstr "Messages directs"
@@ -856,93 +920,55 @@ msgstr "Tous les messages"
msgid "You have no messages right now."
msgstr "Vous n’avez aucun message pour l’instant."
-#: bookwyrm/templates/feed/feed.html:8
-msgid "Home Timeline"
-msgstr "Mon fil d’actualité"
-
-#: bookwyrm/templates/feed/feed.html:10
-msgid "Local Timeline"
-msgstr "Fil d’actualité local"
-
-#: bookwyrm/templates/feed/feed.html:12
-msgid "Federated Timeline"
-msgstr "Fil d’actualité des instances fédérées"
-
-#: bookwyrm/templates/feed/feed.html:18
-msgid "Home"
-msgstr "Accueil"
-
-#: bookwyrm/templates/feed/feed.html:21
-msgid "Local"
-msgstr "Local"
-
-#: bookwyrm/templates/feed/feed.html:24
-#: bookwyrm/templates/settings/edit_server.html:40
-msgid "Federated"
-msgstr "Fédéré"
-
-#: bookwyrm/templates/feed/feed.html:32
-#, python-format
-msgid "load 0 unread status(es)"
+#: bookwyrm/templates/feed/feed.html:22
+#, fuzzy, python-format
+#| msgid "load 0 unread status(es)"
+msgid "load 0 unread status(es)"
msgstr "charger le(s) 0 statut(s) non lu(s)"
-#: bookwyrm/templates/feed/feed.html:47
+#: bookwyrm/templates/feed/feed.html:38
msgid "There aren't any activities right now! Try following a user to get started"
msgstr "Aucune activité pour l’instant ! Abonnez‑vous à quelqu’un pour commencer"
-#: bookwyrm/templates/feed/feed.html:55
-#: bookwyrm/templates/get_started/users.html:6
-msgid "Who to follow"
-msgstr "À qui s’abonner"
-
-#: bookwyrm/templates/feed/feed_layout.html:4
+#: bookwyrm/templates/feed/layout.html:5
msgid "Updates"
msgstr "Mises à jour"
-#: bookwyrm/templates/feed/feed_layout.html:10
+#: bookwyrm/templates/feed/layout.html:12
#: bookwyrm/templates/user/shelf/books_header.html:3
msgid "Your books"
msgstr "Vos livres"
-#: bookwyrm/templates/feed/feed_layout.html:12
+#: bookwyrm/templates/feed/layout.html:14
msgid "There are no books here right now! Try searching for a book to get started"
msgstr "Aucun livre ici pour l’instant ! Cherchez un livre pour commencer"
-#: bookwyrm/templates/feed/feed_layout.html:23
+#: bookwyrm/templates/feed/layout.html:25
#: bookwyrm/templates/user/shelf/shelf.html:29
msgid "To Read"
msgstr "À lire"
-#: bookwyrm/templates/feed/feed_layout.html:24
+#: bookwyrm/templates/feed/layout.html:26
#: bookwyrm/templates/user/shelf/shelf.html:29
msgid "Currently Reading"
msgstr "Lectures en cours"
-#: bookwyrm/templates/feed/feed_layout.html:25
-#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:13
+#: bookwyrm/templates/feed/layout.html:27
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:16
#: bookwyrm/templates/user/shelf/shelf.html:29
msgid "Read"
msgstr "Lu"
-#: bookwyrm/templates/feed/feed_layout.html:87 bookwyrm/templates/goal.html:26
+#: bookwyrm/templates/feed/layout.html:90 bookwyrm/templates/goal.html:26
#: bookwyrm/templates/snippets/goal_card.html:6
#, python-format
msgid "%(year)s Reading Goal"
msgstr "Défi lecture pour %(year)s"
-#: bookwyrm/templates/feed/suggested_users.html:16
-#, python-format
-msgid "%(mutuals)s follower you follow"
-msgid_plural "%(mutuals)s followers you follow"
-msgstr[0] "%(mutuals)s abonné(e) que vous suivez"
-msgstr[1] "%(mutuals)s abonné(e)s que vous suivez"
-
-#: bookwyrm/templates/feed/suggested_users.html:19
-#, python-format
-msgid "%(shared_books)s book on your shelves"
-msgid_plural "%(shared_books)s books on your shelves"
-msgstr[0] "%(shared_books)s livre sur vos étagères"
-msgstr[1] "%(shared_books)s livres sur vos étagères"
+#: bookwyrm/templates/feed/suggested_users.html:3
+#: bookwyrm/templates/get_started/users.html:6
+msgid "Who to follow"
+msgstr "À qui s’abonner"
#: bookwyrm/templates/get_started/book_preview.html:6
#, python-format
@@ -973,7 +999,7 @@ msgstr "Vous pourrez ajouter des livres lorsque vous commencerez à utiliser %(s
#: bookwyrm/templates/get_started/books.html:17
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
-#: bookwyrm/templates/layout.html:37 bookwyrm/templates/layout.html:38
+#: bookwyrm/templates/layout.html:44 bookwyrm/templates/layout.html:45
#: bookwyrm/templates/lists/list.html:139
#: bookwyrm/templates/search/layout.html:4
#: bookwyrm/templates/search/layout.html:9
@@ -999,33 +1025,33 @@ msgstr "Aucun livre trouvé"
msgid "Save & continue"
msgstr "Enregistrer & continuer"
-#: bookwyrm/templates/get_started/layout.html:14
+#: bookwyrm/templates/get_started/layout.html:15
#, python-format
msgid "Welcome to %(site_name)s!"
msgstr "Bienvenue sur %(site_name)s !"
-#: bookwyrm/templates/get_started/layout.html:16
+#: bookwyrm/templates/get_started/layout.html:17
msgid "These are some first steps to get you started."
msgstr "Voici quelques étapes pour commencer votre profil."
-#: bookwyrm/templates/get_started/layout.html:30
+#: bookwyrm/templates/get_started/layout.html:31
#: bookwyrm/templates/get_started/profile.html:6
msgid "Create your profile"
msgstr "Créez votre profil"
-#: bookwyrm/templates/get_started/layout.html:34
+#: bookwyrm/templates/get_started/layout.html:35
msgid "Add books"
msgstr "Ajoutez des livres"
-#: bookwyrm/templates/get_started/layout.html:38
+#: bookwyrm/templates/get_started/layout.html:39
msgid "Find friends"
msgstr "Établissez des contacts"
-#: bookwyrm/templates/get_started/layout.html:44
+#: bookwyrm/templates/get_started/layout.html:45
msgid "Skip this step"
msgstr "Passer cette étape"
-#: bookwyrm/templates/get_started/layout.html:48
+#: bookwyrm/templates/get_started/layout.html:49
msgid "Finish"
msgstr "Terminer"
@@ -1054,7 +1080,7 @@ msgid "Manually approve followers:"
msgstr "Autoriser les abonnements manuellement :"
#: bookwyrm/templates/get_started/profile.html:48
-#: bookwyrm/templates/preferences/edit_user.html:58
+#: bookwyrm/templates/preferences/edit_user.html:66
msgid "Show this account in suggested users:"
msgstr "Afficher ce compte dans ceux suggérés :"
@@ -1135,75 +1161,87 @@ msgstr "Importations récentes"
msgid "No recent imports"
msgstr "Aucune importation récente"
-#: bookwyrm/templates/import_status.html:5
-#: bookwyrm/templates/import_status.html:9
+#: bookwyrm/templates/import_status.html:6
+#: bookwyrm/templates/import_status.html:10
msgid "Import Status"
msgstr "Statut de l’importation"
-#: bookwyrm/templates/import_status.html:13
+#: bookwyrm/templates/import_status.html:11
+#, fuzzy
+#| msgid "Back to reports"
+msgid "Back to imports"
+msgstr "Retour aux signalements"
+
+#: bookwyrm/templates/import_status.html:15
msgid "Import started:"
msgstr "Début de l’importation :"
-#: bookwyrm/templates/import_status.html:18
+#: bookwyrm/templates/import_status.html:20
msgid "Import completed:"
msgstr "Fin de l’importation :"
-#: bookwyrm/templates/import_status.html:23
+#: bookwyrm/templates/import_status.html:25
msgid "TASK FAILED"
msgstr "la tâche a échoué"
-#: bookwyrm/templates/import_status.html:30
+#: bookwyrm/templates/import_status.html:32
msgid "Import still in progress."
msgstr "L’importation est toujours en cours"
-#: bookwyrm/templates/import_status.html:32
+#: bookwyrm/templates/import_status.html:34
msgid "(Hit reload to update!)"
msgstr "(Rechargez la page pour la mettre à jour !)"
-#: bookwyrm/templates/import_status.html:39
+#: bookwyrm/templates/import_status.html:41
msgid "Failed to load"
msgstr "Éléments non importés"
-#: bookwyrm/templates/import_status.html:48
+#: bookwyrm/templates/import_status.html:50
#, python-format
msgid "Jump to the bottom of the list to select the %(failed_count)s items which failed to import."
msgstr "Sauter en bas de liste pour sélectionner les %(failed_count)s items n’ayant pu être importés."
-#: bookwyrm/templates/import_status.html:60
+#: bookwyrm/templates/import_status.html:62
#, python-format
msgid "Line %(index)s: %(title)s by %(author)s"
msgstr "Ligne %(index)s : %(title)s par %(author)s"
-#: bookwyrm/templates/import_status.html:80
+#: bookwyrm/templates/import_status.html:82
msgid "Select all"
msgstr "Tout sélectionner"
-#: bookwyrm/templates/import_status.html:83
+#: bookwyrm/templates/import_status.html:85
msgid "Retry items"
msgstr "Réessayer l’importation de ces éléments"
-#: bookwyrm/templates/import_status.html:109
+#: bookwyrm/templates/import_status.html:112
msgid "Successfully imported"
msgstr "Importation réussie"
-#: bookwyrm/templates/import_status.html:113
+#: bookwyrm/templates/import_status.html:114
+#, fuzzy
+#| msgid "Import still in progress."
+msgid "Import Progress"
+msgstr "L’importation est toujours en cours"
+
+#: bookwyrm/templates/import_status.html:119
msgid "Book"
msgstr "Livre"
-#: bookwyrm/templates/import_status.html:116
+#: bookwyrm/templates/import_status.html:122
#: bookwyrm/templates/snippets/create_status_form.html:13
#: bookwyrm/templates/user/shelf/shelf.html:79
#: bookwyrm/templates/user/shelf/shelf.html:99
msgid "Title"
msgstr "Titre"
-#: bookwyrm/templates/import_status.html:119
+#: bookwyrm/templates/import_status.html:125
#: bookwyrm/templates/user/shelf/shelf.html:80
#: bookwyrm/templates/user/shelf/shelf.html:102
msgid "Author"
msgstr "Auteur/autrice"
-#: bookwyrm/templates/import_status.html:142
+#: bookwyrm/templates/import_status.html:148
msgid "Imported"
msgstr "Importé"
@@ -1233,27 +1271,27 @@ msgstr "Résultats de recherche pour « %(query)s »"
msgid "Matching Books"
msgstr "Livres correspondants"
-#: bookwyrm/templates/layout.html:33
+#: bookwyrm/templates/layout.html:40
msgid "Search for a book or user"
msgstr "Chercher un livre ou un compte"
-#: bookwyrm/templates/layout.html:47 bookwyrm/templates/layout.html:48
+#: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55
msgid "Main navigation menu"
msgstr "Menu de navigation principal "
-#: bookwyrm/templates/layout.html:58
+#: bookwyrm/templates/layout.html:65
msgid "Feed"
msgstr "Fil d’actualité"
-#: bookwyrm/templates/layout.html:87
+#: bookwyrm/templates/layout.html:94
msgid "Your Books"
msgstr "Vos Livres"
-#: bookwyrm/templates/layout.html:97
+#: bookwyrm/templates/layout.html:104
msgid "Settings"
msgstr "Paramètres"
-#: bookwyrm/templates/layout.html:106
+#: bookwyrm/templates/layout.html:113
#: bookwyrm/templates/settings/admin_layout.html:31
#: bookwyrm/templates/settings/manage_invite_requests.html:15
#: bookwyrm/templates/settings/manage_invites.html:3
@@ -1261,61 +1299,61 @@ msgstr "Paramètres"
msgid "Invites"
msgstr "Invitations"
-#: bookwyrm/templates/layout.html:113
+#: bookwyrm/templates/layout.html:120
msgid "Admin"
msgstr "Admin"
-#: bookwyrm/templates/layout.html:120
+#: bookwyrm/templates/layout.html:127
msgid "Log out"
msgstr "Se déconnecter"
-#: bookwyrm/templates/layout.html:128 bookwyrm/templates/layout.html:129
+#: bookwyrm/templates/layout.html:135 bookwyrm/templates/layout.html:136
#: bookwyrm/templates/notifications.html:6
#: bookwyrm/templates/notifications.html:11
msgid "Notifications"
msgstr "Notifications"
-#: bookwyrm/templates/layout.html:151 bookwyrm/templates/layout.html:155
+#: bookwyrm/templates/layout.html:158 bookwyrm/templates/layout.html:162
#: bookwyrm/templates/login.html:17
#: bookwyrm/templates/snippets/register_form.html:4
msgid "Username:"
msgstr "Nom du compte :"
-#: bookwyrm/templates/layout.html:156
+#: bookwyrm/templates/layout.html:163
msgid "password"
msgstr "Mot de passe"
-#: bookwyrm/templates/layout.html:157 bookwyrm/templates/login.html:36
+#: bookwyrm/templates/layout.html:164 bookwyrm/templates/login.html:36
msgid "Forgot your password?"
msgstr "Mot de passe oublié ?"
-#: bookwyrm/templates/layout.html:160 bookwyrm/templates/login.html:10
+#: bookwyrm/templates/layout.html:167 bookwyrm/templates/login.html:10
#: bookwyrm/templates/login.html:33
msgid "Log in"
msgstr "Se connecter"
-#: bookwyrm/templates/layout.html:168
+#: bookwyrm/templates/layout.html:175
msgid "Join"
msgstr "Rejoindre"
-#: bookwyrm/templates/layout.html:206
+#: bookwyrm/templates/layout.html:213
msgid "About this instance"
msgstr "À propos de cette instance"
-#: bookwyrm/templates/layout.html:210
+#: bookwyrm/templates/layout.html:217
msgid "Contact site admin"
msgstr "Contacter l’administrateur du site"
-#: bookwyrm/templates/layout.html:214
+#: bookwyrm/templates/layout.html:221
msgid "Documentation"
msgstr "Documentation"
-#: bookwyrm/templates/layout.html:221
+#: bookwyrm/templates/layout.html:228
#, python-format
msgid "Support %(site_name)s on %(support_title)s"
msgstr "Soutenez %(site_name)s avec %(support_title)s"
-#: bookwyrm/templates/layout.html:225
+#: bookwyrm/templates/layout.html:232
msgid "BookWyrm's source code is freely available. You can contribute or report issues on GitHub."
msgstr "BookWyrm est un logiciel libre. Vous pouvez contribuer ou faire des rapports de bogues via GitHub."
@@ -1693,6 +1731,7 @@ msgstr "Aucune nouvelle notification !"
#: bookwyrm/templates/password_reset.html:23
#: bookwyrm/templates/preferences/change_password.html:18
+#: bookwyrm/templates/preferences/delete_user.html:20
msgid "Confirm password:"
msgstr "Confirmez le mot de passe :"
@@ -1706,7 +1745,7 @@ msgstr "Changer de mot de passe"
#: bookwyrm/templates/preferences/blocks.html:4
#: bookwyrm/templates/preferences/blocks.html:7
-#: bookwyrm/templates/preferences/preferences_layout.html:26
+#: bookwyrm/templates/preferences/layout.html:30
msgid "Blocked Users"
msgstr "Comptes bloqués"
@@ -1717,7 +1756,7 @@ msgstr "Aucun compte bloqué actuellement"
#: bookwyrm/templates/preferences/change_password.html:4
#: bookwyrm/templates/preferences/change_password.html:7
#: bookwyrm/templates/preferences/change_password.html:21
-#: bookwyrm/templates/preferences/preferences_layout.html:19
+#: bookwyrm/templates/preferences/layout.html:19
msgid "Change Password"
msgstr "Changer le mot de passe"
@@ -1725,6 +1764,23 @@ msgstr "Changer le mot de passe"
msgid "New password:"
msgstr "Nouveau mot de passe :"
+#: bookwyrm/templates/preferences/delete_user.html:4
+#: bookwyrm/templates/preferences/delete_user.html:7
+#: bookwyrm/templates/preferences/delete_user.html:26
+#: bookwyrm/templates/preferences/layout.html:23
+#, fuzzy
+#| msgid "Create an Account"
+msgid "Delete Account"
+msgstr "Créer un compte"
+
+#: bookwyrm/templates/preferences/delete_user.html:12
+msgid "Permanently delete account"
+msgstr ""
+
+#: bookwyrm/templates/preferences/delete_user.html:14
+msgid "Deleting your account cannot be undone. The username will not be available to register in the future."
+msgstr ""
+
#: bookwyrm/templates/preferences/edit_user.html:4
#: bookwyrm/templates/preferences/edit_user.html:7
msgid "Edit Profile"
@@ -1734,44 +1790,68 @@ msgstr "Modifier le profil"
msgid "Show set reading goal prompt in feed:"
msgstr "Afficher le message pour définir un défi lecture dans le fil d’actualité :"
-#: bookwyrm/templates/preferences/edit_user.html:62
+#: bookwyrm/templates/preferences/edit_user.html:58
+#, fuzzy
+#| msgid "Post privacy"
+msgid "Default post privacy:"
+msgstr "Confidentialité du statut"
+
+#: bookwyrm/templates/preferences/edit_user.html:70
#, python-format
msgid "Your account will show up in the directory, and may be recommended to other BookWyrm users."
msgstr "Votre compte sera listé dans le répertoire et pourra être recommandé à d’autres utilisateurs ou utilisatrices de BookWyrm."
-#: bookwyrm/templates/preferences/edit_user.html:65
+#: bookwyrm/templates/preferences/edit_user.html:73
msgid "Preferred Timezone: "
msgstr "Fuseau horaire préféré"
-#: bookwyrm/templates/preferences/preferences_layout.html:11
+#: bookwyrm/templates/preferences/layout.html:11
msgid "Account"
msgstr "Compte"
-#: bookwyrm/templates/preferences/preferences_layout.html:15
+#: bookwyrm/templates/preferences/layout.html:15
msgid "Profile"
msgstr "Profil"
-#: bookwyrm/templates/preferences/preferences_layout.html:22
+#: bookwyrm/templates/preferences/layout.html:26
msgid "Relationships"
msgstr "Relations"
+#: bookwyrm/templates/reading_progress/finish.html:5
+#, fuzzy, python-format
+#| msgid "Finish \"%(book_title)s\""
+msgid "Finish \"%(book_title)s\""
+msgstr "Terminer « %(book_title)s »"
+
+#: bookwyrm/templates/reading_progress/start.html:5
+#, fuzzy, python-format
+#| msgid "Edit \"%(book_title)s\""
+msgid "Start \"%(book_title)s\""
+msgstr "Modifier « %(book_title)s »"
+
+#: bookwyrm/templates/reading_progress/want.html:5
+#, fuzzy, python-format
+#| msgid "Want to Read \"%(book_title)s\""
+msgid "Want to Read \"%(book_title)s\""
+msgstr "Ajouter « %(book_title)s » aux envies de lecture"
+
#: bookwyrm/templates/rss/title.html:5
-#: bookwyrm/templates/snippets/status/status_header.html:35
+#: bookwyrm/templates/snippets/status/status_header.html:36
msgid "rated"
msgstr "a noté"
#: bookwyrm/templates/rss/title.html:7
-#: bookwyrm/templates/snippets/status/status_header.html:37
+#: bookwyrm/templates/snippets/status/status_header.html:38
msgid "reviewed"
msgstr "a écrit une critique de"
#: bookwyrm/templates/rss/title.html:9
-#: bookwyrm/templates/snippets/status/status_header.html:39
+#: bookwyrm/templates/snippets/status/status_header.html:40
msgid "commented on"
msgstr "a commenté"
#: bookwyrm/templates/rss/title.html:11
-#: bookwyrm/templates/snippets/status/status_header.html:41
+#: bookwyrm/templates/snippets/status/status_header.html:42
msgid "quoted"
msgstr "a cité"
@@ -1795,12 +1875,6 @@ msgstr "Requête"
msgid "Search type"
msgstr "Type de recherche"
-#: bookwyrm/templates/search/layout.html:21
-#: bookwyrm/templates/search/layout.html:42
-#: bookwyrm/templates/user/layout.html:74
-msgid "Books"
-msgstr "Livres"
-
#: bookwyrm/templates/search/layout.html:23
#: bookwyrm/templates/search/layout.html:46
#: bookwyrm/templates/settings/admin_layout.html:26
@@ -1976,6 +2050,10 @@ msgstr "Instance :"
msgid "Status:"
msgstr "Statut :"
+#: bookwyrm/templates/settings/edit_server.html:40
+msgid "Federated"
+msgstr "Fédéré"
+
#: bookwyrm/templates/settings/edit_server.html:41
#: bookwyrm/templates/settings/federated_server.html:10
msgid "Blocked"
@@ -2002,7 +2080,7 @@ msgid "Details"
msgstr "Détails"
#: bookwyrm/templates/settings/federated_server.html:39
-#: bookwyrm/templates/user/layout.html:56
+#: bookwyrm/templates/user/layout.html:63
msgid "Activity"
msgstr "Activité"
@@ -2041,7 +2119,7 @@ msgid "Edit"
msgstr "Modifier"
#: bookwyrm/templates/settings/federated_server.html:105
-#: bookwyrm/templates/user_admin/user_moderation_actions.html:3
+#: bookwyrm/templates/user_admin/user_moderation_actions.html:8
msgid "Actions"
msgstr "Actions"
@@ -2264,13 +2342,21 @@ msgstr "Texte affiché lorsque les inscriptions sont closes :"
msgid "Posted by %(username)s"
msgstr "Publiée par %(username)s"
-#: bookwyrm/templates/snippets/book_cover.html:31
+#: bookwyrm/templates/snippets/authors.html:22
+#, python-format
+msgid "and %(remainder_count_display)s other"
+msgid_plural "and %(remainder_count_display)s others"
+msgstr[0] ""
+msgstr[1] ""
+
+#: bookwyrm/templates/snippets/book_cover.html:32
msgid "No cover"
msgstr "Pas de couverture"
-#: bookwyrm/templates/snippets/book_titleby.html:4
-#, python-format
-msgid "%(title)s by "
+#: bookwyrm/templates/snippets/book_titleby.html:6
+#, fuzzy, python-format
+#| msgid "%(title)s by "
+msgid "%(title)s by"
msgstr "%(title)s par "
#: bookwyrm/templates/snippets/boost_button.html:20
@@ -2352,7 +2438,7 @@ msgstr "Afficher une alerte spoiler"
#: bookwyrm/templates/snippets/create_status_form.html:117
#: bookwyrm/templates/snippets/privacy-icons.html:15
#: bookwyrm/templates/snippets/privacy-icons.html:16
-#: bookwyrm/templates/snippets/privacy_select.html:19
+#: bookwyrm/templates/snippets/privacy_select.html:20
msgid "Private"
msgstr "Privé"
@@ -2469,7 +2555,7 @@ msgstr "Confidentialité du défi :"
#: bookwyrm/templates/snippets/goal_form.html:26
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:37
-#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:29
+#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:31
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:20
msgid "Post to feed"
msgstr "Publier sur le fil d’actualité"
@@ -2513,13 +2599,13 @@ msgstr "Suivante"
#: bookwyrm/templates/snippets/privacy-icons.html:3
#: bookwyrm/templates/snippets/privacy-icons.html:4
-#: bookwyrm/templates/snippets/privacy_select.html:10
+#: bookwyrm/templates/snippets/privacy_select.html:11
msgid "Public"
msgstr "Public"
#: bookwyrm/templates/snippets/privacy-icons.html:7
#: bookwyrm/templates/snippets/privacy-icons.html:8
-#: bookwyrm/templates/snippets/privacy_select.html:13
+#: bookwyrm/templates/snippets/privacy_select.html:14
msgid "Unlisted"
msgstr "Non listé"
@@ -2531,7 +2617,7 @@ msgstr "Abonnemé(e)s uniquement"
msgid "Post privacy"
msgstr "Confidentialité du statut"
-#: bookwyrm/templates/snippets/privacy_select.html:16
+#: bookwyrm/templates/snippets/privacy_select.html:17
#: bookwyrm/templates/user/relationships/followers.html:6
#: bookwyrm/templates/user/relationships/layout.html:11
msgid "Followers"
@@ -2545,38 +2631,9 @@ msgstr "Laisser une note"
msgid "Rate"
msgstr "Noter"
-#: bookwyrm/templates/snippets/readthrough.html:8
-msgid "Progress Updates:"
-msgstr "Progression :"
-
-#: bookwyrm/templates/snippets/readthrough.html:14
-msgid "finished"
-msgstr "terminé"
-
-#: bookwyrm/templates/snippets/readthrough.html:25
-msgid "Show all updates"
-msgstr "Montrer toutes les progressions"
-
-#: bookwyrm/templates/snippets/readthrough.html:41
-msgid "Delete this progress update"
-msgstr "Supprimer cette mise à jour"
-
-#: bookwyrm/templates/snippets/readthrough.html:52
-msgid "started"
-msgstr "commencé"
-
-#: bookwyrm/templates/snippets/readthrough.html:59
-#: bookwyrm/templates/snippets/readthrough.html:73
-msgid "Edit read dates"
-msgstr "Modifier les date de lecture"
-
-#: bookwyrm/templates/snippets/readthrough.html:63
-msgid "Delete these read dates"
-msgstr "Supprimer ces dates de lecture"
-
#: bookwyrm/templates/snippets/readthrough_form.html:7
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:19
-#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:17
+#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:19
msgid "Started reading"
msgstr "Lecture commencée le"
@@ -2611,7 +2668,7 @@ msgid "Finish \"%(book_title)s\""
msgstr "Terminer « %(book_title)s »"
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:5
-#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:36
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:45
msgid "Update progress"
msgstr "Progression de la mise à jour"
@@ -2619,20 +2676,20 @@ msgstr "Progression de la mise à jour"
msgid "More shelves"
msgstr "Plus d’étagères"
-#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:10
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:11
msgid "Start reading"
msgstr "Commencer la lecture"
-#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:15
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:19
msgid "Finish reading"
msgstr "Terminer la lecture"
-#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:18
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:25
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:26
msgid "Want to read"
msgstr "Je veux le lire"
-#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:47
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:57
#, python-format
msgid "Remove from %(name)s"
msgstr "Retirer de %(name)s"
@@ -2647,17 +2704,17 @@ msgstr "Commencer « %(book_title)s »"
msgid "Want to Read \"%(book_title)s\""
msgstr "Ajouter « %(book_title)s » aux envies de lecture"
-#: bookwyrm/templates/snippets/status/content_status.html:71
+#: bookwyrm/templates/snippets/status/content_status.html:72
#: bookwyrm/templates/snippets/trimmed_text.html:15
msgid "Show more"
msgstr "Déplier"
-#: bookwyrm/templates/snippets/status/content_status.html:86
+#: bookwyrm/templates/snippets/status/content_status.html:87
#: bookwyrm/templates/snippets/trimmed_text.html:30
msgid "Show less"
msgstr "Replier"
-#: bookwyrm/templates/snippets/status/content_status.html:116
+#: bookwyrm/templates/snippets/status/content_status.html:117
msgid "Open image in new window"
msgstr "Ouvrir l’image dans une nouvelle fenêtre"
@@ -2680,7 +2737,7 @@ msgstr "Ajouter le statut aux favoris"
msgid "boosted"
msgstr "a partagé"
-#: bookwyrm/templates/snippets/status/status_header.html:45
+#: bookwyrm/templates/snippets/status/status_header.html:46
#, python-format
msgid "replied to %(username)s's status"
msgstr "a répondu au statut de %(username)s"
@@ -2696,10 +2753,31 @@ msgstr "Supprimer & recommencer la rédaction"
#: bookwyrm/templates/snippets/status/status_options.html:35
#: bookwyrm/templates/snippets/user_options.html:13
-#: bookwyrm/templates/user_admin/user_moderation_actions.html:6
+#: bookwyrm/templates/user_admin/user_moderation_actions.html:12
msgid "Send direct message"
msgstr "Envoyer un message direct"
+#: bookwyrm/templates/snippets/suggested_users.html:16
+#, python-format
+msgid "%(mutuals)s follower you follow"
+msgid_plural "%(mutuals)s followers you follow"
+msgstr[0] "%(mutuals)s abonné(e) que vous suivez"
+msgstr[1] "%(mutuals)s abonné(e)s que vous suivez"
+
+#: bookwyrm/templates/snippets/suggested_users.html:23
+#, python-format
+msgid "%(shared_books)s book on your shelves"
+msgid_plural "%(shared_books)s books on your shelves"
+msgstr[0] "%(shared_books)s livre sur vos étagères"
+msgstr[1] "%(shared_books)s livres sur vos étagères"
+
+#: bookwyrm/templates/snippets/suggested_users.html:31
+#: bookwyrm/templates/user/user_preview.html:36
+#, fuzzy
+#| msgid "followed you"
+msgid "Follows you"
+msgstr "vous suit"
+
#: bookwyrm/templates/snippets/switch_edition_button.html:5
msgid "Switch to this edition"
msgstr "Changer vers cette édition"
@@ -2712,15 +2790,15 @@ msgstr "Trié par ordre croissant"
msgid "Sorted descending"
msgstr "Trié par ordre décroissant"
-#: bookwyrm/templates/user/layout.html:13 bookwyrm/templates/user/user.html:10
+#: bookwyrm/templates/user/layout.html:18 bookwyrm/templates/user/user.html:10
msgid "User Profile"
msgstr "Profil"
-#: bookwyrm/templates/user/layout.html:37
+#: bookwyrm/templates/user/layout.html:44
msgid "Follow Requests"
msgstr "Demandes d’abonnement"
-#: bookwyrm/templates/user/layout.html:62
+#: bookwyrm/templates/user/layout.html:69
msgid "Reading Goal"
msgstr "Défi lecture"
@@ -2826,30 +2904,37 @@ msgstr "Flux RSS"
msgid "No activities yet!"
msgstr "Aucune activité pour l’instant !"
-#: bookwyrm/templates/user/user_preview.html:15
+#: bookwyrm/templates/user/user_preview.html:22
#, python-format
msgid "Joined %(date)s"
msgstr "A rejoint ce serveur %(date)s"
-#: bookwyrm/templates/user/user_preview.html:19
+#: bookwyrm/templates/user/user_preview.html:26
#, python-format
msgid "%(counter)s follower"
msgid_plural "%(counter)s followers"
msgstr[0] "%(counter)s abonné(e)"
msgstr[1] "%(counter)s abonné(e)s"
-#: bookwyrm/templates/user/user_preview.html:20
+#: bookwyrm/templates/user/user_preview.html:27
#, python-format
msgid "%(counter)s following"
msgstr "%(counter)s abonnements"
-#: bookwyrm/templates/user/user_preview.html:26
+#: bookwyrm/templates/user/user_preview.html:34
#, python-format
msgid "%(mutuals_display)s follower you follow"
msgid_plural "%(mutuals_display)s followers you follow"
msgstr[0] "%(mutuals_display)s abonné(e) que vous suivez"
msgstr[1] "%(mutuals_display)s abonné(e)s que vous suivez"
+#: bookwyrm/templates/user/user_preview.html:38
+#, fuzzy
+#| msgid "follower you follow"
+#| msgid_plural "followers you follow"
+msgid "No followers you follow"
+msgstr "compte que vous suivez"
+
#: bookwyrm/templates/user_admin/user.html:9
msgid "Back to users"
msgstr "Retour aux comptes"
@@ -2905,15 +2990,19 @@ msgstr "Détails de l’instance"
msgid "View instance"
msgstr "Voir l’instance"
-#: bookwyrm/templates/user_admin/user_moderation_actions.html:11
+#: bookwyrm/templates/user_admin/user_moderation_actions.html:5
+msgid "Permanently deleted"
+msgstr ""
+
+#: bookwyrm/templates/user_admin/user_moderation_actions.html:17
msgid "Suspend user"
msgstr "Suspendre le compte"
-#: bookwyrm/templates/user_admin/user_moderation_actions.html:13
+#: bookwyrm/templates/user_admin/user_moderation_actions.html:19
msgid "Un-suspend user"
msgstr "Rétablir le compte"
-#: bookwyrm/templates/user_admin/user_moderation_actions.html:21
+#: bookwyrm/templates/user_admin/user_moderation_actions.html:28
msgid "Access level:"
msgstr "Niveau d’accès :"
@@ -2939,6 +3028,15 @@ msgstr "Aucun compte avec cette adresse email n’a été trouvé."
msgid "A password reset link sent to %s"
msgstr "Un lien de réinitialisation a été envoyé à %s."
+#~ msgid "Local Timeline"
+#~ msgstr "Fil d’actualité local"
+
+#~ msgid "Federated Timeline"
+#~ msgstr "Fil d’actualité des instances fédérées"
+
+#~ msgid "Local"
+#~ msgstr "Local"
+
#, fuzzy
#~| msgid "BookWyrm users"
#~ msgid "BookWyrm\\"
diff --git a/locale/zh_Hans/LC_MESSAGES/django.mo b/locale/zh_Hans/LC_MESSAGES/django.mo
index 3450c353a..664503339 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 a52542b0a..d9921655e 100644
--- a/locale/zh_Hans/LC_MESSAGES/django.po
+++ b/locale/zh_Hans/LC_MESSAGES/django.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.1.1\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2021-07-30 09:07+0000\n"
+"POT-Creation-Date: 2021-08-05 01:33+0000\n"
"PO-Revision-Date: 2021-03-20 00:56+0000\n"
"Last-Translator: Kana \n"
"Language-Team: Mouse Reeve \n"
@@ -18,100 +18,120 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: bookwyrm/forms.py:231
+#: bookwyrm/forms.py:232
msgid "A user with this email already exists."
msgstr "已经存在使用该邮箱的用户。"
-#: bookwyrm/forms.py:245
+#: bookwyrm/forms.py:246
msgid "One Day"
msgstr "一天"
-#: bookwyrm/forms.py:246
+#: bookwyrm/forms.py:247
msgid "One Week"
msgstr "一周"
-#: bookwyrm/forms.py:247
+#: bookwyrm/forms.py:248
msgid "One Month"
msgstr "一个月"
-#: bookwyrm/forms.py:248
+#: bookwyrm/forms.py:249
msgid "Does Not Expire"
msgstr "永不失效"
-#: bookwyrm/forms.py:253
+#: bookwyrm/forms.py:254
#, python-format
msgid "%(count)d uses"
msgstr "%(count)d 次使用"
-#: bookwyrm/forms.py:256
+#: bookwyrm/forms.py:257
msgid "Unlimited"
msgstr "不受限"
-#: bookwyrm/forms.py:306
+#: bookwyrm/forms.py:307
msgid "List Order"
msgstr "列表顺序"
-#: bookwyrm/forms.py:307
+#: bookwyrm/forms.py:308
msgid "Book Title"
msgstr "书名"
-#: bookwyrm/forms.py:308 bookwyrm/templates/snippets/create_status_form.html:34
+#: bookwyrm/forms.py:309 bookwyrm/templates/snippets/create_status_form.html:34
#: bookwyrm/templates/user/shelf/shelf.html:85
#: bookwyrm/templates/user/shelf/shelf.html:116
msgid "Rating"
msgstr "评价"
-#: bookwyrm/forms.py:310 bookwyrm/templates/lists/list.html:107
+#: bookwyrm/forms.py:311 bookwyrm/templates/lists/list.html:107
msgid "Sort By"
msgstr "排序方式"
-#: bookwyrm/forms.py:314
+#: bookwyrm/forms.py:315
msgid "Ascending"
msgstr "升序"
-#: bookwyrm/forms.py:315
+#: bookwyrm/forms.py:316
msgid "Descending"
msgstr "降序"
-#: bookwyrm/models/fields.py:26
+#: bookwyrm/models/fields.py:27
#, python-format
msgid "%(value)s is not a valid remote_id"
msgstr "%(value)s 不是有效的 remote_id"
-#: bookwyrm/models/fields.py:35 bookwyrm/models/fields.py:44
+#: bookwyrm/models/fields.py:36 bookwyrm/models/fields.py:45
#, python-format
msgid "%(value)s is not a valid username"
msgstr "%(value)s 不是有效的用户名"
-#: bookwyrm/models/fields.py:167 bookwyrm/templates/layout.html:157
+#: bookwyrm/models/fields.py:174 bookwyrm/templates/layout.html:159
msgid "username"
msgstr "用户名"
-#: bookwyrm/models/fields.py:172
+#: bookwyrm/models/fields.py:179
msgid "A user with that username already exists."
msgstr "已经存在使用该用户名的用户。"
-#: bookwyrm/settings.py:164
+#: bookwyrm/settings.py:123
+msgid "Home Timeline"
+msgstr "主页时间线"
+
+#: bookwyrm/settings.py:123
+msgid "Home"
+msgstr "主页"
+
+#: bookwyrm/settings.py:124
+#, fuzzy
+#| msgid "Book Title"
+msgid "Books Timeline"
+msgstr "书名"
+
+#: bookwyrm/settings.py:124 bookwyrm/templates/search/layout.html:21
+#: bookwyrm/templates/search/layout.html:42
+#: bookwyrm/templates/user/layout.html:81
+msgid "Books"
+msgstr "书目"
+
+#: bookwyrm/settings.py:170
msgid "English"
msgstr "English(英语)"
-#: bookwyrm/settings.py:165
+#: bookwyrm/settings.py:171
msgid "German"
msgstr "Deutsch(德语)"
-#: bookwyrm/settings.py:166
+#: bookwyrm/settings.py:172
msgid "Spanish"
msgstr "Español(西班牙语)"
-#: bookwyrm/settings.py:167
+#: bookwyrm/settings.py:173
msgid "French"
msgstr "Français(法语)"
-#: bookwyrm/settings.py:168
+#: bookwyrm/settings.py:174
msgid "Simplified Chinese"
msgstr "简体中文"
-#: bookwyrm/settings.py:169
+#: bookwyrm/settings.py:175
msgid "Traditional Chinese"
msgstr "繁體中文(繁体中文)"
@@ -158,12 +178,12 @@ msgid "Wikipedia"
msgstr "维基百科"
#: bookwyrm/templates/author/author.html:69
-#: bookwyrm/templates/book/book.html:90
+#: bookwyrm/templates/book/book.html:95
msgid "View on OpenLibrary"
msgstr "在 OpenLibrary 查看"
#: bookwyrm/templates/author/author.html:77
-#: bookwyrm/templates/book/book.html:93
+#: bookwyrm/templates/book/book.html:98
msgid "View on Inventaire"
msgstr "在 Inventaire 查看"
@@ -256,11 +276,11 @@ msgid "Goodreads key:"
msgstr "Goodreads key:"
#: bookwyrm/templates/author/edit_author.html:116
-#: bookwyrm/templates/book/book.html:136
+#: bookwyrm/templates/book/book.html:141
#: bookwyrm/templates/book/edit_book.html:321
#: bookwyrm/templates/book/readthrough.html:77
#: bookwyrm/templates/lists/form.html:42
-#: bookwyrm/templates/preferences/edit_user.html:70
+#: bookwyrm/templates/preferences/edit_user.html:78
#: bookwyrm/templates/settings/announcement_form.html:69
#: bookwyrm/templates/settings/edit_server.html:68
#: bookwyrm/templates/settings/federated_server.html:98
@@ -273,7 +293,7 @@ msgid "Save"
msgstr "保存"
#: bookwyrm/templates/author/edit_author.html:117
-#: bookwyrm/templates/book/book.html:137 bookwyrm/templates/book/book.html:186
+#: bookwyrm/templates/book/book.html:142 bookwyrm/templates/book/book.html:191
#: bookwyrm/templates/book/cover_modal.html:32
#: bookwyrm/templates/book/edit_book.html:322
#: bookwyrm/templates/book/readthrough.html:78
@@ -288,109 +308,109 @@ msgstr "保存"
msgid "Cancel"
msgstr "取消"
-#: bookwyrm/templates/book/book.html:43
+#: bookwyrm/templates/book/book.html:48
#: bookwyrm/templates/discover/large-book.html:25
#: bookwyrm/templates/discover/small-book.html:19
msgid "by"
msgstr "作者"
-#: bookwyrm/templates/book/book.html:51 bookwyrm/templates/book/book.html:52
+#: bookwyrm/templates/book/book.html:56 bookwyrm/templates/book/book.html:57
msgid "Edit Book"
msgstr "编辑书目"
-#: bookwyrm/templates/book/book.html:69
+#: bookwyrm/templates/book/book.html:74
#: bookwyrm/templates/book/cover_modal.html:5
msgid "Add cover"
msgstr "添加封面"
-#: bookwyrm/templates/book/book.html:73
+#: bookwyrm/templates/book/book.html:78
msgid "Failed to load cover"
msgstr "加载封面失败"
-#: bookwyrm/templates/book/book.html:113
+#: bookwyrm/templates/book/book.html:118
#, python-format
msgid "(%(review_count)s review)"
msgid_plural "(%(review_count)s reviews)"
msgstr[0] "(%(review_count)s 则书评)"
-#: bookwyrm/templates/book/book.html:125
+#: bookwyrm/templates/book/book.html:130
msgid "Add Description"
msgstr "添加描述"
-#: bookwyrm/templates/book/book.html:132
+#: bookwyrm/templates/book/book.html:137
#: bookwyrm/templates/book/edit_book.html:136
#: bookwyrm/templates/lists/form.html:12
msgid "Description:"
msgstr "描述:"
-#: bookwyrm/templates/book/book.html:146
+#: bookwyrm/templates/book/book.html:151
#, python-format
msgid "%(count)s editions"
msgstr "%(count)s 个版本"
-#: bookwyrm/templates/book/book.html:154
+#: bookwyrm/templates/book/book.html:159
#, python-format
msgid "This edition is on your %(shelf_name)s shelf."
msgstr "此版本在你的 %(shelf_name)s 书架上。"
-#: bookwyrm/templates/book/book.html:160
+#: bookwyrm/templates/book/book.html:165
#, 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:171
+#: bookwyrm/templates/book/book.html:176
msgid "Your reading activity"
msgstr "你的阅读活动"
-#: bookwyrm/templates/book/book.html:174
+#: bookwyrm/templates/book/book.html:179
msgid "Add read dates"
msgstr "添加阅读日期"
-#: bookwyrm/templates/book/book.html:183
+#: bookwyrm/templates/book/book.html:188
msgid "Create"
msgstr "创建"
-#: bookwyrm/templates/book/book.html:193
+#: bookwyrm/templates/book/book.html:198
msgid "You don't have any reading activity for this book."
msgstr "你还没有任何这本书的阅读活动。"
-#: bookwyrm/templates/book/book.html:212
+#: bookwyrm/templates/book/book.html:217
msgid "Reviews"
msgstr "书评"
-#: bookwyrm/templates/book/book.html:217
+#: bookwyrm/templates/book/book.html:222
msgid "Your reviews"
msgstr "你的书评"
-#: bookwyrm/templates/book/book.html:223
+#: bookwyrm/templates/book/book.html:228
msgid "Your comments"
msgstr "你的评论"
-#: bookwyrm/templates/book/book.html:229
+#: bookwyrm/templates/book/book.html:234
msgid "Your quotes"
msgstr "你的引用"
-#: bookwyrm/templates/book/book.html:265
+#: bookwyrm/templates/book/book.html:270
msgid "Subjects"
msgstr "主题"
-#: bookwyrm/templates/book/book.html:277
+#: bookwyrm/templates/book/book.html:282
msgid "Places"
msgstr "地点"
-#: bookwyrm/templates/book/book.html:288 bookwyrm/templates/layout.html:66
+#: bookwyrm/templates/book/book.html:293 bookwyrm/templates/layout.html:68
#: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:25
#: bookwyrm/templates/search/layout.html:50
-#: bookwyrm/templates/user/layout.html:73
+#: bookwyrm/templates/user/layout.html:75
msgid "Lists"
msgstr "列表"
-#: bookwyrm/templates/book/book.html:299
+#: bookwyrm/templates/book/book.html:304
msgid "Add to list"
msgstr "添加到列表"
-#: bookwyrm/templates/book/book.html:309
+#: bookwyrm/templates/book/book.html:314
#: bookwyrm/templates/book/cover_modal.html:31
#: bookwyrm/templates/lists/list.html:179
msgid "Add"
@@ -649,9 +669,9 @@ msgstr "删除这些阅读日期"
#: bookwyrm/templates/components/inline_form.html:8
#: bookwyrm/templates/components/modal.html:11
-#: bookwyrm/templates/feed/layout.html:70
-#: bookwyrm/templates/get_started/layout.html:19
-#: bookwyrm/templates/get_started/layout.html:52
+#: bookwyrm/templates/feed/layout.html:71
+#: bookwyrm/templates/get_started/layout.html:20
+#: bookwyrm/templates/get_started/layout.html:53
#: bookwyrm/templates/search/book.html:32
#: bookwyrm/templates/snippets/announcement.html:18
msgid "Close"
@@ -675,7 +695,7 @@ msgstr "跨站社区"
#: bookwyrm/templates/directory/directory.html:4
#: bookwyrm/templates/directory/directory.html:9
-#: bookwyrm/templates/layout.html:69
+#: bookwyrm/templates/layout.html:71
msgid "Directory"
msgstr "目录"
@@ -706,21 +726,30 @@ msgstr "受推荐"
msgid "Recently active"
msgstr "最近活跃"
-#: bookwyrm/templates/directory/user_card.html:33
+#: bookwyrm/templates/directory/user_card.html:17
+#: bookwyrm/templates/directory/user_card.html:18
+#: bookwyrm/templates/user/user_preview.html:16
+#: bookwyrm/templates/user/user_preview.html:17
+#, fuzzy
+#| msgid "Your Account"
+msgid "Locked account"
+msgstr "你的帐号"
+
+#: bookwyrm/templates/directory/user_card.html:40
msgid "follower you follow"
msgid_plural "followers you follow"
msgstr[0] "你关注的关注者"
-#: bookwyrm/templates/directory/user_card.html:40
+#: bookwyrm/templates/directory/user_card.html:47
msgid "book on your shelves"
msgid_plural "books on your shelves"
msgstr[0] "你书架上的书"
-#: bookwyrm/templates/directory/user_card.html:48
+#: bookwyrm/templates/directory/user_card.html:55
msgid "posts"
msgstr "发文"
-#: bookwyrm/templates/directory/user_card.html:54
+#: bookwyrm/templates/directory/user_card.html:61
msgid "last active"
msgstr "最后活跃"
@@ -756,7 +785,7 @@ msgid "Recent Books"
msgstr "最近书目"
#: bookwyrm/templates/discover/landing_layout.html:5
-#: bookwyrm/templates/get_started/layout.html:4
+#: bookwyrm/templates/get_started/layout.html:5
msgid "Welcome"
msgstr "欢迎"
@@ -874,7 +903,7 @@ msgid "Direct Messages with %(username)s"
msgstr "与 %(username)s 私信"
#: bookwyrm/templates/feed/direct_messages.html:10
-#: bookwyrm/templates/layout.html:97
+#: bookwyrm/templates/layout.html:99
msgid "Direct Messages"
msgstr "私信"
@@ -886,91 +915,55 @@ msgstr "所有消息"
msgid "You have no messages right now."
msgstr "你现在没有消息。"
-#: bookwyrm/templates/feed/feed.html:8
-msgid "Home Timeline"
-msgstr "主页时间线"
-
-#: bookwyrm/templates/feed/feed.html:10
-msgid "Local Timeline"
-msgstr "本地时间线"
-
-#: bookwyrm/templates/feed/feed.html:12
-msgid "Federated Timeline"
-msgstr "跨站时间线"
-
-#: bookwyrm/templates/feed/feed.html:18
-msgid "Home"
-msgstr "主页"
-
-#: bookwyrm/templates/feed/feed.html:21
-msgid "Local"
-msgstr "本站"
-
-#: bookwyrm/templates/feed/feed.html:24
-#: bookwyrm/templates/settings/edit_server.html:40
-msgid "Federated"
-msgstr "跨站"
-
-#: bookwyrm/templates/feed/feed.html:32
-#, python-format
-msgid "load 0 unread status(es)"
+#: bookwyrm/templates/feed/feed.html:22
+#, fuzzy, python-format
+#| msgid "load 0 unread status(es)"
+msgid "load 0 unread status(es)"
msgstr "加载 0 条未读状态"
-#: bookwyrm/templates/feed/feed.html:47
+#: bookwyrm/templates/feed/feed.html:38
msgid "There aren't any activities right now! Try following a user to get started"
msgstr "现在还没有任何活动!尝试从关注一个用户开始吧"
-#: bookwyrm/templates/feed/feed.html:55
-#: bookwyrm/templates/get_started/users.html:6
-msgid "Who to follow"
-msgstr "可以关注的人"
-
-#: bookwyrm/templates/feed/layout.html:4
+#: bookwyrm/templates/feed/layout.html:5
msgid "Updates"
msgstr "更新"
-#: bookwyrm/templates/feed/layout.html:11
+#: bookwyrm/templates/feed/layout.html:12
#: bookwyrm/templates/user/shelf/books_header.html:3
msgid "Your books"
msgstr "你的书目"
-#: bookwyrm/templates/feed/layout.html:13
+#: bookwyrm/templates/feed/layout.html:14
msgid "There are no books here right now! Try searching for a book to get started"
msgstr "现在这里还没有任何书目!尝试着从搜索某本书开始吧"
-#: bookwyrm/templates/feed/layout.html:24
+#: bookwyrm/templates/feed/layout.html:25
#: bookwyrm/templates/user/shelf/shelf.html:29
msgid "To Read"
msgstr "想读"
-#: bookwyrm/templates/feed/layout.html:25
+#: bookwyrm/templates/feed/layout.html:26
#: bookwyrm/templates/user/shelf/shelf.html:29
msgid "Currently Reading"
msgstr "在读"
-#: bookwyrm/templates/feed/layout.html:26
+#: bookwyrm/templates/feed/layout.html:27
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:16
#: bookwyrm/templates/user/shelf/shelf.html:29
msgid "Read"
msgstr "读过"
-#: bookwyrm/templates/feed/layout.html:89 bookwyrm/templates/goal.html:26
+#: bookwyrm/templates/feed/layout.html:90 bookwyrm/templates/goal.html:26
#: bookwyrm/templates/snippets/goal_card.html:6
#, python-format
msgid "%(year)s Reading Goal"
msgstr "%(year)s 阅读目标"
-#: bookwyrm/templates/feed/suggested_users.html:16
-#, python-format
-msgid "%(mutuals)s follower you follow"
-msgid_plural "%(mutuals)s followers you follow"
-msgstr[0] "%(mutuals)s 个你也关注的关注者"
-
-#: bookwyrm/templates/feed/suggested_users.html:19
-#, python-format
-msgid "%(shared_books)s book on your shelves"
-msgid_plural "%(shared_books)s books on your shelves"
-msgstr[0] "%(shared_books)s 本在你书架上也有的书"
+#: bookwyrm/templates/feed/suggested_users.html:3
+#: bookwyrm/templates/get_started/users.html:6
+msgid "Who to follow"
+msgstr "可以关注的人"
#: bookwyrm/templates/get_started/book_preview.html:6
#, python-format
@@ -1001,7 +994,7 @@ msgstr "你可以在开始使用 %(site_name)s 后添加书目。"
#: bookwyrm/templates/get_started/books.html:17
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
-#: bookwyrm/templates/layout.html:42 bookwyrm/templates/layout.html:43
+#: bookwyrm/templates/layout.html:44 bookwyrm/templates/layout.html:45
#: bookwyrm/templates/lists/list.html:139
#: bookwyrm/templates/search/layout.html:4
#: bookwyrm/templates/search/layout.html:9
@@ -1027,33 +1020,33 @@ msgstr "没有找到书目"
msgid "Save & continue"
msgstr "保存 & 继续"
-#: bookwyrm/templates/get_started/layout.html:14
+#: bookwyrm/templates/get_started/layout.html:15
#, python-format
msgid "Welcome to %(site_name)s!"
msgstr "欢迎来到 %(site_name)s!"
-#: bookwyrm/templates/get_started/layout.html:16
+#: bookwyrm/templates/get_started/layout.html:17
msgid "These are some first steps to get you started."
msgstr "这些最初的步骤可以帮助你入门。"
-#: bookwyrm/templates/get_started/layout.html:30
+#: bookwyrm/templates/get_started/layout.html:31
#: bookwyrm/templates/get_started/profile.html:6
msgid "Create your profile"
msgstr "创建你的个人资料"
-#: bookwyrm/templates/get_started/layout.html:34
+#: bookwyrm/templates/get_started/layout.html:35
msgid "Add books"
msgstr "添加书目"
-#: bookwyrm/templates/get_started/layout.html:38
+#: bookwyrm/templates/get_started/layout.html:39
msgid "Find friends"
msgstr "寻找同好"
-#: bookwyrm/templates/get_started/layout.html:44
+#: bookwyrm/templates/get_started/layout.html:45
msgid "Skip this step"
msgstr "跳过此步骤"
-#: bookwyrm/templates/get_started/layout.html:48
+#: bookwyrm/templates/get_started/layout.html:49
msgid "Finish"
msgstr "完成"
@@ -1082,7 +1075,7 @@ msgid "Manually approve followers:"
msgstr "手动批准关注者:"
#: bookwyrm/templates/get_started/profile.html:48
-#: bookwyrm/templates/preferences/edit_user.html:58
+#: bookwyrm/templates/preferences/edit_user.html:66
msgid "Show this account in suggested users:"
msgstr "在推荐的用户中显示此帐号:"
@@ -1163,83 +1156,83 @@ msgstr "最近的导入"
msgid "No recent imports"
msgstr "无最近的导入"
-#: bookwyrm/templates/import_status.html:5
-#: bookwyrm/templates/import_status.html:9
+#: bookwyrm/templates/import_status.html:6
+#: bookwyrm/templates/import_status.html:10
msgid "Import Status"
msgstr "导入状态"
-#: bookwyrm/templates/import_status.html:10
+#: bookwyrm/templates/import_status.html:11
msgid "Back to imports"
msgstr "回到导入"
-#: bookwyrm/templates/import_status.html:14
+#: bookwyrm/templates/import_status.html:15
msgid "Import started:"
msgstr "导入开始:"
-#: bookwyrm/templates/import_status.html:19
+#: bookwyrm/templates/import_status.html:20
msgid "Import completed:"
msgstr "导入完成:"
-#: bookwyrm/templates/import_status.html:24
+#: bookwyrm/templates/import_status.html:25
msgid "TASK FAILED"
msgstr "任务失败"
-#: bookwyrm/templates/import_status.html:31
+#: bookwyrm/templates/import_status.html:32
msgid "Import still in progress."
msgstr "还在导入中。"
-#: bookwyrm/templates/import_status.html:33
+#: bookwyrm/templates/import_status.html:34
msgid "(Hit reload to update!)"
msgstr "(按下重新加载来更新!)"
-#: bookwyrm/templates/import_status.html:40
+#: bookwyrm/templates/import_status.html:41
msgid "Failed to load"
msgstr "加载失败"
-#: bookwyrm/templates/import_status.html:49
+#: bookwyrm/templates/import_status.html:50
#, python-format
msgid "Jump to the bottom of the list to select the %(failed_count)s items which failed to import."
msgstr "跳转至列表底部来选取 %(failed_count)s 个导入失败的项目。"
-#: bookwyrm/templates/import_status.html:61
+#: bookwyrm/templates/import_status.html:62
#, python-format
msgid "Line %(index)s: %(title)s by %(author)s"
msgstr "第 %(index)s 行: %(author)s 所著的 %(title)s"
-#: bookwyrm/templates/import_status.html:81
+#: bookwyrm/templates/import_status.html:82
msgid "Select all"
msgstr "全选"
-#: bookwyrm/templates/import_status.html:84
+#: bookwyrm/templates/import_status.html:85
msgid "Retry items"
msgstr "重试项目"
-#: bookwyrm/templates/import_status.html:111
+#: bookwyrm/templates/import_status.html:112
msgid "Successfully imported"
msgstr "成功导入了"
-#: bookwyrm/templates/import_status.html:113
+#: bookwyrm/templates/import_status.html:114
msgid "Import Progress"
msgstr "导入进度"
-#: bookwyrm/templates/import_status.html:118
+#: bookwyrm/templates/import_status.html:119
msgid "Book"
msgstr "书目"
-#: bookwyrm/templates/import_status.html:121
+#: bookwyrm/templates/import_status.html:122
#: bookwyrm/templates/snippets/create_status_form.html:13
#: bookwyrm/templates/user/shelf/shelf.html:79
#: bookwyrm/templates/user/shelf/shelf.html:99
msgid "Title"
msgstr "标题"
-#: bookwyrm/templates/import_status.html:124
+#: bookwyrm/templates/import_status.html:125
#: bookwyrm/templates/user/shelf/shelf.html:80
#: bookwyrm/templates/user/shelf/shelf.html:102
msgid "Author"
msgstr "作者"
-#: bookwyrm/templates/import_status.html:147
+#: bookwyrm/templates/import_status.html:148
msgid "Imported"
msgstr "已导入"
@@ -1269,27 +1262,27 @@ msgstr "\"%(query)s\" 的搜索结果"
msgid "Matching Books"
msgstr "匹配的书目"
-#: bookwyrm/templates/layout.html:38
+#: bookwyrm/templates/layout.html:40
msgid "Search for a book or user"
msgstr "搜索书目或用户"
-#: bookwyrm/templates/layout.html:52 bookwyrm/templates/layout.html:53
+#: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55
msgid "Main navigation menu"
msgstr "主导航菜单"
-#: bookwyrm/templates/layout.html:63
+#: bookwyrm/templates/layout.html:65
msgid "Feed"
msgstr "动态"
-#: bookwyrm/templates/layout.html:92
+#: bookwyrm/templates/layout.html:94
msgid "Your Books"
msgstr "你的书目"
-#: bookwyrm/templates/layout.html:102
+#: bookwyrm/templates/layout.html:104
msgid "Settings"
msgstr "设置"
-#: bookwyrm/templates/layout.html:111
+#: bookwyrm/templates/layout.html:113
#: bookwyrm/templates/settings/admin_layout.html:31
#: bookwyrm/templates/settings/manage_invite_requests.html:15
#: bookwyrm/templates/settings/manage_invites.html:3
@@ -1297,61 +1290,61 @@ msgstr "设置"
msgid "Invites"
msgstr "邀请"
-#: bookwyrm/templates/layout.html:118
+#: bookwyrm/templates/layout.html:120
msgid "Admin"
msgstr "管理员"
-#: bookwyrm/templates/layout.html:125
+#: bookwyrm/templates/layout.html:127
msgid "Log out"
msgstr "登出"
-#: bookwyrm/templates/layout.html:133 bookwyrm/templates/layout.html:134
+#: bookwyrm/templates/layout.html:135 bookwyrm/templates/layout.html:136
#: bookwyrm/templates/notifications.html:6
#: bookwyrm/templates/notifications.html:11
msgid "Notifications"
msgstr "通知"
-#: bookwyrm/templates/layout.html:156 bookwyrm/templates/layout.html:160
+#: bookwyrm/templates/layout.html:158 bookwyrm/templates/layout.html:162
#: bookwyrm/templates/login.html:17
#: bookwyrm/templates/snippets/register_form.html:4
msgid "Username:"
msgstr "用户名:"
-#: bookwyrm/templates/layout.html:161
+#: bookwyrm/templates/layout.html:163
msgid "password"
msgstr "密码"
-#: bookwyrm/templates/layout.html:162 bookwyrm/templates/login.html:36
+#: bookwyrm/templates/layout.html:164 bookwyrm/templates/login.html:36
msgid "Forgot your password?"
msgstr "忘记了密码?"
-#: bookwyrm/templates/layout.html:165 bookwyrm/templates/login.html:10
+#: bookwyrm/templates/layout.html:167 bookwyrm/templates/login.html:10
#: bookwyrm/templates/login.html:33
msgid "Log in"
msgstr "登录"
-#: bookwyrm/templates/layout.html:173
+#: bookwyrm/templates/layout.html:175
msgid "Join"
msgstr "加入"
-#: bookwyrm/templates/layout.html:211
+#: bookwyrm/templates/layout.html:213
msgid "About this instance"
msgstr "关于本实例"
-#: bookwyrm/templates/layout.html:215
+#: bookwyrm/templates/layout.html:217
msgid "Contact site admin"
msgstr "联系站点管理员"
-#: bookwyrm/templates/layout.html:219
+#: bookwyrm/templates/layout.html:221
msgid "Documentation"
msgstr "文档:"
-#: bookwyrm/templates/layout.html:226
+#: bookwyrm/templates/layout.html:228
#, python-format
msgid "Support %(site_name)s on %(support_title)s"
msgstr "在 %(support_title)s 上支持 %(site_name)s"
-#: bookwyrm/templates/layout.html:230
+#: bookwyrm/templates/layout.html:232
msgid "BookWyrm's source code is freely available. You can contribute or report issues on GitHub."
msgstr "BookWyrm 是开源软件。你可以在 GitHub 贡献或报告问题。"
@@ -1786,12 +1779,18 @@ msgstr "编辑个人资料"
msgid "Show set reading goal prompt in feed:"
msgstr "在消息流中显示设置阅读目标的提示:"
-#: bookwyrm/templates/preferences/edit_user.html:62
+#: bookwyrm/templates/preferences/edit_user.html:58
+#, fuzzy
+#| msgid "Post privacy"
+msgid "Default post privacy:"
+msgstr "发文隐私"
+
+#: bookwyrm/templates/preferences/edit_user.html:70
#, python-format
msgid "Your account will show up in the directory, and may be recommended to other BookWyrm users."
msgstr "你的帐号会显示在 目录 中,并可能受其它 BookWyrm 用户推荐。"
-#: bookwyrm/templates/preferences/edit_user.html:65
+#: bookwyrm/templates/preferences/edit_user.html:73
msgid "Preferred Timezone: "
msgstr "偏好的时区:"
@@ -1823,22 +1822,22 @@ msgid "Want to Read \"%(book_title)s\""
msgstr "想要阅读 \"%(book_title)s\""
#: bookwyrm/templates/rss/title.html:5
-#: bookwyrm/templates/snippets/status/status_header.html:35
+#: bookwyrm/templates/snippets/status/status_header.html:36
msgid "rated"
msgstr "评价了"
#: bookwyrm/templates/rss/title.html:7
-#: bookwyrm/templates/snippets/status/status_header.html:37
+#: bookwyrm/templates/snippets/status/status_header.html:38
msgid "reviewed"
msgstr "写了书评给"
#: bookwyrm/templates/rss/title.html:9
-#: bookwyrm/templates/snippets/status/status_header.html:39
+#: bookwyrm/templates/snippets/status/status_header.html:40
msgid "commented on"
msgstr "评论了"
#: bookwyrm/templates/rss/title.html:11
-#: bookwyrm/templates/snippets/status/status_header.html:41
+#: bookwyrm/templates/snippets/status/status_header.html:42
msgid "quoted"
msgstr "引用了"
@@ -1862,12 +1861,6 @@ msgstr "搜索请求"
msgid "Search type"
msgstr "搜索类型"
-#: bookwyrm/templates/search/layout.html:21
-#: bookwyrm/templates/search/layout.html:42
-#: bookwyrm/templates/user/layout.html:79
-msgid "Books"
-msgstr "书目"
-
#: bookwyrm/templates/search/layout.html:23
#: bookwyrm/templates/search/layout.html:46
#: bookwyrm/templates/settings/admin_layout.html:26
@@ -2043,6 +2036,10 @@ msgstr "实例:"
msgid "Status:"
msgstr "状态:"
+#: bookwyrm/templates/settings/edit_server.html:40
+msgid "Federated"
+msgstr "跨站"
+
#: bookwyrm/templates/settings/edit_server.html:41
#: bookwyrm/templates/settings/federated_server.html:10
msgid "Blocked"
@@ -2069,7 +2066,7 @@ msgid "Details"
msgstr "详细"
#: bookwyrm/templates/settings/federated_server.html:39
-#: bookwyrm/templates/user/layout.html:61
+#: bookwyrm/templates/user/layout.html:63
msgid "Activity"
msgstr "活动"
@@ -2331,13 +2328,20 @@ msgstr "注册关闭文字:"
msgid "Posted by %(username)s"
msgstr "由 %(username)s 发布"
-#: bookwyrm/templates/snippets/book_cover.html:31
+#: bookwyrm/templates/snippets/authors.html:22
+#, python-format
+msgid "and %(remainder_count_display)s other"
+msgid_plural "and %(remainder_count_display)s others"
+msgstr[0] ""
+
+#: bookwyrm/templates/snippets/book_cover.html:32
msgid "No cover"
msgstr "没有封面"
-#: bookwyrm/templates/snippets/book_titleby.html:4
-#, python-format
-msgid "%(title)s by "
+#: bookwyrm/templates/snippets/book_titleby.html:6
+#, fuzzy, python-format
+#| msgid "%(title)s by "
+msgid "%(title)s by"
msgstr "%(title)s 来自"
#: bookwyrm/templates/snippets/boost_button.html:20
@@ -2419,7 +2423,7 @@ msgstr "加入剧透警告"
#: bookwyrm/templates/snippets/create_status_form.html:117
#: bookwyrm/templates/snippets/privacy-icons.html:15
#: bookwyrm/templates/snippets/privacy-icons.html:16
-#: bookwyrm/templates/snippets/privacy_select.html:19
+#: bookwyrm/templates/snippets/privacy_select.html:20
msgid "Private"
msgstr "私密"
@@ -2576,13 +2580,13 @@ msgstr "往后"
#: bookwyrm/templates/snippets/privacy-icons.html:3
#: bookwyrm/templates/snippets/privacy-icons.html:4
-#: bookwyrm/templates/snippets/privacy_select.html:10
+#: bookwyrm/templates/snippets/privacy_select.html:11
msgid "Public"
msgstr "公开"
#: bookwyrm/templates/snippets/privacy-icons.html:7
#: bookwyrm/templates/snippets/privacy-icons.html:8
-#: bookwyrm/templates/snippets/privacy_select.html:13
+#: bookwyrm/templates/snippets/privacy_select.html:14
msgid "Unlisted"
msgstr "不公开"
@@ -2594,7 +2598,7 @@ msgstr "仅关注者"
msgid "Post privacy"
msgstr "发文隐私"
-#: bookwyrm/templates/snippets/privacy_select.html:16
+#: bookwyrm/templates/snippets/privacy_select.html:17
#: bookwyrm/templates/user/relationships/followers.html:6
#: bookwyrm/templates/user/relationships/layout.html:11
msgid "Followers"
@@ -2681,17 +2685,17 @@ msgstr "开始 \"%(book_title)s\""
msgid "Want to Read \"%(book_title)s\""
msgstr "想要阅读 \"%(book_title)s\""
-#: bookwyrm/templates/snippets/status/content_status.html:71
+#: bookwyrm/templates/snippets/status/content_status.html:72
#: bookwyrm/templates/snippets/trimmed_text.html:15
msgid "Show more"
msgstr "显示更多"
-#: bookwyrm/templates/snippets/status/content_status.html:86
+#: bookwyrm/templates/snippets/status/content_status.html:87
#: bookwyrm/templates/snippets/trimmed_text.html:30
msgid "Show less"
msgstr "显示更少"
-#: bookwyrm/templates/snippets/status/content_status.html:116
+#: bookwyrm/templates/snippets/status/content_status.html:117
msgid "Open image in new window"
msgstr "在新窗口中打开图像"
@@ -2714,7 +2718,7 @@ msgstr "喜欢状态"
msgid "boosted"
msgstr "转发了"
-#: bookwyrm/templates/snippets/status/status_header.html:45
+#: bookwyrm/templates/snippets/status/status_header.html:46
#, python-format
msgid "replied to %(username)s's status"
msgstr "回复了 %(username)s 的 状态"
@@ -2734,6 +2738,25 @@ msgstr "删除并重新起草"
msgid "Send direct message"
msgstr "发送私信"
+#: bookwyrm/templates/snippets/suggested_users.html:16
+#, python-format
+msgid "%(mutuals)s follower you follow"
+msgid_plural "%(mutuals)s followers you follow"
+msgstr[0] "%(mutuals)s 个你也关注的关注者"
+
+#: bookwyrm/templates/snippets/suggested_users.html:23
+#, python-format
+msgid "%(shared_books)s book on your shelves"
+msgid_plural "%(shared_books)s books on your shelves"
+msgstr[0] "%(shared_books)s 本在你书架上也有的书"
+
+#: bookwyrm/templates/snippets/suggested_users.html:31
+#: bookwyrm/templates/user/user_preview.html:36
+#, fuzzy
+#| msgid "followed you"
+msgid "Follows you"
+msgstr "关注了你"
+
#: bookwyrm/templates/snippets/switch_edition_button.html:5
msgid "Switch to this edition"
msgstr "切换到此版本"
@@ -2750,11 +2773,11 @@ msgstr "降序排序"
msgid "User Profile"
msgstr "用户个人资料"
-#: bookwyrm/templates/user/layout.html:42
+#: bookwyrm/templates/user/layout.html:44
msgid "Follow Requests"
msgstr "关注请求"
-#: bookwyrm/templates/user/layout.html:67
+#: bookwyrm/templates/user/layout.html:69
msgid "Reading Goal"
msgstr "阅读目标"
@@ -2860,28 +2883,35 @@ msgstr "RSS 流"
msgid "No activities yet!"
msgstr "还没有活动!"
-#: bookwyrm/templates/user/user_preview.html:15
+#: bookwyrm/templates/user/user_preview.html:22
#, python-format
msgid "Joined %(date)s"
msgstr "在 %(date)s 加入"
-#: bookwyrm/templates/user/user_preview.html:19
+#: bookwyrm/templates/user/user_preview.html:26
#, python-format
msgid "%(counter)s follower"
msgid_plural "%(counter)s followers"
msgstr[0] "%(counter)s 个关注者"
-#: bookwyrm/templates/user/user_preview.html:20
+#: bookwyrm/templates/user/user_preview.html:27
#, python-format
msgid "%(counter)s following"
msgstr "关注着 %(counter)s 人"
-#: bookwyrm/templates/user/user_preview.html:26
+#: bookwyrm/templates/user/user_preview.html:34
#, python-format
msgid "%(mutuals_display)s follower you follow"
msgid_plural "%(mutuals_display)s followers you follow"
msgstr[0] "%(mutuals_display)s 个你也关注的关注者"
+#: bookwyrm/templates/user/user_preview.html:38
+#, fuzzy
+#| msgid "follower you follow"
+#| msgid_plural "followers you follow"
+msgid "No followers you follow"
+msgstr "你关注的关注者"
+
#: bookwyrm/templates/user_admin/user.html:9
msgid "Back to users"
msgstr "回到用户"
@@ -2974,3 +3004,12 @@ msgstr "没有找到使用该邮箱的用户。"
#, python-format
msgid "A password reset link sent to %s"
msgstr "密码重置连接已发送给 %s"
+
+#~ msgid "Local Timeline"
+#~ msgstr "本地时间线"
+
+#~ msgid "Federated Timeline"
+#~ msgstr "跨站时间线"
+
+#~ msgid "Local"
+#~ msgstr "本站"
diff --git a/locale/zh_Hant/LC_MESSAGES/django.mo b/locale/zh_Hant/LC_MESSAGES/django.mo
index 8c8b5af88..552fea2a6 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 e11f024b7..5ce42251b 100644
--- a/locale/zh_Hant/LC_MESSAGES/django.po
+++ b/locale/zh_Hant/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-06-30 10:36+0000\n"
+"POT-Creation-Date: 2021-08-05 01:33+0000\n"
"PO-Revision-Date: 2021-06-30 10:36+0000\n"
"Last-Translator: Grace Cheng \n"
"Language-Team: LANGUAGE \n"
@@ -18,101 +18,123 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-#: bookwyrm/forms.py:224
+#: bookwyrm/forms.py:232
msgid "A user with this email already exists."
msgstr "已經存在使用該郵箱的使用者。"
-#: bookwyrm/forms.py:238
+#: bookwyrm/forms.py:246
msgid "One Day"
msgstr "一天"
-#: bookwyrm/forms.py:239
+#: bookwyrm/forms.py:247
msgid "One Week"
msgstr "一週"
-#: bookwyrm/forms.py:240
+#: bookwyrm/forms.py:248
msgid "One Month"
msgstr "一個月"
-#: bookwyrm/forms.py:241
+#: bookwyrm/forms.py:249
msgid "Does Not Expire"
msgstr "永不失效"
-#: bookwyrm/forms.py:246
+#: bookwyrm/forms.py:254
#, python-format
msgid "%(count)d uses"
msgstr "%(count)d 次使用"
-#: bookwyrm/forms.py:249
+#: bookwyrm/forms.py:257
msgid "Unlimited"
msgstr "不受限"
-#: bookwyrm/forms.py:299
+#: bookwyrm/forms.py:307
msgid "List Order"
msgstr "列表順序"
-#: bookwyrm/forms.py:300
+#: bookwyrm/forms.py:308
msgid "Book Title"
msgstr "書名"
-#: bookwyrm/forms.py:301 bookwyrm/templates/snippets/create_status_form.html:34
+#: bookwyrm/forms.py:309 bookwyrm/templates/snippets/create_status_form.html:34
#: bookwyrm/templates/user/shelf/shelf.html:85
#: bookwyrm/templates/user/shelf/shelf.html:116
msgid "Rating"
msgstr "評價"
-#: bookwyrm/forms.py:303 bookwyrm/templates/lists/list.html:107
+#: bookwyrm/forms.py:311 bookwyrm/templates/lists/list.html:107
msgid "Sort By"
msgstr "排序方式"
-#: bookwyrm/forms.py:307
+#: bookwyrm/forms.py:315
msgid "Ascending"
msgstr "升序"
-#: bookwyrm/forms.py:308
+#: bookwyrm/forms.py:316
msgid "Descending"
msgstr "降序"
-#: bookwyrm/models/fields.py:25
+#: bookwyrm/models/fields.py:27
#, python-format
msgid "%(value)s is not a valid remote_id"
msgstr "%(value)s 不是有效的 remote_id"
-#: bookwyrm/models/fields.py:34 bookwyrm/models/fields.py:43
+#: bookwyrm/models/fields.py:36 bookwyrm/models/fields.py:45
#, python-format
msgid "%(value)s is not a valid username"
msgstr "%(value)s 不是有效的使用者名稱"
-#: bookwyrm/models/fields.py:166 bookwyrm/templates/layout.html:152
+#: bookwyrm/models/fields.py:174 bookwyrm/templates/layout.html:159
msgid "username"
msgstr "使用者名稱"
-#: bookwyrm/models/fields.py:171
+#: bookwyrm/models/fields.py:179
msgid "A user with that username already exists."
msgstr "已經存在使用該名稱的使用者。"
-#: bookwyrm/settings.py:156
+#: bookwyrm/settings.py:123
+msgid "Home Timeline"
+msgstr "主頁時間線"
+
+#: bookwyrm/settings.py:123
+msgid "Home"
+msgstr "主頁"
+
+#: bookwyrm/settings.py:124
+#, fuzzy
+#| msgid "Book Title"
+msgid "Books Timeline"
+msgstr "書名"
+
+#: bookwyrm/settings.py:124 bookwyrm/templates/search/layout.html:21
+#: bookwyrm/templates/search/layout.html:42
+#: bookwyrm/templates/user/layout.html:81
+msgid "Books"
+msgstr "書目"
+
+#: bookwyrm/settings.py:170
msgid "English"
msgstr "English(英語)"
-#: bookwyrm/settings.py:157
+#: bookwyrm/settings.py:171
msgid "German"
msgstr "Deutsch(德語)"
-#: bookwyrm/settings.py:158
+#: bookwyrm/settings.py:172
msgid "Spanish"
msgstr "Español(西班牙語)"
-#: bookwyrm/settings.py:159
+#: bookwyrm/settings.py:173
msgid "French"
msgstr "Français(法語)"
-#: bookwyrm/settings.py:160
+#: bookwyrm/settings.py:174
msgid "Simplified Chinese"
msgstr "簡體中文"
-#: bookwyrm/settings.py:161
-msgid "Tranditional Chinese"
+#: bookwyrm/settings.py:175
+#, fuzzy
+#| msgid "Tranditional Chinese"
+msgid "Traditional Chinese"
msgstr "繁體中文"
#: bookwyrm/templates/404.html:4 bookwyrm/templates/404.html:8
@@ -140,34 +162,44 @@ msgstr "某些東西出錯了!抱歉。"
msgid "Edit Author"
msgstr "編輯作者"
-#: bookwyrm/templates/author/author.html:32
-#: bookwyrm/templates/author/edit_author.html:38
+#: bookwyrm/templates/author/author.html:34
+#: bookwyrm/templates/author/edit_author.html:41
msgid "Aliases:"
msgstr "別名:"
-#: bookwyrm/templates/author/author.html:38
+#: bookwyrm/templates/author/author.html:45
msgid "Born:"
msgstr "出生:"
-#: bookwyrm/templates/author/author.html:44
+#: bookwyrm/templates/author/author.html:52
msgid "Died:"
msgstr "逝世:"
-#: bookwyrm/templates/author/author.html:51
+#: bookwyrm/templates/author/author.html:61
msgid "Wikipedia"
msgstr "維基百科"
-#: bookwyrm/templates/author/author.html:55
-#: bookwyrm/templates/book/book.html:78
+#: bookwyrm/templates/author/author.html:69
+#: bookwyrm/templates/book/book.html:95
msgid "View on OpenLibrary"
msgstr "在 OpenLibrary 檢視"
-#: bookwyrm/templates/author/author.html:60
-#: bookwyrm/templates/book/book.html:81
+#: bookwyrm/templates/author/author.html:77
+#: bookwyrm/templates/book/book.html:98
msgid "View on Inventaire"
msgstr "在 Inventaire 檢視"
-#: bookwyrm/templates/author/author.html:74
+#: bookwyrm/templates/author/author.html:85
+#, fuzzy
+#| msgid "View on OpenLibrary"
+msgid "View on LibraryThing"
+msgstr "在 OpenLibrary 檢視"
+
+#: bookwyrm/templates/author/author.html:93
+msgid "View on Goodreads"
+msgstr ""
+
+#: bookwyrm/templates/author/author.html:108
#, python-format
msgid "Books by %(name)s"
msgstr "%(name)s 所著的書"
@@ -177,212 +209,212 @@ msgid "Edit Author:"
msgstr "編輯作者:"
#: bookwyrm/templates/author/edit_author.html:13
-#: bookwyrm/templates/book/edit_book.html:18
+#: bookwyrm/templates/book/edit_book.html:19
msgid "Added:"
msgstr "新增了:"
#: bookwyrm/templates/author/edit_author.html:14
-#: bookwyrm/templates/book/edit_book.html:19
+#: bookwyrm/templates/book/edit_book.html:24
msgid "Updated:"
msgstr "更新了:"
#: bookwyrm/templates/author/edit_author.html:15
-#: bookwyrm/templates/book/edit_book.html:20
+#: bookwyrm/templates/book/edit_book.html:30
msgid "Last edited by:"
msgstr "最後編輯者:"
#: bookwyrm/templates/author/edit_author.html:31
-#: bookwyrm/templates/book/edit_book.html:90
+#: bookwyrm/templates/book/edit_book.html:117
msgid "Metadata"
msgstr "元資料"
-#: bookwyrm/templates/author/edit_author.html:32
+#: bookwyrm/templates/author/edit_author.html:33
#: bookwyrm/templates/lists/form.html:8
#: bookwyrm/templates/user/shelf/create_shelf_form.html:13
#: bookwyrm/templates/user/shelf/edit_shelf_form.html:14
msgid "Name:"
msgstr "名稱:"
-#: bookwyrm/templates/author/edit_author.html:40
-#: bookwyrm/templates/book/edit_book.html:132
-#: bookwyrm/templates/book/edit_book.html:141
-#: bookwyrm/templates/book/edit_book.html:178
+#: bookwyrm/templates/author/edit_author.html:43
+#: bookwyrm/templates/book/edit_book.html:162
+#: bookwyrm/templates/book/edit_book.html:171
+#: bookwyrm/templates/book/edit_book.html:214
msgid "Separate multiple values with commas."
msgstr "請用逗號(,)分隔多個值。"
-#: bookwyrm/templates/author/edit_author.html:46
+#: bookwyrm/templates/author/edit_author.html:50
msgid "Bio:"
msgstr "簡介:"
-#: bookwyrm/templates/author/edit_author.html:51
+#: bookwyrm/templates/author/edit_author.html:57
msgid "Wikipedia link:"
msgstr "維基百科連結:"
-#: bookwyrm/templates/author/edit_author.html:57
+#: bookwyrm/templates/author/edit_author.html:63
msgid "Birth date:"
msgstr "出生日期:"
-#: bookwyrm/templates/author/edit_author.html:65
+#: bookwyrm/templates/author/edit_author.html:71
msgid "Death date:"
msgstr "死亡日期:"
-#: bookwyrm/templates/author/edit_author.html:73
+#: bookwyrm/templates/author/edit_author.html:79
msgid "Author Identifiers"
msgstr "作者標識號:"
-#: bookwyrm/templates/author/edit_author.html:74
+#: bookwyrm/templates/author/edit_author.html:81
msgid "Openlibrary key:"
msgstr "Openlibrary key:"
-#: bookwyrm/templates/author/edit_author.html:79
-#: bookwyrm/templates/book/edit_book.html:243
+#: bookwyrm/templates/author/edit_author.html:89
+#: bookwyrm/templates/book/edit_book.html:293
msgid "Inventaire ID:"
msgstr "Inventaire ID:"
-#: bookwyrm/templates/author/edit_author.html:84
+#: bookwyrm/templates/author/edit_author.html:97
msgid "Librarything key:"
msgstr "Librarything key:"
-#: bookwyrm/templates/author/edit_author.html:89
+#: bookwyrm/templates/author/edit_author.html:105
msgid "Goodreads key:"
msgstr "Goodreads key:"
-#: bookwyrm/templates/author/edit_author.html:98
-#: bookwyrm/templates/book/book.html:124
-#: bookwyrm/templates/book/edit_book.html:263
+#: bookwyrm/templates/author/edit_author.html:116
+#: bookwyrm/templates/book/book.html:141
+#: bookwyrm/templates/book/edit_book.html:321
+#: bookwyrm/templates/book/readthrough.html:77
#: bookwyrm/templates/lists/form.html:42
-#: bookwyrm/templates/preferences/edit_user.html:70
+#: bookwyrm/templates/preferences/edit_user.html:78
#: bookwyrm/templates/settings/announcement_form.html:69
#: bookwyrm/templates/settings/edit_server.html:68
#: bookwyrm/templates/settings/federated_server.html:98
-#: bookwyrm/templates/settings/site.html:97
-#: bookwyrm/templates/snippets/readthrough.html:77
+#: bookwyrm/templates/settings/site.html:101
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:42
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:42
-#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:34
-#: bookwyrm/templates/user_admin/user_moderation_actions.html:38
+#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:36
+#: bookwyrm/templates/user_admin/user_moderation_actions.html:45
msgid "Save"
msgstr "儲存"
-#: bookwyrm/templates/author/edit_author.html:99
-#: bookwyrm/templates/book/book.html:125 bookwyrm/templates/book/book.html:174
+#: bookwyrm/templates/author/edit_author.html:117
+#: bookwyrm/templates/book/book.html:142 bookwyrm/templates/book/book.html:191
#: bookwyrm/templates/book/cover_modal.html:32
-#: bookwyrm/templates/book/edit_book.html:264
+#: bookwyrm/templates/book/edit_book.html:322
+#: bookwyrm/templates/book/readthrough.html:78
#: bookwyrm/templates/moderation/report_modal.html:34
#: bookwyrm/templates/settings/federated_server.html:99
#: bookwyrm/templates/snippets/delete_readthrough_modal.html:17
#: bookwyrm/templates/snippets/goal_form.html:32
-#: bookwyrm/templates/snippets/readthrough.html:78
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:43
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:43
-#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:35
+#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:37
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:28
msgid "Cancel"
msgstr "取消"
-#: bookwyrm/templates/book/book.html:31
+#: bookwyrm/templates/book/book.html:48
#: bookwyrm/templates/discover/large-book.html:25
#: bookwyrm/templates/discover/small-book.html:19
msgid "by"
msgstr "作者"
-#: bookwyrm/templates/book/book.html:39 bookwyrm/templates/book/book.html:40
+#: bookwyrm/templates/book/book.html:56 bookwyrm/templates/book/book.html:57
msgid "Edit Book"
msgstr "編輯書目"
-#: bookwyrm/templates/book/book.html:57
+#: bookwyrm/templates/book/book.html:74
#: bookwyrm/templates/book/cover_modal.html:5
msgid "Add cover"
msgstr "新增封面"
-#: bookwyrm/templates/book/book.html:61
+#: bookwyrm/templates/book/book.html:78
msgid "Failed to load cover"
msgstr "載入封面失敗"
-#: bookwyrm/templates/book/book.html:101
+#: bookwyrm/templates/book/book.html:118
#, python-format
msgid "(%(review_count)s review)"
msgid_plural "(%(review_count)s reviews)"
msgstr[0] "(%(review_count)s 則書評)"
-#: bookwyrm/templates/book/book.html:113
+#: bookwyrm/templates/book/book.html:130
msgid "Add Description"
msgstr "新增描述"
-#: bookwyrm/templates/book/book.html:120
-#: bookwyrm/templates/book/edit_book.html:108
+#: bookwyrm/templates/book/book.html:137
+#: bookwyrm/templates/book/edit_book.html:136
#: bookwyrm/templates/lists/form.html:12
msgid "Description:"
msgstr "描述:"
-#: bookwyrm/templates/book/book.html:134
+#: bookwyrm/templates/book/book.html:151
#, python-format
msgid "%(count)s editions"
msgstr "%(count)s 個版本"
-#: bookwyrm/templates/book/book.html:142
+#: bookwyrm/templates/book/book.html:159
#, python-format
msgid "This edition is on your %(shelf_name)s shelf."
msgstr "此版本在你的 %(shelf_name)s 書架上。"
-#: bookwyrm/templates/book/book.html:148
+#: bookwyrm/templates/book/book.html:165
#, 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:159
+#: bookwyrm/templates/book/book.html:176
msgid "Your reading activity"
msgstr "你的閱讀活動"
-#: bookwyrm/templates/book/book.html:162
+#: bookwyrm/templates/book/book.html:179
msgid "Add read dates"
msgstr "新增閱讀日期"
-#: bookwyrm/templates/book/book.html:171
+#: bookwyrm/templates/book/book.html:188
msgid "Create"
msgstr "建立"
-#: bookwyrm/templates/book/book.html:181
+#: bookwyrm/templates/book/book.html:198
msgid "You don't have any reading activity for this book."
msgstr "你還未閱讀這本書。"
-#: bookwyrm/templates/book/book.html:200
+#: bookwyrm/templates/book/book.html:217
msgid "Reviews"
msgstr "書評"
-#: bookwyrm/templates/book/book.html:205
+#: bookwyrm/templates/book/book.html:222
msgid "Your reviews"
msgstr "你的書評"
-#: bookwyrm/templates/book/book.html:211
+#: bookwyrm/templates/book/book.html:228
msgid "Your comments"
msgstr "你的評論"
-#: bookwyrm/templates/book/book.html:217
+#: bookwyrm/templates/book/book.html:234
msgid "Your quotes"
msgstr "你的引用"
-#: bookwyrm/templates/book/book.html:253
+#: bookwyrm/templates/book/book.html:270
msgid "Subjects"
msgstr "主題"
-#: bookwyrm/templates/book/book.html:265
+#: bookwyrm/templates/book/book.html:282
msgid "Places"
msgstr "地點"
-#: bookwyrm/templates/book/book.html:276 bookwyrm/templates/layout.html:61
+#: bookwyrm/templates/book/book.html:293 bookwyrm/templates/layout.html:68
#: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:25
#: bookwyrm/templates/search/layout.html:50
-#: bookwyrm/templates/user/layout.html:68
+#: bookwyrm/templates/user/layout.html:75
msgid "Lists"
msgstr "列表"
-#: bookwyrm/templates/book/book.html:287
+#: bookwyrm/templates/book/book.html:304
msgid "Add to list"
msgstr "新增到列表"
-#: bookwyrm/templates/book/book.html:297
+#: bookwyrm/templates/book/book.html:314
#: bookwyrm/templates/book/cover_modal.html:31
#: bookwyrm/templates/lists/list.html:179
msgid "Add"
@@ -393,22 +425,22 @@ msgid "ISBN:"
msgstr "ISBN:"
#: bookwyrm/templates/book/book_identifiers.html:14
-#: bookwyrm/templates/book/edit_book.html:248
+#: bookwyrm/templates/book/edit_book.html:301
msgid "OCLC Number:"
msgstr "OCLC 號:"
#: bookwyrm/templates/book/book_identifiers.html:21
-#: bookwyrm/templates/book/edit_book.html:253
+#: bookwyrm/templates/book/edit_book.html:309
msgid "ASIN:"
msgstr "ASIN:"
#: bookwyrm/templates/book/cover_modal.html:17
-#: bookwyrm/templates/book/edit_book.html:192
+#: bookwyrm/templates/book/edit_book.html:229
msgid "Upload cover:"
msgstr "上載封面:"
#: bookwyrm/templates/book/cover_modal.html:23
-#: bookwyrm/templates/book/edit_book.html:198
+#: bookwyrm/templates/book/edit_book.html:235
msgid "Load cover from url:"
msgstr "從網址載入封面:"
@@ -423,127 +455,134 @@ msgstr "編輯 \"%(book_title)s\""
msgid "Add Book"
msgstr "新增書目"
-#: bookwyrm/templates/book/edit_book.html:40
+#: bookwyrm/templates/book/edit_book.html:54
msgid "Confirm Book Info"
msgstr "確認書目資料"
-#: bookwyrm/templates/book/edit_book.html:47
+#: bookwyrm/templates/book/edit_book.html:62
#, python-format
msgid "Is \"%(name)s\" an existing author?"
msgstr "\"%(name)s\" 是已存在的作者嗎?"
-#: bookwyrm/templates/book/edit_book.html:52
+#: bookwyrm/templates/book/edit_book.html:71
#, python-format
msgid "Author of %(book_title)s"
msgstr "%(book_title)s 的作者"
-#: bookwyrm/templates/book/edit_book.html:55
+#: bookwyrm/templates/book/edit_book.html:75
msgid "This is a new author"
msgstr "這是一位新的作者"
-#: bookwyrm/templates/book/edit_book.html:61
+#: bookwyrm/templates/book/edit_book.html:82
#, python-format
msgid "Creating a new author: %(name)s"
msgstr "正在建立新的作者: %(name)s"
-#: bookwyrm/templates/book/edit_book.html:67
+#: bookwyrm/templates/book/edit_book.html:89
msgid "Is this an edition of an existing work?"
msgstr "這是已存在的作品的另一個版本嗎?"
-#: bookwyrm/templates/book/edit_book.html:71
+#: bookwyrm/templates/book/edit_book.html:97
msgid "This is a new work"
msgstr "這是一個新的作品。"
-#: bookwyrm/templates/book/edit_book.html:77
+#: bookwyrm/templates/book/edit_book.html:104
#: bookwyrm/templates/password_reset.html:30
msgid "Confirm"
msgstr "確認"
-#: bookwyrm/templates/book/edit_book.html:79
+#: bookwyrm/templates/book/edit_book.html:106
#: bookwyrm/templates/feed/status.html:8
msgid "Back"
msgstr "返回"
-#: bookwyrm/templates/book/edit_book.html:93
+#: bookwyrm/templates/book/edit_book.html:120
msgid "Title:"
msgstr "標題:"
-#: bookwyrm/templates/book/edit_book.html:101
+#: bookwyrm/templates/book/edit_book.html:128
msgid "Subtitle:"
msgstr "副標題:"
-#: bookwyrm/templates/book/edit_book.html:114
+#: bookwyrm/templates/book/edit_book.html:144
msgid "Series:"
msgstr "系列:"
-#: bookwyrm/templates/book/edit_book.html:122
+#: bookwyrm/templates/book/edit_book.html:152
msgid "Series number:"
msgstr "系列編號:"
-#: bookwyrm/templates/book/edit_book.html:130
+#: bookwyrm/templates/book/edit_book.html:160
msgid "Languages:"
msgstr "語言:"
-#: bookwyrm/templates/book/edit_book.html:139
+#: bookwyrm/templates/book/edit_book.html:169
msgid "Publisher:"
msgstr "出版社:"
-#: bookwyrm/templates/book/edit_book.html:148
+#: bookwyrm/templates/book/edit_book.html:178
msgid "First published date:"
msgstr "初版時間:"
-#: bookwyrm/templates/book/edit_book.html:156
+#: bookwyrm/templates/book/edit_book.html:186
msgid "Published date:"
msgstr "出版時間:"
-#: bookwyrm/templates/book/edit_book.html:165
+#: bookwyrm/templates/book/edit_book.html:195
msgid "Authors"
msgstr "作者"
-#: bookwyrm/templates/book/edit_book.html:171
-#, python-format
-msgid "Remove %(name)s"
-msgstr "移除 %(name)s"
+#: bookwyrm/templates/book/edit_book.html:202
+#, fuzzy, python-format
+#| msgid "Remove from %(name)s"
+msgid "Remove %(name)s"
+msgstr "從 %(name)s 移除"
-#: bookwyrm/templates/book/edit_book.html:176
+#: bookwyrm/templates/book/edit_book.html:205
+#, fuzzy, python-format
+#| msgid "Remove from %(name)s"
+msgid "Author page for %(name)s"
+msgstr "從 %(name)s 移除"
+
+#: bookwyrm/templates/book/edit_book.html:212
msgid "Add Authors:"
msgstr "新增作者:"
-#: bookwyrm/templates/book/edit_book.html:177
+#: bookwyrm/templates/book/edit_book.html:213
msgid "John Doe, Jane Smith"
msgstr "John Doe, Jane Smith"
-#: bookwyrm/templates/book/edit_book.html:183
+#: bookwyrm/templates/book/edit_book.html:220
#: bookwyrm/templates/user/shelf/shelf.html:78
msgid "Cover"
msgstr "封面"
-#: bookwyrm/templates/book/edit_book.html:211
+#: bookwyrm/templates/book/edit_book.html:248
msgid "Physical Properties"
msgstr "實體性質"
-#: bookwyrm/templates/book/edit_book.html:212
+#: bookwyrm/templates/book/edit_book.html:250
#: bookwyrm/templates/book/format_filter.html:5
msgid "Format:"
msgstr "格式:"
-#: bookwyrm/templates/book/edit_book.html:220
+#: bookwyrm/templates/book/edit_book.html:258
msgid "Pages:"
msgstr "頁數:"
-#: bookwyrm/templates/book/edit_book.html:227
+#: bookwyrm/templates/book/edit_book.html:267
msgid "Book Identifiers"
msgstr "書目標識號"
-#: bookwyrm/templates/book/edit_book.html:228
+#: bookwyrm/templates/book/edit_book.html:269
msgid "ISBN 13:"
msgstr "ISBN 13:"
-#: bookwyrm/templates/book/edit_book.html:233
+#: bookwyrm/templates/book/edit_book.html:277
msgid "ISBN 10:"
msgstr "ISBN 10:"
-#: bookwyrm/templates/book/edit_book.html:238
+#: bookwyrm/templates/book/edit_book.html:285
msgid "Openlibrary ID:"
msgstr "Openlibrary ID:"
@@ -605,11 +644,40 @@ msgstr "由 %(publisher)s 出版。"
msgid "rated it"
msgstr "評價了"
+#: bookwyrm/templates/book/readthrough.html:8
+msgid "Progress Updates:"
+msgstr "進度更新:"
+
+#: bookwyrm/templates/book/readthrough.html:14
+msgid "finished"
+msgstr "已完成"
+
+#: bookwyrm/templates/book/readthrough.html:25
+msgid "Show all updates"
+msgstr "顯示所有更新"
+
+#: bookwyrm/templates/book/readthrough.html:41
+msgid "Delete this progress update"
+msgstr "刪除此進度更新"
+
+#: bookwyrm/templates/book/readthrough.html:52
+msgid "started"
+msgstr "已開始"
+
+#: bookwyrm/templates/book/readthrough.html:59
+#: bookwyrm/templates/book/readthrough.html:73
+msgid "Edit read dates"
+msgstr "編輯閱讀日期"
+
+#: bookwyrm/templates/book/readthrough.html:63
+msgid "Delete these read dates"
+msgstr "刪除這些閱讀日期"
+
#: bookwyrm/templates/components/inline_form.html:8
#: bookwyrm/templates/components/modal.html:11
-#: bookwyrm/templates/feed/feed_layout.html:69
-#: bookwyrm/templates/get_started/layout.html:19
-#: bookwyrm/templates/get_started/layout.html:52
+#: bookwyrm/templates/feed/layout.html:71
+#: bookwyrm/templates/get_started/layout.html:20
+#: bookwyrm/templates/get_started/layout.html:53
#: bookwyrm/templates/search/book.html:32
#: bookwyrm/templates/snippets/announcement.html:18
msgid "Close"
@@ -633,7 +701,7 @@ msgstr "跨站社群"
#: bookwyrm/templates/directory/directory.html:4
#: bookwyrm/templates/directory/directory.html:9
-#: bookwyrm/templates/layout.html:64
+#: bookwyrm/templates/layout.html:71
msgid "Directory"
msgstr "目錄"
@@ -664,21 +732,30 @@ msgstr "受推薦"
msgid "Recently active"
msgstr "最近活躍"
-#: bookwyrm/templates/directory/user_card.html:33
+#: bookwyrm/templates/directory/user_card.html:17
+#: bookwyrm/templates/directory/user_card.html:18
+#: bookwyrm/templates/user/user_preview.html:16
+#: bookwyrm/templates/user/user_preview.html:17
+#, fuzzy
+#| msgid "Your Account"
+msgid "Locked account"
+msgstr "你的帳號"
+
+#: bookwyrm/templates/directory/user_card.html:40
msgid "follower you follow"
msgid_plural "followers you follow"
msgstr[0] "你關注的關注者"
-#: bookwyrm/templates/directory/user_card.html:40
+#: bookwyrm/templates/directory/user_card.html:47
msgid "book on your shelves"
msgid_plural "books on your shelves"
msgstr[0] "你書架上的書"
-#: bookwyrm/templates/directory/user_card.html:48
+#: bookwyrm/templates/directory/user_card.html:55
msgid "posts"
msgstr "發文"
-#: bookwyrm/templates/directory/user_card.html:54
+#: bookwyrm/templates/directory/user_card.html:61
msgid "last active"
msgstr "最後活躍"
@@ -714,7 +791,7 @@ msgid "Recent Books"
msgstr "最近書目"
#: bookwyrm/templates/discover/landing_layout.html:5
-#: bookwyrm/templates/get_started/layout.html:4
+#: bookwyrm/templates/get_started/layout.html:5
msgid "Welcome"
msgstr "歡迎"
@@ -832,7 +909,7 @@ msgid "Direct Messages with %(username)s"
msgstr "與 %(username)s 私信"
#: bookwyrm/templates/feed/direct_messages.html:10
-#: bookwyrm/templates/layout.html:92
+#: bookwyrm/templates/layout.html:99
msgid "Direct Messages"
msgstr "私信"
@@ -844,91 +921,55 @@ msgstr "所有訊息"
msgid "You have no messages right now."
msgstr "你現在沒有訊息。"
-#: bookwyrm/templates/feed/feed.html:8
-msgid "Home Timeline"
-msgstr "主頁時間線"
-
-#: bookwyrm/templates/feed/feed.html:10
-msgid "Local Timeline"
-msgstr "本地時間線"
-
-#: bookwyrm/templates/feed/feed.html:12
-msgid "Federated Timeline"
-msgstr "跨站時間線"
-
-#: bookwyrm/templates/feed/feed.html:18
-msgid "Home"
-msgstr "主頁"
-
-#: bookwyrm/templates/feed/feed.html:21
-msgid "Local"
-msgstr "本站"
-
-#: bookwyrm/templates/feed/feed.html:24
-#: bookwyrm/templates/settings/edit_server.html:40
-msgid "Federated"
-msgstr "跨站"
-
-#: bookwyrm/templates/feed/feed.html:32
-#, python-format
-msgid "load 0 unread status(es)"
+#: bookwyrm/templates/feed/feed.html:22
+#, fuzzy, python-format
+#| msgid "load 0 unread status(es)"
+msgid "load 0 unread status(es)"
msgstr "載入 0 條未讀狀態"
-#: bookwyrm/templates/feed/feed.html:47
+#: bookwyrm/templates/feed/feed.html:38
msgid "There aren't any activities right now! Try following a user to get started"
msgstr "現在還沒有任何活動!嘗試著從關注一個使用者開始吧"
-#: bookwyrm/templates/feed/feed.html:55
-#: bookwyrm/templates/get_started/users.html:6
-msgid "Who to follow"
-msgstr "可以關注的人"
-
-#: bookwyrm/templates/feed/feed_layout.html:4
+#: bookwyrm/templates/feed/layout.html:5
msgid "Updates"
msgstr "更新"
-#: bookwyrm/templates/feed/feed_layout.html:10
+#: bookwyrm/templates/feed/layout.html:12
#: bookwyrm/templates/user/shelf/books_header.html:3
msgid "Your books"
msgstr "你的書目"
-#: bookwyrm/templates/feed/feed_layout.html:12
+#: bookwyrm/templates/feed/layout.html:14
msgid "There are no books here right now! Try searching for a book to get started"
msgstr "現在這裡還沒有任何書目!嘗試著從搜尋某本書開始吧"
-#: bookwyrm/templates/feed/feed_layout.html:23
+#: bookwyrm/templates/feed/layout.html:25
#: bookwyrm/templates/user/shelf/shelf.html:29
msgid "To Read"
msgstr "想讀"
-#: bookwyrm/templates/feed/feed_layout.html:24
+#: bookwyrm/templates/feed/layout.html:26
#: bookwyrm/templates/user/shelf/shelf.html:29
msgid "Currently Reading"
msgstr "在讀"
-#: bookwyrm/templates/feed/feed_layout.html:25
-#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:13
+#: bookwyrm/templates/feed/layout.html:27
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:16
#: bookwyrm/templates/user/shelf/shelf.html:29
msgid "Read"
msgstr "讀過"
-#: bookwyrm/templates/feed/feed_layout.html:87 bookwyrm/templates/goal.html:26
+#: bookwyrm/templates/feed/layout.html:90 bookwyrm/templates/goal.html:26
#: bookwyrm/templates/snippets/goal_card.html:6
#, python-format
msgid "%(year)s Reading Goal"
msgstr "%(year)s 閱讀目標"
-#: bookwyrm/templates/feed/suggested_users.html:16
-#, python-format
-msgid "%(mutuals)s follower you follow"
-msgid_plural "%(mutuals)s followers you follow"
-msgstr[0] "%(mutuals)s 個你也關注的關注者"
-
-#: bookwyrm/templates/feed/suggested_users.html:19
-#, python-format
-msgid "%(shared_books)s book on your shelves"
-msgid_plural "%(shared_books)s books on your shelves"
-msgstr[0] "%(shared_books)s 本在你書架上也有的書"
+#: bookwyrm/templates/feed/suggested_users.html:3
+#: bookwyrm/templates/get_started/users.html:6
+msgid "Who to follow"
+msgstr "可以關注的人"
#: bookwyrm/templates/get_started/book_preview.html:6
#, python-format
@@ -959,7 +1000,7 @@ msgstr "你可以在開始使用 %(site_name)s 後新增書目。"
#: bookwyrm/templates/get_started/books.html:17
#: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19
-#: bookwyrm/templates/layout.html:37 bookwyrm/templates/layout.html:38
+#: bookwyrm/templates/layout.html:44 bookwyrm/templates/layout.html:45
#: bookwyrm/templates/lists/list.html:139
#: bookwyrm/templates/search/layout.html:4
#: bookwyrm/templates/search/layout.html:9
@@ -985,33 +1026,33 @@ msgstr "沒有找到書目"
msgid "Save & continue"
msgstr "儲存 & 繼續"
-#: bookwyrm/templates/get_started/layout.html:14
+#: bookwyrm/templates/get_started/layout.html:15
#, python-format
msgid "Welcome to %(site_name)s!"
msgstr "歡迎來到 %(site_name)s!"
-#: bookwyrm/templates/get_started/layout.html:16
+#: bookwyrm/templates/get_started/layout.html:17
msgid "These are some first steps to get you started."
msgstr "這些最初的步驟可以幫助你入門。"
-#: bookwyrm/templates/get_started/layout.html:30
+#: bookwyrm/templates/get_started/layout.html:31
#: bookwyrm/templates/get_started/profile.html:6
msgid "Create your profile"
msgstr "建立你的使用者資料"
-#: bookwyrm/templates/get_started/layout.html:34
+#: bookwyrm/templates/get_started/layout.html:35
msgid "Add books"
msgstr "新增書目"
-#: bookwyrm/templates/get_started/layout.html:38
+#: bookwyrm/templates/get_started/layout.html:39
msgid "Find friends"
msgstr "尋找同好"
-#: bookwyrm/templates/get_started/layout.html:44
+#: bookwyrm/templates/get_started/layout.html:45
msgid "Skip this step"
msgstr "跳過此步驟"
-#: bookwyrm/templates/get_started/layout.html:48
+#: bookwyrm/templates/get_started/layout.html:49
msgid "Finish"
msgstr "完成"
@@ -1040,7 +1081,7 @@ msgid "Manually approve followers:"
msgstr "手動批准關注者:"
#: bookwyrm/templates/get_started/profile.html:48
-#: bookwyrm/templates/preferences/edit_user.html:58
+#: bookwyrm/templates/preferences/edit_user.html:66
msgid "Show this account in suggested users:"
msgstr "在推薦的使用者中顯示此帳號:"
@@ -1121,70 +1162,87 @@ msgstr "最近的匯入"
msgid "No recent imports"
msgstr "無最近的匯入"
-#: bookwyrm/templates/import_status.html:5
-#: bookwyrm/templates/import_status.html:9
+#: bookwyrm/templates/import_status.html:6
+#: bookwyrm/templates/import_status.html:10
msgid "Import Status"
msgstr "匯入狀態"
-#: bookwyrm/templates/import_status.html:12
+#: bookwyrm/templates/import_status.html:11
+#, fuzzy
+#| msgid "Back to reports"
+msgid "Back to imports"
+msgstr "回到舉報"
+
+#: bookwyrm/templates/import_status.html:15
msgid "Import started:"
msgstr "匯入開始:"
-#: bookwyrm/templates/import_status.html:16
+#: bookwyrm/templates/import_status.html:20
msgid "Import completed:"
msgstr "匯入完成:"
-#: bookwyrm/templates/import_status.html:19
+#: bookwyrm/templates/import_status.html:25
msgid "TASK FAILED"
msgstr "任務失敗"
-#: bookwyrm/templates/import_status.html:25
+#: bookwyrm/templates/import_status.html:32
msgid "Import still in progress."
msgstr "還在匯入中。"
-#: bookwyrm/templates/import_status.html:27
+#: bookwyrm/templates/import_status.html:34
msgid "(Hit reload to update!)"
msgstr "(按下重新載入來更新!)"
-#: bookwyrm/templates/import_status.html:34
+#: bookwyrm/templates/import_status.html:41
msgid "Failed to load"
msgstr "載入失敗"
-#: bookwyrm/templates/import_status.html:43
+#: bookwyrm/templates/import_status.html:50
#, python-format
msgid "Jump to the bottom of the list to select the %(failed_count)s items which failed to import."
msgstr "跳轉至列表底部來選取 %(failed_count)s 個匯入失敗的項目。"
-#: bookwyrm/templates/import_status.html:78
+#: bookwyrm/templates/import_status.html:62
+#, python-format
+msgid "Line %(index)s: %(title)s by %(author)s"
+msgstr ""
+
+#: bookwyrm/templates/import_status.html:82
msgid "Select all"
msgstr "全選"
-#: bookwyrm/templates/import_status.html:81
+#: bookwyrm/templates/import_status.html:85
msgid "Retry items"
msgstr "重試項目"
-#: bookwyrm/templates/import_status.html:107
+#: bookwyrm/templates/import_status.html:112
msgid "Successfully imported"
msgstr "成功匯入了"
-#: bookwyrm/templates/import_status.html:111
+#: bookwyrm/templates/import_status.html:114
+#, fuzzy
+#| msgid "Import still in progress."
+msgid "Import Progress"
+msgstr "還在匯入中。"
+
+#: bookwyrm/templates/import_status.html:119
msgid "Book"
msgstr "書目"
-#: bookwyrm/templates/import_status.html:114
+#: bookwyrm/templates/import_status.html:122
#: bookwyrm/templates/snippets/create_status_form.html:13
#: bookwyrm/templates/user/shelf/shelf.html:79
#: bookwyrm/templates/user/shelf/shelf.html:99
msgid "Title"
msgstr "標題"
-#: bookwyrm/templates/import_status.html:117
+#: bookwyrm/templates/import_status.html:125
#: bookwyrm/templates/user/shelf/shelf.html:80
#: bookwyrm/templates/user/shelf/shelf.html:102
msgid "Author"
msgstr "作者"
-#: bookwyrm/templates/import_status.html:140
+#: bookwyrm/templates/import_status.html:148
msgid "Imported"
msgstr "已匯入"
@@ -1214,27 +1272,27 @@ msgstr "\"%(query)s\" 的搜尋結果"
msgid "Matching Books"
msgstr "匹配的書目"
-#: bookwyrm/templates/layout.html:33
+#: bookwyrm/templates/layout.html:40
msgid "Search for a book or user"
msgstr "搜尋書目或使用者"
-#: bookwyrm/templates/layout.html:47 bookwyrm/templates/layout.html:48
+#: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55
msgid "Main navigation menu"
msgstr "主導航選單"
-#: bookwyrm/templates/layout.html:58
+#: bookwyrm/templates/layout.html:65
msgid "Feed"
msgstr "動態"
-#: bookwyrm/templates/layout.html:87
+#: bookwyrm/templates/layout.html:94
msgid "Your Books"
msgstr "你的書目"
-#: bookwyrm/templates/layout.html:97
+#: bookwyrm/templates/layout.html:104
msgid "Settings"
msgstr "設定"
-#: bookwyrm/templates/layout.html:106
+#: bookwyrm/templates/layout.html:113
#: bookwyrm/templates/settings/admin_layout.html:31
#: bookwyrm/templates/settings/manage_invite_requests.html:15
#: bookwyrm/templates/settings/manage_invites.html:3
@@ -1242,61 +1300,61 @@ msgstr "設定"
msgid "Invites"
msgstr "邀請"
-#: bookwyrm/templates/layout.html:113
+#: bookwyrm/templates/layout.html:120
msgid "Admin"
msgstr "管理員"
-#: bookwyrm/templates/layout.html:120
+#: bookwyrm/templates/layout.html:127
msgid "Log out"
msgstr "登出"
-#: bookwyrm/templates/layout.html:128 bookwyrm/templates/layout.html:129
+#: bookwyrm/templates/layout.html:135 bookwyrm/templates/layout.html:136
#: bookwyrm/templates/notifications.html:6
#: bookwyrm/templates/notifications.html:11
msgid "Notifications"
msgstr "通知"
-#: bookwyrm/templates/layout.html:151 bookwyrm/templates/layout.html:155
+#: bookwyrm/templates/layout.html:158 bookwyrm/templates/layout.html:162
#: bookwyrm/templates/login.html:17
#: bookwyrm/templates/snippets/register_form.html:4
msgid "Username:"
msgstr "使用者名稱:"
-#: bookwyrm/templates/layout.html:156
+#: bookwyrm/templates/layout.html:163
msgid "password"
msgstr "密碼"
-#: bookwyrm/templates/layout.html:157 bookwyrm/templates/login.html:36
+#: bookwyrm/templates/layout.html:164 bookwyrm/templates/login.html:36
msgid "Forgot your password?"
msgstr "忘記了密碼?"
-#: bookwyrm/templates/layout.html:160 bookwyrm/templates/login.html:10
+#: bookwyrm/templates/layout.html:167 bookwyrm/templates/login.html:10
#: bookwyrm/templates/login.html:33
msgid "Log in"
msgstr "登入"
-#: bookwyrm/templates/layout.html:168
+#: bookwyrm/templates/layout.html:175
msgid "Join"
msgstr "加入"
-#: bookwyrm/templates/layout.html:206
+#: bookwyrm/templates/layout.html:213
msgid "About this instance"
msgstr "關於本實例"
-#: bookwyrm/templates/layout.html:210
+#: bookwyrm/templates/layout.html:217
msgid "Contact site admin"
msgstr "聯絡網站管理員"
-#: bookwyrm/templates/layout.html:214
+#: bookwyrm/templates/layout.html:221
msgid "Documentation"
msgstr "文件:"
-#: bookwyrm/templates/layout.html:221
+#: bookwyrm/templates/layout.html:228
#, python-format
msgid "Support %(site_name)s on %(support_title)s"
msgstr "在 %(support_title)s 上支援 %(site_name)s"
-#: bookwyrm/templates/layout.html:225
+#: bookwyrm/templates/layout.html:232
msgid "BookWyrm's source code is freely available. You can contribute or report issues on GitHub."
msgstr "BookWyrm 是開源軟體。你可以在 GitHub 貢獻或報告問題。"
@@ -1674,6 +1732,7 @@ msgstr "你什麼也沒錯過!"
#: bookwyrm/templates/password_reset.html:23
#: bookwyrm/templates/preferences/change_password.html:18
+#: bookwyrm/templates/preferences/delete_user.html:20
msgid "Confirm password:"
msgstr "確認密碼:"
@@ -1687,7 +1746,7 @@ msgstr "重設密碼"
#: bookwyrm/templates/preferences/blocks.html:4
#: bookwyrm/templates/preferences/blocks.html:7
-#: bookwyrm/templates/preferences/preferences_layout.html:26
+#: bookwyrm/templates/preferences/layout.html:30
msgid "Blocked Users"
msgstr "封鎖的使用者"
@@ -1698,7 +1757,7 @@ msgstr "當前沒有被封鎖的使用者。"
#: bookwyrm/templates/preferences/change_password.html:4
#: bookwyrm/templates/preferences/change_password.html:7
#: bookwyrm/templates/preferences/change_password.html:21
-#: bookwyrm/templates/preferences/preferences_layout.html:19
+#: bookwyrm/templates/preferences/layout.html:19
msgid "Change Password"
msgstr "更改密碼"
@@ -1706,6 +1765,23 @@ msgstr "更改密碼"
msgid "New password:"
msgstr "新密碼:"
+#: bookwyrm/templates/preferences/delete_user.html:4
+#: bookwyrm/templates/preferences/delete_user.html:7
+#: bookwyrm/templates/preferences/delete_user.html:26
+#: bookwyrm/templates/preferences/layout.html:23
+#, fuzzy
+#| msgid "Create an Account"
+msgid "Delete Account"
+msgstr "建立帳號"
+
+#: bookwyrm/templates/preferences/delete_user.html:12
+msgid "Permanently delete account"
+msgstr ""
+
+#: bookwyrm/templates/preferences/delete_user.html:14
+msgid "Deleting your account cannot be undone. The username will not be available to register in the future."
+msgstr ""
+
#: bookwyrm/templates/preferences/edit_user.html:4
#: bookwyrm/templates/preferences/edit_user.html:7
msgid "Edit Profile"
@@ -1715,44 +1791,68 @@ msgstr "編輯使用者資料"
msgid "Show set reading goal prompt in feed:"
msgstr "在即時動態中顯示設定的閱讀目標提示:"
-#: bookwyrm/templates/preferences/edit_user.html:62
+#: bookwyrm/templates/preferences/edit_user.html:58
+#, fuzzy
+#| msgid "Post privacy"
+msgid "Default post privacy:"
+msgstr "發文隱私"
+
+#: bookwyrm/templates/preferences/edit_user.html:70
#, python-format
msgid "Your account will show up in the directory, and may be recommended to other BookWyrm users."
msgstr "你的帳號會顯示在 目錄 中,並可能受其它 BookWyrm 使用者推薦。"
-#: bookwyrm/templates/preferences/edit_user.html:65
+#: bookwyrm/templates/preferences/edit_user.html:73
msgid "Preferred Timezone: "
msgstr "偏好時區:"
-#: bookwyrm/templates/preferences/preferences_layout.html:11
+#: bookwyrm/templates/preferences/layout.html:11
msgid "Account"
msgstr "帳號"
-#: bookwyrm/templates/preferences/preferences_layout.html:15
+#: bookwyrm/templates/preferences/layout.html:15
msgid "Profile"
msgstr "使用者資料"
-#: bookwyrm/templates/preferences/preferences_layout.html:22
+#: bookwyrm/templates/preferences/layout.html:26
msgid "Relationships"
msgstr "關係"
+#: bookwyrm/templates/reading_progress/finish.html:5
+#, fuzzy, python-format
+#| msgid "Finish \"%(book_title)s\""
+msgid "Finish \"%(book_title)s\""
+msgstr "完成 \"%(book_title)s\""
+
+#: bookwyrm/templates/reading_progress/start.html:5
+#, fuzzy, python-format
+#| msgid "Edit \"%(book_title)s\""
+msgid "Start \"%(book_title)s\""
+msgstr "編輯 \"%(book_title)s\""
+
+#: bookwyrm/templates/reading_progress/want.html:5
+#, fuzzy, python-format
+#| msgid "Want to Read \"%(book_title)s\""
+msgid "Want to Read \"%(book_title)s\""
+msgstr "想要閱讀 \"%(book_title)s\""
+
#: bookwyrm/templates/rss/title.html:5
-#: bookwyrm/templates/snippets/status/status_header.html:35
+#: bookwyrm/templates/snippets/status/status_header.html:36
msgid "rated"
msgstr "評價了"
#: bookwyrm/templates/rss/title.html:7
-#: bookwyrm/templates/snippets/status/status_header.html:37
+#: bookwyrm/templates/snippets/status/status_header.html:38
msgid "reviewed"
msgstr "寫了書評給"
#: bookwyrm/templates/rss/title.html:9
-#: bookwyrm/templates/snippets/status/status_header.html:39
+#: bookwyrm/templates/snippets/status/status_header.html:40
msgid "commented on"
msgstr "評論了"
#: bookwyrm/templates/rss/title.html:11
-#: bookwyrm/templates/snippets/status/status_header.html:41
+#: bookwyrm/templates/snippets/status/status_header.html:42
msgid "quoted"
msgstr "引用了"
@@ -1776,12 +1876,6 @@ msgstr "搜尋請求"
msgid "Search type"
msgstr "搜尋類別"
-#: bookwyrm/templates/search/layout.html:21
-#: bookwyrm/templates/search/layout.html:42
-#: bookwyrm/templates/user/layout.html:74
-msgid "Books"
-msgstr "書目"
-
#: bookwyrm/templates/search/layout.html:23
#: bookwyrm/templates/search/layout.html:46
#: bookwyrm/templates/settings/admin_layout.html:26
@@ -1957,6 +2051,10 @@ msgstr "實例:"
msgid "Status:"
msgstr "狀態:"
+#: bookwyrm/templates/settings/edit_server.html:40
+msgid "Federated"
+msgstr "跨站"
+
#: bookwyrm/templates/settings/edit_server.html:41
#: bookwyrm/templates/settings/federated_server.html:10
msgid "Blocked"
@@ -1983,7 +2081,7 @@ msgid "Details"
msgstr "詳細"
#: bookwyrm/templates/settings/federated_server.html:39
-#: bookwyrm/templates/user/layout.html:56
+#: bookwyrm/templates/user/layout.html:63
msgid "Activity"
msgstr "活動"
@@ -2022,7 +2120,7 @@ msgid "Edit"
msgstr "編輯"
#: bookwyrm/templates/settings/federated_server.html:105
-#: bookwyrm/templates/user_admin/user_moderation_actions.html:3
+#: bookwyrm/templates/user_admin/user_moderation_actions.html:8
msgid "Actions"
msgstr "動作"
@@ -2228,15 +2326,19 @@ msgstr "管理員郵件:"
msgid "Additional info:"
msgstr "附加資訊:"
-#: bookwyrm/templates/settings/site.html:83
-msgid "Allow registration:"
+#: bookwyrm/templates/settings/site.html:85
+#, fuzzy
+#| msgid "Allow registration:"
+msgid "Allow registration"
msgstr "允許註冊:"
-#: bookwyrm/templates/settings/site.html:87
-msgid "Allow invite requests:"
+#: bookwyrm/templates/settings/site.html:91
+#, fuzzy
+#| msgid "Allow invite requests:"
+msgid "Allow invite requests"
msgstr "允許請求邀請:"
-#: bookwyrm/templates/settings/site.html:91
+#: bookwyrm/templates/settings/site.html:95
msgid "Registration closed text:"
msgstr "註冊關閉文字:"
@@ -2245,13 +2347,20 @@ msgstr "註冊關閉文字:"
msgid "Posted by %(username)s"
msgstr "由 %(username)s 釋出"
-#: bookwyrm/templates/snippets/book_cover.html:31
+#: bookwyrm/templates/snippets/authors.html:22
+#, python-format
+msgid "and %(remainder_count_display)s other"
+msgid_plural "and %(remainder_count_display)s others"
+msgstr[0] ""
+
+#: bookwyrm/templates/snippets/book_cover.html:32
msgid "No cover"
msgstr "沒有封面"
-#: bookwyrm/templates/snippets/book_titleby.html:4
-#, python-format
-msgid "%(title)s by "
+#: bookwyrm/templates/snippets/book_titleby.html:6
+#, fuzzy, python-format
+#| msgid "%(title)s by "
+msgid "%(title)s by"
msgstr "%(title)s 來自"
#: bookwyrm/templates/snippets/boost_button.html:20
@@ -2333,7 +2442,7 @@ msgstr "加入劇透警告"
#: bookwyrm/templates/snippets/create_status_form.html:117
#: bookwyrm/templates/snippets/privacy-icons.html:15
#: bookwyrm/templates/snippets/privacy-icons.html:16
-#: bookwyrm/templates/snippets/privacy_select.html:19
+#: bookwyrm/templates/snippets/privacy_select.html:20
msgid "Private"
msgstr "私密"
@@ -2446,7 +2555,7 @@ msgstr "目標隱私:"
#: bookwyrm/templates/snippets/goal_form.html:26
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:37
-#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:29
+#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:31
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:20
msgid "Post to feed"
msgstr "發佈到即時動態"
@@ -2490,13 +2599,13 @@ msgstr "往後"
#: bookwyrm/templates/snippets/privacy-icons.html:3
#: bookwyrm/templates/snippets/privacy-icons.html:4
-#: bookwyrm/templates/snippets/privacy_select.html:10
+#: bookwyrm/templates/snippets/privacy_select.html:11
msgid "Public"
msgstr "公開"
#: bookwyrm/templates/snippets/privacy-icons.html:7
#: bookwyrm/templates/snippets/privacy-icons.html:8
-#: bookwyrm/templates/snippets/privacy_select.html:13
+#: bookwyrm/templates/snippets/privacy_select.html:14
msgid "Unlisted"
msgstr "不公開"
@@ -2508,7 +2617,7 @@ msgstr "僅關注者"
msgid "Post privacy"
msgstr "發文隱私"
-#: bookwyrm/templates/snippets/privacy_select.html:16
+#: bookwyrm/templates/snippets/privacy_select.html:17
#: bookwyrm/templates/user/relationships/followers.html:6
#: bookwyrm/templates/user/relationships/layout.html:11
msgid "Followers"
@@ -2522,38 +2631,9 @@ msgstr "留下評價"
msgid "Rate"
msgstr "評價"
-#: bookwyrm/templates/snippets/readthrough.html:8
-msgid "Progress Updates:"
-msgstr "進度更新:"
-
-#: bookwyrm/templates/snippets/readthrough.html:14
-msgid "finished"
-msgstr "已完成"
-
-#: bookwyrm/templates/snippets/readthrough.html:25
-msgid "Show all updates"
-msgstr "顯示所有更新"
-
-#: bookwyrm/templates/snippets/readthrough.html:41
-msgid "Delete this progress update"
-msgstr "刪除此進度更新"
-
-#: bookwyrm/templates/snippets/readthrough.html:52
-msgid "started"
-msgstr "已開始"
-
-#: bookwyrm/templates/snippets/readthrough.html:59
-#: bookwyrm/templates/snippets/readthrough.html:73
-msgid "Edit read dates"
-msgstr "編輯閱讀日期"
-
-#: bookwyrm/templates/snippets/readthrough.html:63
-msgid "Delete these read dates"
-msgstr "刪除這些閱讀日期"
-
#: bookwyrm/templates/snippets/readthrough_form.html:7
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:19
-#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:17
+#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:19
msgid "Started reading"
msgstr "已開始閱讀"
@@ -2588,7 +2668,7 @@ msgid "Finish \"%(book_title)s\""
msgstr "完成 \"%(book_title)s\""
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:5
-#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:36
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:45
msgid "Update progress"
msgstr "更新進度"
@@ -2596,20 +2676,20 @@ msgstr "更新進度"
msgid "More shelves"
msgstr "更多書架"
-#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:10
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:11
msgid "Start reading"
msgstr "開始閱讀"
-#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:15
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:19
msgid "Finish reading"
msgstr "完成閱讀"
-#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:18
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:25
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:26
msgid "Want to read"
msgstr "想要閱讀"
-#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:47
+#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:57
#, python-format
msgid "Remove from %(name)s"
msgstr "從 %(name)s 移除"
@@ -2624,17 +2704,17 @@ msgstr "開始 \"%(book_title)s\""
msgid "Want to Read \"%(book_title)s\""
msgstr "想要閱讀 \"%(book_title)s\""
-#: bookwyrm/templates/snippets/status/content_status.html:71
+#: bookwyrm/templates/snippets/status/content_status.html:72
#: bookwyrm/templates/snippets/trimmed_text.html:15
msgid "Show more"
msgstr "顯示更多"
-#: bookwyrm/templates/snippets/status/content_status.html:86
+#: bookwyrm/templates/snippets/status/content_status.html:87
#: bookwyrm/templates/snippets/trimmed_text.html:30
msgid "Show less"
msgstr "顯示更少"
-#: bookwyrm/templates/snippets/status/content_status.html:116
+#: bookwyrm/templates/snippets/status/content_status.html:117
msgid "Open image in new window"
msgstr "在新視窗中開啟圖片"
@@ -2657,7 +2737,7 @@ msgstr "喜歡狀態"
msgid "boosted"
msgstr "轉發了"
-#: bookwyrm/templates/snippets/status/status_header.html:45
+#: bookwyrm/templates/snippets/status/status_header.html:46
#, python-format
msgid "replied to %(username)s's status"
msgstr "回覆了 %(username)s 的 狀態"
@@ -2673,10 +2753,29 @@ msgstr "刪除並重新起草"
#: bookwyrm/templates/snippets/status/status_options.html:35
#: bookwyrm/templates/snippets/user_options.html:13
-#: bookwyrm/templates/user_admin/user_moderation_actions.html:6
+#: bookwyrm/templates/user_admin/user_moderation_actions.html:12
msgid "Send direct message"
msgstr "發送私信"
+#: bookwyrm/templates/snippets/suggested_users.html:16
+#, python-format
+msgid "%(mutuals)s follower you follow"
+msgid_plural "%(mutuals)s followers you follow"
+msgstr[0] "%(mutuals)s 個你也關注的關注者"
+
+#: bookwyrm/templates/snippets/suggested_users.html:23
+#, python-format
+msgid "%(shared_books)s book on your shelves"
+msgid_plural "%(shared_books)s books on your shelves"
+msgstr[0] "%(shared_books)s 本在你書架上也有的書"
+
+#: bookwyrm/templates/snippets/suggested_users.html:31
+#: bookwyrm/templates/user/user_preview.html:36
+#, fuzzy
+#| msgid "followed you"
+msgid "Follows you"
+msgstr "關注了你"
+
#: bookwyrm/templates/snippets/switch_edition_button.html:5
msgid "Switch to this edition"
msgstr "切換到此版本"
@@ -2689,15 +2788,15 @@ msgstr "升序排序"
msgid "Sorted descending"
msgstr "降序排序"
-#: bookwyrm/templates/user/layout.html:13 bookwyrm/templates/user/user.html:10
+#: bookwyrm/templates/user/layout.html:18 bookwyrm/templates/user/user.html:10
msgid "User Profile"
msgstr "使用者使用者資料"
-#: bookwyrm/templates/user/layout.html:37
+#: bookwyrm/templates/user/layout.html:44
msgid "Follow Requests"
msgstr "關注請求"
-#: bookwyrm/templates/user/layout.html:62
+#: bookwyrm/templates/user/layout.html:69
msgid "Reading Goal"
msgstr "閱讀目標"
@@ -2803,28 +2902,35 @@ msgstr "RSS 訂閱"
msgid "No activities yet!"
msgstr "還沒有活動!"
-#: bookwyrm/templates/user/user_preview.html:15
+#: bookwyrm/templates/user/user_preview.html:22
#, python-format
msgid "Joined %(date)s"
msgstr "在 %(date)s 加入"
-#: bookwyrm/templates/user/user_preview.html:19
+#: bookwyrm/templates/user/user_preview.html:26
#, python-format
msgid "%(counter)s follower"
msgid_plural "%(counter)s followers"
msgstr[0] "%(counter)s 個關注者"
-#: bookwyrm/templates/user/user_preview.html:20
+#: bookwyrm/templates/user/user_preview.html:27
#, python-format
msgid "%(counter)s following"
msgstr "關注著 %(counter)s 人"
-#: bookwyrm/templates/user/user_preview.html:26
+#: bookwyrm/templates/user/user_preview.html:34
#, python-format
msgid "%(mutuals_display)s follower you follow"
msgid_plural "%(mutuals_display)s followers you follow"
msgstr[0] "%(mutuals_display)s 個你也關注的關注者"
+#: bookwyrm/templates/user/user_preview.html:38
+#, fuzzy
+#| msgid "follower you follow"
+#| msgid_plural "followers you follow"
+msgid "No followers you follow"
+msgstr "你關注的關注者"
+
#: bookwyrm/templates/user_admin/user.html:9
msgid "Back to users"
msgstr "回到使用者"
@@ -2880,22 +2986,31 @@ msgstr "實例詳情"
msgid "View instance"
msgstr "檢視實例"
-#: bookwyrm/templates/user_admin/user_moderation_actions.html:11
+#: bookwyrm/templates/user_admin/user_moderation_actions.html:5
+msgid "Permanently deleted"
+msgstr ""
+
+#: bookwyrm/templates/user_admin/user_moderation_actions.html:17
msgid "Suspend user"
msgstr "停用使用者"
-#: bookwyrm/templates/user_admin/user_moderation_actions.html:13
+#: bookwyrm/templates/user_admin/user_moderation_actions.html:19
msgid "Un-suspend user"
msgstr "取消停用使用者"
-#: bookwyrm/templates/user_admin/user_moderation_actions.html:21
+#: bookwyrm/templates/user_admin/user_moderation_actions.html:28
msgid "Access level:"
msgstr "訪問權限:"
-#: bookwyrm/templates/widgets/clearable_file_input_with_warning.html:3
+#: bookwyrm/templates/widgets/clearable_file_input_with_warning.html:22
msgid "File exceeds maximum size: 10MB"
msgstr "檔案超過了最大大小: 10MB"
+#: bookwyrm/templatetags/utilities.py:30
+#, python-format
+msgid "%(title)s: %(subtitle)s"
+msgstr ""
+
#: bookwyrm/views/import_data.py:67
msgid "Not a valid csv file"
msgstr "不是有效的 csv 檔案"
@@ -2909,3 +3024,14 @@ msgstr "沒有找到使用該郵箱的使用者。"
msgid "A password reset link sent to %s"
msgstr "密碼重置連結已傳送給 %s"
+#~ msgid "Local Timeline"
+#~ msgstr "本地時間線"
+
+#~ msgid "Federated Timeline"
+#~ msgstr "跨站時間線"
+
+#~ msgid "Local"
+#~ msgstr "本站"
+
+#~ msgid "Remove %(name)s"
+#~ msgstr "移除 %(name)s"