diff --git a/.github/workflows/django-tests.yml b/.github/workflows/django-tests.yml
index 00e08dadb..97a744813 100644
--- a/.github/workflows/django-tests.yml
+++ b/.github/workflows/django-tests.yml
@@ -55,5 +55,6 @@ jobs:
EMAIL_HOST_PASSWORD: ""
EMAIL_USE_TLS: true
ENABLE_PREVIEW_IMAGES: false
+ ENABLE_THUMBNAIL_GENERATION: true
run: |
pytest -n 3
diff --git a/bookwyrm/connectors/inventaire.py b/bookwyrm/connectors/inventaire.py
index 3d5f913bd..df9b2e43a 100644
--- a/bookwyrm/connectors/inventaire.py
+++ b/bookwyrm/connectors/inventaire.py
@@ -160,12 +160,13 @@ class Connector(AbstractConnector):
def create_edition_from_data(self, work, edition_data, instance=None):
"""pass in the url as data and then call the version in abstract connector"""
- try:
- data = self.get_book_data(edition_data)
- except ConnectorException:
- # who, indeed, knows
- return
- super().create_edition_from_data(work, data, instance=instance)
+ if isinstance(edition_data, str):
+ try:
+ edition_data = self.get_book_data(edition_data)
+ except ConnectorException:
+ # who, indeed, knows
+ return
+ super().create_edition_from_data(work, edition_data, instance=instance)
def get_cover_url(self, cover_blob, *_):
"""format the relative cover url into an absolute one:
diff --git a/bookwyrm/emailing.py b/bookwyrm/emailing.py
index 80aca071b..9349b8ae2 100644
--- a/bookwyrm/emailing.py
+++ b/bookwyrm/emailing.py
@@ -45,7 +45,8 @@ def moderation_report_email(report):
"""a report was created"""
data = email_data()
data["reporter"] = report.reporter.localname or report.reporter.username
- data["reportee"] = report.user.localname or report.user.username
+ if report.user:
+ data["reportee"] = report.user.localname or report.user.username
data["report_link"] = report.remote_id
for admin in models.User.objects.filter(
diff --git a/bookwyrm/forms/__init__.py b/bookwyrm/forms/__init__.py
index 075752936..a37d126ac 100644
--- a/bookwyrm/forms/__init__.py
+++ b/bookwyrm/forms/__init__.py
@@ -10,3 +10,4 @@ from .landing import *
from .links import *
from .lists import *
from .status import *
+from .user_admin import *
diff --git a/bookwyrm/forms/groups.py b/bookwyrm/forms/groups.py
index 15b27c0ae..90aace3ba 100644
--- a/bookwyrm/forms/groups.py
+++ b/bookwyrm/forms/groups.py
@@ -4,12 +4,6 @@ from .custom_form import CustomForm
# pylint: disable=missing-class-docstring
-class UserGroupForm(CustomForm):
- class Meta:
- model = models.User
- fields = ["groups"]
-
-
class GroupForm(CustomForm):
class Meta:
model = models.Group
diff --git a/bookwyrm/forms/user_admin.py b/bookwyrm/forms/user_admin.py
new file mode 100644
index 000000000..a3bf6fa8e
--- /dev/null
+++ b/bookwyrm/forms/user_admin.py
@@ -0,0 +1,10 @@
+""" using django model forms """
+from bookwyrm import models
+from .custom_form import CustomForm
+
+
+# pylint: disable=missing-class-docstring
+class UserGroupForm(CustomForm):
+ class Meta:
+ model = models.User
+ fields = ["groups"]
diff --git a/bookwyrm/migrations/0151_alter_report_user.py b/bookwyrm/migrations/0151_alter_report_user.py
new file mode 100644
index 000000000..4c3f9dbda
--- /dev/null
+++ b/bookwyrm/migrations/0151_alter_report_user.py
@@ -0,0 +1,24 @@
+# Generated by Django 3.2.13 on 2022-07-05 23:54
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("bookwyrm", "0150_readthrough_stopped_date"),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name="report",
+ name="user",
+ field=models.ForeignKey(
+ null=True,
+ on_delete=django.db.models.deletion.PROTECT,
+ to=settings.AUTH_USER_MODEL,
+ ),
+ ),
+ ]
diff --git a/bookwyrm/migrations/0151_auto_20220705_0049.py b/bookwyrm/migrations/0151_auto_20220705_0049.py
new file mode 100644
index 000000000..6010e38e5
--- /dev/null
+++ b/bookwyrm/migrations/0151_auto_20220705_0049.py
@@ -0,0 +1,90 @@
+# Generated by Django 3.2.13 on 2022-07-05 00:49
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("bookwyrm", "0150_readthrough_stopped_date"),
+ ]
+
+ operations = [
+ migrations.RemoveField(
+ model_name="notification",
+ name="related_book",
+ ),
+ migrations.AddField(
+ model_name="notification",
+ name="related_list_items",
+ field=models.ManyToManyField(
+ related_name="notifications", to="bookwyrm.ListItem"
+ ),
+ ),
+ migrations.AddField(
+ model_name="notification",
+ name="related_reports",
+ field=models.ManyToManyField(to="bookwyrm.Report"),
+ ),
+ migrations.AddField(
+ model_name="notification",
+ name="related_users",
+ field=models.ManyToManyField(
+ related_name="notifications", to=settings.AUTH_USER_MODEL
+ ),
+ ),
+ migrations.AlterField(
+ model_name="notification",
+ name="related_list_item",
+ field=models.ForeignKey(
+ null=True,
+ on_delete=django.db.models.deletion.CASCADE,
+ related_name="notifications_tmp",
+ to="bookwyrm.listitem",
+ ),
+ ),
+ migrations.AlterField(
+ model_name="notification",
+ name="related_report",
+ field=models.ForeignKey(
+ null=True,
+ on_delete=django.db.models.deletion.CASCADE,
+ related_name="notifications_tmp",
+ to="bookwyrm.report",
+ ),
+ ),
+ migrations.RunSQL(
+ sql="""
+ INSERT INTO bookwyrm_notification_related_users (notification_id, user_id)
+ SELECT id, related_user_id
+ FROM bookwyrm_notification
+ WHERE bookwyrm_notification.related_user_id IS NOT NULL;
+
+ INSERT INTO bookwyrm_notification_related_list_items (notification_id, listitem_id)
+ SELECT id, related_list_item_id
+ FROM bookwyrm_notification
+ WHERE bookwyrm_notification.related_list_item_id IS NOT NULL;
+
+ INSERT INTO bookwyrm_notification_related_reports (notification_id, report_id)
+ SELECT id, related_report_id
+ FROM bookwyrm_notification
+ WHERE bookwyrm_notification.related_report_id IS NOT NULL;
+
+ """,
+ reverse_sql=migrations.RunSQL.noop,
+ ),
+ migrations.RemoveField(
+ model_name="notification",
+ name="related_list_item",
+ ),
+ migrations.RemoveField(
+ model_name="notification",
+ name="related_report",
+ ),
+ migrations.RemoveField(
+ model_name="notification",
+ name="related_user",
+ ),
+ ]
diff --git a/bookwyrm/migrations/0152_alter_report_user.py b/bookwyrm/migrations/0152_alter_report_user.py
new file mode 100644
index 000000000..1a67871c8
--- /dev/null
+++ b/bookwyrm/migrations/0152_alter_report_user.py
@@ -0,0 +1,25 @@
+# Generated by Django 3.2.13 on 2022-07-06 19:16
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("bookwyrm", "0151_alter_report_user"),
+ ]
+
+ operations = [
+ migrations.AlterField(
+ model_name="report",
+ name="user",
+ field=models.ForeignKey(
+ blank=True,
+ null=True,
+ on_delete=django.db.models.deletion.PROTECT,
+ to=settings.AUTH_USER_MODEL,
+ ),
+ ),
+ ]
diff --git a/bookwyrm/migrations/0152_remove_notification_notification_type_valid.py b/bookwyrm/migrations/0152_remove_notification_notification_type_valid.py
new file mode 100644
index 000000000..f7471c0d2
--- /dev/null
+++ b/bookwyrm/migrations/0152_remove_notification_notification_type_valid.py
@@ -0,0 +1,17 @@
+# Generated by Django 3.2.13 on 2022-07-05 03:16
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("bookwyrm", "0151_auto_20220705_0049"),
+ ]
+
+ operations = [
+ migrations.RemoveConstraint(
+ model_name="notification",
+ name="notification_type_valid",
+ ),
+ ]
diff --git a/bookwyrm/migrations/0153_merge_20220706_2141.py b/bookwyrm/migrations/0153_merge_20220706_2141.py
new file mode 100644
index 000000000..03959f9ef
--- /dev/null
+++ b/bookwyrm/migrations/0153_merge_20220706_2141.py
@@ -0,0 +1,13 @@
+# Generated by Django 3.2.13 on 2022-07-06 21:41
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ("bookwyrm", "0152_alter_report_user"),
+ ("bookwyrm", "0152_remove_notification_notification_type_valid"),
+ ]
+
+ operations = []
diff --git a/bookwyrm/models/antispam.py b/bookwyrm/models/antispam.py
index f506b6f19..dd2a6df26 100644
--- a/bookwyrm/models/antispam.py
+++ b/bookwyrm/models/antispam.py
@@ -3,7 +3,7 @@ from functools import reduce
import operator
from django.apps import apps
-from django.db import models
+from django.db import models, transaction
from django.db.models import Q
from django.utils.translation import gettext_lazy as _
@@ -58,25 +58,20 @@ def automod_task():
return
reporter = AutoMod.objects.first().created_by
reports = automod_users(reporter) + automod_statuses(reporter)
- if reports:
- admins = User.objects.filter(
- models.Q(user_permissions__name__in=["moderate_user", "moderate_post"])
- | models.Q(is_superuser=True)
- ).all()
- notification_model = apps.get_model(
- "bookwyrm", "Notification", require_ready=True
- )
+ if not reports:
+ return
+
+ admins = User.objects.filter(
+ models.Q(user_permissions__name__in=["moderate_user", "moderate_post"])
+ | models.Q(is_superuser=True)
+ ).all()
+ notification_model = apps.get_model("bookwyrm", "Notification", require_ready=True)
+ with transaction.atomic():
for admin in admins:
- notification_model.objects.bulk_create(
- [
- notification_model(
- user=admin,
- related_report=r,
- notification_type="REPORT",
- )
- for r in reports
- ]
+ notification, _ = notification_model.objects.get_or_create(
+ user=admin, notification_type=notification_model.REPORT, read=False
)
+ notification.related_repors.add(reports)
def automod_users(reporter):
diff --git a/bookwyrm/models/base_model.py b/bookwyrm/models/base_model.py
index eeb2e940d..3ac220bc4 100644
--- a/bookwyrm/models/base_model.py
+++ b/bookwyrm/models/base_model.py
@@ -132,7 +132,7 @@ class BookWyrmModel(models.Model):
return
# but generally moderators can delete other people's stuff
- if self.user == viewer or viewer.has_perm("moderate_post"):
+ if self.user == viewer or viewer.has_perm("bookwyrm.moderate_post"):
return
raise PermissionDenied()
diff --git a/bookwyrm/models/fields.py b/bookwyrm/models/fields.py
index 62c61cc40..785f3397c 100644
--- a/bookwyrm/models/fields.py
+++ b/bookwyrm/models/fields.py
@@ -16,7 +16,7 @@ from django.utils.encoding import filepath_to_uri
from bookwyrm import activitypub
from bookwyrm.connectors import get_image
-from bookwyrm.sanitize_html import InputHtmlParser
+from bookwyrm.utils.sanitizer import clean
from bookwyrm.settings import MEDIA_FULL_URL
@@ -497,9 +497,7 @@ class HtmlField(ActivitypubFieldMixin, models.TextField):
def field_from_activity(self, value):
if not value or value == MISSING:
return None
- sanitizer = InputHtmlParser()
- sanitizer.feed(value)
- return sanitizer.get_output()
+ return clean(value)
class ArrayField(ActivitypubFieldMixin, DjangoArrayField):
diff --git a/bookwyrm/models/group.py b/bookwyrm/models/group.py
index 05ed39a27..003b23d02 100644
--- a/bookwyrm/models/group.py
+++ b/bookwyrm/models/group.py
@@ -140,16 +140,6 @@ class GroupMemberInvitation(models.Model):
# make an invitation
super().save(*args, **kwargs)
- # now send the invite
- model = apps.get_model("bookwyrm.Notification", require_ready=True)
- notification_type = "INVITE"
- model.objects.create(
- user=self.user,
- related_user=self.group.user,
- related_group=self.group,
- notification_type=notification_type,
- )
-
@transaction.atomic
def accept(self):
"""turn this request into the real deal"""
@@ -157,25 +147,24 @@ class GroupMemberInvitation(models.Model):
model = apps.get_model("bookwyrm.Notification", require_ready=True)
# tell the group owner
- model.objects.create(
- user=self.group.user,
- related_user=self.user,
+ model.notify(
+ self.group.user,
+ self.user,
related_group=self.group,
- notification_type="ACCEPT",
+ notification_type=model.ACCEPT,
)
# let the other members know about it
for membership in self.group.memberships.all():
member = membership.user
if member not in (self.user, self.group.user):
- model.objects.create(
- user=member,
- related_user=self.user,
+ model.notify(
+ member,
+ self.user,
related_group=self.group,
- notification_type="JOIN",
+ notification_type=model.JOIN,
)
def reject(self):
"""generate a Reject for this membership request"""
-
self.delete()
diff --git a/bookwyrm/models/link.py b/bookwyrm/models/link.py
index 0e4148ddd..56b096bc2 100644
--- a/bookwyrm/models/link.py
+++ b/bookwyrm/models/link.py
@@ -84,7 +84,7 @@ class LinkDomain(BookWyrmModel):
)
def raise_not_editable(self, viewer):
- if viewer.has_perm("moderate_post"):
+ if viewer.has_perm("bookwyrm.moderate_post"):
return
raise PermissionDenied()
diff --git a/bookwyrm/models/list.py b/bookwyrm/models/list.py
index 0195020e0..63dd5b23f 100644
--- a/bookwyrm/models/list.py
+++ b/bookwyrm/models/list.py
@@ -1,7 +1,6 @@
""" make a list of books!! """
import uuid
-from django.apps import apps
from django.core.exceptions import PermissionDenied
from django.db import models
from django.db.models import Q
@@ -151,34 +150,12 @@ class ListItem(CollectionItemMixin, BookWyrmModel):
collection_field = "book_list"
def save(self, *args, **kwargs):
- """create a notification too"""
- created = not bool(self.id)
+ """Update the list's date"""
super().save(*args, **kwargs)
# tick the updated date on the parent list
self.book_list.updated_date = timezone.now()
self.book_list.save(broadcast=False, update_fields=["updated_date"])
- list_owner = self.book_list.user
- model = apps.get_model("bookwyrm.Notification", require_ready=True)
- # create a notification if somoene ELSE added to a local user's list
- if created and list_owner.local and list_owner != self.user:
- model.objects.create(
- user=list_owner,
- related_user=self.user,
- related_list_item=self,
- notification_type="ADD",
- )
-
- if self.book_list.group:
- for membership in self.book_list.group.memberships.all():
- if membership.user != self.user:
- model.objects.create(
- user=membership.user,
- related_user=self.user,
- related_list_item=self,
- notification_type="ADD",
- )
-
def raise_not_deletable(self, viewer):
"""the associated user OR the list owner can delete"""
if self.book_list.user == viewer:
diff --git a/bookwyrm/models/notification.py b/bookwyrm/models/notification.py
index 417bf7591..818c7bd05 100644
--- a/bookwyrm/models/notification.py
+++ b/bookwyrm/models/notification.py
@@ -1,77 +1,123 @@
""" alert a user to activity """
-from django.db import models
+from django.db import models, transaction
from django.dispatch import receiver
from .base_model import BookWyrmModel
-from . import Boost, Favorite, ImportJob, Report, Status, User
-
-# pylint: disable=line-too-long
-NotificationType = models.TextChoices(
- "NotificationType",
- "FAVORITE REPLY MENTION TAG FOLLOW FOLLOW_REQUEST BOOST IMPORT ADD REPORT INVITE ACCEPT JOIN LEAVE REMOVE GROUP_PRIVACY GROUP_NAME GROUP_DESCRIPTION",
-)
+from . import Boost, Favorite, GroupMemberInvitation, ImportJob, ListItem, Report
+from . import Status, User, UserFollowRequest
class Notification(BookWyrmModel):
"""you've been tagged, liked, followed, etc"""
+ # Status interactions
+ FAVORITE = "FAVORITE"
+ BOOST = "BOOST"
+ REPLY = "REPLY"
+ MENTION = "MENTION"
+ TAG = "TAG"
+
+ # Relationships
+ FOLLOW = "FOLLOW"
+ FOLLOW_REQUEST = "FOLLOW_REQUEST"
+
+ # Imports
+ IMPORT = "IMPORT"
+
+ # List activity
+ ADD = "ADD"
+
+ # Admin
+ REPORT = "REPORT"
+
+ # Groups
+ INVITE = "INVITE"
+ ACCEPT = "ACCEPT"
+ JOIN = "JOIN"
+ LEAVE = "LEAVE"
+ REMOVE = "REMOVE"
+ GROUP_PRIVACY = "GROUP_PRIVACY"
+ GROUP_NAME = "GROUP_NAME"
+ GROUP_DESCRIPTION = "GROUP_DESCRIPTION"
+
+ # pylint: disable=line-too-long
+ NotificationType = models.TextChoices(
+ # there has got be a better way to do this
+ "NotificationType",
+ f"{FAVORITE} {REPLY} {MENTION} {TAG} {FOLLOW} {FOLLOW_REQUEST} {BOOST} {IMPORT} {ADD} {REPORT} {INVITE} {ACCEPT} {JOIN} {LEAVE} {REMOVE} {GROUP_PRIVACY} {GROUP_NAME} {GROUP_DESCRIPTION}",
+ )
+
user = models.ForeignKey("User", on_delete=models.CASCADE)
- related_book = models.ForeignKey("Edition", on_delete=models.CASCADE, null=True)
- related_user = models.ForeignKey(
- "User", on_delete=models.CASCADE, null=True, related_name="related_user"
+ read = models.BooleanField(default=False)
+ notification_type = models.CharField(
+ max_length=255, choices=NotificationType.choices
+ )
+
+ related_users = models.ManyToManyField(
+ "User", symmetrical=False, related_name="notifications"
)
related_group = models.ForeignKey(
"Group", on_delete=models.CASCADE, null=True, related_name="notifications"
)
related_status = models.ForeignKey("Status", on_delete=models.CASCADE, null=True)
related_import = models.ForeignKey("ImportJob", on_delete=models.CASCADE, null=True)
- related_list_item = models.ForeignKey(
- "ListItem", on_delete=models.CASCADE, null=True
- )
- related_report = models.ForeignKey("Report", on_delete=models.CASCADE, null=True)
- read = models.BooleanField(default=False)
- notification_type = models.CharField(
- max_length=255, choices=NotificationType.choices
+ related_list_items = models.ManyToManyField(
+ "ListItem", symmetrical=False, related_name="notifications"
)
+ related_reports = models.ManyToManyField("Report", symmetrical=False)
- def save(self, *args, **kwargs):
- """save, but don't make dupes"""
- # there's probably a better way to do this
- if self.__class__.objects.filter(
- user=self.user,
- related_book=self.related_book,
- related_user=self.related_user,
- related_group=self.related_group,
- related_status=self.related_status,
- related_import=self.related_import,
- related_list_item=self.related_list_item,
- related_report=self.related_report,
- notification_type=self.notification_type,
- ).exists():
+ @classmethod
+ @transaction.atomic
+ def notify(cls, user, related_user, **kwargs):
+ """Create a notification"""
+ if related_user and (not user.local or user == related_user):
return
- super().save(*args, **kwargs)
+ notification, _ = cls.objects.get_or_create(user=user, **kwargs)
+ if related_user:
+ notification.related_users.add(related_user)
+ notification.read = False
+ notification.save()
- class Meta:
- """checks if notifcation is in enum list for valid types"""
-
- constraints = [
- models.CheckConstraint(
- check=models.Q(notification_type__in=NotificationType.values),
- name="notification_type_valid",
+ @classmethod
+ @transaction.atomic
+ def notify_list_item(cls, user, list_item):
+ """Group the notifications around the list items, not the user"""
+ related_user = list_item.user
+ notification = cls.objects.filter(
+ user=user,
+ related_users=related_user,
+ related_list_items__book_list=list_item.book_list,
+ notification_type=Notification.ADD,
+ ).first()
+ if not notification:
+ notification = cls.objects.create(
+ user=user, notification_type=Notification.ADD
)
- ]
+ notification.related_users.add(related_user)
+ notification.related_list_items.add(list_item)
+ notification.read = False
+ notification.save()
+
+ @classmethod
+ def unnotify(cls, user, related_user, **kwargs):
+ """Remove a user from a notification and delete it if that was the only user"""
+ try:
+ notification = cls.objects.filter(user=user, **kwargs).get()
+ except Notification.DoesNotExist:
+ return
+ notification.related_users.remove(related_user)
+ if not notification.related_users.count():
+ notification.delete()
@receiver(models.signals.post_save, sender=Favorite)
# pylint: disable=unused-argument
def notify_on_fav(sender, instance, *args, **kwargs):
"""someone liked your content, you ARE loved"""
- if not instance.status.user.local or instance.status.user == instance.user:
- return
- Notification.objects.create(
- user=instance.status.user,
- notification_type="FAVORITE",
- related_user=instance.user,
+ Notification.notify(
+ instance.status.user,
+ instance.user,
related_status=instance.status,
+ notification_type=Notification.FAVORITE,
)
@@ -81,15 +127,16 @@ def notify_on_unfav(sender, instance, *args, **kwargs):
"""oops, didn't like that after all"""
if not instance.status.user.local:
return
- Notification.objects.filter(
- user=instance.status.user,
- related_user=instance.user,
+ Notification.unnotify(
+ instance.status.user,
+ instance.user,
related_status=instance.status,
- notification_type="FAVORITE",
- ).delete()
+ notification_type=Notification.FAVORITE,
+ )
@receiver(models.signals.post_save)
+@transaction.atomic
# pylint: disable=unused-argument
def notify_user_on_mention(sender, instance, *args, **kwargs):
"""creating and deleting statuses with @ mentions and replies"""
@@ -105,22 +152,23 @@ def notify_user_on_mention(sender, instance, *args, **kwargs):
and instance.reply_parent.user != instance.user
and instance.reply_parent.user.local
):
- Notification.objects.create(
- user=instance.reply_parent.user,
- notification_type="REPLY",
- related_user=instance.user,
+ Notification.notify(
+ instance.reply_parent.user,
+ instance.user,
related_status=instance,
+ notification_type=Notification.REPLY,
)
+
for mention_user in instance.mention_users.all():
# avoid double-notifying about this status
if not mention_user.local or (
instance.reply_parent and mention_user == instance.reply_parent.user
):
continue
- Notification.objects.create(
- user=mention_user,
- notification_type="MENTION",
- related_user=instance.user,
+ Notification.notify(
+ mention_user,
+ instance.user,
+ notification_type=Notification.MENTION,
related_status=instance,
)
@@ -135,11 +183,11 @@ def notify_user_on_boost(sender, instance, *args, **kwargs):
):
return
- Notification.objects.create(
- user=instance.boosted_status.user,
+ Notification.notify(
+ instance.boosted_status.user,
+ instance.user,
related_status=instance.boosted_status,
- related_user=instance.user,
- notification_type="BOOST",
+ notification_type=Notification.BOOST,
)
@@ -147,12 +195,12 @@ def notify_user_on_boost(sender, instance, *args, **kwargs):
# pylint: disable=unused-argument
def notify_user_on_unboost(sender, instance, *args, **kwargs):
"""unboosting a status"""
- Notification.objects.filter(
- user=instance.boosted_status.user,
+ Notification.unnotify(
+ instance.boosted_status.user,
+ instance.user,
related_status=instance.boosted_status,
- related_user=instance.user,
- notification_type="BOOST",
- ).delete()
+ notification_type=Notification.BOOST,
+ )
@receiver(models.signals.post_save, sender=ImportJob)
@@ -166,23 +214,92 @@ def notify_user_on_import_complete(
return
Notification.objects.create(
user=instance.user,
- notification_type="IMPORT",
+ notification_type=Notification.IMPORT,
related_import=instance,
)
@receiver(models.signals.post_save, sender=Report)
+@transaction.atomic
# pylint: disable=unused-argument
-def notify_admins_on_report(sender, instance, *args, **kwargs):
+def notify_admins_on_report(sender, instance, created, *args, **kwargs):
"""something is up, make sure the admins know"""
+ if not created:
+ # otherwise you'll get a notification when you resolve a report
+ return
+
# moderators and superusers should be notified
admins = User.objects.filter(
models.Q(user_permissions__name__in=["moderate_user", "moderate_post"])
| models.Q(is_superuser=True)
).all()
for admin in admins:
- Notification.objects.create(
+ notification, _ = Notification.objects.get_or_create(
user=admin,
- related_report=instance,
- notification_type="REPORT",
+ notification_type=Notification.REPORT,
+ read=False,
+ )
+ notification.related_reports.add(instance)
+
+
+@receiver(models.signals.post_save, sender=GroupMemberInvitation)
+# pylint: disable=unused-argument
+def notify_user_on_group_invite(sender, instance, *args, **kwargs):
+ """Cool kids club here we come"""
+ Notification.notify(
+ instance.user,
+ instance.group.user,
+ related_group=instance.group,
+ notification_type=Notification.INVITE,
+ )
+
+
+@receiver(models.signals.post_save, sender=ListItem)
+@transaction.atomic
+# pylint: disable=unused-argument
+def notify_user_on_list_item_add(sender, instance, created, *args, **kwargs):
+ """Someone added to your list"""
+ if not created:
+ return
+
+ list_owner = instance.book_list.user
+ # create a notification if somoene ELSE added to a local user's list
+ if list_owner.local and list_owner != instance.user:
+ # keep the related_user singular, group the items
+ Notification.notify_list_item(list_owner, instance)
+
+ if instance.book_list.group:
+ for membership in instance.book_list.group.memberships.all():
+ if membership.user != instance.user:
+ Notification.notify_list_item(membership.user, instance)
+
+
+@receiver(models.signals.post_save, sender=UserFollowRequest)
+@transaction.atomic
+# pylint: disable=unused-argument
+def notify_user_on_follow(sender, instance, created, *args, **kwargs):
+ """Someone added to your list"""
+ if not created or not instance.user_object.local:
+ return
+
+ manually_approves = instance.user_object.manually_approves_followers
+ if manually_approves:
+ # don't group notifications
+ notification = Notification.objects.filter(
+ user=instance.user_object,
+ related_users=instance.user_subject,
+ notification_type=Notification.FOLLOW_REQUEST,
+ ).first()
+ if not notification:
+ notification = Notification.objects.create(
+ user=instance.user_object, notification_type=Notification.FOLLOW_REQUEST
+ )
+ notification.related_users.set([instance.user_subject])
+ notification.read = False
+ notification.save()
+ else:
+ Notification.notify(
+ instance.user_object,
+ instance.user_subject,
+ notification_type=Notification.FOLLOW,
)
diff --git a/bookwyrm/models/relationship.py b/bookwyrm/models/relationship.py
index 171f45840..082294c0e 100644
--- a/bookwyrm/models/relationship.py
+++ b/bookwyrm/models/relationship.py
@@ -1,5 +1,4 @@
""" defines relationships between users """
-from django.apps import apps
from django.core.cache import cache
from django.db import models, transaction, IntegrityError
from django.db.models import Q
@@ -148,14 +147,6 @@ class UserFollowRequest(ActivitypubMixin, UserRelationship):
if not manually_approves:
self.accept()
- model = apps.get_model("bookwyrm.Notification", require_ready=True)
- notification_type = "FOLLOW_REQUEST" if manually_approves else "FOLLOW"
- model.objects.create(
- user=self.user_object,
- related_user=self.user_subject,
- notification_type=notification_type,
- )
-
def get_accept_reject_id(self, status):
"""get id for sending an accept or reject of a local user"""
@@ -218,7 +209,7 @@ def clear_cache(user_subject, user_object):
"""clear relationship cache"""
cache.delete_many(
[
- f"relationship-{user_subject.id}-{user_object.id}",
- f"relationship-{user_object.id}-{user_subject.id}",
+ f"cached-relationship-{user_subject.id}-{user_object.id}",
+ f"cached-relationship-{user_object.id}-{user_subject.id}",
]
)
diff --git a/bookwyrm/models/report.py b/bookwyrm/models/report.py
index bf3184f52..d161c0349 100644
--- a/bookwyrm/models/report.py
+++ b/bookwyrm/models/report.py
@@ -11,7 +11,7 @@ class Report(BookWyrmModel):
"User", related_name="reporter", on_delete=models.PROTECT
)
note = models.TextField(null=True, blank=True)
- user = models.ForeignKey("User", on_delete=models.PROTECT)
+ user = models.ForeignKey("User", on_delete=models.PROTECT, null=True, blank=True)
status = models.ForeignKey(
"Status",
null=True,
diff --git a/bookwyrm/models/shelf.py b/bookwyrm/models/shelf.py
index 3291d5653..d955e8d07 100644
--- a/bookwyrm/models/shelf.py
+++ b/bookwyrm/models/shelf.py
@@ -103,12 +103,25 @@ class ShelfBook(CollectionItemMixin, BookWyrmModel):
if not self.user:
self.user = self.shelf.user
if self.id and self.user.local:
- cache.delete(f"book-on-shelf-{self.book.id}-{self.shelf.id}")
+ # remove all caches related to all editions of this book
+ cache.delete_many(
+ [
+ f"book-on-shelf-{book.id}-{self.shelf.id}"
+ for book in self.book.parent_work.editions.all()
+ ]
+ )
super().save(*args, **kwargs)
def delete(self, *args, **kwargs):
if self.id and self.user.local:
- cache.delete(f"book-on-shelf-{self.book.id}-{self.shelf.id}")
+ cache.delete_many(
+ [
+ f"book-on-shelf-{book}-{self.shelf.id}"
+ for book in self.book.parent_work.editions.values_list(
+ "id", flat=True
+ )
+ ]
+ )
super().delete(*args, **kwargs)
class Meta:
diff --git a/bookwyrm/sanitize_html.py b/bookwyrm/sanitize_html.py
deleted file mode 100644
index 4edd2818e..000000000
--- a/bookwyrm/sanitize_html.py
+++ /dev/null
@@ -1,71 +0,0 @@
-""" html parser to clean up incoming text from unknown sources """
-from html.parser import HTMLParser
-
-
-class InputHtmlParser(HTMLParser): # pylint: disable=abstract-method
- """Removes any html that isn't allowed_tagsed from a block"""
-
- def __init__(self):
- HTMLParser.__init__(self)
- self.allowed_tags = [
- "p",
- "blockquote",
- "br",
- "b",
- "i",
- "strong",
- "em",
- "pre",
- "a",
- "span",
- "ul",
- "ol",
- "li",
- ]
- self.allowed_attrs = ["href", "rel", "src", "alt"]
- self.tag_stack = []
- self.output = []
- # if the html appears invalid, we just won't allow any at all
- self.allow_html = True
-
- def handle_starttag(self, tag, attrs):
- """check if the tag is valid"""
- if self.allow_html and tag in self.allowed_tags:
- allowed_attrs = " ".join(
- f'{a}="{v}"' for a, v in attrs if a in self.allowed_attrs
- )
- reconstructed = f"<{tag}"
- if allowed_attrs:
- reconstructed += " " + allowed_attrs
- reconstructed += ">"
- self.output.append(("tag", reconstructed))
- self.tag_stack.append(tag)
- else:
- self.output.append(("data", ""))
-
- def handle_endtag(self, tag):
- """keep the close tag"""
- if not self.allow_html or tag not in self.allowed_tags:
- self.output.append(("data", ""))
- return
-
- if not self.tag_stack or self.tag_stack[-1] != tag:
- # the end tag doesn't match the most recent start tag
- self.allow_html = False
- self.output.append(("data", ""))
- return
-
- self.tag_stack = self.tag_stack[:-1]
- self.output.append(("tag", f"{tag}>"))
-
- def handle_data(self, data):
- """extract the answer, if we're in an answer tag"""
- self.output.append(("data", data))
-
- def get_output(self):
- """convert the output from a list of tuples to a string"""
- if self.tag_stack:
- self.allow_html = False
- if not self.allow_html:
- return "".join(v for (k, v) in self.output if k == "data")
- return "".join(v for (k, v) in self.output)
diff --git a/bookwyrm/settings.py b/bookwyrm/settings.py
index dc0d71f30..c1335edf6 100644
--- a/bookwyrm/settings.py
+++ b/bookwyrm/settings.py
@@ -11,7 +11,7 @@ from django.utils.translation import gettext_lazy as _
env = Env()
env.read_env()
DOMAIN = env("DOMAIN")
-VERSION = "0.4.0"
+VERSION = "0.4.2"
RELEASE_API = env(
"RELEASE_API",
diff --git a/bookwyrm/status.py b/bookwyrm/status.py
index 09fbdc06e..de7682ee7 100644
--- a/bookwyrm/status.py
+++ b/bookwyrm/status.py
@@ -2,15 +2,13 @@
from django.db import transaction
from bookwyrm import models
-from bookwyrm.sanitize_html import InputHtmlParser
+from bookwyrm.utils import sanitizer
def create_generated_note(user, content, mention_books=None, privacy="public"):
"""a note created by the app about user activity"""
# sanitize input html
- parser = InputHtmlParser()
- parser.feed(content)
- content = parser.get_output()
+ content = sanitizer.clean(content)
with transaction.atomic():
# create but don't save
diff --git a/bookwyrm/templates/book/file_links/edit_links.html b/bookwyrm/templates/book/file_links/edit_links.html
index 44206ef77..fb722753f 100644
--- a/bookwyrm/templates/book/file_links/edit_links.html
+++ b/bookwyrm/templates/book/file_links/edit_links.html
@@ -42,7 +42,11 @@
{{ link.url }}
+ {% if link.added_by %}
{{ link.added_by.display_name }}
+ {% else %}
+ {% trans "Unknown user" %}
+ {% endif %}
{{ link.filelink.filetype }}
@@ -50,7 +54,7 @@
{{ link.domain.name }}
- {% trans "Report spam" %}
+ {% trans "Report spam" %}
diff --git a/bookwyrm/templates/book/file_links/verification_modal.html b/bookwyrm/templates/book/file_links/verification_modal.html
index 01f17f965..75678763f 100644
--- a/bookwyrm/templates/book/file_links/verification_modal.html
+++ b/bookwyrm/templates/book/file_links/verification_modal.html
@@ -19,7 +19,7 @@ Is that where you'd like to go?
{% block modal-footer %}
{% if request.user.is_authenticated %}
{% trans "Cancel" %}
diff --git a/bookwyrm/templates/email/moderation_report/html_content.html b/bookwyrm/templates/email/moderation_report/html_content.html
index 10df380f2..3828ff70c 100644
--- a/bookwyrm/templates/email/moderation_report/html_content.html
+++ b/bookwyrm/templates/email/moderation_report/html_content.html
@@ -3,7 +3,19 @@
{% block content %}
-{% blocktrans %}@{{ reporter }} has flagged behavior by @{{ reportee }} for moderation. {% endblocktrans %}
+{% if report_link %}
+
+ {% blocktrans trimmed %}
+ @{{ reporter }} has flagged a link domain for moderation.
+ {% endblocktrans %}
+
+{% else %}
+
+ {% blocktrans trimmed %}
+ @{{ reporter }} has flagged behavior by @{{ reportee }} for moderation.
+ {% endblocktrans %}
+
+{% endif %}
{% trans "View report" as text %}
diff --git a/bookwyrm/templates/email/moderation_report/text_content.html b/bookwyrm/templates/email/moderation_report/text_content.html
index 57d37d446..764a3c72a 100644
--- a/bookwyrm/templates/email/moderation_report/text_content.html
+++ b/bookwyrm/templates/email/moderation_report/text_content.html
@@ -2,7 +2,15 @@
{% load i18n %}
{% block content %}
-{% blocktrans %}@{{ reporter}} has flagged behavior by @{{ reportee }} for moderation. {% endblocktrans %}
+{% if report_link %}
+{% blocktrans trimmed %}
+@{{ reporter }} has flagged a link domain for moderation.
+{% endblocktrans %}
+{% else %}
+{% blocktrans trimmed %}
+@{{ reporter }} has flagged behavior by @{{ reportee }} for moderation.
+{% endblocktrans %}
+{% endif %}
{% trans "View report" %}
{{ report_link }}
diff --git a/bookwyrm/templates/landing/password_reset_request.html b/bookwyrm/templates/landing/password_reset_request.html
index 5d877442f..b06668e57 100644
--- a/bookwyrm/templates/landing/password_reset_request.html
+++ b/bookwyrm/templates/landing/password_reset_request.html
@@ -9,7 +9,13 @@
{% trans "Reset Password" %}
- {% if message %}
{{ message }}
{% endif %}
+ {% if sent_message %}
+
+ {% blocktrans trimmed %}
+ A password reset link will be sent to {{ email }} if there is an account using that email address.
+ {% endblocktrans %}
+
+ {% endif %}
{% trans "A link to reset your password will be sent to your email address" %}
-
+
- {% trans "Requesting camera..." %}
+ {% trans "Requesting camera..." %}
{% trans "Grant access to the camera to scan a book's barcode." %}
diff --git a/bookwyrm/templates/settings/dashboard/dashboard.html b/bookwyrm/templates/settings/dashboard/dashboard.html
index cec3e89ac..ea7a8a796 100644
--- a/bookwyrm/templates/settings/dashboard/dashboard.html
+++ b/bookwyrm/templates/settings/dashboard/dashboard.html
@@ -37,50 +37,40 @@
- {% if reports %}
-
+ {% if email_config_error %}
+ {% include 'settings/dashboard/warnings/email_config.html' with warning_level="danger" fullwidth=True %}
{% endif %}
- {% if pending_domains %}
-
+ {% if current_version %}
+ {% include 'settings/dashboard/warnings/update_version.html' with warning_level="warning" fullwidth=True %}
{% endif %}
- {% if not site.allow_registration and site.allow_invite_requests and invite_requests %}
-
-
- {% blocktrans trimmed count counter=invite_requests with display_count=invite_requests|intcomma %}
- {{ display_count }} invite request
- {% plural %}
- {{ display_count }} invite requests
- {% endblocktrans %}
-
+ {% if missing_privacy or missing_conduct %}
+
+ {% if missing_privacy %}
+ {% include 'settings/dashboard/warnings/missing_privacy.html' with warning_level="danger" %}
+ {% endif %}
+
+ {% if missing_conduct %}
+ {% include 'settings/dashboard/warnings/missing_conduct.html' with warning_level="warning" %}
+ {% endif %}
{% endif %}
{% if current_version %}
-
+ {% include 'settings/dashboard/warnings/update_version.html' with warning_level="warning" fullwidth=True %}
+ {% endif %}
+
+ {% if reports %}
+ {% include 'settings/dashboard/warnings/reports.html' with warning_level="warning" %}
+ {% endif %}
+
+ {% if pending_domains %}
+ {% include 'settings/dashboard/warnings/domain_review.html' with warning_level="primary" %}
+ {% endif %}
+
+ {% if not site.allow_registration and site.allow_invite_requests and invite_requests %}
+ {% include 'settings/dashboard/warnings/invites.html' with warning_level="success" %}
{% endif %}
diff --git a/bookwyrm/templates/settings/dashboard/warnings/domain_review.html b/bookwyrm/templates/settings/dashboard/warnings/domain_review.html
new file mode 100644
index 000000000..d03971f92
--- /dev/null
+++ b/bookwyrm/templates/settings/dashboard/warnings/domain_review.html
@@ -0,0 +1,15 @@
+{% extends 'settings/dashboard/warnings/layout.html' %}
+{% load i18n %}
+{% load humanize %}
+
+{% block warning_link %}{% url 'settings-link-domain' %}{% endblock %}
+
+{% block warning_text %}
+
+{% blocktrans trimmed count counter=pending_domains with display_count=pending_domains|intcomma %}
+{{ display_count }} domain needs review
+{% plural %}
+{{ display_count }} domains need review
+{% endblocktrans %}
+
+{% endblock %}
diff --git a/bookwyrm/templates/settings/dashboard/warnings/email_config.html b/bookwyrm/templates/settings/dashboard/warnings/email_config.html
new file mode 100644
index 000000000..26ad5b1d7
--- /dev/null
+++ b/bookwyrm/templates/settings/dashboard/warnings/email_config.html
@@ -0,0 +1,13 @@
+{% extends 'settings/dashboard/warnings/layout.html' %}
+{% load i18n %}
+
+{% block warning_link %}https://docs.joinbookwyrm.com/install-prod.html{% endblock %}
+
+{% block warning_text %}
+
+{% blocktrans trimmed %}
+Your outgoing email address,
{{ email_sender }}
, may be misconfigured.
+{% endblocktrans %}
+{% trans "Check the
EMAIL_SENDER_NAME
and
EMAIL_SENDER_DOMAIN
in your
.env
file." %}
+
+{% endblock %}
diff --git a/bookwyrm/templates/settings/dashboard/warnings/invites.html b/bookwyrm/templates/settings/dashboard/warnings/invites.html
new file mode 100644
index 000000000..34d278f40
--- /dev/null
+++ b/bookwyrm/templates/settings/dashboard/warnings/invites.html
@@ -0,0 +1,15 @@
+{% extends 'settings/dashboard/warnings/layout.html' %}
+{% load i18n %}
+{% load humanize %}
+
+{% block warning_link %}{% url 'settings-invite-requests' %}{% endblock %}
+
+{% block warning_text %}
+
+{% blocktrans trimmed count counter=invite_requests with display_count=invite_requests|intcomma %}
+{{ display_count }} invite request
+{% plural %}
+{{ display_count }} invite requests
+{% endblocktrans %}
+
+{% endblock %}
diff --git a/bookwyrm/templates/settings/dashboard/warnings/layout.html b/bookwyrm/templates/settings/dashboard/warnings/layout.html
new file mode 100644
index 000000000..7284530fe
--- /dev/null
+++ b/bookwyrm/templates/settings/dashboard/warnings/layout.html
@@ -0,0 +1,5 @@
+
diff --git a/bookwyrm/templates/settings/dashboard/warnings/missing_conduct.html b/bookwyrm/templates/settings/dashboard/warnings/missing_conduct.html
new file mode 100644
index 000000000..aa0b431f2
--- /dev/null
+++ b/bookwyrm/templates/settings/dashboard/warnings/missing_conduct.html
@@ -0,0 +1,10 @@
+{% extends 'settings/dashboard/warnings/layout.html' %}
+{% load i18n %}
+
+{% block warning_link %}{% url 'settings-site' %}#instance-info{% endblock %}
+
+{% block warning_text %}
+
+{% trans "Your instance is missing a code of conduct." %}
+
+{% endblock %}
diff --git a/bookwyrm/templates/settings/dashboard/warnings/missing_privacy.html b/bookwyrm/templates/settings/dashboard/warnings/missing_privacy.html
new file mode 100644
index 000000000..87407632a
--- /dev/null
+++ b/bookwyrm/templates/settings/dashboard/warnings/missing_privacy.html
@@ -0,0 +1,10 @@
+{% extends 'settings/dashboard/warnings/layout.html' %}
+{% load i18n %}
+
+{% block warning_link %}{% url 'settings-site' %}#instance-info{% endblock %}
+
+{% block warning_text %}
+
+{% trans "Your instance is missing a privacy policy." %}
+
+{% endblock %}
diff --git a/bookwyrm/templates/settings/dashboard/warnings/reports.html b/bookwyrm/templates/settings/dashboard/warnings/reports.html
new file mode 100644
index 000000000..885f94789
--- /dev/null
+++ b/bookwyrm/templates/settings/dashboard/warnings/reports.html
@@ -0,0 +1,15 @@
+{% extends 'settings/dashboard/warnings/layout.html' %}
+{% load i18n %}
+{% load humanize %}
+
+{% block warning_link %}{% url 'settings-reports' %}{% endblock %}
+
+{% block warning_text %}
+
+{% blocktrans trimmed count counter=reports with display_count=reports|intcomma %}
+{{ display_count }} open report
+{% plural %}
+{{ display_count }} open reports
+{% endblocktrans %}
+
+{% endblock %}
diff --git a/bookwyrm/templates/settings/dashboard/warnings/update_version.html b/bookwyrm/templates/settings/dashboard/warnings/update_version.html
new file mode 100644
index 000000000..b04b0a624
--- /dev/null
+++ b/bookwyrm/templates/settings/dashboard/warnings/update_version.html
@@ -0,0 +1,12 @@
+{% extends 'settings/dashboard/warnings/layout.html' %}
+{% load i18n %}
+
+{% block warning_link %}https://docs.joinbookwyrm.com/updating.html{% endblock %}
+
+{% block warning_text %}
+
+{% blocktrans trimmed with current=current_version available=available_version %}
+An update is available! You're running v{{ current }} and the latest release is {{ available }}.
+{% endblocktrans %}
+
+{% endblock %}
diff --git a/bookwyrm/templates/settings/federation/instance.html b/bookwyrm/templates/settings/federation/instance.html
index cb6b1fc37..0064c4ff3 100644
--- a/bookwyrm/templates/settings/federation/instance.html
+++ b/bookwyrm/templates/settings/federation/instance.html
@@ -56,7 +56,7 @@
{% trans "Users:" %}
{{ users.count }}
- {% if server.user_set.count %}({% trans "View all" %} ){% endif %}
+ {% if server.user_set.count %}({% trans "View all" %} ){% endif %}
{% trans "Reports:" %}
diff --git a/bookwyrm/templates/settings/link_domains/link_table.html b/bookwyrm/templates/settings/link_domains/link_table.html
index 5518477c8..a8ec18d22 100644
--- a/bookwyrm/templates/settings/link_domains/link_table.html
+++ b/bookwyrm/templates/settings/link_domains/link_table.html
@@ -15,7 +15,11 @@
{{ link.url }}
+ {% if link.added_by %}
@{{ link.added_by|username }}
+ {% else %}
+ {% trans "Unknown user" %}
+ {% endif %}
{% if link.filelink.filetype %}
diff --git a/bookwyrm/templates/settings/reports/report.html b/bookwyrm/templates/settings/reports/report.html
index 20fdeca36..ca105701f 100644
--- a/bookwyrm/templates/settings/reports/report.html
+++ b/bookwyrm/templates/settings/reports/report.html
@@ -55,9 +55,11 @@
{% endif %}
+{% if report.user %}
{% include 'settings/users/user_info.html' with user=report.user %}
{% include 'settings/users/user_moderation_actions.html' with user=report.user %}
+{% endif %}
{% trans "Moderator Comments" %}
diff --git a/bookwyrm/templates/settings/reports/report_header.html b/bookwyrm/templates/settings/reports/report_header.html
index 878a825da..b77c6c6ae 100644
--- a/bookwyrm/templates/settings/reports/report_header.html
+++ b/bookwyrm/templates/settings/reports/report_header.html
@@ -9,9 +9,15 @@ Report #{{ report_id }}: Status posted by @{{ username }}
{% elif report.links.exists %}
-{% blocktrans trimmed with report_id=report.id username=report.user|username %}
-Report #{{ report_id }}: Link added by @{{ username }}
-{% endblocktrans %}
+ {% if report.user %}
+ {% blocktrans trimmed with report_id=report.id username=report.user|username %}
+ Report #{{ report_id }}: Link added by @{{ username }}
+ {% endblocktrans %}
+ {% else %}
+ {% blocktrans trimmed with report_id=report.id %}
+ Report #{{ report_id }}: Link domain
+ {% endblocktrans %}
+ {% endif %}
{% else %}
diff --git a/bookwyrm/templates/settings/users/user_admin.html b/bookwyrm/templates/settings/users/user_admin.html
index 4144f0bde..9bc5805b1 100644
--- a/bookwyrm/templates/settings/users/user_admin.html
+++ b/bookwyrm/templates/settings/users/user_admin.html
@@ -24,6 +24,10 @@
{% trans "Local users" %}
+ {% url 'settings-users' status="deleted" as url %}
+
+ {% trans "Deleted users" %}
+
{% url 'settings-users' status="federated" as url %}
{% trans "Federated community" %}
@@ -36,7 +40,7 @@
{% url 'settings-users' as url %}
-
+
{% trans "Username" as text %}
{% include 'snippets/table-sort-header.html' with field="username" sort=sort text=text %}
@@ -52,7 +56,7 @@
{% trans "Status" as text %}
{% include 'snippets/table-sort-header.html' with field="is_active" sort=sort text=text %}
- {% if status != "local" %}
+ {% if status == "federated" %}
{% trans "Remote instance" as text %}
{% include 'snippets/table-sort-header.html' with field="federated_server__server_name" sort=sort text=text %}
@@ -61,7 +65,10 @@
{% for user in users %}
-
+
+ {% include 'snippets/avatar.html' with user=user %}
+
+
{{ user|username }}
{{ user.created_date }}
@@ -72,6 +79,12 @@
{% trans "Active" %}
+ {% elif user.deactivation_reason == "moderator_deletion" or user.deactivation_reason == "self_deletion" %}
+
+
+
+ {% trans "Deleted" %}
+ ({{ user.get_deactivation_reason_display }})
{% else %}
@@ -80,7 +93,7 @@
({{ user.get_deactivation_reason_display }})
{% endif %}
- {% if status != "local" %}
+ {% if status == "federated" %}
{% if user.federated_server %}
{{ user.federated_server.server_name }}
diff --git a/bookwyrm/templates/setup/config.html b/bookwyrm/templates/setup/config.html
index b14ad37d1..762fb5663 100644
--- a/bookwyrm/templates/setup/config.html
+++ b/bookwyrm/templates/setup/config.html
@@ -144,7 +144,7 @@
{% blocktrans trimmed %}
You can change your instance settings in the .env
file on your server.
{% endblocktrans %}
-
+
{% trans "View installation instructions" %}
diff --git a/bookwyrm/templates/snippets/status/content_status.html b/bookwyrm/templates/snippets/status/content_status.html
index d0d385153..bee4af1dc 100644
--- a/bookwyrm/templates/snippets/status/content_status.html
+++ b/bookwyrm/templates/snippets/status/content_status.html
@@ -112,9 +112,6 @@
{% with full=status.content|safe no_trim=status.content_warning itemprop="reviewBody" %}
{% include 'snippets/trimmed_text.html' %}
{% endwith %}
- {% if status.progress %}
- {% trans "page" %} {{ status.progress }}
- {% endif %}
{% endif %}
{% if status.attachments.exists %}
diff --git a/bookwyrm/templatetags/interaction.py b/bookwyrm/templatetags/interaction.py
index 89a25420a..40f92dcd6 100644
--- a/bookwyrm/templatetags/interaction.py
+++ b/bookwyrm/templatetags/interaction.py
@@ -42,7 +42,7 @@ def get_relationship(context, user_object):
"""caches the relationship between the logged in user and another user"""
user = context["request"].user
return get_or_set(
- f"relationship-{user.id}-{user_object.id}",
+ f"cached-relationship-{user.id}-{user_object.id}",
get_relationship_name,
user,
user_object,
@@ -61,6 +61,6 @@ def get_relationship_name(user, user_object):
types["is_blocked"] = True
elif user_object in user.following.all():
types["is_following"] = True
- elif user_object in user.follower_requests.all():
+ elif user in user_object.follower_requests.all():
types["is_follow_pending"] = True
return types
diff --git a/bookwyrm/templatetags/shelf_tags.py b/bookwyrm/templatetags/shelf_tags.py
index 0eb1d8118..1fb799883 100644
--- a/bookwyrm/templatetags/shelf_tags.py
+++ b/bookwyrm/templatetags/shelf_tags.py
@@ -17,7 +17,7 @@ def get_is_book_on_shelf(book, shelf):
lambda b, s: s.books.filter(id=b.id).exists(),
book,
shelf,
- timeout=15552000,
+ timeout=60 * 60, # just cache this for an hour
)
@@ -68,7 +68,7 @@ def active_shelf(context, book):
),
user,
book,
- timeout=15552000,
+ timeout=60 * 60,
) or {"book": book}
@@ -85,5 +85,5 @@ def latest_read_through(book, user):
),
user,
book,
- timeout=15552000,
+ timeout=60 * 60,
)
diff --git a/bookwyrm/templatetags/utilities.py b/bookwyrm/templatetags/utilities.py
index 00fa4035c..834d39a14 100644
--- a/bookwyrm/templatetags/utilities.py
+++ b/bookwyrm/templatetags/utilities.py
@@ -53,7 +53,7 @@ def comparison_bool(str1, str2, reverse=False):
@register.filter(is_safe=True)
def truncatepath(value, arg):
- """Truncate a path by removing all directories except the first and truncating ."""
+ """Truncate a path by removing all directories except the first and truncating"""
path = os.path.normpath(value.name)
path_list = path.split(os.sep)
try:
diff --git a/bookwyrm/tests/models/test_book_model.py b/bookwyrm/tests/models/test_book_model.py
index d4f59fa58..5a2a6c3b6 100644
--- a/bookwyrm/tests/models/test_book_model.py
+++ b/bookwyrm/tests/models/test_book_model.py
@@ -1,6 +1,10 @@
""" testing models """
-from dateutil.parser import parse
+from io import BytesIO
+import pathlib
+from dateutil.parser import parse
+from PIL import Image
+from django.core.files.base import ContentFile
from django.test import TestCase
from django.utils import timezone
@@ -96,3 +100,28 @@ class Book(TestCase):
self.first_edition.description = "hi"
self.first_edition.save()
self.assertEqual(self.first_edition.edition_rank, 1)
+
+ def test_thumbnail_fields(self):
+ """Just hit them"""
+ image_file = pathlib.Path(__file__).parent.joinpath(
+ "../../static/images/default_avi.jpg"
+ )
+ image = Image.open(image_file)
+ output = BytesIO()
+ image.save(output, format=image.format)
+
+ book = models.Edition.objects.create(title="hello")
+ book.cover.save("test.jpg", ContentFile(output.getvalue()))
+
+ self.assertIsNotNone(book.cover_bw_book_xsmall_webp.url)
+ self.assertIsNotNone(book.cover_bw_book_xsmall_jpg.url)
+ self.assertIsNotNone(book.cover_bw_book_small_webp.url)
+ self.assertIsNotNone(book.cover_bw_book_small_jpg.url)
+ self.assertIsNotNone(book.cover_bw_book_medium_webp.url)
+ self.assertIsNotNone(book.cover_bw_book_medium_jpg.url)
+ self.assertIsNotNone(book.cover_bw_book_large_webp.url)
+ self.assertIsNotNone(book.cover_bw_book_large_jpg.url)
+ self.assertIsNotNone(book.cover_bw_book_xlarge_webp.url)
+ self.assertIsNotNone(book.cover_bw_book_xlarge_jpg.url)
+ self.assertIsNotNone(book.cover_bw_book_xxlarge_webp.url)
+ self.assertIsNotNone(book.cover_bw_book_xxlarge_jpg.url)
diff --git a/bookwyrm/tests/models/test_list.py b/bookwyrm/tests/models/test_list.py
index de6957b57..f7e64c6f2 100644
--- a/bookwyrm/tests/models/test_list.py
+++ b/bookwyrm/tests/models/test_list.py
@@ -7,6 +7,7 @@ from bookwyrm import models, settings
@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async")
+@patch("bookwyrm.lists_stream.remove_list_task.delay")
class List(TestCase):
"""some activitypub oddness ahead"""
@@ -21,25 +22,15 @@ class List(TestCase):
work = models.Work.objects.create(title="hello")
self.book = models.Edition.objects.create(title="hi", 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.apply_async"
- ), patch("bookwyrm.lists_stream.remove_list_task.delay"):
- book_list = models.List.objects.create(
- name="Test List", user=self.local_user
- )
+ book_list = models.List.objects.create(name="Test List", user=self.local_user)
expected_id = f"https://{settings.DOMAIN}/list/{book_list.id}"
self.assertEqual(book_list.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.apply_async"
- ), patch("bookwyrm.lists_stream.remove_list_task.delay"):
- book_list = models.List.objects.create(
- name="Test List", user=self.local_user
- )
+ book_list = models.List.objects.create(name="Test List", user=self.local_user)
activity_json = book_list.to_activity()
self.assertIsInstance(activity_json, dict)
self.assertEqual(activity_json["id"], book_list.remote_id)
@@ -48,14 +39,11 @@ class List(TestCase):
self.assertEqual(activity_json["name"], "Test List")
self.assertEqual(activity_json["owner"], self.local_user.remote_id)
- def test_list_item(self, _):
+ def test_list_item(self, *_):
"""a list entry"""
- with patch(
- "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"
- ), patch("bookwyrm.lists_stream.remove_list_task.delay"):
- book_list = models.List.objects.create(
- name="Test List", user=self.local_user, privacy="unlisted"
- )
+ book_list = models.List.objects.create(
+ name="Test List", user=self.local_user, privacy="unlisted"
+ )
item = models.ListItem.objects.create(
book_list=book_list,
@@ -68,14 +56,9 @@ class List(TestCase):
self.assertEqual(item.privacy, "unlisted")
self.assertEqual(item.recipients, [])
- def test_list_item_pending(self, _):
+ def test_list_item_pending(self, *_):
"""a list entry"""
- with patch(
- "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"
- ), patch("bookwyrm.lists_stream.remove_list_task.delay"):
- book_list = models.List.objects.create(
- name="Test List", user=self.local_user
- )
+ book_list = models.List.objects.create(name="Test List", user=self.local_user)
item = models.ListItem.objects.create(
book_list=book_list,
@@ -90,13 +73,8 @@ class List(TestCase):
self.assertEqual(item.privacy, "direct")
self.assertEqual(item.recipients, [])
- def test_embed_key(self, _):
+ def test_embed_key(self, *_):
"""embed_key should never be empty"""
- with patch(
- "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"
- ), patch("bookwyrm.lists_stream.remove_list_task.delay"):
- book_list = models.List.objects.create(
- name="Test List", user=self.local_user
- )
+ book_list = models.List.objects.create(name="Test List", user=self.local_user)
self.assertIsInstance(book_list.embed_key, UUID)
diff --git a/bookwyrm/tests/models/test_notification.py b/bookwyrm/tests/models/test_notification.py
new file mode 100644
index 000000000..3d6025a5f
--- /dev/null
+++ b/bookwyrm/tests/models/test_notification.py
@@ -0,0 +1,183 @@
+""" testing models """
+from unittest.mock import patch
+from django.test import TestCase
+from bookwyrm import models
+
+
+class Notification(TestCase):
+ """let people know things"""
+
+ def setUp(self): # pylint: disable=invalid-name
+ """useful things for creating a notification"""
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch(
+ "bookwyrm.activitystreams.populate_stream_task.delay"
+ ), patch("bookwyrm.lists_stream.populate_lists_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse", "mouse@mouse.mouse", "mouseword", local=True, localname="mouse"
+ )
+ self.another_user = models.User.objects.create_user(
+ "rat", "rat@rat.rat", "ratword", local=True, localname="rat"
+ )
+ 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",
+ 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",
+ isbn_13="1234567890123",
+ remote_id="https://example.com/book/1",
+ parent_work=self.work,
+ )
+ self.another_book = models.Edition.objects.create(
+ title="Second Test Book",
+ parent_work=models.Work.objects.create(title="Test Work"),
+ )
+
+ def test_notification(self):
+ """New notifications are unread"""
+ notification = models.Notification.objects.create(
+ user=self.local_user, notification_type=models.Notification.FAVORITE
+ )
+ self.assertFalse(notification.read)
+
+ def test_notify(self):
+ """Create a notification"""
+ models.Notification.notify(
+ self.local_user,
+ self.remote_user,
+ notification_type=models.Notification.FAVORITE,
+ )
+ self.assertTrue(models.Notification.objects.exists())
+
+ def test_notify_grouping(self):
+ """Bundle notifications"""
+ models.Notification.notify(
+ self.local_user,
+ self.remote_user,
+ notification_type=models.Notification.FAVORITE,
+ )
+ self.assertEqual(models.Notification.objects.count(), 1)
+ notification = models.Notification.objects.get()
+ self.assertEqual(notification.related_users.count(), 1)
+
+ models.Notification.notify(
+ self.local_user,
+ self.another_user,
+ notification_type=models.Notification.FAVORITE,
+ )
+ self.assertEqual(models.Notification.objects.count(), 1)
+ notification.refresh_from_db()
+ self.assertEqual(notification.related_users.count(), 2)
+
+ def test_notify_remote(self):
+ """Don't create notifications for remote users"""
+ models.Notification.notify(
+ self.remote_user,
+ self.local_user,
+ notification_type=models.Notification.FAVORITE,
+ )
+ self.assertFalse(models.Notification.objects.exists())
+
+ def test_notify_self(self):
+ """Don't create notifications for yourself"""
+ models.Notification.notify(
+ self.local_user,
+ self.local_user,
+ notification_type=models.Notification.FAVORITE,
+ )
+ self.assertFalse(models.Notification.objects.exists())
+
+ @patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async")
+ @patch("bookwyrm.lists_stream.remove_list_task.delay")
+ def test_notify_list_item_own_list(self, *_):
+ """Don't add list item notification for your own list"""
+ test_list = models.List.objects.create(user=self.local_user, name="hi")
+
+ models.ListItem.objects.create(
+ user=self.local_user, book=self.book, book_list=test_list, order=1
+ )
+ self.assertFalse(models.Notification.objects.exists())
+
+ @patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async")
+ @patch("bookwyrm.lists_stream.remove_list_task.delay")
+ def test_notify_list_item_remote(self, *_):
+ """Don't add list item notification for a remote user"""
+ test_list = models.List.objects.create(user=self.remote_user, name="hi")
+
+ models.ListItem.objects.create(
+ user=self.local_user, book=self.book, book_list=test_list, order=1
+ )
+ self.assertFalse(models.Notification.objects.exists())
+
+ @patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async")
+ @patch("bookwyrm.lists_stream.remove_list_task.delay")
+ def test_notify_list_item(self, *_):
+ """Add list item notification"""
+ test_list = models.List.objects.create(user=self.local_user, name="hi")
+ list_item = models.ListItem.objects.create(
+ user=self.remote_user, book=self.book, book_list=test_list, order=2
+ )
+ notification = models.Notification.objects.get()
+ self.assertEqual(notification.related_users.count(), 1)
+ self.assertEqual(notification.related_users.first(), self.remote_user)
+ self.assertEqual(notification.related_list_items.count(), 1)
+ self.assertEqual(notification.related_list_items.first(), list_item)
+
+ models.ListItem.objects.create(
+ user=self.remote_user, book=self.another_book, book_list=test_list, order=3
+ )
+ notification = models.Notification.objects.get()
+ self.assertEqual(notification.related_users.count(), 1)
+ self.assertEqual(notification.related_users.first(), self.remote_user)
+ self.assertEqual(notification.related_list_items.count(), 2)
+
+ def test_unnotify(self):
+ """Remove a notification"""
+ models.Notification.notify(
+ self.local_user,
+ self.remote_user,
+ notification_type=models.Notification.FAVORITE,
+ )
+ self.assertTrue(models.Notification.objects.exists())
+
+ models.Notification.unnotify(
+ self.local_user,
+ self.remote_user,
+ notification_type=models.Notification.FAVORITE,
+ )
+ self.assertFalse(models.Notification.objects.exists())
+
+ def test_unnotify_multiple_users(self):
+ """Remove a notification"""
+ models.Notification.notify(
+ self.local_user,
+ self.remote_user,
+ notification_type=models.Notification.FAVORITE,
+ )
+ models.Notification.notify(
+ self.local_user,
+ self.another_user,
+ notification_type=models.Notification.FAVORITE,
+ )
+ self.assertTrue(models.Notification.objects.exists())
+
+ models.Notification.unnotify(
+ self.local_user,
+ self.remote_user,
+ notification_type=models.Notification.FAVORITE,
+ )
+ self.assertTrue(models.Notification.objects.exists())
+
+ models.Notification.unnotify(
+ self.local_user,
+ self.another_user,
+ notification_type=models.Notification.FAVORITE,
+ )
+ self.assertFalse(models.Notification.objects.exists())
diff --git a/bookwyrm/tests/models/test_status_model.py b/bookwyrm/tests/models/test_status_model.py
index 2f1e8670f..aae34b0a5 100644
--- a/bookwyrm/tests/models/test_status_model.py
+++ b/bookwyrm/tests/models/test_status_model.py
@@ -394,18 +394,6 @@ class Status(TestCase):
self.assertEqual(activity["type"], "Announce")
self.assertEqual(activity, boost.to_activity(pure=True))
- def test_notification(self, *_):
- """a simple model"""
- notification = models.Notification.objects.create(
- user=self.local_user, notification_type="FAVORITE"
- )
- self.assertFalse(notification.read)
-
- with self.assertRaises(IntegrityError):
- models.Notification.objects.create(
- user=self.local_user, notification_type="GLORB"
- )
-
# pylint: disable=unused-argument
def test_create_broadcast(self, one, two, broadcast_mock, *_):
"""should send out two verions of a status on create"""
diff --git a/bookwyrm/tests/templatetags/test_utilities.py b/bookwyrm/tests/templatetags/test_utilities.py
index 0136ca8cd..7738a51d9 100644
--- a/bookwyrm/tests/templatetags/test_utilities.py
+++ b/bookwyrm/tests/templatetags/test_utilities.py
@@ -1,4 +1,5 @@
""" style fixes and lookups for templates """
+from collections import namedtuple
import re
from unittest.mock import patch
@@ -61,3 +62,18 @@ class UtilitiesTags(TestCase):
self.assertEqual(utilities.get_title(self.book), "Test Book")
book = models.Edition.objects.create(title="Oh", subtitle="oh my")
self.assertEqual(utilities.get_title(book), "Oh: oh my")
+
+ def test_comparison_bool(self, *_):
+ """just a simple comparison"""
+ self.assertTrue(utilities.comparison_bool("a", "a"))
+ self.assertFalse(utilities.comparison_bool("a", "b"))
+
+ self.assertFalse(utilities.comparison_bool("a", "a", reverse=True))
+ self.assertTrue(utilities.comparison_bool("a", "b", reverse=True))
+
+ def test_truncatepath(self, *_):
+ """truncate a path"""
+ ValueMock = namedtuple("Value", ("name"))
+ value = ValueMock("home/one/two/three/four")
+ self.assertEqual(utilities.truncatepath(value, 2), "home/…ur")
+ self.assertEqual(utilities.truncatepath(value, "a"), "four")
diff --git a/bookwyrm/tests/test_sanitize_html.py b/bookwyrm/tests/test_sanitize_html.py
index 5814f2207..449acdafb 100644
--- a/bookwyrm/tests/test_sanitize_html.py
+++ b/bookwyrm/tests/test_sanitize_html.py
@@ -1,7 +1,7 @@
""" make sure only valid html gets to the app """
from django.test import TestCase
-from bookwyrm.sanitize_html import InputHtmlParser
+from bookwyrm.utils.sanitizer import clean
class Sanitizer(TestCase):
@@ -10,53 +10,39 @@ class Sanitizer(TestCase):
def test_no_html(self):
"""just text"""
input_text = "no html "
- parser = InputHtmlParser()
- parser.feed(input_text)
- output = parser.get_output()
+ output = clean(input_text)
self.assertEqual(input_text, output)
def test_valid_html(self):
"""leave the html untouched"""
input_text = "yes html "
- parser = InputHtmlParser()
- parser.feed(input_text)
- output = parser.get_output()
+ output = clean(input_text)
self.assertEqual(input_text, output)
def test_valid_html_attrs(self):
"""and don't remove useful attributes"""
input_text = 'yes html '
- parser = InputHtmlParser()
- parser.feed(input_text)
- output = parser.get_output()
+ output = clean(input_text)
self.assertEqual(input_text, output)
def test_valid_html_invalid_attrs(self):
"""do remove un-approved attributes"""
input_text = 'yes html '
- parser = InputHtmlParser()
- parser.feed(input_text)
- output = parser.get_output()
+ output = clean(input_text)
self.assertEqual(output, 'yes html ')
def test_invalid_html(self):
- """remove all html when the html is malformed"""
+ """don't allow malformed html"""
input_text = "yes html "
- parser = InputHtmlParser()
- parser.feed(input_text)
- output = parser.get_output()
- self.assertEqual("yes html", output)
+ output = clean(input_text)
+ self.assertEqual("yes html ", output)
input_text = "yes html "
- parser = InputHtmlParser()
- parser.feed(input_text)
- output = parser.get_output()
- self.assertEqual("yes html ", output)
+ output = clean(input_text)
+ self.assertEqual("yes html ", output)
def test_disallowed_html(self):
"""remove disallowed html but keep allowed html"""
input_text = " yes html
"
- parser = InputHtmlParser()
- parser.feed(input_text)
- output = parser.get_output()
+ output = clean(input_text)
self.assertEqual(" yes html ", output)
diff --git a/bookwyrm/tests/test_utils.py b/bookwyrm/tests/test_utils.py
new file mode 100644
index 000000000..183548975
--- /dev/null
+++ b/bookwyrm/tests/test_utils.py
@@ -0,0 +1,13 @@
+""" test searching for books """
+import re
+from django.test import TestCase
+
+from bookwyrm.utils import regex
+
+
+class TestUtils(TestCase):
+ """utility functions"""
+
+ def test_regex(self):
+ """Regexes used throughout the app"""
+ self.assertTrue(re.match(regex.DOMAIN, "xn--69aa8bzb.xn--y9a3aq"))
diff --git a/bookwyrm/tests/views/admin/test_automod.py b/bookwyrm/tests/views/admin/test_automod.py
index 1ed36caf5..95db4d52f 100644
--- a/bookwyrm/tests/views/admin/test_automod.py
+++ b/bookwyrm/tests/views/admin/test_automod.py
@@ -1,11 +1,14 @@
""" test for app action functionality """
from unittest.mock import patch
+from django.contrib.auth.models import Group
from django.template.response import TemplateResponse
from django.test import TestCase
from django.test.client import RequestFactory
+from django_celery_beat.models import PeriodicTask, IntervalSchedule
from bookwyrm import forms, models, views
+from bookwyrm.management.commands import initdb
from bookwyrm.tests.validate_html import validate_html
@@ -25,14 +28,52 @@ class AutomodViews(TestCase):
local=True,
localname="mouse",
)
+ initdb.init_groups()
+ initdb.init_permissions()
+ group = Group.objects.get(name="moderator")
+ self.local_user.groups.set([group])
models.SiteSettings.objects.create()
def test_automod_rules_get(self):
+ """there are so many views, this just makes sure it LOADS"""
+ schedule = IntervalSchedule.objects.create(every=1, period="days")
+ PeriodicTask.objects.create(
+ interval=schedule,
+ name="automod-task",
+ task="bookwyrm.models.antispam.automod_task",
+ )
+ models.AutoMod.objects.create(created_by=self.local_user, string_match="hello")
+ view = views.AutoMod.as_view()
+ request = self.factory.get("")
+ request.user = self.local_user
+
+ result = view(request)
+ self.assertIsInstance(result, TemplateResponse)
+ validate_html(result.render())
+ self.assertEqual(result.status_code, 200)
+
+ def test_automod_rules_get_empty_with_schedule(self):
+ """there are so many views, this just makes sure it LOADS"""
+ schedule = IntervalSchedule.objects.create(every=1, period="days")
+ PeriodicTask.objects.create(
+ interval=schedule,
+ name="automod-task",
+ task="bookwyrm.models.antispam.automod_task",
+ )
+ view = views.AutoMod.as_view()
+ request = self.factory.get("")
+ request.user = self.local_user
+
+ result = view(request)
+ self.assertIsInstance(result, TemplateResponse)
+ validate_html(result.render())
+ self.assertEqual(result.status_code, 200)
+
+ def test_automod_rules_get_empty_without_schedule(self):
"""there are so many views, this just makes sure it LOADS"""
view = views.AutoMod.as_view()
request = self.factory.get("")
request.user = self.local_user
- request.user.is_superuser = True
result = view(request)
self.assertIsInstance(result, TemplateResponse)
@@ -45,14 +86,33 @@ class AutomodViews(TestCase):
form.data["string_match"] = "hello"
form.data["flag_users"] = True
form.data["flag_statuses"] = False
- form.data["created_by"] = self.local_user
+ form.data["created_by"] = self.local_user.id
view = views.AutoMod.as_view()
request = self.factory.post("", form.data)
request.user = self.local_user
- request.user.is_superuser = True
result = view(request)
+
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
+
+ rule = models.AutoMod.objects.get()
+ self.assertTrue(rule.flag_users)
+ self.assertFalse(rule.flag_statuses)
+
+ def test_schedule_automod_task(self):
+ """Schedule the task"""
+ self.assertFalse(IntervalSchedule.objects.exists())
+
+ form = forms.IntervalScheduleForm()
+ form.data["every"] = 1
+ form.data["period"] = "days"
+ request = self.factory.post("", form.data)
+ request.user = self.local_user
+
+ response = views.schedule_automod_task(request)
+ self.assertEqual(response.status_code, 302)
+
+ self.assertTrue(IntervalSchedule.objects.exists())
diff --git a/bookwyrm/tests/views/admin/test_dashboard.py b/bookwyrm/tests/views/admin/test_dashboard.py
index d05772c25..c36e2918f 100644
--- a/bookwyrm/tests/views/admin/test_dashboard.py
+++ b/bookwyrm/tests/views/admin/test_dashboard.py
@@ -1,10 +1,13 @@
""" test for app action functionality """
from unittest.mock import patch
+
+from django.contrib.auth.models import Group
from django.template.response import TemplateResponse
from django.test import TestCase
from django.test.client import RequestFactory
from bookwyrm import models, views
+from bookwyrm.management.commands import initdb
from bookwyrm.tests.validate_html import validate_html
@@ -24,6 +27,10 @@ class DashboardViews(TestCase):
local=True,
localname="mouse",
)
+ initdb.init_groups()
+ initdb.init_permissions()
+ group = Group.objects.get(name="moderator")
+ self.local_user.groups.set([group])
models.SiteSettings.objects.create()
@@ -32,7 +39,7 @@ class DashboardViews(TestCase):
view = views.Dashboard.as_view()
request = self.factory.get("")
request.user = self.local_user
- request.user.is_superuser = True
+
result = view(request)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
diff --git a/bookwyrm/tests/views/admin/test_email_blocks.py b/bookwyrm/tests/views/admin/test_email_blocks.py
index 4fe9412e9..3c0f548e6 100644
--- a/bookwyrm/tests/views/admin/test_email_blocks.py
+++ b/bookwyrm/tests/views/admin/test_email_blocks.py
@@ -1,11 +1,13 @@
""" test for app action functionality """
from unittest.mock import patch
+from django.contrib.auth.models import Group
from django.template.response import TemplateResponse
from django.test import TestCase
from django.test.client import RequestFactory
from bookwyrm import models, views
+from bookwyrm.management.commands import initdb
from bookwyrm.tests.validate_html import validate_html
@@ -25,6 +27,10 @@ class EmailBlocklistViews(TestCase):
local=True,
localname="mouse",
)
+ initdb.init_groups()
+ initdb.init_permissions()
+ group = Group.objects.get(name="moderator")
+ self.local_user.groups.set([group])
models.SiteSettings.objects.create()
@@ -33,7 +39,6 @@ class EmailBlocklistViews(TestCase):
view = views.EmailBlocklist.as_view()
request = self.factory.get("")
request.user = self.local_user
- request.user.is_superuser = True
result = view(request)
@@ -46,7 +51,6 @@ class EmailBlocklistViews(TestCase):
view = views.EmailBlocklist.as_view()
request = self.factory.post("", {"domain": "gmail.com"})
request.user = self.local_user
- request.user.is_superuser = True
result = view(request)
@@ -65,7 +69,6 @@ class EmailBlocklistViews(TestCase):
view = views.EmailBlocklist.as_view()
request = self.factory.post("")
request.user = self.local_user
- request.user.is_superuser = True
result = view(request, domain_id=domain.id)
self.assertEqual(result.status_code, 302)
diff --git a/bookwyrm/tests/views/admin/test_federation.py b/bookwyrm/tests/views/admin/test_federation.py
index 340ed6052..33d7990b3 100644
--- a/bookwyrm/tests/views/admin/test_federation.py
+++ b/bookwyrm/tests/views/admin/test_federation.py
@@ -3,12 +3,14 @@ import os
import json
from unittest.mock import patch
+from django.contrib.auth.models import Group
from django.core.files.uploadedfile import SimpleUploadedFile
from django.template.response import TemplateResponse
from django.test import TestCase
from django.test.client import RequestFactory
from bookwyrm import forms, models, views
+from bookwyrm.management.commands import initdb
from bookwyrm.tests.validate_html import validate_html
@@ -38,6 +40,10 @@ class FederationViews(TestCase):
inbox="https://example.com/users/rat/inbox",
outbox="https://example.com/users/rat/outbox",
)
+ initdb.init_groups()
+ initdb.init_permissions()
+ group = Group.objects.get(name="moderator")
+ self.local_user.groups.set([group])
models.SiteSettings.objects.create()
@@ -46,7 +52,7 @@ class FederationViews(TestCase):
view = views.Federation.as_view()
request = self.factory.get("")
request.user = self.local_user
- request.user.is_superuser = True
+
result = view(request)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
@@ -58,7 +64,6 @@ class FederationViews(TestCase):
view = views.FederatedServer.as_view()
request = self.factory.get("")
request.user = self.local_user
- request.user.is_superuser = True
result = view(request, server.id)
self.assertIsInstance(result, TemplateResponse)
@@ -81,7 +86,6 @@ class FederationViews(TestCase):
view = views.block_server
request = self.factory.post("")
request.user = self.local_user
- request.user.is_superuser = True
with patch("bookwyrm.suggested_users.bulk_remove_instance_task.delay") as mock:
view(request, server.id)
@@ -121,7 +125,6 @@ class FederationViews(TestCase):
request = self.factory.post("")
request.user = self.local_user
- request.user.is_superuser = True
with patch("bookwyrm.suggested_users.bulk_add_instance_task.delay") as mock:
views.unblock_server(request, server.id)
@@ -147,7 +150,6 @@ class FederationViews(TestCase):
view = views.AddFederatedServer.as_view()
request = self.factory.get("")
request.user = self.local_user
- request.user.is_superuser = True
result = view(request)
self.assertIsInstance(result, TemplateResponse)
@@ -164,7 +166,6 @@ class FederationViews(TestCase):
view = views.AddFederatedServer.as_view()
request = self.factory.post("", form.data)
request.user = self.local_user
- request.user.is_superuser = True
view(request)
server = models.FederatedServer.objects.get()
@@ -196,7 +197,6 @@ class FederationViews(TestCase):
},
)
request.user = self.local_user
- request.user.is_superuser = True
view(request)
server.refresh_from_db()
diff --git a/bookwyrm/tests/views/admin/test_ip_blocklist.py b/bookwyrm/tests/views/admin/test_ip_blocklist.py
index af63ffaf3..a15a4d368 100644
--- a/bookwyrm/tests/views/admin/test_ip_blocklist.py
+++ b/bookwyrm/tests/views/admin/test_ip_blocklist.py
@@ -1,10 +1,13 @@
""" test for app action functionality """
from unittest.mock import patch
+
+from django.contrib.auth.models import Group
from django.template.response import TemplateResponse
from django.test import TestCase
from django.test.client import RequestFactory
from bookwyrm import forms, models, views
+from bookwyrm.management.commands import initdb
from bookwyrm.tests.validate_html import validate_html
@@ -24,6 +27,10 @@ class IPBlocklistViews(TestCase):
local=True,
localname="mouse",
)
+ initdb.init_groups()
+ initdb.init_permissions()
+ group = Group.objects.get(name="moderator")
+ self.local_user.groups.set([group])
models.SiteSettings.objects.create()
@@ -32,7 +39,6 @@ class IPBlocklistViews(TestCase):
view = views.IPBlocklist.as_view()
request = self.factory.get("")
request.user = self.local_user
- request.user.is_superuser = True
result = view(request)
@@ -48,7 +54,6 @@ class IPBlocklistViews(TestCase):
request = self.factory.post("", form.data)
request.user = self.local_user
- request.user.is_superuser = True
result = view(request)
@@ -67,7 +72,6 @@ class IPBlocklistViews(TestCase):
request = self.factory.post("")
request.user = self.local_user
- request.user.is_superuser = True
view(request, block.id)
self.assertFalse(models.IPBlocklist.objects.exists())
diff --git a/bookwyrm/tests/views/admin/test_link_domains.py b/bookwyrm/tests/views/admin/test_link_domains.py
index 5d440dc50..5b2b8e025 100644
--- a/bookwyrm/tests/views/admin/test_link_domains.py
+++ b/bookwyrm/tests/views/admin/test_link_domains.py
@@ -1,11 +1,13 @@
""" test for app action functionality """
from unittest.mock import patch
+from django.contrib.auth.models import Group
from django.template.response import TemplateResponse
from django.test import TestCase
from django.test.client import RequestFactory
from bookwyrm import models, views
+from bookwyrm.management.commands import initdb
from bookwyrm.tests.validate_html import validate_html
@@ -25,6 +27,11 @@ class LinkDomainViews(TestCase):
local=True,
localname="mouse",
)
+ initdb.init_groups()
+ initdb.init_permissions()
+ group = Group.objects.get(name="moderator")
+ self.local_user.groups.set([group])
+
self.book = models.Edition.objects.create(title="hello")
models.FileLink.objects.create(
book=self.book,
@@ -39,7 +46,6 @@ class LinkDomainViews(TestCase):
view = views.LinkDomain.as_view()
request = self.factory.get("")
request.user = self.local_user
- request.user.is_superuser = True
result = view(request, "pending")
@@ -55,7 +61,6 @@ class LinkDomainViews(TestCase):
view = views.LinkDomain.as_view()
request = self.factory.post("", {"name": "ugh"})
request.user = self.local_user
- request.user.is_superuser = True
result = view(request, "pending", domain.id)
self.assertEqual(result.status_code, 302)
@@ -71,7 +76,6 @@ class LinkDomainViews(TestCase):
view = views.update_domain_status
request = self.factory.post("")
request.user = self.local_user
- request.user.is_superuser = True
result = view(request, domain.id, "approved")
self.assertEqual(result.status_code, 302)
diff --git a/bookwyrm/tests/views/admin/test_reports.py b/bookwyrm/tests/views/admin/test_reports.py
index d0875f2c2..e93b34341 100644
--- a/bookwyrm/tests/views/admin/test_reports.py
+++ b/bookwyrm/tests/views/admin/test_reports.py
@@ -2,11 +2,13 @@
import json
from unittest.mock import patch
+from django.contrib.auth.models import Group
from django.template.response import TemplateResponse
from django.test import TestCase
from django.test.client import RequestFactory
-from bookwyrm import forms, models, views
+from bookwyrm import models, views
+from bookwyrm.management.commands import initdb
from bookwyrm.tests.validate_html import validate_html
@@ -33,6 +35,10 @@ class ReportViews(TestCase):
local=True,
localname="rat",
)
+ initdb.init_groups()
+ initdb.init_permissions()
+ group = Group.objects.get(name="moderator")
+ self.local_user.groups.set([group])
models.SiteSettings.objects.create()
def test_reports_page(self):
@@ -40,7 +46,6 @@ class ReportViews(TestCase):
view = views.ReportsAdmin.as_view()
request = self.factory.get("")
request.user = self.local_user
- request.user.is_superuser = True
result = view(request)
self.assertIsInstance(result, TemplateResponse)
@@ -52,7 +57,6 @@ class ReportViews(TestCase):
view = views.ReportsAdmin.as_view()
request = self.factory.get("")
request.user = self.local_user
- request.user.is_superuser = True
models.Report.objects.create(reporter=self.local_user, user=self.rat)
result = view(request)
@@ -65,7 +69,6 @@ class ReportViews(TestCase):
view = views.ReportAdmin.as_view()
request = self.factory.get("")
request.user = self.local_user
- request.user.is_superuser = True
report = models.Report.objects.create(reporter=self.local_user, user=self.rat)
result = view(request, report.id)
@@ -79,7 +82,6 @@ class ReportViews(TestCase):
view = views.ReportAdmin.as_view()
request = self.factory.post("", {"note": "hi"})
request.user = self.local_user
- request.user.is_superuser = True
report = models.Report.objects.create(reporter=self.local_user, user=self.rat)
view(request, report.id)
@@ -89,59 +91,12 @@ class ReportViews(TestCase):
self.assertEqual(comment.note, "hi")
self.assertEqual(comment.report, report)
- def test_report_modal_view(self):
- """a user reports another user"""
- request = self.factory.get("")
- request.user = self.local_user
- result = views.Report.as_view()(request, self.local_user.id)
-
- validate_html(result.render())
-
- def test_make_report(self):
- """a user reports another user"""
- form = forms.ReportForm()
- form.data["reporter"] = self.local_user.id
- form.data["user"] = self.rat.id
- request = self.factory.post("", form.data)
- request.user = self.local_user
-
- views.Report.as_view()(request)
-
- report = models.Report.objects.get()
- self.assertEqual(report.reporter, self.local_user)
- self.assertEqual(report.user, self.rat)
-
- def test_report_link(self):
- """a user reports a link as spam"""
- book = models.Edition.objects.create(title="hi")
- link = models.FileLink.objects.create(
- book=book, added_by=self.local_user, url="https://skdjfs.sdf"
- )
- domain = link.domain
- domain.status = "approved"
- domain.save()
-
- form = forms.ReportForm()
- form.data["reporter"] = self.local_user.id
- form.data["user"] = self.rat.id
- form.data["links"] = link.id
- request = self.factory.post("", form.data)
- request.user = self.local_user
-
- views.Report.as_view()(request)
-
- report = models.Report.objects.get()
- domain.refresh_from_db()
- self.assertEqual(report.links.first().id, link.id)
- self.assertEqual(domain.status, "pending")
-
def test_resolve_report(self):
"""toggle report resolution status"""
report = models.Report.objects.create(reporter=self.local_user, user=self.rat)
self.assertFalse(report.resolved)
request = self.factory.post("")
request.user = self.local_user
- request.user.is_superuser = True
# resolve
views.resolve_report(request, report.id)
@@ -161,7 +116,6 @@ class ReportViews(TestCase):
self.assertTrue(self.rat.is_active)
request = self.factory.post("")
request.user = self.local_user
- request.user.is_superuser = True
# de-activate
views.suspend_user(request, self.rat.id)
@@ -180,7 +134,6 @@ class ReportViews(TestCase):
self.assertTrue(self.rat.is_active)
request = self.factory.post("", {"password": "password"})
request.user = self.local_user
- request.user.is_superuser = True
# de-activate
with patch(
diff --git a/bookwyrm/tests/views/admin/test_site.py b/bookwyrm/tests/views/admin/test_site.py
new file mode 100644
index 000000000..85f785027
--- /dev/null
+++ b/bookwyrm/tests/views/admin/test_site.py
@@ -0,0 +1,85 @@
+""" test for app action functionality """
+from unittest.mock import patch
+
+from django.contrib.auth.models import Group
+from django.template.response import TemplateResponse
+from django.test import TestCase
+from django.test.client import RequestFactory
+
+from bookwyrm import forms, models, views
+from bookwyrm.management.commands import initdb
+from bookwyrm.tests.validate_html import validate_html
+
+
+class SiteSettingsViews(TestCase):
+ """Edit site settings"""
+
+ def setUp(self):
+ """we need basic test data and mocks"""
+ self.factory = RequestFactory()
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch(
+ "bookwyrm.activitystreams.populate_stream_task.delay"
+ ), patch("bookwyrm.lists_stream.populate_lists_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@local.com",
+ "mouse@mouse.mouse",
+ "password",
+ local=True,
+ localname="mouse",
+ )
+ initdb.init_groups()
+ initdb.init_permissions()
+ group = Group.objects.get(name="admin")
+ self.local_user.groups.set([group])
+
+ self.site = models.SiteSettings.objects.create()
+
+ def test_site_get(self):
+ """there are so many views, this just makes sure it LOADS"""
+ view = views.Site.as_view()
+ request = self.factory.get("")
+ request.user = self.local_user
+
+ result = view(request)
+ self.assertIsInstance(result, TemplateResponse)
+ validate_html(result.render())
+ self.assertEqual(result.status_code, 200)
+
+ def test_site_post(self):
+ """there are so many views, this just makes sure it LOADS"""
+ view = views.Site.as_view()
+ form = forms.SiteForm()
+ form.data["name"] = "Name!"
+ form.data["instance_tagline"] = "hi"
+ form.data["instance_description"] = "blah"
+ form.data["registration_closed_text"] = "blah"
+ form.data["invite_request_text"] = "blah"
+ form.data["code_of_conduct"] = "blah"
+ form.data["privacy_policy"] = "blah"
+ request = self.factory.post("", form.data)
+ request.user = self.local_user
+
+ result = view(request)
+
+ self.assertIsInstance(result, TemplateResponse)
+ validate_html(result.render())
+ self.assertEqual(result.status_code, 200)
+
+ site = models.SiteSettings.objects.get()
+ self.assertEqual(site.name, "Name!")
+
+ def test_site_post_invalid(self):
+ """there are so many views, this just makes sure it LOADS"""
+ view = views.Site.as_view()
+ form = forms.SiteForm()
+ request = self.factory.post("", form.data)
+ request.user = self.local_user
+
+ result = view(request)
+
+ self.assertIsInstance(result, TemplateResponse)
+ validate_html(result.render())
+ self.assertEqual(result.status_code, 200)
+
+ self.site.refresh_from_db()
+ self.assertEqual(self.site.name, "BookWyrm")
diff --git a/bookwyrm/tests/views/admin/test_user_admin.py b/bookwyrm/tests/views/admin/test_user_admin.py
index 4cb3702d8..3f480d990 100644
--- a/bookwyrm/tests/views/admin/test_user_admin.py
+++ b/bookwyrm/tests/views/admin/test_user_admin.py
@@ -7,6 +7,7 @@ from django.test import TestCase
from django.test.client import RequestFactory
from bookwyrm import models, views
+from bookwyrm.management.commands import initdb
from bookwyrm.tests.validate_html import validate_html
@@ -26,6 +27,10 @@ class UserAdminViews(TestCase):
local=True,
localname="mouse",
)
+ initdb.init_groups()
+ initdb.init_permissions()
+ group = Group.objects.get(name="moderator")
+ self.local_user.groups.set([group])
models.SiteSettings.objects.create()
def test_user_admin_list_page(self):
@@ -33,7 +38,7 @@ class UserAdminViews(TestCase):
view = views.UserAdminList.as_view()
request = self.factory.get("")
request.user = self.local_user
- request.user.is_superuser = True
+
result = view(request)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
@@ -44,7 +49,6 @@ class UserAdminViews(TestCase):
view = views.UserAdmin.as_view()
request = self.factory.get("")
request.user = self.local_user
- request.user.is_superuser = True
result = view(request, self.local_user.id)
@@ -57,15 +61,14 @@ class UserAdminViews(TestCase):
@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")
+ group = Group.objects.get(name="editor")
self.assertEqual(
- list(self.local_user.groups.values_list("name", flat=True)), []
+ list(self.local_user.groups.values_list("name", flat=True)), ["moderator"]
)
view = views.UserAdmin.as_view()
request = self.factory.post("", {"groups": [group.id]})
request.user = self.local_user
- request.user.is_superuser = True
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
result = view(request, self.local_user.id)
diff --git a/bookwyrm/tests/views/books/test_edit_book.py b/bookwyrm/tests/views/books/test_edit_book.py
index c7869807b..1ac8336d8 100644
--- a/bookwyrm/tests/views/books/test_edit_book.py
+++ b/bookwyrm/tests/views/books/test_edit_book.py
@@ -48,7 +48,7 @@ class EditBookViews(TestCase):
models.SiteSettings.objects.create()
- def test_edit_book_page(self):
+ def test_edit_book_get(self):
"""there are so many views, this just makes sure it LOADS"""
view = views.EditBook.as_view()
request = self.factory.get("")
@@ -59,18 +59,7 @@ class EditBookViews(TestCase):
validate_html(result.render())
self.assertEqual(result.status_code, 200)
- def test_edit_book_create_page(self):
- """there are so many views, this just makes sure it LOADS"""
- view = views.CreateBook.as_view()
- request = self.factory.get("")
- request.user = self.local_user
- request.user.is_superuser = True
- result = view(request)
- self.assertIsInstance(result, TemplateResponse)
- validate_html(result.render())
- self.assertEqual(result.status_code, 200)
-
- def test_edit_book(self):
+ def test_edit_book_post(self):
"""lets a user edit a book"""
view = views.EditBook.as_view()
self.local_user.groups.add(self.group)
@@ -86,6 +75,23 @@ class EditBookViews(TestCase):
self.book.refresh_from_db()
self.assertEqual(self.book.title, "New Title")
+ def test_edit_book_post_invalid(self):
+ """book form is invalid"""
+ view = views.EditBook.as_view()
+ self.local_user.groups.add(self.group)
+ form = forms.EditionForm(instance=self.book)
+ form.data["title"] = ""
+ form.data["last_edited_by"] = self.local_user.id
+ request = self.factory.post("", form.data)
+ request.user = self.local_user
+
+ result = view(request, self.book.id)
+ validate_html(result.render())
+ self.assertEqual(result.status_code, 200)
+ # Title is unchanged
+ self.book.refresh_from_db()
+ self.assertEqual(self.book.title, "Example Edition")
+
def test_edit_book_add_author(self):
"""lets a user edit a book with new authors"""
view = views.EditBook.as_view()
@@ -234,3 +240,49 @@ class EditBookViews(TestCase):
self.assertEqual(len(result["author_matches"]), 2)
self.assertEqual(result["author_matches"][0]["name"], "Sappho")
self.assertEqual(result["author_matches"][1]["name"], "Some Guy")
+
+ def test_create_book_get(self):
+ """there are so many views, this just makes sure it LOADS"""
+ view = views.CreateBook.as_view()
+ request = self.factory.get("")
+ request.user = self.local_user
+ request.user.is_superuser = True
+ result = view(request)
+ self.assertIsInstance(result, TemplateResponse)
+ validate_html(result.render())
+ self.assertEqual(result.status_code, 200)
+
+ def test_create_book_post_existing_work(self):
+ """Adding an edition to an existing work"""
+ author = models.Author.objects.create(name="Sappho")
+ view = views.CreateBook.as_view()
+ form = forms.EditionForm()
+ form.data["title"] = "A Title"
+ form.data["parent_work"] = self.work.id
+ form.data["authors"] = [author.id]
+ form.data["last_edited_by"] = self.local_user.id
+ request = self.factory.post("", form.data)
+ request.user = self.local_user
+ request.user.is_superuser = True
+
+ with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
+ result = view(request)
+ self.assertEqual(result.status_code, 302)
+
+ new_edition = models.Edition.objects.get(title="A Title")
+ self.assertEqual(new_edition.parent_work, self.work)
+ self.assertEqual(new_edition.authors.first(), author)
+
+ def test_create_book_post_invalid(self):
+ """book form is invalid"""
+ view = views.CreateBook.as_view()
+ self.local_user.groups.add(self.group)
+ form = forms.EditionForm(instance=self.book)
+ form.data["title"] = ""
+ form.data["last_edited_by"] = self.local_user.id
+ request = self.factory.post("", form.data)
+ request.user = self.local_user
+
+ result = view(request)
+ validate_html(result.render())
+ self.assertEqual(result.status_code, 200)
diff --git a/bookwyrm/tests/views/test_group.py b/bookwyrm/tests/views/test_group.py
index e43b040ac..b0a0c925a 100644
--- a/bookwyrm/tests/views/test_group.py
+++ b/bookwyrm/tests/views/test_group.py
@@ -257,6 +257,29 @@ class GroupViews(TestCase):
self.assertEqual(notification.related_group, self.testgroup)
self.assertEqual(notification.notification_type, "REMOVE")
+ def test_remove_member_remove_self(self, _):
+ """Leave a group"""
+ models.GroupMember.objects.create(
+ user=self.rat,
+ group=self.testgroup,
+ )
+ request = self.factory.post(
+ "",
+ {
+ "group": self.testgroup.id,
+ "user": self.rat.localname,
+ },
+ )
+ request.user = self.rat
+ result = views.remove_member(request)
+ self.assertEqual(result.status_code, 302)
+ self.assertEqual(models.GroupMember.objects.count(), 1)
+ self.assertEqual(models.GroupMember.objects.first().user, self.local_user)
+ notification = models.Notification.objects.get()
+ self.assertEqual(notification.user, self.local_user)
+ self.assertEqual(notification.related_group, self.testgroup)
+ self.assertEqual(notification.notification_type, "LEAVE")
+
def test_accept_membership(self, _):
"""accept an invite"""
models.GroupMemberInvitation.objects.create(
diff --git a/bookwyrm/tests/views/test_helpers.py b/bookwyrm/tests/views/test_helpers.py
index a092a4c9a..ce1f6a735 100644
--- a/bookwyrm/tests/views/test_helpers.py
+++ b/bookwyrm/tests/views/test_helpers.py
@@ -112,7 +112,17 @@ 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_handle_remote_webfinger_invalid(self, *_):
+ """Various ways you can send a bad query"""
+ # if there's no query, there's no result
+ result = views.helpers.handle_remote_webfinger(None)
+ self.assertIsNone(result)
+
+ # malformed user
+ result = views.helpers.handle_remote_webfinger("noatsymbol")
+ self.assertIsNone(result)
+
+ def test_handle_remote_webfinger_existing_user(self, *_):
"""simple database lookup by username"""
result = views.helpers.handle_remote_webfinger("@mouse@local.com")
self.assertEqual(result, self.local_user)
@@ -124,7 +134,19 @@ class ViewsHelpers(TestCase):
self.assertEqual(result, self.local_user)
@responses.activate
- def test_load_user(self, *_):
+ def test_handle_remote_webfinger_load_user_invalid_result(self, *_):
+ """find a remote user using webfinger, but fail"""
+ username = "mouse@example.com"
+ responses.add(
+ responses.GET,
+ f"https://example.com/.well-known/webfinger?resource=acct:{username}",
+ status=500,
+ )
+ result = views.helpers.handle_remote_webfinger("@mouse@example.com")
+ self.assertIsNone(result)
+
+ @responses.activate
+ def test_handle_remote_webfinger_load_user(self, *_):
"""find a remote user using webfinger"""
username = "mouse@example.com"
wellknown = {
@@ -154,7 +176,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_handler_remote_webfinger_user_on_blocked_server(self, *_):
"""find a remote user using webfinger"""
models.FederatedServer.objects.create(
server_name="example.com", status="blocked"
@@ -163,6 +185,38 @@ class ViewsHelpers(TestCase):
result = views.helpers.handle_remote_webfinger("@mouse@example.com")
self.assertIsNone(result)
+ @responses.activate
+ def test_subscribe_remote_webfinger(self, *_):
+ """remote subscribe templates"""
+ query = "mouse@example.com"
+ response = {
+ "subject": f"acct:{query}",
+ "links": [
+ {
+ "rel": "self",
+ "type": "application/activity+json",
+ "href": "https://example.com/user/mouse",
+ "template": "hi",
+ },
+ {
+ "rel": "http://ostatus.org/schema/1.0/subscribe",
+ "type": "application/activity+json",
+ "href": "https://example.com/user/mouse",
+ "template": "hello",
+ },
+ ],
+ }
+ responses.add(
+ responses.GET,
+ f"https://example.com/.well-known/webfinger?resource=acct:{query}",
+ json=response,
+ status=200,
+ )
+ template = views.helpers.subscribe_remote_webfinger(query)
+ self.assertEqual(template, "hello")
+ template = views.helpers.subscribe_remote_webfinger(f"@{query}")
+ self.assertEqual(template, "hello")
+
def test_handle_reading_status_to_read(self, *_):
"""posts shelve activities"""
shelf = self.local_user.shelf_set.get(identifier="to-read")
diff --git a/bookwyrm/tests/views/test_interaction.py b/bookwyrm/tests/views/test_interaction.py
index 1d729f9a5..74878df7d 100644
--- a/bookwyrm/tests/views/test_interaction.py
+++ b/bookwyrm/tests/views/test_interaction.py
@@ -60,7 +60,7 @@ class InteractionViews(TestCase):
notification = models.Notification.objects.get()
self.assertEqual(notification.notification_type, "FAVORITE")
self.assertEqual(notification.user, self.local_user)
- self.assertEqual(notification.related_user, self.remote_user)
+ self.assertEqual(notification.related_users.first(), self.remote_user)
def test_unfavorite(self, *_):
"""unfav a status"""
@@ -98,7 +98,7 @@ class InteractionViews(TestCase):
notification = models.Notification.objects.get()
self.assertEqual(notification.notification_type, "BOOST")
self.assertEqual(notification.user, self.local_user)
- self.assertEqual(notification.related_user, self.remote_user)
+ self.assertEqual(notification.related_users.first(), self.remote_user)
self.assertEqual(notification.related_status, status)
def test_self_boost(self, *_):
diff --git a/bookwyrm/tests/views/test_notifications.py b/bookwyrm/tests/views/test_notifications.py
index 2a5cf7984..8e5dfa2b5 100644
--- a/bookwyrm/tests/views/test_notifications.py
+++ b/bookwyrm/tests/views/test_notifications.py
@@ -25,10 +25,12 @@ class NotificationViews(TestCase):
local=True,
localname="mouse",
)
+ self.another_user = models.User.objects.create_user(
+ "rat", "rat@rat.rat", "ratword", local=True, localname="rat"
+ )
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"):
self.status = models.Status.objects.create(
- content="hi",
- user=self.local_user,
+ content="hi", user=self.local_user
)
models.SiteSettings.objects.create()
@@ -42,27 +44,31 @@ class NotificationViews(TestCase):
validate_html(result.render())
self.assertEqual(result.status_code, 200)
- def test_notifications_page_notifications(self):
+ def test_notifications_page_status_notifications(self):
"""there are so many views, this just makes sure it LOADS"""
- models.Notification.objects.create(
- user=self.local_user,
+ models.Notification.notify(
+ self.local_user,
+ self.another_user,
notification_type="FAVORITE",
related_status=self.status,
)
- models.Notification.objects.create(
- user=self.local_user,
+ models.Notification.notify(
+ self.local_user,
+ self.another_user,
notification_type="BOOST",
related_status=self.status,
)
- models.Notification.objects.create(
- user=self.local_user,
+ models.Notification.notify(
+ self.local_user,
+ self.another_user,
notification_type="MENTION",
related_status=self.status,
)
self.status.reply_parent = self.status
self.status.save(broadcast=False)
- models.Notification.objects.create(
- user=self.local_user,
+ models.Notification.notify(
+ self.local_user,
+ self.another_user,
notification_type="REPLY",
related_status=self.status,
)
@@ -74,6 +80,200 @@ class NotificationViews(TestCase):
validate_html(result.render())
self.assertEqual(result.status_code, 200)
+ def test_notifications_page_follow_request(self):
+ """import completed notification"""
+ models.Notification.notify(
+ self.local_user,
+ self.another_user,
+ notification_type="FOLLOW_REQUEST",
+ )
+ view = views.Notifications.as_view()
+ request = self.factory.get("")
+ request.user = self.local_user
+ result = view(request)
+ self.assertIsInstance(result, TemplateResponse)
+ validate_html(result.render())
+
+ def test_notifications_page_follows(self):
+ """import completed notification"""
+ models.Notification.notify(
+ self.local_user,
+ self.another_user,
+ notification_type="FOLLOW",
+ )
+ view = views.Notifications.as_view()
+ request = self.factory.get("")
+ request.user = self.local_user
+ result = view(request)
+ self.assertIsInstance(result, TemplateResponse)
+ validate_html(result.render())
+
+ def test_notifications_page_report(self):
+ """import completed notification"""
+ report = models.Report.objects.create(
+ user=self.another_user,
+ reporter=self.local_user,
+ )
+ notification = models.Notification.objects.create(
+ user=self.local_user,
+ notification_type="REPORT",
+ )
+ notification.related_reports.add(report)
+
+ view = views.Notifications.as_view()
+ request = self.factory.get("")
+ request.user = self.local_user
+ result = view(request)
+ self.assertIsInstance(result, TemplateResponse)
+ validate_html(result.render())
+
+ def test_notifications_page_import(self):
+ """import completed notification"""
+ import_job = models.ImportJob.objects.create(user=self.local_user, mappings={})
+ models.Notification.objects.create(
+ user=self.local_user, notification_type="IMPORT", related_import=import_job
+ )
+ view = views.Notifications.as_view()
+ request = self.factory.get("")
+ request.user = self.local_user
+ result = view(request)
+ self.assertIsInstance(result, TemplateResponse)
+ validate_html(result.render())
+ self.assertEqual(result.status_code, 200)
+
+ def test_notifications_page_list(self):
+ """Adding books to lists"""
+ book = models.Edition.objects.create(title="shape")
+ with patch(
+ "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"
+ ), patch("bookwyrm.lists_stream.remove_list_task.delay"):
+ book_list = models.List.objects.create(user=self.local_user, name="hi")
+ item = models.ListItem.objects.create(
+ book=book, user=self.another_user, book_list=book_list, order=1
+ )
+ models.Notification.notify_list_item(self.local_user, item)
+ view = views.Notifications.as_view()
+ request = self.factory.get("")
+ request.user = self.local_user
+ result = view(request)
+ self.assertIsInstance(result, TemplateResponse)
+ validate_html(result.render())
+ self.assertEqual(result.status_code, 200)
+
+ def test_notifications_page_group_invite(self):
+ """group related notifications"""
+ group = models.Group.objects.create(user=self.another_user, name="group")
+ models.Notification.notify(
+ self.local_user,
+ self.another_user,
+ notification_type="INVITE",
+ related_group=group,
+ )
+ view = views.Notifications.as_view()
+ request = self.factory.get("")
+ request.user = self.local_user
+ result = view(request)
+ self.assertIsInstance(result, TemplateResponse)
+ validate_html(result.render())
+ self.assertEqual(result.status_code, 200)
+
+ def test_notifications_page_group_accept(self):
+ """group related notifications"""
+ group = models.Group.objects.create(user=self.another_user, name="group")
+ models.Notification.notify(
+ self.local_user,
+ self.another_user,
+ notification_type="ACCEPT",
+ related_group=group,
+ )
+ view = views.Notifications.as_view()
+ request = self.factory.get("")
+ request.user = self.local_user
+ result = view(request)
+ self.assertIsInstance(result, TemplateResponse)
+ validate_html(result.render())
+ self.assertEqual(result.status_code, 200)
+
+ def test_notifications_page_group_join(self):
+ """group related notifications"""
+ group = models.Group.objects.create(user=self.another_user, name="group")
+ models.Notification.notify(
+ self.local_user,
+ self.another_user,
+ notification_type="JOIN",
+ related_group=group,
+ )
+ view = views.Notifications.as_view()
+ request = self.factory.get("")
+ request.user = self.local_user
+ result = view(request)
+ self.assertIsInstance(result, TemplateResponse)
+ validate_html(result.render())
+ self.assertEqual(result.status_code, 200)
+
+ def test_notifications_page_group_leave(self):
+ """group related notifications"""
+ group = models.Group.objects.create(user=self.another_user, name="group")
+ models.Notification.notify(
+ self.local_user,
+ self.another_user,
+ notification_type="LEAVE",
+ related_group=group,
+ )
+ view = views.Notifications.as_view()
+ request = self.factory.get("")
+ request.user = self.local_user
+ result = view(request)
+ self.assertIsInstance(result, TemplateResponse)
+ validate_html(result.render())
+ self.assertEqual(result.status_code, 200)
+
+ def test_notifications_page_group_remove(self):
+ """group related notifications"""
+ group = models.Group.objects.create(user=self.another_user, name="group")
+ models.Notification.notify(
+ self.local_user,
+ self.another_user,
+ notification_type="REMOVE",
+ related_group=group,
+ )
+ view = views.Notifications.as_view()
+ request = self.factory.get("")
+ request.user = self.local_user
+ result = view(request)
+ self.assertIsInstance(result, TemplateResponse)
+ validate_html(result.render())
+ self.assertEqual(result.status_code, 200)
+
+ def test_notifications_page_group_changes(self):
+ """group related notifications"""
+ group = models.Group.objects.create(user=self.another_user, name="group")
+ models.Notification.notify(
+ self.local_user,
+ self.another_user,
+ notification_type="GROUP_PRIVACY",
+ related_group=group,
+ )
+ models.Notification.notify(
+ self.local_user,
+ self.another_user,
+ notification_type="GROUP_NAME",
+ related_group=group,
+ )
+ models.Notification.notify(
+ self.local_user,
+ self.another_user,
+ notification_type="GROUP_DESCRIPTION",
+ related_group=group,
+ )
+ view = views.Notifications.as_view()
+ request = self.factory.get("")
+ request.user = self.local_user
+ result = view(request)
+ self.assertIsInstance(result, TemplateResponse)
+ validate_html(result.render())
+ self.assertEqual(result.status_code, 200)
+
def test_clear_notifications(self):
"""erase notifications"""
models.Notification.objects.create(
diff --git a/bookwyrm/tests/views/test_report.py b/bookwyrm/tests/views/test_report.py
new file mode 100644
index 000000000..85dca8aea
--- /dev/null
+++ b/bookwyrm/tests/views/test_report.py
@@ -0,0 +1,109 @@
+""" test for app action functionality """
+from unittest.mock import patch
+
+from django.test import TestCase
+from django.test.client import RequestFactory
+
+from bookwyrm import forms, models, views
+from bookwyrm.tests.validate_html import validate_html
+
+
+class ReportViews(TestCase):
+ """every response to a get request, html or json"""
+
+ def setUp(self):
+ """we need basic test data and mocks"""
+ self.factory = RequestFactory()
+ with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch(
+ "bookwyrm.activitystreams.populate_stream_task.delay"
+ ), patch("bookwyrm.lists_stream.populate_lists_task.delay"):
+ self.local_user = models.User.objects.create_user(
+ "mouse@local.com",
+ "mouse@mouse.mouse",
+ "password",
+ local=True,
+ localname="mouse",
+ )
+ self.rat = models.User.objects.create_user(
+ "rat@local.com",
+ "rat@mouse.mouse",
+ "password",
+ local=True,
+ localname="rat",
+ )
+ with patch(
+ "bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"
+ ), patch("bookwyrm.activitystreams.add_status_task.delay"):
+ self.status = models.Status.objects.create(
+ user=self.local_user,
+ content="Test status",
+ )
+ models.SiteSettings.objects.create()
+
+ def test_report_modal_view(self):
+ """a user reports another user"""
+ request = self.factory.get("")
+ request.user = self.local_user
+ result = views.Report.as_view()(request, self.local_user.id)
+
+ validate_html(result.render())
+
+ def test_report_modal_view_with_status(self):
+ """a user reports another user"""
+ request = self.factory.get("")
+ request.user = self.local_user
+ result = views.Report.as_view()(
+ request, user_id=self.local_user.id, status_id=self.status.id
+ )
+
+ validate_html(result.render())
+
+ def test_report_modal_view_with_link_domain(self):
+ """a user reports another user"""
+ link = models.Link.objects.create(
+ url="http://example.com/hi",
+ added_by=self.local_user,
+ )
+ request = self.factory.get("")
+ request.user = self.local_user
+ result = views.Report.as_view()(request, link_id=link.id)
+
+ validate_html(result.render())
+
+ def test_make_report(self):
+ """a user reports another user"""
+ form = forms.ReportForm()
+ form.data["reporter"] = self.local_user.id
+ form.data["user"] = self.rat.id
+ request = self.factory.post("", form.data)
+ request.user = self.local_user
+
+ views.Report.as_view()(request)
+
+ report = models.Report.objects.get()
+ self.assertEqual(report.reporter, self.local_user)
+ self.assertEqual(report.user, self.rat)
+
+ def test_report_link(self):
+ """a user reports a link as spam"""
+ book = models.Edition.objects.create(title="hi")
+ link = models.FileLink.objects.create(
+ book=book, added_by=self.local_user, url="https://skdjfs.sdf"
+ )
+ domain = link.domain
+ domain.status = "approved"
+ domain.save()
+
+ form = forms.ReportForm()
+ form.data["reporter"] = self.local_user.id
+ form.data["user"] = self.rat.id
+ form.data["links"] = link.id
+ request = self.factory.post("", form.data)
+ request.user = self.local_user
+
+ views.Report.as_view()(request)
+
+ report = models.Report.objects.get()
+ domain.refresh_from_db()
+ self.assertEqual(report.links.first().id, link.id)
+ self.assertEqual(domain.status, "pending")
diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py
index 9287c3705..ee5ed05db 100644
--- a/bookwyrm/urls.py
+++ b/bookwyrm/urls.py
@@ -126,7 +126,7 @@ urlpatterns = [
r"^settings/users/?$", views.UserAdminList.as_view(), name="settings-users"
),
re_path(
- r"^settings/users/(?P(local|federated))\/?$",
+ r"^settings/users/(?P(local|federated|deleted))\/?$",
views.UserAdminList.as_view(),
name="settings-users",
),
@@ -287,7 +287,7 @@ urlpatterns = [
name="report-status",
),
re_path(
- r"^report/(?P\d+)/link/(?P\d+)?$",
+ r"^report/link/(?P\d+)?$",
views.Report.as_view(),
name="report-link",
),
diff --git a/bookwyrm/utils/sanitizer.py b/bookwyrm/utils/sanitizer.py
new file mode 100644
index 000000000..f6c87358c
--- /dev/null
+++ b/bookwyrm/utils/sanitizer.py
@@ -0,0 +1,26 @@
+"""Clean user-provided text"""
+import bleach
+
+
+def clean(input_text):
+ """Run through "bleach" """
+ return bleach.clean(
+ input_text,
+ tags=[
+ "p",
+ "blockquote",
+ "br",
+ "b",
+ "i",
+ "strong",
+ "em",
+ "pre",
+ "a",
+ "span",
+ "ul",
+ "ol",
+ "li",
+ ],
+ attributes=["href", "rel", "src", "alt"],
+ strip=True,
+ )
diff --git a/bookwyrm/views/admin/automod.py b/bookwyrm/views/admin/automod.py
index f8c3e8e67..65eae71a9 100644
--- a/bookwyrm/views/admin/automod.py
+++ b/bookwyrm/views/admin/automod.py
@@ -33,8 +33,7 @@ class AutoMod(View):
def post(self, request):
"""add rule"""
form = forms.AutoModRuleForm(request.POST)
- success = form.is_valid()
- if success:
+ if form.is_valid():
form.save()
form = forms.AutoModRuleForm()
diff --git a/bookwyrm/views/admin/dashboard.py b/bookwyrm/views/admin/dashboard.py
index b06b6ba00..19583bfa1 100644
--- a/bookwyrm/views/admin/dashboard.py
+++ b/bookwyrm/views/admin/dashboard.py
@@ -1,5 +1,7 @@
""" instance overview """
from datetime import timedelta
+import re
+
from dateutil.parser import parse
from packaging import version
@@ -13,6 +15,7 @@ from django.views import View
from bookwyrm import models, settings
from bookwyrm.connectors.abstract_connector import get_data
from bookwyrm.connectors.connector_manager import ConnectorException
+from bookwyrm.utils import regex
# pylint: disable= no-self-use
@@ -26,91 +29,32 @@ class Dashboard(View):
def get(self, request):
"""list of users"""
- interval = int(request.GET.get("days", 1))
- now = timezone.now()
- start = request.GET.get("start")
- if start:
- start = timezone.make_aware(parse(start))
- else:
- start = now - timedelta(days=6 * interval)
+ data = get_charts_and_stats(request)
- end = request.GET.get("end")
- end = timezone.make_aware(parse(end)) if end else now
- start = start.replace(hour=0, minute=0, second=0)
+ # Make sure email looks properly configured
+ email_config_error = re.findall(
+ r"[\s\@]", settings.EMAIL_SENDER_DOMAIN
+ ) or not re.match(regex.DOMAIN, settings.EMAIL_SENDER_DOMAIN)
- user_queryset = models.User.objects.filter(local=True)
- user_chart = Chart(
- queryset=user_queryset,
- queries={
- "total": lambda q, s, e: q.filter(
- Q(is_active=True) | Q(deactivation_date__gt=e),
- created_date__lte=e,
- ).count(),
- "active": lambda q, s, e: q.filter(
- Q(is_active=True) | Q(deactivation_date__gt=e),
- created_date__lte=e,
- )
- .filter(
- last_active_date__gt=e - timedelta(days=31),
- )
- .count(),
- },
+ data["email_config_error"] = email_config_error
+ # pylint: disable=line-too-long
+ data[
+ "email_sender"
+ ] = f"{settings.EMAIL_SENDER_NAME}@{settings.EMAIL_SENDER_DOMAIN}"
+
+ site = models.SiteSettings.objects.get()
+ # pylint: disable=protected-access
+ data["missing_conduct"] = (
+ not site.code_of_conduct
+ or site.code_of_conduct
+ == site._meta.get_field("code_of_conduct").get_default()
)
-
- status_queryset = models.Status.objects.filter(user__local=True, deleted=False)
- status_chart = Chart(
- queryset=status_queryset,
- queries={
- "total": lambda q, s, e: q.filter(
- created_date__gt=s,
- created_date__lte=e,
- ).count()
- },
+ data["missing_privacy"] = (
+ not site.privacy_policy
+ or site.privacy_policy
+ == site._meta.get_field("privacy_policy").get_default()
)
- register_chart = Chart(
- queryset=user_queryset,
- queries={
- "total": lambda q, s, e: q.filter(
- created_date__gt=s,
- created_date__lte=e,
- ).count()
- },
- )
-
- works_chart = Chart(
- queryset=models.Work.objects,
- queries={
- "total": lambda q, s, e: q.filter(
- created_date__gt=s,
- created_date__lte=e,
- ).count()
- },
- )
-
- data = {
- "start": start.strftime("%Y-%m-%d"),
- "end": end.strftime("%Y-%m-%d"),
- "interval": interval,
- "users": user_queryset.filter(is_active=True).count(),
- "active_users": user_queryset.filter(
- is_active=True, last_active_date__gte=now - timedelta(days=31)
- ).count(),
- "statuses": status_queryset.count(),
- "works": models.Work.objects.count(),
- "reports": models.Report.objects.filter(resolved=False).count(),
- "pending_domains": models.LinkDomain.objects.filter(
- status="pending"
- ).count(),
- "invite_requests": models.InviteRequest.objects.filter(
- ignored=False, invite__isnull=True
- ).count(),
- "user_stats": user_chart.get_chart(start, end, interval),
- "status_stats": status_chart.get_chart(start, end, interval),
- "register_stats": register_chart.get_chart(start, end, interval),
- "works_stats": works_chart.get_chart(start, end, interval),
- }
-
# check version
try:
release = get_data(settings.RELEASE_API, timeout=3)
@@ -126,6 +70,91 @@ class Dashboard(View):
return TemplateResponse(request, "settings/dashboard/dashboard.html", data)
+def get_charts_and_stats(request):
+ """Defines the dashbaord charts"""
+ interval = int(request.GET.get("days", 1))
+ now = timezone.now()
+ start = request.GET.get("start")
+ if start:
+ start = timezone.make_aware(parse(start))
+ else:
+ start = now - timedelta(days=6 * interval)
+
+ end = request.GET.get("end")
+ end = timezone.make_aware(parse(end)) if end else now
+ start = start.replace(hour=0, minute=0, second=0)
+
+ user_queryset = models.User.objects.filter(local=True)
+ user_chart = Chart(
+ queryset=user_queryset,
+ queries={
+ "total": lambda q, s, e: q.filter(
+ Q(is_active=True) | Q(deactivation_date__gt=e),
+ created_date__lte=e,
+ ).count(),
+ "active": lambda q, s, e: q.filter(
+ Q(is_active=True) | Q(deactivation_date__gt=e),
+ created_date__lte=e,
+ )
+ .filter(
+ last_active_date__gt=e - timedelta(days=31),
+ )
+ .count(),
+ },
+ )
+
+ status_queryset = models.Status.objects.filter(user__local=True, deleted=False)
+ status_chart = Chart(
+ queryset=status_queryset,
+ queries={
+ "total": lambda q, s, e: q.filter(
+ created_date__gt=s,
+ created_date__lte=e,
+ ).count()
+ },
+ )
+
+ register_chart = Chart(
+ queryset=user_queryset,
+ queries={
+ "total": lambda q, s, e: q.filter(
+ created_date__gt=s,
+ created_date__lte=e,
+ ).count()
+ },
+ )
+
+ works_chart = Chart(
+ queryset=models.Work.objects,
+ queries={
+ "total": lambda q, s, e: q.filter(
+ created_date__gt=s,
+ created_date__lte=e,
+ ).count()
+ },
+ )
+ return {
+ "start": start.strftime("%Y-%m-%d"),
+ "end": end.strftime("%Y-%m-%d"),
+ "interval": interval,
+ "users": user_queryset.filter(is_active=True).count(),
+ "active_users": user_queryset.filter(
+ is_active=True, last_active_date__gte=now - timedelta(days=31)
+ ).count(),
+ "statuses": status_queryset.count(),
+ "works": models.Work.objects.count(),
+ "reports": models.Report.objects.filter(resolved=False).count(),
+ "pending_domains": models.LinkDomain.objects.filter(status="pending").count(),
+ "invite_requests": models.InviteRequest.objects.filter(
+ ignored=False, invite__isnull=True
+ ).count(),
+ "user_stats": user_chart.get_chart(start, end, interval),
+ "status_stats": status_chart.get_chart(start, end, interval),
+ "register_stats": register_chart.get_chart(start, end, interval),
+ "works_stats": works_chart.get_chart(start, end, interval),
+ }
+
+
class Chart:
"""Data for a chart"""
diff --git a/bookwyrm/views/admin/link_domains.py b/bookwyrm/views/admin/link_domains.py
index 5f9ec6c06..0b8674170 100644
--- a/bookwyrm/views/admin/link_domains.py
+++ b/bookwyrm/views/admin/link_domains.py
@@ -45,6 +45,7 @@ class LinkDomain(View):
@require_POST
@login_required
+@permission_required("bookwyrm.moderate_user")
def update_domain_status(request, domain_id, status):
"""This domain seems fine"""
domain = get_object_or_404(models.LinkDomain, id=domain_id)
diff --git a/bookwyrm/views/admin/reports.py b/bookwyrm/views/admin/reports.py
index c19e3db4a..a0b222ebe 100644
--- a/bookwyrm/views/admin/reports.py
+++ b/bookwyrm/views/admin/reports.py
@@ -83,7 +83,7 @@ class ReportAdmin(View):
@login_required
-@permission_required("bookwyrm_moderate_user")
+@permission_required("bookwyrm.moderate_user")
def suspend_user(_, user_id):
"""mark an account as inactive"""
user = get_object_or_404(models.User, id=user_id)
@@ -95,7 +95,7 @@ def suspend_user(_, user_id):
@login_required
-@permission_required("bookwyrm_moderate_user")
+@permission_required("bookwyrm.moderate_user")
def unsuspend_user(_, user_id):
"""mark an account as inactive"""
user = get_object_or_404(models.User, id=user_id)
@@ -107,7 +107,7 @@ def unsuspend_user(_, user_id):
@login_required
-@permission_required("bookwyrm_moderate_user")
+@permission_required("bookwyrm.moderate_user")
def moderator_delete_user(request, user_id):
"""permanently delete a user"""
user = get_object_or_404(models.User, id=user_id)
@@ -132,7 +132,7 @@ def moderator_delete_user(request, user_id):
@login_required
-@permission_required("bookwyrm_moderate_post")
+@permission_required("bookwyrm.moderate_post")
def resolve_report(_, report_id):
"""mark a report as (un)resolved"""
report = get_object_or_404(models.Report, id=report_id)
diff --git a/bookwyrm/views/admin/user_admin.py b/bookwyrm/views/admin/user_admin.py
index f1bb87a88..6ec6f93d2 100644
--- a/bookwyrm/views/admin/user_admin.py
+++ b/bookwyrm/views/admin/user_admin.py
@@ -22,21 +22,25 @@ class UserAdminList(View):
def get(self, request, status="local"):
"""list of users"""
filters = {}
+ exclusions = {}
if server := request.GET.get("server"):
server = models.FederatedServer.objects.filter(server_name=server).first()
filters["federated_server"] = server
filters["federated_server__isnull"] = False
+
if username := request.GET.get("username"):
filters["username__icontains"] = username
- scope = request.GET.get("scope")
- if scope and scope == "local":
- filters["local"] = True
+
if email := request.GET.get("email"):
filters["email__endswith"] = email
- filters["local"] = status == "local"
+ filters["local"] = status in ["local", "deleted"]
+ if status == "deleted":
+ filters["deactivation_reason__icontains"] = "deletion"
+ else:
+ exclusions["deactivation_reason__icontains"] = "deletion"
- users = models.User.objects.filter(**filters)
+ users = models.User.objects.filter(**filters).exclude(**exclusions)
sort = request.GET.get("sort", "-created_date")
sort_fields = [
@@ -62,7 +66,7 @@ class UserAdminList(View):
@method_decorator(login_required, name="dispatch")
@method_decorator(
- permission_required("bookwyrm.moderate_users", raise_exception=True),
+ permission_required("bookwyrm.moderate_user", raise_exception=True),
name="dispatch",
)
class UserAdmin(View):
@@ -77,8 +81,13 @@ class UserAdmin(View):
def post(self, request, user):
"""update user group"""
user = get_object_or_404(models.User, id=user)
- form = forms.UserGroupForm(request.POST, instance=user)
- if form.is_valid():
- form.save()
+
+ if request.POST.get("groups") == "":
+ user.groups.set([])
+ form = forms.UserGroupForm(instance=user)
+ else:
+ form = forms.UserGroupForm(request.POST, instance=user)
+ if form.is_valid():
+ form.save()
data = {"user": user, "group_form": form}
return TemplateResponse(request, "settings/users/user.html", data)
diff --git a/bookwyrm/views/group.py b/bookwyrm/views/group.py
index 9c282e48f..469f787d3 100644
--- a/bookwyrm/views/group.py
+++ b/bookwyrm/views/group.py
@@ -59,11 +59,11 @@ class Group(View):
model = apps.get_model("bookwyrm.Notification", require_ready=True)
for field in form.changed_data:
notification_type = (
- "GROUP_PRIVACY"
+ model.GROUP_PRIVACY
if field == "privacy"
- else "GROUP_NAME"
+ else model.GROUP_NAME
if field == "name"
- else "GROUP_DESCRIPTION"
+ else model.GROUP_DESCRIPTION
if field == "description"
else None
)
@@ -71,9 +71,9 @@ class Group(View):
for membership in memberships:
member = membership.user
if member != request.user:
- model.objects.create(
- user=member,
- related_user=request.user,
+ model.notify(
+ member,
+ request.user,
related_group=user_group,
notification_type=notification_type,
)
@@ -244,24 +244,22 @@ def remove_member(request):
memberships = models.GroupMember.objects.filter(group=group)
model = apps.get_model("bookwyrm.Notification", require_ready=True)
- notification_type = "LEAVE" if user == request.user else "REMOVE"
+ notification_type = model.LEAVE if user == request.user else model.REMOVE
# let the other members know about it
for membership in memberships:
member = membership.user
if member != request.user:
- model.objects.create(
- user=member,
- related_user=user,
+ model.notify(
+ member,
+ user,
related_group=group,
notification_type=notification_type,
)
# let the user (now ex-member) know as well, if they were removed
- if notification_type == "REMOVE":
- model.objects.create(
- user=user,
- related_group=group,
- notification_type=notification_type,
+ if notification_type == model.REMOVE:
+ model.notify(
+ user, None, related_group=group, notification_type=notification_type
)
return redirect(group.local_path)
diff --git a/bookwyrm/views/helpers.py b/bookwyrm/views/helpers.py
index 7d8eced7c..7be42a87b 100644
--- a/bookwyrm/views/helpers.py
+++ b/bookwyrm/views/helpers.py
@@ -148,13 +148,6 @@ def handle_reading_status(user, shelf, book, privacy):
status.save()
-def is_blocked(viewer, user):
- """is this viewer blocked by the user?"""
- if viewer.is_authenticated and viewer in user.blocks.all():
- return True
- return False
-
-
def load_date_in_user_tz_as_utc(date_str: str, user: models.User) -> datetime:
"""ensures that data is stored consistently in the UTC timezone"""
if not date_str:
diff --git a/bookwyrm/views/landing/password.py b/bookwyrm/views/landing/password.py
index 90713e29d..a7eb001b0 100644
--- a/bookwyrm/views/landing/password.py
+++ b/bookwyrm/views/landing/password.py
@@ -3,7 +3,6 @@ from django.contrib.auth import login
from django.core.exceptions import PermissionDenied
from django.shortcuts import redirect
from django.template.response import TemplateResponse
-from django.utils.translation import gettext_lazy as _
from django.views import View
from bookwyrm import models
@@ -24,12 +23,13 @@ class PasswordResetRequest(View):
def post(self, request):
"""create a password reset token"""
email = request.POST.get("email")
+ data = {"sent_message": True, "email": email}
try:
user = models.User.viewer_aware_objects(request.user).get(
email=email, email__isnull=False
)
except models.User.DoesNotExist:
- data = {"error": _("No user with that email address was found.")}
+ # Showing an error message would leak whether or not this email is in use
return TemplateResponse(
request, "landing/password_reset_request.html", data
)
@@ -40,7 +40,6 @@ class PasswordResetRequest(View):
# create a new reset code
code = models.PasswordReset.objects.create(user=user)
password_reset_email(code)
- data = {"message": _(f"A password reset link was sent to {email}")}
return TemplateResponse(request, "landing/password_reset_request.html", data)
diff --git a/bookwyrm/views/notifications.py b/bookwyrm/views/notifications.py
index 0a7a62002..e4549ba98 100644
--- a/bookwyrm/views/notifications.py
+++ b/bookwyrm/views/notifications.py
@@ -15,16 +15,17 @@ class Notifications(View):
"""people are interacting with you, get hyped"""
notifications = (
request.user.notification_set.all()
- .order_by("-created_date")
+ .order_by("-updated_date")
.select_related(
"related_status",
"related_status__reply_parent",
+ "related_group",
"related_import",
- "related_report",
- "related_user",
- "related_book",
- "related_list_item",
- "related_list_item__book",
+ )
+ .prefetch_related(
+ "related_reports",
+ "related_users",
+ "related_list_items",
)
)
if notification_type == "mentions":
diff --git a/bookwyrm/views/reading.py b/bookwyrm/views/reading.py
index c1e6e5955..eb43e4ea4 100644
--- a/bookwyrm/views/reading.py
+++ b/bookwyrm/views/reading.py
@@ -52,9 +52,6 @@ class ReadingStatus(View):
logger.exception("Invalid reading status type: %s", status)
return HttpResponseBadRequest()
- # invalidate related caches
- cache.delete(f"active_shelf-{request.user.id}-{book_id}")
-
desired_shelf = get_object_or_404(
models.Shelf, identifier=identifier, user=request.user
)
@@ -65,6 +62,14 @@ class ReadingStatus(View):
.get(id=book_id)
)
+ # invalidate related caches
+ cache.delete_many(
+ [
+ f"active_shelf-{request.user.id}-{ed}"
+ for ed in book.parent_work.editions.values_list("id", flat=True)
+ ]
+ )
+
# gets the first shelf that indicates a reading status, or None
shelves = [
s
diff --git a/bookwyrm/views/report.py b/bookwyrm/views/report.py
index 6469f3cb0..118f67988 100644
--- a/bookwyrm/views/report.py
+++ b/bookwyrm/views/report.py
@@ -13,9 +13,13 @@ from bookwyrm import emailing, forms, models
class Report(View):
"""Make reports"""
- def get(self, request, user_id, status_id=None, link_id=None):
+ def get(self, request, user_id=None, status_id=None, link_id=None):
"""static view of report modal"""
- data = {"user": get_object_or_404(models.User, id=user_id)}
+ data = {"user": None}
+ if user_id:
+ # but normally we should have an error if the user is not found
+ data["user"] = get_object_or_404(models.User, id=user_id)
+
if status_id:
data["status"] = status_id
if link_id:
diff --git a/bookwyrm/views/status.py b/bookwyrm/views/status.py
index 670ea5717..0dd9e0f80 100644
--- a/bookwyrm/views/status.py
+++ b/bookwyrm/views/status.py
@@ -16,9 +16,8 @@ from django.views.decorators.http import require_POST
from markdown import markdown
from bookwyrm import forms, models
-from bookwyrm.sanitize_html import InputHtmlParser
from bookwyrm.settings import DOMAIN
-from bookwyrm.utils import regex
+from bookwyrm.utils import regex, sanitizer
from .helpers import handle_remote_webfinger, is_api_request
from .helpers import load_date_in_user_tz_as_utc
@@ -268,6 +267,4 @@ def to_markdown(content):
content = format_links(content)
content = markdown(content)
# sanitize resulting html
- sanitizer = InputHtmlParser()
- sanitizer.feed(content)
- return sanitizer.get_output()
+ return sanitizer.clean(content)
diff --git a/bookwyrm/views/user.py b/bookwyrm/views/user.py
index 1ee93347b..514769267 100644
--- a/bookwyrm/views/user.py
+++ b/bookwyrm/views/user.py
@@ -60,6 +60,12 @@ class User(View):
request.user,
)
.filter(user=user)
+ .exclude(
+ privacy="direct",
+ review__isnull=True,
+ comment__isnull=True,
+ quotation__isnull=True,
+ )
.select_related(
"user",
"reply_parent",
diff --git a/bw-dev b/bw-dev
index 4dd543c0a..7ecef5c34 100755
--- a/bw-dev
+++ b/bw-dev
@@ -103,6 +103,9 @@ case "$CMD" in
pytest)
runweb pytest --no-cov-on-fail "$@"
;;
+ pytest_coverage_report)
+ runweb pytest -n 3 --cov-report term-missing "$@"
+ ;;
collectstatic)
runweb python manage.py collectstatic --no-input
;;
diff --git a/locale/de_DE/LC_MESSAGES/django.mo b/locale/de_DE/LC_MESSAGES/django.mo
index 049645c44..4ce83f72b 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 21b885252..3b1fad3ba 100644
--- a/locale/de_DE/LC_MESSAGES/django.po
+++ b/locale/de_DE/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-05-31 23:50+0000\n"
-"PO-Revision-Date: 2022-06-19 10:11\n"
+"POT-Creation-Date: 2022-07-07 17:47+0000\n"
+"PO-Revision-Date: 2022-07-07 18:12\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: German\n"
"Language: de\n"
@@ -121,9 +121,9 @@ msgstr "Warnung"
msgid "Danger"
msgstr "Gefahr"
-#: bookwyrm/models/antispam.py:106 bookwyrm/models/antispam.py:140
+#: bookwyrm/models/antispam.py:101 bookwyrm/models/antispam.py:135
msgid "Automatically generated report"
-msgstr "Automatisch generierter Report"
+msgstr "Automatisch generierter Bericht"
#: bookwyrm/models/base_model.py:18 bookwyrm/models/link.py:72
#: bookwyrm/templates/import/import_status.html:200
@@ -405,7 +405,7 @@ msgstr "Lerne deine Admins kennen"
#: bookwyrm/templates/about/about.html:101
#, python-format
msgid "%(site_name)s's moderators and administrators keep the site up and running, enforce the code of conduct , and respond when users report spam and bad behavior."
-msgstr "Die Moderator*innen und Administrator*innen von %(site_name)s halten diese Seite am Laufen. Beachte den Verhaltenskodex und melde, wenn andere Benutzer*innen dagegen verstoßen oder Spam verbreiten."
+msgstr "Die Moderator*innen und Administrator*innen von %(site_name)s halten diese Seite am Laufen, setzen den Verhaltenskodex durch und reagieren, wenn Benutzer*innen Spam oder schlechtes Verhalten melden."
#: bookwyrm/templates/about/about.html:115
msgid "Moderator"
@@ -467,7 +467,7 @@ msgstr "Rückblick auf %(year)s"
#: bookwyrm/templates/annual_summary/layout.html:47
#, python-format
msgid "%(display_name)s’s year of reading"
-msgstr "Lektürejahr für %(display_name)s "
+msgstr "%(display_name)ss Lesejahr"
#: bookwyrm/templates/annual_summary/layout.html:53
msgid "Share this page"
@@ -740,7 +740,7 @@ msgstr "ISNI:"
#: bookwyrm/templates/book/book.html:202
#: bookwyrm/templates/book/edit/edit_book.html:135
#: bookwyrm/templates/book/file_links/add_link_modal.html:60
-#: bookwyrm/templates/book/file_links/edit_links.html:82
+#: bookwyrm/templates/book/file_links/edit_links.html:86
#: bookwyrm/templates/groups/form.html:32
#: bookwyrm/templates/lists/bookmark_button.html:15
#: bookwyrm/templates/lists/edit_item_form.html:15
@@ -1016,19 +1016,19 @@ msgstr "Sprachen:"
#: bookwyrm/templates/book/edit/edit_book_form.html:86
msgid "Subjects:"
-msgstr "Betreff:"
+msgstr "Themen:"
#: bookwyrm/templates/book/edit/edit_book_form.html:90
msgid "Add subject"
-msgstr "Betreff hinzufügen"
+msgstr "Thema hinzufügen"
#: bookwyrm/templates/book/edit/edit_book_form.html:108
msgid "Remove subject"
-msgstr "Betreff entfernen"
+msgstr "Thema entfernen"
#: bookwyrm/templates/book/edit/edit_book_form.html:131
msgid "Add Another Subject"
-msgstr "Weiteren Betreff hinzufügen"
+msgstr "Weiteres Thema hinzufügen"
#: bookwyrm/templates/book/edit/edit_book_form.html:139
msgid "Publication"
@@ -1128,7 +1128,7 @@ msgstr "Ausgaben von \"%(work_title)s\" "
#: bookwyrm/templates/book/editions/editions.html:55
msgid "Can't find the edition you're looking for?"
-msgstr "Sie können die gesuchte Auflage nicht finden?"
+msgstr "Du kannst die gesuchte Auflage nicht finden?"
#: bookwyrm/templates/book/editions/editions.html:75
msgid "Add another edition"
@@ -1218,16 +1218,21 @@ msgstr "Status"
msgid "Actions"
msgstr "Aktionen"
-#: bookwyrm/templates/book/file_links/edit_links.html:53
+#: bookwyrm/templates/book/file_links/edit_links.html:48
+#: bookwyrm/templates/settings/link_domains/link_table.html:21
+msgid "Unknown user"
+msgstr ""
+
+#: bookwyrm/templates/book/file_links/edit_links.html:57
#: bookwyrm/templates/book/file_links/verification_modal.html:22
msgid "Report spam"
msgstr "Spam melden"
-#: bookwyrm/templates/book/file_links/edit_links.html:97
+#: bookwyrm/templates/book/file_links/edit_links.html:101
msgid "No links available for this book."
msgstr "Keine Links für dieses Buch vorhanden."
-#: bookwyrm/templates/book/file_links/edit_links.html:108
+#: bookwyrm/templates/book/file_links/edit_links.html:112
#: bookwyrm/templates/book/file_links/links.html:18
msgid "Add link to file"
msgstr "Link zur Datei hinzufügen"
@@ -1324,7 +1329,7 @@ msgstr "Bestätigungscode:"
#: bookwyrm/templates/confirm_email/confirm_email.html:25
#: bookwyrm/templates/landing/layout.html:81
-#: bookwyrm/templates/settings/dashboard/dashboard.html:116
+#: bookwyrm/templates/settings/dashboard/dashboard.html:127
#: bookwyrm/templates/snippets/report_modal.html:53
msgid "Submit"
msgstr "Absenden"
@@ -1340,7 +1345,7 @@ msgstr "Bestätigungslink erneut senden"
#: bookwyrm/templates/confirm_email/resend_modal.html:15
#: bookwyrm/templates/landing/layout.html:68
-#: bookwyrm/templates/landing/password_reset_request.html:18
+#: bookwyrm/templates/landing/password_reset_request.html:24
#: bookwyrm/templates/preferences/edit_user.html:53
#: bookwyrm/templates/snippets/register_form.html:27
msgid "Email address:"
@@ -1567,14 +1572,20 @@ msgstr "Du bist eingeladen, %(site_name)s beizutreten! Klicke auf den Link unten
msgid "Learn more about %(site_name)s:"
msgstr "Erfahre mehr über %(site_name)s:"
-#: bookwyrm/templates/email/moderation_report/html_content.html:6
-#: bookwyrm/templates/email/moderation_report/text_content.html:5
+#: bookwyrm/templates/email/moderation_report/html_content.html:8
+#: bookwyrm/templates/email/moderation_report/text_content.html:6
#, python-format
-msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation. "
-msgstr "@%(reporter)s hat das Verhalten von @%(reportee)s zur Moderation gekennzeichnet. "
+msgid "@%(reporter)s has flagged a link domain for moderation."
+msgstr ""
-#: bookwyrm/templates/email/moderation_report/html_content.html:9
-#: bookwyrm/templates/email/moderation_report/text_content.html:7
+#: bookwyrm/templates/email/moderation_report/html_content.html:14
+#: bookwyrm/templates/email/moderation_report/text_content.html:10
+#, python-format
+msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation."
+msgstr ""
+
+#: bookwyrm/templates/email/moderation_report/html_content.html:21
+#: bookwyrm/templates/email/moderation_report/text_content.html:15
msgid "View report"
msgstr "Bericht anzeigen"
@@ -1611,7 +1622,7 @@ msgstr "Passwort für %(site_name)s zurücksetzen"
#: bookwyrm/templates/setup/layout.html:12
#, python-format
msgid "%(site_name)s home page"
-msgstr "%(site_name)s-Startseite"
+msgstr "%(site_name)s Startseite"
#: bookwyrm/templates/embed-layout.html:40 bookwyrm/templates/layout.html:186
msgid "Contact site admin"
@@ -1674,11 +1685,11 @@ msgstr "Hier sind noch keine Bücher! Versuche, nach Büchern zu suchen, um losz
#: bookwyrm/templates/feed/suggested_books.html:13
msgid "Do you have book data from another service like GoodReads?"
-msgstr "Haben Sie Buchdaten von einem anderen Service wie GoodReads?"
+msgstr "Hast Du Buchdaten von einem anderen Service wie GoodReads?"
#: bookwyrm/templates/feed/suggested_books.html:16
msgid "Import your reading history"
-msgstr "Importieren Sie Ihren Leseverlauf"
+msgstr "Importiere Deinen Leseverlauf"
#: bookwyrm/templates/feed/suggested_users.html:5
#: bookwyrm/templates/get_started/users.html:6
@@ -2268,10 +2279,15 @@ msgid "Confirm password:"
msgstr "Passwort bestätigen:"
#: bookwyrm/templates/landing/password_reset_request.html:14
+#, python-format
+msgid "A password reset link will be sent to %(email)s if there is an account using that email address."
+msgstr ""
+
+#: bookwyrm/templates/landing/password_reset_request.html:20
msgid "A link to reset your password will be sent to your email address"
msgstr "Ein Link zum Zurücksetzen deines Passworts wird an deine E-Mail-Adresse geschickt"
-#: bookwyrm/templates/landing/password_reset_request.html:28
+#: bookwyrm/templates/landing/password_reset_request.html:34
msgid "Reset password"
msgstr "Passwort zurücksetzen"
@@ -2499,7 +2515,7 @@ msgstr "Notizen bearbeiten"
#: bookwyrm/templates/lists/list.html:119
msgid "Add notes"
-msgstr "Notiz hinzufügen"
+msgstr "Notizen hinzufügen"
#: bookwyrm/templates/lists/list.html:131
#, python-format
@@ -2579,108 +2595,244 @@ msgstr "Alle Listen"
msgid "Saved Lists"
msgstr "Gespeicherte Listen"
-#: bookwyrm/templates/notifications/items/accept.html:16
+#: bookwyrm/templates/notifications/items/accept.html:18
#, python-format
-msgid "accepted your invitation to join group \"%(group_name)s \""
-msgstr "hat deine Einladung angenommen, der Gruppe „%(group_name)s “ beizutreten"
+msgid "%(related_user)s accepted your invitation to join group \"%(group_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/add.html:24
+#: bookwyrm/templates/notifications/items/accept.html:26
#, python-format
-msgid "added %(book_title)s to your list \"%(list_name)s \""
-msgstr "%(book_title)s zu deiner Liste „%(list_name)s “ hinzugefügt"
+msgid "%(related_user)s and %(second_user)s accepted your invitation to join group \"%(group_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/add.html:31
+#: bookwyrm/templates/notifications/items/accept.html:36
#, python-format
-msgid "suggested adding %(book_title)s to your list \"%(list_name)s \""
-msgstr "hat vorgeschlagen, %(book_title)s zu deiner Liste „%(list_name)s “ hinzuzufügen"
+msgid "%(related_user)s and %(other_user_display_count)s others accepted your invitation to join group \"%(group_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:19
+#: bookwyrm/templates/notifications/items/add.html:33
#, python-format
-msgid "boosted your review of %(book_title)s "
-msgstr "hat deine Besprechung von %(book_title)s geteilt"
+msgid "%(related_user)s added %(book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:25
+#: bookwyrm/templates/notifications/items/add.html:39
#, python-format
-msgid "boosted your comment on%(book_title)s "
-msgstr "hat deinen Kommentar zu%(book_title)s geteilt"
+msgid "%(related_user)s suggested adding %(book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:31
+#: bookwyrm/templates/notifications/items/add.html:47
#, python-format
-msgid "boosted your quote from %(book_title)s "
-msgstr "hat dein Zitat aus %(book_title)s geteilt"
+msgid "%(related_user)s added %(book_title)s and %(second_book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:37
+#: bookwyrm/templates/notifications/items/add.html:54
#, python-format
-msgid "boosted your status "
-msgstr "hat deinen Status geteilt"
+msgid "%(related_user)s suggested adding %(book_title)s and %(second_book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/fav.html:19
+#: bookwyrm/templates/notifications/items/add.html:66
#, python-format
-msgid "liked your review of %(book_title)s "
-msgstr "hat deine Besprechung von %(book_title)s favorisiert"
+msgid "%(related_user)s added %(book_title)s , %(second_book_title)s , and %(display_count)s other book to your list \"%(list_name)s \""
+msgid_plural "%(related_user)s added %(book_title)s , %(second_book_title)s , and %(display_count)s other books to your list \"%(list_name)s \""
+msgstr[0] ""
+msgstr[1] ""
-#: bookwyrm/templates/notifications/items/fav.html:25
+#: bookwyrm/templates/notifications/items/add.html:82
#, python-format
-msgid "liked your comment on %(book_title)s "
-msgstr "hat deinen Kommentar zu %(book_title)s favorisiert "
+msgid "%(related_user)s suggested adding %(book_title)s , %(second_book_title)s , and %(display_count)s other book to your list \"%(list_name)s \""
+msgid_plural "%(related_user)s suggested adding %(book_title)s , %(second_book_title)s , and %(display_count)s other books to your list \"%(list_name)s \""
+msgstr[0] ""
+msgstr[1] ""
-#: bookwyrm/templates/notifications/items/fav.html:31
+#: bookwyrm/templates/notifications/items/boost.html:21
#, python-format
-msgid "liked your quote from %(book_title)s "
-msgstr "hat dein Zitat aus %(book_title)s favorisiert "
+msgid "%(related_user)s boosted your review of %(book_title)s "
+msgstr ""
-#: bookwyrm/templates/notifications/items/fav.html:37
+#: bookwyrm/templates/notifications/items/boost.html:27
#, python-format
-msgid "liked your status "
-msgstr "hat deinen Status favorisiert"
+msgid "%(related_user)s and %(second_user)s boosted your review of %(book_title)s "
+msgstr ""
-#: bookwyrm/templates/notifications/items/follow.html:15
-msgid "followed you"
-msgstr "folgt dir"
+#: bookwyrm/templates/notifications/items/boost.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your review of %(book_title)s "
+msgstr ""
-#: bookwyrm/templates/notifications/items/follow_request.html:11
-msgid "sent you a follow request"
-msgstr "möchte dir folgen"
+#: bookwyrm/templates/notifications/items/boost.html:44
+#, python-format
+msgid "%(related_user)s boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:50
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:59
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:67
+#, python-format
+msgid "%(related_user)s boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:73
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:82
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:90
+#, python-format
+msgid "%(related_user)s boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:96
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:105
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:21
+#, python-format
+msgid "%(related_user)s liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:27
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:44
+#, python-format
+msgid "%(related_user)s liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:50
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:59
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:67
+#, python-format
+msgid "%(related_user)s liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:73
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:82
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:90
+#, python-format
+msgid "%(related_user)s liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:96
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:105
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:16
+#, python-format
+msgid "%(related_user)s followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:20
+#, python-format
+msgid "%(related_user)s and %(second_user)s followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:25
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow_request.html:15
+#, python-format
+msgid "%(related_user)s sent you a follow request"
+msgstr ""
#: bookwyrm/templates/notifications/items/import.html:14
#, python-format
msgid "Your import completed."
msgstr "Dein Import ist fertig."
-#: bookwyrm/templates/notifications/items/invite.html:15
+#: bookwyrm/templates/notifications/items/invite.html:16
#, python-format
-msgid "invited you to join the group \"%(group_name)s \""
-msgstr "hat dich eingeladen, der Gruppe „%(group_name)s “ beizutreten"
+msgid "%(related_user)s invited you to join the group \"%(group_name)s \""
+msgstr ""
#: bookwyrm/templates/notifications/items/join.html:16
#, python-format
msgid "has joined your group \"%(group_name)s \""
msgstr "ist deiner Gruppe „%(group_name)s “ beigetreten"
-#: bookwyrm/templates/notifications/items/leave.html:16
+#: bookwyrm/templates/notifications/items/leave.html:18
#, python-format
-msgid "has left your group \"%(group_name)s \""
-msgstr "hat deine Gruppe „%(group_name)s “ verlassen"
+msgid "%(related_user)s has left your group \"%(group_name)s \""
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/leave.html:26
+#, python-format
+msgid "%(related_user)s and %(second_user)s have left your group \"%(group_name)s \""
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/leave.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others have left your group \"%(group_name)s \""
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:20
#, python-format
-msgid "mentioned you in a review of %(book_title)s "
-msgstr "hat dich in einer Besprechung von %(book_title)s erwähnt"
+msgid "%(related_user)s mentioned you in a review of %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:26
#, python-format
-msgid "mentioned you in a comment on %(book_title)s "
-msgstr "hat dich in einem Kommentar zu %(book_title)s erwähnt"
+msgid "%(related_user)s mentioned you in a comment on %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:32
#, python-format
-msgid "mentioned you in a quote from %(book_title)s "
-msgstr "hat dich in einem Zitat von %(book_title)s erwähnt"
+msgid "%(related_user)s mentioned you in a quote from %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:38
#, python-format
-msgid "mentioned you in a status "
-msgstr "hat dich in einem Status erwähnt"
+msgid "%(related_user)s mentioned you in a status "
+msgstr ""
#: bookwyrm/templates/notifications/items/remove.html:17
#, python-format
@@ -2694,28 +2846,30 @@ msgstr "Du wurdest aus der Gruppe „%(group_name)s
#: bookwyrm/templates/notifications/items/reply.html:21
#, python-format
-msgid " replied to your review of %(book_title)s "
-msgstr "hat auf deine Besprechung von %(book_title)s geantwortet "
+msgid "%(related_user)s replied to your review of %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:27
#, python-format
-msgid "replied to your comment on %(book_title)s "
-msgstr "hat auf deinen Kommentar zu %(book_title)s geantwortet "
+msgid "%(related_user)s replied to your comment on %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:33
#, python-format
-msgid "replied to your quote from %(book_title)s "
-msgstr "hat auf dein Zitat aus %(book_title)s geantwortet "
+msgid "%(related_user)s replied to your quote from %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:39
#, python-format
-msgid "replied to your status "
-msgstr "hat auf deinen Status geantwortet "
+msgid "%(related_user)s replied to your status "
+msgstr ""
#: bookwyrm/templates/notifications/items/report.html:15
#, python-format
-msgid "A new report needs moderation."
-msgstr "Eine neue Meldung muss moderiert werden."
+msgid "A new report needs moderation"
+msgid_plural "%(display_count)s new reports need moderation"
+msgstr[0] ""
+msgstr[1] ""
#: bookwyrm/templates/notifications/items/update.html:16
#, python-format
@@ -3199,13 +3353,13 @@ msgstr "Nein"
#: bookwyrm/templates/settings/announcements/announcement.html:57
#: bookwyrm/templates/settings/announcements/edit_announcement.html:79
-#: bookwyrm/templates/settings/dashboard/dashboard.html:94
+#: bookwyrm/templates/settings/dashboard/dashboard.html:105
msgid "Start date:"
msgstr "Startdatum:"
#: bookwyrm/templates/settings/announcements/announcement.html:62
#: bookwyrm/templates/settings/announcements/edit_announcement.html:89
-#: bookwyrm/templates/settings/dashboard/dashboard.html:100
+#: bookwyrm/templates/settings/dashboard/dashboard.html:111
msgid "End date:"
msgstr "Enddatum:"
@@ -3365,7 +3519,7 @@ msgid "Dashboard"
msgstr "Übersicht"
#: bookwyrm/templates/settings/dashboard/dashboard.html:15
-#: bookwyrm/templates/settings/dashboard/dashboard.html:123
+#: bookwyrm/templates/settings/dashboard/dashboard.html:134
msgid "Total users"
msgstr "Benutzer*innen insgesamt"
@@ -3385,55 +3539,64 @@ msgstr "Werke"
#: bookwyrm/templates/settings/dashboard/dashboard.html:43
#, python-format
+msgid "Your outgoing email address, %(email_sender)s
, may be misconfigured."
+msgstr ""
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:46
+msgid "Check the EMAIL_SENDER_NAME
and EMAIL_SENDER_DOMAIN
in your .env
."
+msgstr ""
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:54
+#, python-format
msgid "%(display_count)s open report"
msgid_plural "%(display_count)s open reports"
msgstr[0] "%(display_count)s offene Meldung"
msgstr[1] "%(display_count)s offene Meldungen"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:55
+#: bookwyrm/templates/settings/dashboard/dashboard.html:66
#, python-format
msgid "%(display_count)s domain needs review"
msgid_plural "%(display_count)s domains need review"
msgstr[0] "%(display_count)s Domain muss überprüft werden"
msgstr[1] "%(display_count)s Domains müssen überprüft werden"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:67
+#: bookwyrm/templates/settings/dashboard/dashboard.html:78
#, python-format
msgid "%(display_count)s invite request"
msgid_plural "%(display_count)s invite requests"
msgstr[0] "%(display_count)s Einladungsanfrage"
msgstr[1] "%(display_count)s Einladungsanfragen"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:79
+#: bookwyrm/templates/settings/dashboard/dashboard.html:90
#, python-format
msgid "An update is available! You're running v%(current)s and the latest release is %(available)s."
-msgstr "Ein Update ist verfügbar! Sie verwenden v%(current)s, die neueste Version ist %(available)s."
+msgstr "Ein Update ist verfügbar! Du verwendest v%(current)s, die neueste Version ist %(available)s."
-#: bookwyrm/templates/settings/dashboard/dashboard.html:88
+#: bookwyrm/templates/settings/dashboard/dashboard.html:99
msgid "Instance Activity"
msgstr "Instanzaktivität"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:106
+#: bookwyrm/templates/settings/dashboard/dashboard.html:117
msgid "Interval:"
msgstr "Intervall:"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:110
+#: bookwyrm/templates/settings/dashboard/dashboard.html:121
msgid "Days"
msgstr "Tage"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:111
+#: bookwyrm/templates/settings/dashboard/dashboard.html:122
msgid "Weeks"
msgstr "Wochen"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:129
+#: bookwyrm/templates/settings/dashboard/dashboard.html:140
msgid "User signup activity"
msgstr "Neuanmeldungen"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:135
+#: bookwyrm/templates/settings/dashboard/dashboard.html:146
msgid "Status activity"
msgstr "Statusaktivitäten"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:141
+#: bookwyrm/templates/settings/dashboard/dashboard.html:152
msgid "Works created"
msgstr "Erstellte Werke"
@@ -3853,7 +4016,7 @@ msgstr "Derzeit keine zur Freigabe anstehenden Domains"
msgid "No domains currently blocked"
msgstr "Derzeit keine Domains gesperrt"
-#: bookwyrm/templates/settings/link_domains/link_table.html:39
+#: bookwyrm/templates/settings/link_domains/link_table.html:43
msgid "No links available for this domain."
msgstr "Keine Links für diese Domain vorhanden."
@@ -3881,11 +4044,11 @@ msgstr "Statusmeldung gelöscht"
msgid "Reported links"
msgstr "Gemeldete Links"
-#: bookwyrm/templates/settings/reports/report.html:63
+#: bookwyrm/templates/settings/reports/report.html:65
msgid "Moderator Comments"
msgstr "Moderator*innenkommentare"
-#: bookwyrm/templates/settings/reports/report.html:84
+#: bookwyrm/templates/settings/reports/report.html:86
#: bookwyrm/templates/snippets/create_status.html:26
msgid "Comment"
msgstr "Kommentieren"
@@ -3895,12 +4058,17 @@ msgstr "Kommentieren"
msgid "Report #%(report_id)s: Status posted by @%(username)s"
msgstr "Bericht #%(report_id)s: Status gepostet von @%(username)s"
-#: bookwyrm/templates/settings/reports/report_header.html:12
+#: bookwyrm/templates/settings/reports/report_header.html:13
#, python-format
msgid "Report #%(report_id)s: Link added by @%(username)s"
msgstr "Bericht #%(report_id)s: Link hinzugefügt von @%(username)s"
-#: bookwyrm/templates/settings/reports/report_header.html:18
+#: bookwyrm/templates/settings/reports/report_header.html:17
+#, python-format
+msgid "Report #%(report_id)s: Link domain"
+msgstr ""
+
+#: bookwyrm/templates/settings/reports/report_header.html:24
#, python-format
msgid "Report #%(report_id)s: User @%(username)s"
msgstr "Bericht #%(report_id)s: Benutzer @%(username)s"
@@ -4163,11 +4331,15 @@ msgid "Active"
msgstr "Aktiv"
#: bookwyrm/templates/settings/users/user_admin.html:79
+msgid "Deleted"
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_admin.html:85
#: bookwyrm/templates/settings/users/user_info.html:32
msgid "Inactive"
msgstr "Inaktiv"
-#: bookwyrm/templates/settings/users/user_admin.html:88
+#: bookwyrm/templates/settings/users/user_admin.html:94
#: bookwyrm/templates/settings/users/user_info.html:127
msgid "Not set"
msgstr "Nicht festgelegt"
@@ -5172,15 +5344,6 @@ msgstr "Keine gültige CSV-Datei"
msgid "Username or password are incorrect"
msgstr "Benutzer*inname oder Passwort falsch"
-#: bookwyrm/views/landing/password.py:32
-msgid "No user with that email address was found."
-msgstr "Es wurde kein*e Benutzer*in mit dieser E-Mail-Adresse gefunden."
-
-#: bookwyrm/views/landing/password.py:43
-#, python-brace-format
-msgid "A password reset link was sent to {email}"
-msgstr "Ein Link zum Zurücksetzen des Passworts wurde an {email} gesendet"
-
#: bookwyrm/views/rss_feed.py:34
#, python-brace-format
msgid "Status updates from {obj.display_name}"
diff --git a/locale/en_US/LC_MESSAGES/django.po b/locale/en_US/LC_MESSAGES/django.po
index 2ea1905ca..4476585f6 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: 2022-06-30 16:55+0000\n"
+"POT-Creation-Date: 2022-07-08 22:40+0000\n"
"PO-Revision-Date: 2021-02-28 17:19-0800\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: English \n"
@@ -122,7 +122,7 @@ msgstr ""
msgid "Danger"
msgstr ""
-#: bookwyrm/models/antispam.py:106 bookwyrm/models/antispam.py:140
+#: bookwyrm/models/antispam.py:101 bookwyrm/models/antispam.py:135
msgid "Automatically generated report"
msgstr ""
@@ -741,7 +741,7 @@ msgstr ""
#: bookwyrm/templates/book/book.html:202
#: bookwyrm/templates/book/edit/edit_book.html:135
#: bookwyrm/templates/book/file_links/add_link_modal.html:60
-#: bookwyrm/templates/book/file_links/edit_links.html:82
+#: bookwyrm/templates/book/file_links/edit_links.html:86
#: bookwyrm/templates/groups/form.html:32
#: bookwyrm/templates/lists/bookmark_button.html:15
#: bookwyrm/templates/lists/edit_item_form.html:15
@@ -1206,7 +1206,7 @@ msgstr ""
#: bookwyrm/templates/settings/announcements/announcements.html:37
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:47
#: bookwyrm/templates/settings/invites/status_filter.html:5
-#: bookwyrm/templates/settings/users/user_admin.html:52
+#: bookwyrm/templates/settings/users/user_admin.html:56
#: bookwyrm/templates/settings/users/user_info.html:24
msgid "Status"
msgstr ""
@@ -1219,16 +1219,21 @@ msgstr ""
msgid "Actions"
msgstr ""
-#: bookwyrm/templates/book/file_links/edit_links.html:53
+#: bookwyrm/templates/book/file_links/edit_links.html:48
+#: bookwyrm/templates/settings/link_domains/link_table.html:21
+msgid "Unknown user"
+msgstr ""
+
+#: bookwyrm/templates/book/file_links/edit_links.html:57
#: bookwyrm/templates/book/file_links/verification_modal.html:22
msgid "Report spam"
msgstr ""
-#: bookwyrm/templates/book/file_links/edit_links.html:97
+#: bookwyrm/templates/book/file_links/edit_links.html:101
msgid "No links available for this book."
msgstr ""
-#: bookwyrm/templates/book/file_links/edit_links.html:108
+#: bookwyrm/templates/book/file_links/edit_links.html:112
#: bookwyrm/templates/book/file_links/links.html:18
msgid "Add link to file"
msgstr ""
@@ -1325,7 +1330,7 @@ msgstr ""
#: bookwyrm/templates/confirm_email/confirm_email.html:25
#: bookwyrm/templates/landing/layout.html:81
-#: bookwyrm/templates/settings/dashboard/dashboard.html:116
+#: bookwyrm/templates/settings/dashboard/dashboard.html:106
#: bookwyrm/templates/snippets/report_modal.html:53
msgid "Submit"
msgstr ""
@@ -1341,7 +1346,7 @@ msgstr ""
#: bookwyrm/templates/confirm_email/resend_modal.html:15
#: bookwyrm/templates/landing/layout.html:68
-#: bookwyrm/templates/landing/password_reset_request.html:18
+#: bookwyrm/templates/landing/password_reset_request.html:24
#: bookwyrm/templates/preferences/edit_user.html:53
#: bookwyrm/templates/snippets/register_form.html:27
msgid "Email address:"
@@ -1365,7 +1370,7 @@ msgid "Local users"
msgstr ""
#: bookwyrm/templates/directory/community_filter.html:12
-#: bookwyrm/templates/settings/users/user_admin.html:29
+#: bookwyrm/templates/settings/users/user_admin.html:33
msgid "Federated community"
msgstr ""
@@ -1568,14 +1573,20 @@ msgstr ""
msgid "Learn more about %(site_name)s:"
msgstr ""
-#: bookwyrm/templates/email/moderation_report/html_content.html:6
-#: bookwyrm/templates/email/moderation_report/text_content.html:5
+#: bookwyrm/templates/email/moderation_report/html_content.html:8
+#: bookwyrm/templates/email/moderation_report/text_content.html:6
#, python-format
-msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation. "
+msgid "@%(reporter)s has flagged a link domain for moderation."
msgstr ""
-#: bookwyrm/templates/email/moderation_report/html_content.html:9
-#: bookwyrm/templates/email/moderation_report/text_content.html:7
+#: bookwyrm/templates/email/moderation_report/html_content.html:14
+#: bookwyrm/templates/email/moderation_report/text_content.html:10
+#, python-format
+msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation."
+msgstr ""
+
+#: bookwyrm/templates/email/moderation_report/html_content.html:21
+#: bookwyrm/templates/email/moderation_report/text_content.html:15
msgid "View report"
msgstr ""
@@ -2269,10 +2280,15 @@ msgid "Confirm password:"
msgstr ""
#: bookwyrm/templates/landing/password_reset_request.html:14
+#, python-format
+msgid "A password reset link will be sent to %(email)s if there is an account using that email address."
+msgstr ""
+
+#: bookwyrm/templates/landing/password_reset_request.html:20
msgid "A link to reset your password will be sent to your email address"
msgstr ""
-#: bookwyrm/templates/landing/password_reset_request.html:28
+#: bookwyrm/templates/landing/password_reset_request.html:34
msgid "Reset password"
msgstr ""
@@ -2580,67 +2596,193 @@ msgstr ""
msgid "Saved Lists"
msgstr ""
-#: bookwyrm/templates/notifications/items/accept.html:16
+#: bookwyrm/templates/notifications/items/accept.html:18
#, python-format
-msgid "accepted your invitation to join group \"%(group_name)s \""
+msgid "%(related_user)s accepted your invitation to join group \"%(group_name)s \""
msgstr ""
-#: bookwyrm/templates/notifications/items/add.html:24
+#: bookwyrm/templates/notifications/items/accept.html:26
#, python-format
-msgid "added %(book_title)s to your list \"%(list_name)s \""
+msgid "%(related_user)s and %(second_user)s accepted your invitation to join group \"%(group_name)s \""
msgstr ""
-#: bookwyrm/templates/notifications/items/add.html:31
+#: bookwyrm/templates/notifications/items/accept.html:36
#, python-format
-msgid "suggested adding %(book_title)s to your list \"%(list_name)s \""
+msgid "%(related_user)s and %(other_user_display_count)s others accepted your invitation to join group \"%(group_name)s \""
msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:19
+#: bookwyrm/templates/notifications/items/add.html:33
#, python-format
-msgid "boosted your review of %(book_title)s "
+msgid "%(related_user)s added %(book_title)s to your list \"%(list_name)s \""
msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:25
+#: bookwyrm/templates/notifications/items/add.html:39
#, python-format
-msgid "boosted your comment on%(book_title)s "
+msgid "%(related_user)s suggested adding %(book_title)s to your list \"%(list_name)s \""
msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:31
+#: bookwyrm/templates/notifications/items/add.html:47
#, python-format
-msgid "boosted your quote from %(book_title)s "
+msgid "%(related_user)s added %(book_title)s and %(second_book_title)s to your list \"%(list_name)s \""
msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:37
+#: bookwyrm/templates/notifications/items/add.html:54
#, python-format
-msgid "boosted your status "
+msgid "%(related_user)s suggested adding %(book_title)s and %(second_book_title)s to your list \"%(list_name)s \""
msgstr ""
-#: bookwyrm/templates/notifications/items/fav.html:19
+#: bookwyrm/templates/notifications/items/add.html:66
#, python-format
-msgid "liked your review of %(book_title)s "
-msgstr ""
+msgid "%(related_user)s added %(book_title)s , %(second_book_title)s , and %(display_count)s other book to your list \"%(list_name)s \""
+msgid_plural "%(related_user)s added %(book_title)s , %(second_book_title)s , and %(display_count)s other books to your list \"%(list_name)s \""
+msgstr[0] ""
+msgstr[1] ""
-#: bookwyrm/templates/notifications/items/fav.html:25
+#: bookwyrm/templates/notifications/items/add.html:82
#, python-format
-msgid "liked your comment on %(book_title)s "
-msgstr ""
+msgid "%(related_user)s suggested adding %(book_title)s , %(second_book_title)s , and %(display_count)s other book to your list \"%(list_name)s \""
+msgid_plural "%(related_user)s suggested adding %(book_title)s , %(second_book_title)s , and %(display_count)s other books to your list \"%(list_name)s \""
+msgstr[0] ""
+msgstr[1] ""
-#: bookwyrm/templates/notifications/items/fav.html:31
+#: bookwyrm/templates/notifications/items/boost.html:21
#, python-format
-msgid "liked your quote from %(book_title)s "
+msgid "%(related_user)s boosted your review of %(book_title)s "
msgstr ""
-#: bookwyrm/templates/notifications/items/fav.html:37
+#: bookwyrm/templates/notifications/items/boost.html:27
#, python-format
-msgid "liked your status "
+msgid "%(related_user)s and %(second_user)s boosted your review of %(book_title)s "
msgstr ""
-#: bookwyrm/templates/notifications/items/follow.html:15
-msgid "followed you"
+#: bookwyrm/templates/notifications/items/boost.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your review of %(book_title)s "
msgstr ""
-#: bookwyrm/templates/notifications/items/follow_request.html:11
-msgid "sent you a follow request"
+#: bookwyrm/templates/notifications/items/boost.html:44
+#, python-format
+msgid "%(related_user)s boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:50
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:59
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:67
+#, python-format
+msgid "%(related_user)s boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:73
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:82
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:90
+#, python-format
+msgid "%(related_user)s boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:96
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:105
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:21
+#, python-format
+msgid "%(related_user)s liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:27
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:44
+#, python-format
+msgid "%(related_user)s liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:50
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:59
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:67
+#, python-format
+msgid "%(related_user)s liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:73
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:82
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:90
+#, python-format
+msgid "%(related_user)s liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:96
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:105
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:16
+#, python-format
+msgid "%(related_user)s followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:20
+#, python-format
+msgid "%(related_user)s and %(second_user)s followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:25
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow_request.html:15
+#, python-format
+msgid "%(related_user)s sent you a follow request"
msgstr ""
#: bookwyrm/templates/notifications/items/import.html:14
@@ -2648,9 +2790,9 @@ msgstr ""
msgid "Your import completed."
msgstr ""
-#: bookwyrm/templates/notifications/items/invite.html:15
+#: bookwyrm/templates/notifications/items/invite.html:16
#, python-format
-msgid "invited you to join the group \"%(group_name)s \""
+msgid "%(related_user)s invited you to join the group \"%(group_name)s \""
msgstr ""
#: bookwyrm/templates/notifications/items/join.html:16
@@ -2658,29 +2800,39 @@ msgstr ""
msgid "has joined your group \"%(group_name)s \""
msgstr ""
-#: bookwyrm/templates/notifications/items/leave.html:16
+#: bookwyrm/templates/notifications/items/leave.html:18
#, python-format
-msgid "has left your group \"%(group_name)s \""
+msgid "%(related_user)s has left your group \"%(group_name)s \""
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/leave.html:26
+#, python-format
+msgid "%(related_user)s and %(second_user)s have left your group \"%(group_name)s \""
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/leave.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others have left your group \"%(group_name)s \""
msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:20
#, python-format
-msgid "mentioned you in a review of %(book_title)s "
+msgid "%(related_user)s mentioned you in a review of %(book_title)s "
msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:26
#, python-format
-msgid "mentioned you in a comment on %(book_title)s "
+msgid "%(related_user)s mentioned you in a comment on %(book_title)s "
msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:32
#, python-format
-msgid "mentioned you in a quote from %(book_title)s "
+msgid "%(related_user)s mentioned you in a quote from %(book_title)s "
msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:38
#, python-format
-msgid "mentioned you in a status "
+msgid "%(related_user)s mentioned you in a status "
msgstr ""
#: bookwyrm/templates/notifications/items/remove.html:17
@@ -2695,28 +2847,30 @@ msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:21
#, python-format
-msgid "replied to your review of %(book_title)s "
+msgid "%(related_user)s replied to your review of %(book_title)s "
msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:27
#, python-format
-msgid "replied to your comment on %(book_title)s "
+msgid "%(related_user)s replied to your comment on %(book_title)s "
msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:33
#, python-format
-msgid "replied to your quote from %(book_title)s "
+msgid "%(related_user)s replied to your quote from %(book_title)s "
msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:39
#, python-format
-msgid "replied to your status "
+msgid "%(related_user)s replied to your status "
msgstr ""
#: bookwyrm/templates/notifications/items/report.html:15
#, python-format
-msgid "A new report needs moderation."
-msgstr ""
+msgid "A new report needs moderation"
+msgid_plural "%(display_count)s new reports need moderation"
+msgstr[0] ""
+msgstr[1] ""
#: bookwyrm/templates/notifications/items/update.html:16
#, python-format
@@ -3199,13 +3353,13 @@ msgstr ""
#: bookwyrm/templates/settings/announcements/announcement.html:57
#: bookwyrm/templates/settings/announcements/edit_announcement.html:79
-#: bookwyrm/templates/settings/dashboard/dashboard.html:94
+#: bookwyrm/templates/settings/dashboard/dashboard.html:84
msgid "Start date:"
msgstr ""
#: bookwyrm/templates/settings/announcements/announcement.html:62
#: bookwyrm/templates/settings/announcements/edit_announcement.html:89
-#: bookwyrm/templates/settings/dashboard/dashboard.html:100
+#: bookwyrm/templates/settings/dashboard/dashboard.html:90
msgid "End date:"
msgstr ""
@@ -3365,7 +3519,7 @@ msgid "Dashboard"
msgstr ""
#: bookwyrm/templates/settings/dashboard/dashboard.html:15
-#: bookwyrm/templates/settings/dashboard/dashboard.html:123
+#: bookwyrm/templates/settings/dashboard/dashboard.html:113
msgid "Total users"
msgstr ""
@@ -3383,57 +3537,31 @@ msgstr ""
msgid "Works"
msgstr ""
-#: bookwyrm/templates/settings/dashboard/dashboard.html:43
-#, python-format
-msgid "%(display_count)s open report"
-msgid_plural "%(display_count)s open reports"
-msgstr[0] ""
-msgstr[1] ""
-
-#: bookwyrm/templates/settings/dashboard/dashboard.html:55
-#, python-format
-msgid "%(display_count)s domain needs review"
-msgid_plural "%(display_count)s domains need review"
-msgstr[0] ""
-msgstr[1] ""
-
-#: bookwyrm/templates/settings/dashboard/dashboard.html:67
-#, python-format
-msgid "%(display_count)s invite request"
-msgid_plural "%(display_count)s invite requests"
-msgstr[0] ""
-msgstr[1] ""
-
-#: bookwyrm/templates/settings/dashboard/dashboard.html:79
-#, python-format
-msgid "An update is available! You're running v%(current)s and the latest release is %(available)s."
-msgstr ""
-
-#: bookwyrm/templates/settings/dashboard/dashboard.html:88
+#: bookwyrm/templates/settings/dashboard/dashboard.html:78
msgid "Instance Activity"
msgstr ""
-#: bookwyrm/templates/settings/dashboard/dashboard.html:106
+#: bookwyrm/templates/settings/dashboard/dashboard.html:96
msgid "Interval:"
msgstr ""
-#: bookwyrm/templates/settings/dashboard/dashboard.html:110
+#: bookwyrm/templates/settings/dashboard/dashboard.html:100
msgid "Days"
msgstr ""
-#: bookwyrm/templates/settings/dashboard/dashboard.html:111
+#: bookwyrm/templates/settings/dashboard/dashboard.html:101
msgid "Weeks"
msgstr ""
-#: bookwyrm/templates/settings/dashboard/dashboard.html:129
+#: bookwyrm/templates/settings/dashboard/dashboard.html:119
msgid "User signup activity"
msgstr ""
-#: bookwyrm/templates/settings/dashboard/dashboard.html:135
+#: bookwyrm/templates/settings/dashboard/dashboard.html:125
msgid "Status activity"
msgstr ""
-#: bookwyrm/templates/settings/dashboard/dashboard.html:141
+#: bookwyrm/templates/settings/dashboard/dashboard.html:131
msgid "Works created"
msgstr ""
@@ -3449,6 +3577,49 @@ msgstr ""
msgid "Total"
msgstr ""
+#: bookwyrm/templates/settings/dashboard/warnings/domain_review.html:9
+#, python-format
+msgid "%(display_count)s domain needs review"
+msgid_plural "%(display_count)s domains need review"
+msgstr[0] ""
+msgstr[1] ""
+
+#: bookwyrm/templates/settings/dashboard/warnings/email_config.html:8
+#, python-format
+msgid "Your outgoing email address, %(email_sender)s
, may be misconfigured."
+msgstr ""
+
+#: bookwyrm/templates/settings/dashboard/warnings/email_config.html:11
+msgid "Check the EMAIL_SENDER_NAME
and EMAIL_SENDER_DOMAIN
in your .env
file."
+msgstr ""
+
+#: bookwyrm/templates/settings/dashboard/warnings/invites.html:9
+#, python-format
+msgid "%(display_count)s invite request"
+msgid_plural "%(display_count)s invite requests"
+msgstr[0] ""
+msgstr[1] ""
+
+#: bookwyrm/templates/settings/dashboard/warnings/missing_conduct.html:8
+msgid "Your instance is missing a code of conduct."
+msgstr ""
+
+#: bookwyrm/templates/settings/dashboard/warnings/missing_privacy.html:8
+msgid "Your instance is missing a privacy policy."
+msgstr ""
+
+#: bookwyrm/templates/settings/dashboard/warnings/reports.html:9
+#, python-format
+msgid "%(display_count)s open report"
+msgid_plural "%(display_count)s open reports"
+msgstr[0] ""
+msgstr[1] ""
+
+#: bookwyrm/templates/settings/dashboard/warnings/update_version.html:8
+#, python-format
+msgid "An update is available! You're running v%(current)s and the latest release is %(available)s."
+msgstr ""
+
#: bookwyrm/templates/settings/email_blocklist/domain_form.html:5
#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:10
msgid "Add domain"
@@ -3853,7 +4024,7 @@ msgstr ""
msgid "No domains currently blocked"
msgstr ""
-#: bookwyrm/templates/settings/link_domains/link_table.html:39
+#: bookwyrm/templates/settings/link_domains/link_table.html:43
msgid "No links available for this domain."
msgstr ""
@@ -3881,11 +4052,11 @@ msgstr ""
msgid "Reported links"
msgstr ""
-#: bookwyrm/templates/settings/reports/report.html:63
+#: bookwyrm/templates/settings/reports/report.html:65
msgid "Moderator Comments"
msgstr ""
-#: bookwyrm/templates/settings/reports/report.html:84
+#: bookwyrm/templates/settings/reports/report.html:86
#: bookwyrm/templates/snippets/create_status.html:26
msgid "Comment"
msgstr ""
@@ -3895,12 +4066,17 @@ msgstr ""
msgid "Report #%(report_id)s: Status posted by @%(username)s"
msgstr ""
-#: bookwyrm/templates/settings/reports/report_header.html:12
+#: bookwyrm/templates/settings/reports/report_header.html:13
#, python-format
msgid "Report #%(report_id)s: Link added by @%(username)s"
msgstr ""
-#: bookwyrm/templates/settings/reports/report_header.html:18
+#: bookwyrm/templates/settings/reports/report_header.html:17
+#, python-format
+msgid "Report #%(report_id)s: Link domain"
+msgstr ""
+
+#: bookwyrm/templates/settings/reports/report_header.html:24
#, python-format
msgid "Report #%(report_id)s: User @%(username)s"
msgstr ""
@@ -4140,34 +4316,42 @@ msgstr ""
msgid "Users: %(instance_name)s "
msgstr ""
-#: bookwyrm/templates/settings/users/user_admin.html:40
+#: bookwyrm/templates/settings/users/user_admin.html:29
+msgid "Deleted users"
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_admin.html:44
#: bookwyrm/templates/settings/users/username_filter.html:5
msgid "Username"
msgstr ""
-#: bookwyrm/templates/settings/users/user_admin.html:44
+#: bookwyrm/templates/settings/users/user_admin.html:48
msgid "Date Added"
msgstr ""
-#: bookwyrm/templates/settings/users/user_admin.html:48
+#: bookwyrm/templates/settings/users/user_admin.html:52
msgid "Last Active"
msgstr ""
-#: bookwyrm/templates/settings/users/user_admin.html:57
+#: bookwyrm/templates/settings/users/user_admin.html:61
msgid "Remote instance"
msgstr ""
-#: bookwyrm/templates/settings/users/user_admin.html:74
+#: bookwyrm/templates/settings/users/user_admin.html:81
#: bookwyrm/templates/settings/users/user_info.html:28
msgid "Active"
msgstr ""
-#: bookwyrm/templates/settings/users/user_admin.html:79
+#: bookwyrm/templates/settings/users/user_admin.html:86
+msgid "Deleted"
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_admin.html:92
#: bookwyrm/templates/settings/users/user_info.html:32
msgid "Inactive"
msgstr ""
-#: bookwyrm/templates/settings/users/user_admin.html:88
+#: bookwyrm/templates/settings/users/user_admin.html:101
#: bookwyrm/templates/settings/users/user_info.html:127
msgid "Not set"
msgstr ""
@@ -4870,15 +5054,11 @@ msgstr ""
msgid "(%(percent)s%%)"
msgstr ""
-#: bookwyrm/templates/snippets/status/content_status.html:116
-msgid "page"
-msgstr ""
-
-#: bookwyrm/templates/snippets/status/content_status.html:129
+#: bookwyrm/templates/snippets/status/content_status.html:126
msgid "Open image in new window"
msgstr ""
-#: bookwyrm/templates/snippets/status/content_status.html:148
+#: bookwyrm/templates/snippets/status/content_status.html:145
msgid "Hide status"
msgstr ""
@@ -5176,15 +5356,6 @@ msgstr ""
msgid "Username or password are incorrect"
msgstr ""
-#: bookwyrm/views/landing/password.py:32
-msgid "No user with that email address was found."
-msgstr ""
-
-#: bookwyrm/views/landing/password.py:43
-#, python-brace-format
-msgid "A password reset link was sent to {email}"
-msgstr ""
-
#: bookwyrm/views/rss_feed.py:34
#, python-brace-format
msgid "Status updates from {obj.display_name}"
diff --git a/locale/es_ES/LC_MESSAGES/django.mo b/locale/es_ES/LC_MESSAGES/django.mo
index dc20de07a..49a5f2de8 100644
Binary files a/locale/es_ES/LC_MESSAGES/django.mo and b/locale/es_ES/LC_MESSAGES/django.mo differ
diff --git a/locale/es_ES/LC_MESSAGES/django.po b/locale/es_ES/LC_MESSAGES/django.po
index dc8f4bb26..28404d726 100644
--- a/locale/es_ES/LC_MESSAGES/django.po
+++ b/locale/es_ES/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-05-31 23:50+0000\n"
-"PO-Revision-Date: 2022-06-01 00:55\n"
+"POT-Creation-Date: 2022-07-07 17:47+0000\n"
+"PO-Revision-Date: 2022-07-07 18:12\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: Spanish\n"
"Language: es\n"
@@ -121,7 +121,7 @@ msgstr "Aviso"
msgid "Danger"
msgstr "Cuidado"
-#: bookwyrm/models/antispam.py:106 bookwyrm/models/antispam.py:140
+#: bookwyrm/models/antispam.py:101 bookwyrm/models/antispam.py:135
msgid "Automatically generated report"
msgstr "Informe generado automáticamente"
@@ -740,7 +740,7 @@ msgstr "ISNI:"
#: bookwyrm/templates/book/book.html:202
#: bookwyrm/templates/book/edit/edit_book.html:135
#: bookwyrm/templates/book/file_links/add_link_modal.html:60
-#: bookwyrm/templates/book/file_links/edit_links.html:82
+#: bookwyrm/templates/book/file_links/edit_links.html:86
#: bookwyrm/templates/groups/form.html:32
#: bookwyrm/templates/lists/bookmark_button.html:15
#: bookwyrm/templates/lists/edit_item_form.html:15
@@ -1218,16 +1218,21 @@ msgstr "Estado"
msgid "Actions"
msgstr "Acciones"
-#: bookwyrm/templates/book/file_links/edit_links.html:53
+#: bookwyrm/templates/book/file_links/edit_links.html:48
+#: bookwyrm/templates/settings/link_domains/link_table.html:21
+msgid "Unknown user"
+msgstr ""
+
+#: bookwyrm/templates/book/file_links/edit_links.html:57
#: bookwyrm/templates/book/file_links/verification_modal.html:22
msgid "Report spam"
msgstr "Denunciar spam"
-#: bookwyrm/templates/book/file_links/edit_links.html:97
+#: bookwyrm/templates/book/file_links/edit_links.html:101
msgid "No links available for this book."
msgstr "Ningún enlace disponible para este libro."
-#: bookwyrm/templates/book/file_links/edit_links.html:108
+#: bookwyrm/templates/book/file_links/edit_links.html:112
#: bookwyrm/templates/book/file_links/links.html:18
msgid "Add link to file"
msgstr "Añadir enlace a archivo"
@@ -1324,7 +1329,7 @@ msgstr "Código de confirmación:"
#: bookwyrm/templates/confirm_email/confirm_email.html:25
#: bookwyrm/templates/landing/layout.html:81
-#: bookwyrm/templates/settings/dashboard/dashboard.html:116
+#: bookwyrm/templates/settings/dashboard/dashboard.html:127
#: bookwyrm/templates/snippets/report_modal.html:53
msgid "Submit"
msgstr "Enviar"
@@ -1340,7 +1345,7 @@ msgstr "Reenviar enlace de confirmación"
#: bookwyrm/templates/confirm_email/resend_modal.html:15
#: bookwyrm/templates/landing/layout.html:68
-#: bookwyrm/templates/landing/password_reset_request.html:18
+#: bookwyrm/templates/landing/password_reset_request.html:24
#: bookwyrm/templates/preferences/edit_user.html:53
#: bookwyrm/templates/snippets/register_form.html:27
msgid "Email address:"
@@ -1567,14 +1572,20 @@ msgstr "Estás invitado a unirte con %(site_name)s! Haz clic en el enlace a cont
msgid "Learn more about %(site_name)s:"
msgstr "Más información sobre %(site_name)s:"
-#: bookwyrm/templates/email/moderation_report/html_content.html:6
-#: bookwyrm/templates/email/moderation_report/text_content.html:5
+#: bookwyrm/templates/email/moderation_report/html_content.html:8
+#: bookwyrm/templates/email/moderation_report/text_content.html:6
#, python-format
-msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation. "
-msgstr "@%(reporter)s ha marcado el comportamiento de @%(reportee)s para moderar. "
+msgid "@%(reporter)s has flagged a link domain for moderation."
+msgstr ""
-#: bookwyrm/templates/email/moderation_report/html_content.html:9
-#: bookwyrm/templates/email/moderation_report/text_content.html:7
+#: bookwyrm/templates/email/moderation_report/html_content.html:14
+#: bookwyrm/templates/email/moderation_report/text_content.html:10
+#, python-format
+msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation."
+msgstr ""
+
+#: bookwyrm/templates/email/moderation_report/html_content.html:21
+#: bookwyrm/templates/email/moderation_report/text_content.html:15
msgid "View report"
msgstr "Ver informe"
@@ -2268,10 +2279,15 @@ msgid "Confirm password:"
msgstr "Confirmar contraseña:"
#: bookwyrm/templates/landing/password_reset_request.html:14
+#, python-format
+msgid "A password reset link will be sent to %(email)s if there is an account using that email address."
+msgstr ""
+
+#: bookwyrm/templates/landing/password_reset_request.html:20
msgid "A link to reset your password will be sent to your email address"
msgstr "Un enlace para restablecer tu contraseña se enviará a tu dirección de correo electrónico"
-#: bookwyrm/templates/landing/password_reset_request.html:28
+#: bookwyrm/templates/landing/password_reset_request.html:34
msgid "Reset password"
msgstr "Restablecer contraseña"
@@ -2579,108 +2595,244 @@ msgstr "Todas las listas"
msgid "Saved Lists"
msgstr "Listas guardadas"
-#: bookwyrm/templates/notifications/items/accept.html:16
+#: bookwyrm/templates/notifications/items/accept.html:18
#, python-format
-msgid "accepted your invitation to join group \"%(group_name)s \""
-msgstr "aceptó su invitación para unirse al grupo «%(group_name)s »"
+msgid "%(related_user)s accepted your invitation to join group \"%(group_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/add.html:24
+#: bookwyrm/templates/notifications/items/accept.html:26
#, python-format
-msgid "added %(book_title)s to your list \"%(list_name)s \""
-msgstr "agregó %(book_title)s a su lista «%(list_name)s »"
+msgid "%(related_user)s and %(second_user)s accepted your invitation to join group \"%(group_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/add.html:31
+#: bookwyrm/templates/notifications/items/accept.html:36
#, python-format
-msgid "suggested adding %(book_title)s to your list \"%(list_name)s \""
-msgstr "sugirió agregar %(book_title)s a su lista «%(list_name)s »"
+msgid "%(related_user)s and %(other_user_display_count)s others accepted your invitation to join group \"%(group_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:19
+#: bookwyrm/templates/notifications/items/add.html:33
#, python-format
-msgid "boosted your review of %(book_title)s "
-msgstr "difundió tu reseña de %(book_title)s "
+msgid "%(related_user)s added %(book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:25
+#: bookwyrm/templates/notifications/items/add.html:39
#, python-format
-msgid "boosted your comment on%(book_title)s "
-msgstr "difundió tu comentario en%(book_title)s "
+msgid "%(related_user)s suggested adding %(book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:31
+#: bookwyrm/templates/notifications/items/add.html:47
#, python-format
-msgid "boosted your quote from %(book_title)s "
-msgstr "difundió tu cita de %(book_title)s "
+msgid "%(related_user)s added %(book_title)s and %(second_book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:37
+#: bookwyrm/templates/notifications/items/add.html:54
#, python-format
-msgid "boosted your status "
-msgstr "difundió tu estado "
+msgid "%(related_user)s suggested adding %(book_title)s and %(second_book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/fav.html:19
+#: bookwyrm/templates/notifications/items/add.html:66
#, python-format
-msgid "liked your review of %(book_title)s "
-msgstr "le gustó tu reseña de %(book_title)s "
+msgid "%(related_user)s added %(book_title)s , %(second_book_title)s , and %(display_count)s other book to your list \"%(list_name)s \""
+msgid_plural "%(related_user)s added %(book_title)s , %(second_book_title)s , and %(display_count)s other books to your list \"%(list_name)s \""
+msgstr[0] ""
+msgstr[1] ""
-#: bookwyrm/templates/notifications/items/fav.html:25
+#: bookwyrm/templates/notifications/items/add.html:82
#, python-format
-msgid "liked your comment on %(book_title)s "
-msgstr "le gustó tu comentario sobre %(book_title)s "
+msgid "%(related_user)s suggested adding %(book_title)s , %(second_book_title)s , and %(display_count)s other book to your list \"%(list_name)s \""
+msgid_plural "%(related_user)s suggested adding %(book_title)s , %(second_book_title)s , and %(display_count)s other books to your list \"%(list_name)s \""
+msgstr[0] ""
+msgstr[1] ""
-#: bookwyrm/templates/notifications/items/fav.html:31
+#: bookwyrm/templates/notifications/items/boost.html:21
#, python-format
-msgid "liked your quote from %(book_title)s "
-msgstr "le gustó tu cita de %(book_title)s "
+msgid "%(related_user)s boosted your review of %(book_title)s "
+msgstr ""
-#: bookwyrm/templates/notifications/items/fav.html:37
+#: bookwyrm/templates/notifications/items/boost.html:27
#, python-format
-msgid "liked your status "
-msgstr "le gustó tu estado "
+msgid "%(related_user)s and %(second_user)s boosted your review of %(book_title)s "
+msgstr ""
-#: bookwyrm/templates/notifications/items/follow.html:15
-msgid "followed you"
-msgstr "te siguió"
+#: bookwyrm/templates/notifications/items/boost.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your review of %(book_title)s "
+msgstr ""
-#: bookwyrm/templates/notifications/items/follow_request.html:11
-msgid "sent you a follow request"
-msgstr "te quiere seguir"
+#: bookwyrm/templates/notifications/items/boost.html:44
+#, python-format
+msgid "%(related_user)s boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:50
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:59
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:67
+#, python-format
+msgid "%(related_user)s boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:73
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:82
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:90
+#, python-format
+msgid "%(related_user)s boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:96
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:105
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:21
+#, python-format
+msgid "%(related_user)s liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:27
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:44
+#, python-format
+msgid "%(related_user)s liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:50
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:59
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:67
+#, python-format
+msgid "%(related_user)s liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:73
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:82
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:90
+#, python-format
+msgid "%(related_user)s liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:96
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:105
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:16
+#, python-format
+msgid "%(related_user)s followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:20
+#, python-format
+msgid "%(related_user)s and %(second_user)s followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:25
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow_request.html:15
+#, python-format
+msgid "%(related_user)s sent you a follow request"
+msgstr ""
#: bookwyrm/templates/notifications/items/import.html:14
#, python-format
msgid "Your import completed."
msgstr "Tu importación ha terminado."
-#: bookwyrm/templates/notifications/items/invite.html:15
+#: bookwyrm/templates/notifications/items/invite.html:16
#, python-format
-msgid "invited you to join the group \"%(group_name)s \""
-msgstr "te invitó a unirte al grupo «%(group_name)s »"
+msgid "%(related_user)s invited you to join the group \"%(group_name)s \""
+msgstr ""
#: bookwyrm/templates/notifications/items/join.html:16
#, python-format
msgid "has joined your group \"%(group_name)s \""
msgstr "se ha unido a tu grupo «%(group_name)s »"
-#: bookwyrm/templates/notifications/items/leave.html:16
+#: bookwyrm/templates/notifications/items/leave.html:18
#, python-format
-msgid "has left your group \"%(group_name)s \""
-msgstr "ha dejado tu grupo «%(group_name)s »"
+msgid "%(related_user)s has left your group \"%(group_name)s \""
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/leave.html:26
+#, python-format
+msgid "%(related_user)s and %(second_user)s have left your group \"%(group_name)s \""
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/leave.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others have left your group \"%(group_name)s \""
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:20
#, python-format
-msgid "mentioned you in a review of %(book_title)s "
-msgstr "te mencionó en una reseña de %(book_title)s "
+msgid "%(related_user)s mentioned you in a review of %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:26
#, python-format
-msgid "mentioned you in a comment on %(book_title)s "
-msgstr "te mencionó en un comentario de %(book_title)s "
+msgid "%(related_user)s mentioned you in a comment on %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:32
#, python-format
-msgid "mentioned you in a quote from %(book_title)s "
-msgstr "te mencionó en una cita de %(book_title)s "
+msgid "%(related_user)s mentioned you in a quote from %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:38
#, python-format
-msgid "mentioned you in a status "
-msgstr "te mencionó en un estado "
+msgid "%(related_user)s mentioned you in a status "
+msgstr ""
#: bookwyrm/templates/notifications/items/remove.html:17
#, python-format
@@ -2694,28 +2846,30 @@ msgstr "Te han eliminado del grupo «%(group_name)s
#: bookwyrm/templates/notifications/items/reply.html:21
#, python-format
-msgid " replied to your review of %(book_title)s "
-msgstr "respondió a tu reseña de %(book_title)s "
+msgid "%(related_user)s replied to your review of %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:27
#, python-format
-msgid "replied to your comment on %(book_title)s "
-msgstr "respondió a tu comentario en %(book_title)s "
+msgid "%(related_user)s replied to your comment on %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:33
#, python-format
-msgid "replied to your quote from %(book_title)s "
-msgstr "respondió a tu cita de %(book_title)s "
+msgid "%(related_user)s replied to your quote from %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:39
#, python-format
-msgid "replied to your status "
-msgstr "respondió a tu estado "
+msgid "%(related_user)s replied to your status "
+msgstr ""
#: bookwyrm/templates/notifications/items/report.html:15
#, python-format
-msgid "A new report needs moderation."
-msgstr "Un informe nuevo se requiere moderación."
+msgid "A new report needs moderation"
+msgid_plural "%(display_count)s new reports need moderation"
+msgstr[0] ""
+msgstr[1] ""
#: bookwyrm/templates/notifications/items/update.html:16
#, python-format
@@ -3199,13 +3353,13 @@ msgstr "Falso"
#: bookwyrm/templates/settings/announcements/announcement.html:57
#: bookwyrm/templates/settings/announcements/edit_announcement.html:79
-#: bookwyrm/templates/settings/dashboard/dashboard.html:94
+#: bookwyrm/templates/settings/dashboard/dashboard.html:105
msgid "Start date:"
msgstr "Fecha de inicio:"
#: bookwyrm/templates/settings/announcements/announcement.html:62
#: bookwyrm/templates/settings/announcements/edit_announcement.html:89
-#: bookwyrm/templates/settings/dashboard/dashboard.html:100
+#: bookwyrm/templates/settings/dashboard/dashboard.html:111
msgid "End date:"
msgstr "Fecha final:"
@@ -3365,7 +3519,7 @@ msgid "Dashboard"
msgstr "Tablero"
#: bookwyrm/templates/settings/dashboard/dashboard.html:15
-#: bookwyrm/templates/settings/dashboard/dashboard.html:123
+#: bookwyrm/templates/settings/dashboard/dashboard.html:134
msgid "Total users"
msgstr "Número de usuarios"
@@ -3385,55 +3539,64 @@ msgstr "Obras"
#: bookwyrm/templates/settings/dashboard/dashboard.html:43
#, python-format
+msgid "Your outgoing email address, %(email_sender)s
, may be misconfigured."
+msgstr ""
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:46
+msgid "Check the EMAIL_SENDER_NAME
and EMAIL_SENDER_DOMAIN
in your .env
."
+msgstr ""
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:54
+#, python-format
msgid "%(display_count)s open report"
msgid_plural "%(display_count)s open reports"
msgstr[0] "%(display_count)s informe abierto"
msgstr[1] "%(display_count)s informes abiertos"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:55
+#: bookwyrm/templates/settings/dashboard/dashboard.html:66
#, python-format
msgid "%(display_count)s domain needs review"
msgid_plural "%(display_count)s domains need review"
msgstr[0] "%(display_count)s dominio necesita revisión"
msgstr[1] "%(display_count)s dominios necesitan revisión"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:67
+#: bookwyrm/templates/settings/dashboard/dashboard.html:78
#, python-format
msgid "%(display_count)s invite request"
msgid_plural "%(display_count)s invite requests"
msgstr[0] "%(display_count)s solicitación de invitado"
msgstr[1] "%(display_count)s solicitaciones de invitado"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:79
+#: bookwyrm/templates/settings/dashboard/dashboard.html:90
#, python-format
msgid "An update is available! You're running v%(current)s and the latest release is %(available)s."
msgstr "Hay una actualización disponible. La versión que estás usando es la %(current)s, mientras que la actual es %(available)s."
-#: bookwyrm/templates/settings/dashboard/dashboard.html:88
+#: bookwyrm/templates/settings/dashboard/dashboard.html:99
msgid "Instance Activity"
msgstr "Actividad de instancia"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:106
+#: bookwyrm/templates/settings/dashboard/dashboard.html:117
msgid "Interval:"
msgstr "Intervalo:"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:110
+#: bookwyrm/templates/settings/dashboard/dashboard.html:121
msgid "Days"
msgstr "Dias"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:111
+#: bookwyrm/templates/settings/dashboard/dashboard.html:122
msgid "Weeks"
msgstr "Semanas"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:129
+#: bookwyrm/templates/settings/dashboard/dashboard.html:140
msgid "User signup activity"
msgstr "Actividad de inscripciones de usuarios"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:135
+#: bookwyrm/templates/settings/dashboard/dashboard.html:146
msgid "Status activity"
msgstr "Actividad de estado"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:141
+#: bookwyrm/templates/settings/dashboard/dashboard.html:152
msgid "Works created"
msgstr "Obras creadas"
@@ -3853,7 +4016,7 @@ msgstr "Ningún dominio pendiente actualmente"
msgid "No domains currently blocked"
msgstr "No hay dominios bloqueados actualmente"
-#: bookwyrm/templates/settings/link_domains/link_table.html:39
+#: bookwyrm/templates/settings/link_domains/link_table.html:43
msgid "No links available for this domain."
msgstr "Ningún enlace disponible para este dominio."
@@ -3881,11 +4044,11 @@ msgstr "El estado ha sido eliminado"
msgid "Reported links"
msgstr "Enlaces denunciados"
-#: bookwyrm/templates/settings/reports/report.html:63
+#: bookwyrm/templates/settings/reports/report.html:65
msgid "Moderator Comments"
msgstr "Comentarios de moderador"
-#: bookwyrm/templates/settings/reports/report.html:84
+#: bookwyrm/templates/settings/reports/report.html:86
#: bookwyrm/templates/snippets/create_status.html:26
msgid "Comment"
msgstr "Comentario"
@@ -3895,12 +4058,17 @@ msgstr "Comentario"
msgid "Report #%(report_id)s: Status posted by @%(username)s"
msgstr "Reporte #%(report_id)s: Estado publicado por @%(username)s"
-#: bookwyrm/templates/settings/reports/report_header.html:12
+#: bookwyrm/templates/settings/reports/report_header.html:13
#, python-format
msgid "Report #%(report_id)s: Link added by @%(username)s"
msgstr "Reporte #%(report_id)s: Enlace añadido por @%(username)s"
-#: bookwyrm/templates/settings/reports/report_header.html:18
+#: bookwyrm/templates/settings/reports/report_header.html:17
+#, python-format
+msgid "Report #%(report_id)s: Link domain"
+msgstr ""
+
+#: bookwyrm/templates/settings/reports/report_header.html:24
#, python-format
msgid "Report #%(report_id)s: User @%(username)s"
msgstr "Reporte #%(report_id)s: Usuario @%(username)s"
@@ -4163,11 +4331,15 @@ msgid "Active"
msgstr "Activo"
#: bookwyrm/templates/settings/users/user_admin.html:79
+msgid "Deleted"
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_admin.html:85
#: bookwyrm/templates/settings/users/user_info.html:32
msgid "Inactive"
msgstr "Inactivo"
-#: bookwyrm/templates/settings/users/user_admin.html:88
+#: bookwyrm/templates/settings/users/user_admin.html:94
#: bookwyrm/templates/settings/users/user_info.html:127
msgid "Not set"
msgstr "No establecido"
@@ -5172,15 +5344,6 @@ msgstr "No un archivo csv válido"
msgid "Username or password are incorrect"
msgstr "Nombre de usuario o contraseña es incorrecta"
-#: bookwyrm/views/landing/password.py:32
-msgid "No user with that email address was found."
-msgstr "No se pudo encontrar un usuario con esa dirección de correo electrónico."
-
-#: bookwyrm/views/landing/password.py:43
-#, python-brace-format
-msgid "A password reset link was sent to {email}"
-msgstr "Un enlace para reestablecer tu contraseña se envió a {email}"
-
#: bookwyrm/views/rss_feed.py:34
#, python-brace-format
msgid "Status updates from {obj.display_name}"
diff --git a/locale/fi_FI/LC_MESSAGES/django.mo b/locale/fi_FI/LC_MESSAGES/django.mo
index 4fdb39f56..492f9f547 100644
Binary files a/locale/fi_FI/LC_MESSAGES/django.mo and b/locale/fi_FI/LC_MESSAGES/django.mo differ
diff --git a/locale/fi_FI/LC_MESSAGES/django.po b/locale/fi_FI/LC_MESSAGES/django.po
index bb26b0a0b..f46e70898 100644
--- a/locale/fi_FI/LC_MESSAGES/django.po
+++ b/locale/fi_FI/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-05-31 23:50+0000\n"
-"PO-Revision-Date: 2022-06-01 09:05\n"
+"POT-Creation-Date: 2022-07-07 17:47+0000\n"
+"PO-Revision-Date: 2022-07-07 18:12\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: Finnish\n"
"Language: fi\n"
@@ -121,7 +121,7 @@ msgstr "Varoitus"
msgid "Danger"
msgstr "Vaara"
-#: bookwyrm/models/antispam.py:106 bookwyrm/models/antispam.py:140
+#: bookwyrm/models/antispam.py:101 bookwyrm/models/antispam.py:135
msgid "Automatically generated report"
msgstr "Automaattisesti luotu raportti"
@@ -740,7 +740,7 @@ msgstr "ISNI:"
#: bookwyrm/templates/book/book.html:202
#: bookwyrm/templates/book/edit/edit_book.html:135
#: bookwyrm/templates/book/file_links/add_link_modal.html:60
-#: bookwyrm/templates/book/file_links/edit_links.html:82
+#: bookwyrm/templates/book/file_links/edit_links.html:86
#: bookwyrm/templates/groups/form.html:32
#: bookwyrm/templates/lists/bookmark_button.html:15
#: bookwyrm/templates/lists/edit_item_form.html:15
@@ -1218,16 +1218,21 @@ msgstr "Tila"
msgid "Actions"
msgstr "Toiminnot"
-#: bookwyrm/templates/book/file_links/edit_links.html:53
+#: bookwyrm/templates/book/file_links/edit_links.html:48
+#: bookwyrm/templates/settings/link_domains/link_table.html:21
+msgid "Unknown user"
+msgstr ""
+
+#: bookwyrm/templates/book/file_links/edit_links.html:57
#: bookwyrm/templates/book/file_links/verification_modal.html:22
msgid "Report spam"
msgstr "Ilmoita roskapostiksi"
-#: bookwyrm/templates/book/file_links/edit_links.html:97
+#: bookwyrm/templates/book/file_links/edit_links.html:101
msgid "No links available for this book."
msgstr "Tähän kirjaan ei liity linkkejä."
-#: bookwyrm/templates/book/file_links/edit_links.html:108
+#: bookwyrm/templates/book/file_links/edit_links.html:112
#: bookwyrm/templates/book/file_links/links.html:18
msgid "Add link to file"
msgstr "Lisää linkki tiedostoon"
@@ -1324,7 +1329,7 @@ msgstr "Vahvistuskoodi:"
#: bookwyrm/templates/confirm_email/confirm_email.html:25
#: bookwyrm/templates/landing/layout.html:81
-#: bookwyrm/templates/settings/dashboard/dashboard.html:116
+#: bookwyrm/templates/settings/dashboard/dashboard.html:127
#: bookwyrm/templates/snippets/report_modal.html:53
msgid "Submit"
msgstr "Lähetä"
@@ -1340,7 +1345,7 @@ msgstr "Lähetä vahvistuslinkki uudelleen"
#: bookwyrm/templates/confirm_email/resend_modal.html:15
#: bookwyrm/templates/landing/layout.html:68
-#: bookwyrm/templates/landing/password_reset_request.html:18
+#: bookwyrm/templates/landing/password_reset_request.html:24
#: bookwyrm/templates/preferences/edit_user.html:53
#: bookwyrm/templates/snippets/register_form.html:27
msgid "Email address:"
@@ -1567,14 +1572,20 @@ msgstr "%(site_name)s kutsuu liittymään! Luo käyttäjätili seuraavasta linki
msgid "Learn more about %(site_name)s:"
msgstr "Lue lisää %(site_name)s-yhteisöstä:"
-#: bookwyrm/templates/email/moderation_report/html_content.html:6
-#: bookwyrm/templates/email/moderation_report/text_content.html:5
+#: bookwyrm/templates/email/moderation_report/html_content.html:8
+#: bookwyrm/templates/email/moderation_report/text_content.html:6
#, python-format
-msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation. "
-msgstr "@%(reporter)s on lähettänyt moderointipyynnön käyttäjästä @%(reportee)s. "
+msgid "@%(reporter)s has flagged a link domain for moderation."
+msgstr ""
-#: bookwyrm/templates/email/moderation_report/html_content.html:9
-#: bookwyrm/templates/email/moderation_report/text_content.html:7
+#: bookwyrm/templates/email/moderation_report/html_content.html:14
+#: bookwyrm/templates/email/moderation_report/text_content.html:10
+#, python-format
+msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation."
+msgstr ""
+
+#: bookwyrm/templates/email/moderation_report/html_content.html:21
+#: bookwyrm/templates/email/moderation_report/text_content.html:15
msgid "View report"
msgstr "Näytä raportti"
@@ -2268,10 +2279,15 @@ msgid "Confirm password:"
msgstr "Vahvista salasana:"
#: bookwyrm/templates/landing/password_reset_request.html:14
+#, python-format
+msgid "A password reset link will be sent to %(email)s if there is an account using that email address."
+msgstr ""
+
+#: bookwyrm/templates/landing/password_reset_request.html:20
msgid "A link to reset your password will be sent to your email address"
msgstr "Salasananpalautuslinkki lähetetään sähköpostiosoitteeseesi"
-#: bookwyrm/templates/landing/password_reset_request.html:28
+#: bookwyrm/templates/landing/password_reset_request.html:34
msgid "Reset password"
msgstr "Palauta salasana"
@@ -2579,108 +2595,244 @@ msgstr "Kaikki listat"
msgid "Saved Lists"
msgstr "Tallennetut listat"
-#: bookwyrm/templates/notifications/items/accept.html:16
+#: bookwyrm/templates/notifications/items/accept.html:18
#, python-format
-msgid "accepted your invitation to join group \"%(group_name)s \""
-msgstr "hyväksyi kutsusi liittyä ryhmään ”%(group_name)s ”"
+msgid "%(related_user)s accepted your invitation to join group \"%(group_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/add.html:24
+#: bookwyrm/templates/notifications/items/accept.html:26
#, python-format
-msgid "added %(book_title)s to your list \"%(list_name)s \""
-msgstr "lisäsi teoksen %(book_title)s listaasi ”%(list_name)s ”"
+msgid "%(related_user)s and %(second_user)s accepted your invitation to join group \"%(group_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/add.html:31
+#: bookwyrm/templates/notifications/items/accept.html:36
#, python-format
-msgid "suggested adding %(book_title)s to your list \"%(list_name)s \""
-msgstr "ehdotti teosta %(book_title)s listaasi ”%(list_name)s ”"
+msgid "%(related_user)s and %(other_user_display_count)s others accepted your invitation to join group \"%(group_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:19
+#: bookwyrm/templates/notifications/items/add.html:33
#, python-format
-msgid "boosted your review of %(book_title)s "
-msgstr "kaiutti arviotasi teoksesta %(book_title)s "
+msgid "%(related_user)s added %(book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:25
+#: bookwyrm/templates/notifications/items/add.html:39
#, python-format
-msgid "boosted your comment on%(book_title)s "
-msgstr "kaiutti teokseen %(book_title)s liittyvää kommenttiasi "
+msgid "%(related_user)s suggested adding %(book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:31
+#: bookwyrm/templates/notifications/items/add.html:47
#, python-format
-msgid "boosted your quote from %(book_title)s "
-msgstr "kaiutti lainaustasi teoksesta %(book_title)s "
+msgid "%(related_user)s added %(book_title)s and %(second_book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:37
+#: bookwyrm/templates/notifications/items/add.html:54
#, python-format
-msgid "boosted your status "
-msgstr "kaiutti tilapäivitystäsi "
+msgid "%(related_user)s suggested adding %(book_title)s and %(second_book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/fav.html:19
+#: bookwyrm/templates/notifications/items/add.html:66
#, python-format
-msgid "liked your review of %(book_title)s "
-msgstr "tykkäsi teosta %(book_title)s koskevasta arviostasi "
+msgid "%(related_user)s added %(book_title)s , %(second_book_title)s , and %(display_count)s other book to your list \"%(list_name)s \""
+msgid_plural "%(related_user)s added %(book_title)s , %(second_book_title)s , and %(display_count)s other books to your list \"%(list_name)s \""
+msgstr[0] ""
+msgstr[1] ""
-#: bookwyrm/templates/notifications/items/fav.html:25
+#: bookwyrm/templates/notifications/items/add.html:82
#, python-format
-msgid "liked your comment on %(book_title)s "
-msgstr "tykkäsi teosta %(book_title)s koskevasta kommentistasi "
+msgid "%(related_user)s suggested adding %(book_title)s , %(second_book_title)s , and %(display_count)s other book to your list \"%(list_name)s \""
+msgid_plural "%(related_user)s suggested adding %(book_title)s , %(second_book_title)s , and %(display_count)s other books to your list \"%(list_name)s \""
+msgstr[0] ""
+msgstr[1] ""
-#: bookwyrm/templates/notifications/items/fav.html:31
+#: bookwyrm/templates/notifications/items/boost.html:21
#, python-format
-msgid "liked your quote from %(book_title)s "
-msgstr "tykkäsi lainauksestasi teoksesta %(book_title)s "
+msgid "%(related_user)s boosted your review of %(book_title)s "
+msgstr ""
-#: bookwyrm/templates/notifications/items/fav.html:37
+#: bookwyrm/templates/notifications/items/boost.html:27
#, python-format
-msgid "liked your status "
-msgstr "tykkäsi tilapäivityksestäsi "
+msgid "%(related_user)s and %(second_user)s boosted your review of %(book_title)s "
+msgstr ""
-#: bookwyrm/templates/notifications/items/follow.html:15
-msgid "followed you"
-msgstr "alkoi seurata sinua"
+#: bookwyrm/templates/notifications/items/boost.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your review of %(book_title)s "
+msgstr ""
-#: bookwyrm/templates/notifications/items/follow_request.html:11
-msgid "sent you a follow request"
-msgstr "lähetti pyynnön saada seurata sinua"
+#: bookwyrm/templates/notifications/items/boost.html:44
+#, python-format
+msgid "%(related_user)s boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:50
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:59
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:67
+#, python-format
+msgid "%(related_user)s boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:73
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:82
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:90
+#, python-format
+msgid "%(related_user)s boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:96
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:105
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:21
+#, python-format
+msgid "%(related_user)s liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:27
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:44
+#, python-format
+msgid "%(related_user)s liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:50
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:59
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:67
+#, python-format
+msgid "%(related_user)s liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:73
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:82
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:90
+#, python-format
+msgid "%(related_user)s liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:96
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:105
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:16
+#, python-format
+msgid "%(related_user)s followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:20
+#, python-format
+msgid "%(related_user)s and %(second_user)s followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:25
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow_request.html:15
+#, python-format
+msgid "%(related_user)s sent you a follow request"
+msgstr ""
#: bookwyrm/templates/notifications/items/import.html:14
#, python-format
msgid "Your import completed."
msgstr "Tuonti valmis."
-#: bookwyrm/templates/notifications/items/invite.html:15
+#: bookwyrm/templates/notifications/items/invite.html:16
#, python-format
-msgid "invited you to join the group \"%(group_name)s \""
-msgstr "kutsui sinut ryhmään ”%(group_name)s ”"
+msgid "%(related_user)s invited you to join the group \"%(group_name)s \""
+msgstr ""
#: bookwyrm/templates/notifications/items/join.html:16
#, python-format
msgid "has joined your group \"%(group_name)s \""
msgstr "liittyi ryhmääsi ”%(group_name)s ”"
-#: bookwyrm/templates/notifications/items/leave.html:16
+#: bookwyrm/templates/notifications/items/leave.html:18
#, python-format
-msgid "has left your group \"%(group_name)s \""
-msgstr "on poistunut ryhmästäsi ”%(group_name)s ”"
+msgid "%(related_user)s has left your group \"%(group_name)s \""
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/leave.html:26
+#, python-format
+msgid "%(related_user)s and %(second_user)s have left your group \"%(group_name)s \""
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/leave.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others have left your group \"%(group_name)s \""
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:20
#, python-format
-msgid "mentioned you in a review of %(book_title)s "
-msgstr "mainitsi sinut teoksen %(book_title)s arviossa "
+msgid "%(related_user)s mentioned you in a review of %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:26
#, python-format
-msgid "mentioned you in a comment on %(book_title)s "
-msgstr "mainitsi sinut teosta %(book_title)s koskevassa kommentissa "
+msgid "%(related_user)s mentioned you in a comment on %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:32
#, python-format
-msgid "mentioned you in a quote from %(book_title)s "
-msgstr "mainitsi sinut lainauksessa teoksesta %(book_title)s "
+msgid "%(related_user)s mentioned you in a quote from %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:38
#, python-format
-msgid "mentioned you in a status "
-msgstr "mainitsi sinut tilapäivityksessä "
+msgid "%(related_user)s mentioned you in a status "
+msgstr ""
#: bookwyrm/templates/notifications/items/remove.html:17
#, python-format
@@ -2694,28 +2846,30 @@ msgstr "Sinut on poistettu ryhmästä ”%(group_name
#: bookwyrm/templates/notifications/items/reply.html:21
#, python-format
-msgid " replied to your review of %(book_title)s "
-msgstr "vastasi arvioosi teoksesta %(book_title)s "
+msgid "%(related_user)s replied to your review of %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:27
#, python-format
-msgid "replied to your comment on %(book_title)s "
-msgstr "vastasi teosta %(book_title)s koskevaan kommenttiisi "
+msgid "%(related_user)s replied to your comment on %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:33
#, python-format
-msgid "replied to your quote from %(book_title)s "
-msgstr "vastasi lainaukseesi teoksesta %(book_title)s "
+msgid "%(related_user)s replied to your quote from %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:39
#, python-format
-msgid "replied to your status "
-msgstr "vastasi tilapäivitykseesi "
+msgid "%(related_user)s replied to your status "
+msgstr ""
#: bookwyrm/templates/notifications/items/report.html:15
#, python-format
-msgid "A new report needs moderation."
-msgstr "Uusi raportti odottaa moderointipäätöstä."
+msgid "A new report needs moderation"
+msgid_plural "%(display_count)s new reports need moderation"
+msgstr[0] ""
+msgstr[1] ""
#: bookwyrm/templates/notifications/items/update.html:16
#, python-format
@@ -3199,13 +3353,13 @@ msgstr "Epätosi"
#: bookwyrm/templates/settings/announcements/announcement.html:57
#: bookwyrm/templates/settings/announcements/edit_announcement.html:79
-#: bookwyrm/templates/settings/dashboard/dashboard.html:94
+#: bookwyrm/templates/settings/dashboard/dashboard.html:105
msgid "Start date:"
msgstr "Alkaen:"
#: bookwyrm/templates/settings/announcements/announcement.html:62
#: bookwyrm/templates/settings/announcements/edit_announcement.html:89
-#: bookwyrm/templates/settings/dashboard/dashboard.html:100
+#: bookwyrm/templates/settings/dashboard/dashboard.html:111
msgid "End date:"
msgstr "Päättyen:"
@@ -3365,7 +3519,7 @@ msgid "Dashboard"
msgstr "Kojelauta"
#: bookwyrm/templates/settings/dashboard/dashboard.html:15
-#: bookwyrm/templates/settings/dashboard/dashboard.html:123
+#: bookwyrm/templates/settings/dashboard/dashboard.html:134
msgid "Total users"
msgstr "Käyttäjiä yhteensä"
@@ -3385,55 +3539,64 @@ msgstr "Teoksia"
#: bookwyrm/templates/settings/dashboard/dashboard.html:43
#, python-format
+msgid "Your outgoing email address, %(email_sender)s
, may be misconfigured."
+msgstr ""
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:46
+msgid "Check the EMAIL_SENDER_NAME
and EMAIL_SENDER_DOMAIN
in your .env
."
+msgstr ""
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:54
+#, python-format
msgid "%(display_count)s open report"
msgid_plural "%(display_count)s open reports"
msgstr[0] "%(display_count)s käsittelemätön raportti"
msgstr[1] "%(display_count)s käsittelemätöntä raporttia"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:55
+#: bookwyrm/templates/settings/dashboard/dashboard.html:66
#, python-format
msgid "%(display_count)s domain needs review"
msgid_plural "%(display_count)s domains need review"
msgstr[0] "%(display_count)s verkkotunnus vaatii tarkistusta"
msgstr[1] "%(display_count)s verkkotunnusta vaatii tarkistusta"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:67
+#: bookwyrm/templates/settings/dashboard/dashboard.html:78
#, python-format
msgid "%(display_count)s invite request"
msgid_plural "%(display_count)s invite requests"
msgstr[0] "%(display_count)s kutsupyyntö"
msgstr[1] "%(display_count)s kutsupyyntöä"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:79
+#: bookwyrm/templates/settings/dashboard/dashboard.html:90
#, python-format
msgid "An update is available! You're running v%(current)s and the latest release is %(available)s."
msgstr "Päivitys saatavilla! Käytössäsi on versio %(current)s, ja viimeisin julkaistu versio on %(available)s."
-#: bookwyrm/templates/settings/dashboard/dashboard.html:88
+#: bookwyrm/templates/settings/dashboard/dashboard.html:99
msgid "Instance Activity"
msgstr "Palvelimen aktiivisuus"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:106
+#: bookwyrm/templates/settings/dashboard/dashboard.html:117
msgid "Interval:"
msgstr "Aikaväli:"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:110
+#: bookwyrm/templates/settings/dashboard/dashboard.html:121
msgid "Days"
msgstr "päivä"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:111
+#: bookwyrm/templates/settings/dashboard/dashboard.html:122
msgid "Weeks"
msgstr "viikko"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:129
+#: bookwyrm/templates/settings/dashboard/dashboard.html:140
msgid "User signup activity"
msgstr "Rekisteröityneitä käyttäjiä"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:135
+#: bookwyrm/templates/settings/dashboard/dashboard.html:146
msgid "Status activity"
msgstr "Tilapäivityksiä"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:141
+#: bookwyrm/templates/settings/dashboard/dashboard.html:152
msgid "Works created"
msgstr "Luotuja teoksia"
@@ -3853,7 +4016,7 @@ msgstr "Ei odottavia verkkotunnuksia"
msgid "No domains currently blocked"
msgstr "Ei estettyjä verkkotunnuksia"
-#: bookwyrm/templates/settings/link_domains/link_table.html:39
+#: bookwyrm/templates/settings/link_domains/link_table.html:43
msgid "No links available for this domain."
msgstr "Verkkotunnukselle ei ole linkkejä."
@@ -3881,11 +4044,11 @@ msgstr "Tilapäivitys on poistettu"
msgid "Reported links"
msgstr "Raportoidut linkit"
-#: bookwyrm/templates/settings/reports/report.html:63
+#: bookwyrm/templates/settings/reports/report.html:65
msgid "Moderator Comments"
msgstr "Moderaattorien kommentit"
-#: bookwyrm/templates/settings/reports/report.html:84
+#: bookwyrm/templates/settings/reports/report.html:86
#: bookwyrm/templates/snippets/create_status.html:26
msgid "Comment"
msgstr "Kommentti"
@@ -3895,12 +4058,17 @@ msgstr "Kommentti"
msgid "Report #%(report_id)s: Status posted by @%(username)s"
msgstr "Raportti %(report_id)s: käyttäjän @%(username)s tilapäivitys"
-#: bookwyrm/templates/settings/reports/report_header.html:12
+#: bookwyrm/templates/settings/reports/report_header.html:13
#, python-format
msgid "Report #%(report_id)s: Link added by @%(username)s"
msgstr "Raportti %(report_id)s: käyttäjän @%(username)s lisäämä linkki"
-#: bookwyrm/templates/settings/reports/report_header.html:18
+#: bookwyrm/templates/settings/reports/report_header.html:17
+#, python-format
+msgid "Report #%(report_id)s: Link domain"
+msgstr ""
+
+#: bookwyrm/templates/settings/reports/report_header.html:24
#, python-format
msgid "Report #%(report_id)s: User @%(username)s"
msgstr "Raportti %(report_id)s: käyttäjä @%(username)s"
@@ -4163,11 +4331,15 @@ msgid "Active"
msgstr "Aktiivinen"
#: bookwyrm/templates/settings/users/user_admin.html:79
+msgid "Deleted"
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_admin.html:85
#: bookwyrm/templates/settings/users/user_info.html:32
msgid "Inactive"
msgstr "Ei aktiivinen"
-#: bookwyrm/templates/settings/users/user_admin.html:88
+#: bookwyrm/templates/settings/users/user_admin.html:94
#: bookwyrm/templates/settings/users/user_info.html:127
msgid "Not set"
msgstr "Ei asetettu"
@@ -5172,15 +5344,6 @@ msgstr "Epäkelpo csv-tiedosto"
msgid "Username or password are incorrect"
msgstr "Käyttäjänimi tai salasana on virheellinen"
-#: bookwyrm/views/landing/password.py:32
-msgid "No user with that email address was found."
-msgstr "Tätä sähköpostiosoitetta käyttävää käyttäjää ei löytynyt."
-
-#: bookwyrm/views/landing/password.py:43
-#, python-brace-format
-msgid "A password reset link was sent to {email}"
-msgstr "Osoitteeseen {email} lähetettiin salasananpalautuslinkki"
-
#: bookwyrm/views/rss_feed.py:34
#, python-brace-format
msgid "Status updates from {obj.display_name}"
diff --git a/locale/fr_FR/LC_MESSAGES/django.mo b/locale/fr_FR/LC_MESSAGES/django.mo
index 827080b0c..69fb18862 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 f1cbc5362..3e5bdf86f 100644
--- a/locale/fr_FR/LC_MESSAGES/django.po
+++ b/locale/fr_FR/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-05-31 23:50+0000\n"
-"PO-Revision-Date: 2022-06-10 17:57\n"
+"POT-Creation-Date: 2022-07-07 17:47+0000\n"
+"PO-Revision-Date: 2022-07-08 17:00\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: French\n"
"Language: fr\n"
@@ -121,7 +121,7 @@ msgstr "Avertissement"
msgid "Danger"
msgstr "Danger"
-#: bookwyrm/models/antispam.py:106 bookwyrm/models/antispam.py:140
+#: bookwyrm/models/antispam.py:101 bookwyrm/models/antispam.py:135
msgid "Automatically generated report"
msgstr "Rapport généré automatiquement"
@@ -740,7 +740,7 @@ msgstr "ISNI :"
#: bookwyrm/templates/book/book.html:202
#: bookwyrm/templates/book/edit/edit_book.html:135
#: bookwyrm/templates/book/file_links/add_link_modal.html:60
-#: bookwyrm/templates/book/file_links/edit_links.html:82
+#: bookwyrm/templates/book/file_links/edit_links.html:86
#: bookwyrm/templates/groups/form.html:32
#: bookwyrm/templates/lists/bookmark_button.html:15
#: bookwyrm/templates/lists/edit_item_form.html:15
@@ -1218,16 +1218,21 @@ msgstr "Statut"
msgid "Actions"
msgstr "Actions"
-#: bookwyrm/templates/book/file_links/edit_links.html:53
+#: bookwyrm/templates/book/file_links/edit_links.html:48
+#: bookwyrm/templates/settings/link_domains/link_table.html:21
+msgid "Unknown user"
+msgstr "Compte inconnu"
+
+#: bookwyrm/templates/book/file_links/edit_links.html:57
#: bookwyrm/templates/book/file_links/verification_modal.html:22
msgid "Report spam"
msgstr "Signaler un spam"
-#: bookwyrm/templates/book/file_links/edit_links.html:97
+#: bookwyrm/templates/book/file_links/edit_links.html:101
msgid "No links available for this book."
msgstr "Aucun lien disponible pour ce livre."
-#: bookwyrm/templates/book/file_links/edit_links.html:108
+#: bookwyrm/templates/book/file_links/edit_links.html:112
#: bookwyrm/templates/book/file_links/links.html:18
msgid "Add link to file"
msgstr "Ajouter un lien vers un fichier"
@@ -1324,7 +1329,7 @@ msgstr "Code de confirmation :"
#: bookwyrm/templates/confirm_email/confirm_email.html:25
#: bookwyrm/templates/landing/layout.html:81
-#: bookwyrm/templates/settings/dashboard/dashboard.html:116
+#: bookwyrm/templates/settings/dashboard/dashboard.html:127
#: bookwyrm/templates/snippets/report_modal.html:53
msgid "Submit"
msgstr "Valider"
@@ -1340,7 +1345,7 @@ msgstr "Envoyer le lien de confirmation de nouveau"
#: bookwyrm/templates/confirm_email/resend_modal.html:15
#: bookwyrm/templates/landing/layout.html:68
-#: bookwyrm/templates/landing/password_reset_request.html:18
+#: bookwyrm/templates/landing/password_reset_request.html:24
#: bookwyrm/templates/preferences/edit_user.html:53
#: bookwyrm/templates/snippets/register_form.html:27
msgid "Email address:"
@@ -1567,14 +1572,20 @@ msgstr "Vous avez reçu une invitation à rejoindre %(site_name)s ! Cliquez le
msgid "Learn more about %(site_name)s:"
msgstr "En savoir plus sur %(site_name)s :"
-#: bookwyrm/templates/email/moderation_report/html_content.html:6
-#: bookwyrm/templates/email/moderation_report/text_content.html:5
+#: bookwyrm/templates/email/moderation_report/html_content.html:8
+#: bookwyrm/templates/email/moderation_report/text_content.html:6
#, python-format
-msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation. "
-msgstr "@%(reporter)s a signalé un comportement de @%(reportee)s pour modération. "
+msgid "@%(reporter)s has flagged a link domain for moderation."
+msgstr "@%(reporter)s a signalé le domaine d’un lien pour modération."
-#: bookwyrm/templates/email/moderation_report/html_content.html:9
-#: bookwyrm/templates/email/moderation_report/text_content.html:7
+#: bookwyrm/templates/email/moderation_report/html_content.html:14
+#: bookwyrm/templates/email/moderation_report/text_content.html:10
+#, python-format
+msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation."
+msgstr "@%(reporter)s a signalé un comportement de @%(reportee)s pour modération."
+
+#: bookwyrm/templates/email/moderation_report/html_content.html:21
+#: bookwyrm/templates/email/moderation_report/text_content.html:15
msgid "View report"
msgstr "Voir le signalement"
@@ -2268,10 +2279,15 @@ msgid "Confirm password:"
msgstr "Confirmez le mot de passe :"
#: bookwyrm/templates/landing/password_reset_request.html:14
+#, python-format
+msgid "A password reset link will be sent to %(email)s if there is an account using that email address."
+msgstr "Un lien de réinitialisation du mot de passe sera envoyé à %(email)s s'il y a un compte utilisant cette adresse e-mail."
+
+#: bookwyrm/templates/landing/password_reset_request.html:20
msgid "A link to reset your password will be sent to your email address"
msgstr "Un lien pour changer votre mot de passe sera envoyé à votre addresse email"
-#: bookwyrm/templates/landing/password_reset_request.html:28
+#: bookwyrm/templates/landing/password_reset_request.html:34
msgid "Reset password"
msgstr "Changer de mot de passe"
@@ -2579,108 +2595,244 @@ msgstr "Toutes les listes"
msgid "Saved Lists"
msgstr "Listes sauvegardées"
-#: bookwyrm/templates/notifications/items/accept.html:16
+#: bookwyrm/templates/notifications/items/accept.html:18
#, python-format
-msgid "accepted your invitation to join group \"%(group_name)s \""
-msgstr "a accepté votre invitation à rejoindre le groupe \"%(group_name)s \""
+msgid "%(related_user)s accepted your invitation to join group \"%(group_name)s \""
+msgstr "%(related_user)s a accepté votre invitation à rejoindre le groupe \"%(group_name)s \""
-#: bookwyrm/templates/notifications/items/add.html:24
+#: bookwyrm/templates/notifications/items/accept.html:26
#, python-format
-msgid "added %(book_title)s to your list \"%(list_name)s \""
-msgstr "a ajouté %(book_title)s à votre liste \"%(list_name)s \""
+msgid "%(related_user)s and %(second_user)s accepted your invitation to join group \"%(group_name)s \""
+msgstr "%(related_user)s et %(second_user)s ont accepté votre invitation à rejoindre le groupe \"%(group_name)s \""
-#: bookwyrm/templates/notifications/items/add.html:31
+#: bookwyrm/templates/notifications/items/accept.html:36
#, python-format
-msgid "suggested adding %(book_title)s to your list \"%(list_name)s \""
-msgstr "a suggéré d'ajouter %(book_title)s à votre liste \"%(list_name)s \""
+msgid "%(related_user)s and %(other_user_display_count)s others accepted your invitation to join group \"%(group_name)s \""
+msgstr "%(related_user)s et %(other_user_display_count)s autres ont accepté votre invitation à rejoindre le groupe \"%(group_name)s \""
-#: bookwyrm/templates/notifications/items/boost.html:19
+#: bookwyrm/templates/notifications/items/add.html:33
#, python-format
-msgid "boosted your review of %(book_title)s "
-msgstr "a partagé votre critique de %(book_title)s "
+msgid "%(related_user)s added %(book_title)s to your list \"%(list_name)s \""
+msgstr "%(related_user)s a ajouté %(book_title)s à votre liste \"%(list_name)s \""
-#: bookwyrm/templates/notifications/items/boost.html:25
+#: bookwyrm/templates/notifications/items/add.html:39
#, python-format
-msgid "boosted your comment on%(book_title)s "
-msgstr "a partagé votre commentaire sur %(book_title)s "
+msgid "%(related_user)s suggested adding %(book_title)s to your list \"%(list_name)s \""
+msgstr "%(related_user)s a suggéré d'ajouter %(book_title)s à votre liste \"%(list_name)s \""
-#: bookwyrm/templates/notifications/items/boost.html:31
+#: bookwyrm/templates/notifications/items/add.html:47
#, python-format
-msgid "boosted your quote from %(book_title)s "
-msgstr "a partagé votre citation de %(book_title)s "
+msgid "%(related_user)s added %(book_title)s and %(second_book_title)s to your list \"%(list_name)s \""
+msgstr "%(related_user)s a ajouté %(book_title)s et %(second_book_title)s à votre liste \"%(list_name)s \""
-#: bookwyrm/templates/notifications/items/boost.html:37
+#: bookwyrm/templates/notifications/items/add.html:54
#, python-format
-msgid "boosted your status "
-msgstr "a partagé votre statut "
+msgid "%(related_user)s suggested adding %(book_title)s and %(second_book_title)s to your list \"%(list_name)s \""
+msgstr "%(related_user)s a suggéré d'ajouter %(book_title)s et %(second_book_title)s à votre liste \"%(list_name)s \""
-#: bookwyrm/templates/notifications/items/fav.html:19
+#: bookwyrm/templates/notifications/items/add.html:66
#, python-format
-msgid "liked your review of %(book_title)s "
-msgstr "a ajouté votre critique de %(book_title)s à ses favoris"
+msgid "%(related_user)s added %(book_title)s , %(second_book_title)s , and %(display_count)s other book to your list \"%(list_name)s \""
+msgid_plural "%(related_user)s added %(book_title)s , %(second_book_title)s , and %(display_count)s other books to your list \"%(list_name)s \""
+msgstr[0] "%(related_user)s a ajouté %(book_title)s , %(second_book_title)s et %(display_count)s autre livre à votre liste \"%(list_name)s \""
+msgstr[1] "%(related_user)s a ajouté %(book_title)s , %(second_book_title)s et %(display_count)s autres livres dans votre liste \"%(list_name)s \""
-#: bookwyrm/templates/notifications/items/fav.html:25
+#: bookwyrm/templates/notifications/items/add.html:82
#, python-format
-msgid "liked your comment on %(book_title)s "
-msgstr "a ajouté votre commentaire sur %(book_title)s à ses favoris"
+msgid "%(related_user)s suggested adding %(book_title)s , %(second_book_title)s , and %(display_count)s other book to your list \"%(list_name)s \""
+msgid_plural "%(related_user)s suggested adding %(book_title)s , %(second_book_title)s , and %(display_count)s other books to your list \"%(list_name)s \""
+msgstr[0] "%(related_user)s a suggéré d'ajouter %(book_title)s , %(second_book_title)s et %(display_count)s autre livre à votre liste \"%(list_name)s \""
+msgstr[1] "%(related_user)s a suggéré d'ajouter %(book_title)s , %(second_book_title)s et %(display_count)s autres livres dans votre liste \"%(list_name)s \""
-#: bookwyrm/templates/notifications/items/fav.html:31
+#: bookwyrm/templates/notifications/items/boost.html:21
#, python-format
-msgid "liked your quote from %(book_title)s "
-msgstr "a ajouté votre citation de %(book_title)s à ses favoris"
+msgid "%(related_user)s boosted your review of %(book_title)s "
+msgstr "%(related_user)s a boosté votre critique de %(book_title)s "
-#: bookwyrm/templates/notifications/items/fav.html:37
+#: bookwyrm/templates/notifications/items/boost.html:27
#, python-format
-msgid "liked your status "
-msgstr "a ajouté votre statut à ses favoris"
+msgid "%(related_user)s and %(second_user)s boosted your review of %(book_title)s "
+msgstr "%(related_user)s et %(second_user)s ont boosté votre critique de %(book_title)s "
-#: bookwyrm/templates/notifications/items/follow.html:15
-msgid "followed you"
-msgstr "vous suit"
+#: bookwyrm/templates/notifications/items/boost.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your review of %(book_title)s "
+msgstr "%(related_user)s et %(other_user_display_count)s autres ont boosté votre critique de %(book_title)s "
-#: bookwyrm/templates/notifications/items/follow_request.html:11
-msgid "sent you a follow request"
-msgstr "vous a envoyé une demande d’abonnement"
+#: bookwyrm/templates/notifications/items/boost.html:44
+#, python-format
+msgid "%(related_user)s boosted your comment on %(book_title)s "
+msgstr "%(related_user)s a boosté votre commentaire sur %(book_title)s "
+
+#: bookwyrm/templates/notifications/items/boost.html:50
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your comment on %(book_title)s "
+msgstr "%(related_user)s et %(second_user)s ont boosté votre commentaire sur %(book_title)s "
+
+#: bookwyrm/templates/notifications/items/boost.html:59
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your comment on %(book_title)s "
+msgstr "%(related_user)s et %(other_user_display_count)s autres ont boosté votre commentaire sur %(book_title)s "
+
+#: bookwyrm/templates/notifications/items/boost.html:67
+#, python-format
+msgid "%(related_user)s boosted your quote from %(book_title)s "
+msgstr "%(related_user)s a boosté votre citation de %(book_title)s "
+
+#: bookwyrm/templates/notifications/items/boost.html:73
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your quote from %(book_title)s "
+msgstr "%(related_user)s et %(second_user)s ont boosté votre citation de %(book_title)s "
+
+#: bookwyrm/templates/notifications/items/boost.html:82
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your quote from %(book_title)s "
+msgstr "%(related_user)s et %(other_user_display_count)s autres ont boosté votre citation de %(book_title)s "
+
+#: bookwyrm/templates/notifications/items/boost.html:90
+#, python-format
+msgid "%(related_user)s boosted your status "
+msgstr "%(related_user)s a boosté votre statut "
+
+#: bookwyrm/templates/notifications/items/boost.html:96
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your status "
+msgstr "%(related_user)s et %(second_user)s ont boosté votre statut "
+
+#: bookwyrm/templates/notifications/items/boost.html:105
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your status "
+msgstr "%(related_user)s et %(other_user_display_count)s autres ont boosté votre statut "
+
+#: bookwyrm/templates/notifications/items/fav.html:21
+#, python-format
+msgid "%(related_user)s liked your review of %(book_title)s "
+msgstr "%(related_user)s a aimé votre critique de %(book_title)s "
+
+#: bookwyrm/templates/notifications/items/fav.html:27
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your review of %(book_title)s "
+msgstr "%(related_user)s et %(second_user)s ont aimé votre critique de %(book_title)s "
+
+#: bookwyrm/templates/notifications/items/fav.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your review of %(book_title)s "
+msgstr "%(related_user)s et %(other_user_display_count)s autres ont aimé votre critique de %(book_title)s "
+
+#: bookwyrm/templates/notifications/items/fav.html:44
+#, python-format
+msgid "%(related_user)s liked your comment on %(book_title)s "
+msgstr "%(related_user)s a aimé votre commentaire sur %(book_title)s "
+
+#: bookwyrm/templates/notifications/items/fav.html:50
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your comment on %(book_title)s "
+msgstr "%(related_user)s et %(second_user)s ont aimé votre commentaire sur %(book_title)s "
+
+#: bookwyrm/templates/notifications/items/fav.html:59
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your comment on %(book_title)s "
+msgstr "%(related_user)s et %(other_user_display_count)s autres ont aimé votre commentaire sur %(book_title)s "
+
+#: bookwyrm/templates/notifications/items/fav.html:67
+#, python-format
+msgid "%(related_user)s liked your quote from %(book_title)s "
+msgstr "%(related_user)s a aimé votre citation de %(book_title)s "
+
+#: bookwyrm/templates/notifications/items/fav.html:73
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your quote from %(book_title)s "
+msgstr "%(related_user)s et %(second_user)s ont aimé votre citation de %(book_title)s "
+
+#: bookwyrm/templates/notifications/items/fav.html:82
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your quote from %(book_title)s "
+msgstr "%(related_user)s et %(other_user_display_count)s autres ont aimé votre citation de %(book_title)s "
+
+#: bookwyrm/templates/notifications/items/fav.html:90
+#, python-format
+msgid "%(related_user)s liked your status "
+msgstr "%(related_user)s a aimé votre statut "
+
+#: bookwyrm/templates/notifications/items/fav.html:96
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your status "
+msgstr "%(related_user)s et %(second_user)s ont aimé votre statut "
+
+#: bookwyrm/templates/notifications/items/fav.html:105
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your status "
+msgstr "%(related_user)s et %(other_user_display_count)s autres ont aimé votre statut "
+
+#: bookwyrm/templates/notifications/items/follow.html:16
+#, python-format
+msgid "%(related_user)s followed you"
+msgstr "%(related_user)s a commencé à vous suivre"
+
+#: bookwyrm/templates/notifications/items/follow.html:20
+#, python-format
+msgid "%(related_user)s and %(second_user)s followed you"
+msgstr "%(related_user)s et %(second_user)s ont commencé à vous suivre"
+
+#: bookwyrm/templates/notifications/items/follow.html:25
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others followed you"
+msgstr "%(related_user)s et %(other_user_display_count)s autres ont commencé à vous suivre"
+
+#: bookwyrm/templates/notifications/items/follow_request.html:15
+#, python-format
+msgid "%(related_user)s sent you a follow request"
+msgstr "%(related_user)s vous a envoyé une demande d'abonnement"
#: bookwyrm/templates/notifications/items/import.html:14
#, python-format
msgid "Your import completed."
msgstr "Votre importation est terminée."
-#: bookwyrm/templates/notifications/items/invite.html:15
+#: bookwyrm/templates/notifications/items/invite.html:16
#, python-format
-msgid "invited you to join the group \"%(group_name)s \""
-msgstr "vous a invité·e à rejoindre le groupe \"%(group_name)s \""
+msgid "%(related_user)s invited you to join the group \"%(group_name)s \""
+msgstr "%(related_user)s vous a invité à rejoindre le groupe \"%(group_name)s \""
#: bookwyrm/templates/notifications/items/join.html:16
#, python-format
msgid "has joined your group \"%(group_name)s \""
msgstr "a rejoint votre groupe \"%(group_name)s \""
-#: bookwyrm/templates/notifications/items/leave.html:16
+#: bookwyrm/templates/notifications/items/leave.html:18
#, python-format
-msgid "has left your group \"%(group_name)s \""
-msgstr "a quitté votre groupe \"%(group_name)s \""
+msgid "%(related_user)s has left your group \"%(group_name)s \""
+msgstr "%(related_user)s a quitté votre groupe \"%(group_name)s \""
+
+#: bookwyrm/templates/notifications/items/leave.html:26
+#, python-format
+msgid "%(related_user)s and %(second_user)s have left your group \"%(group_name)s \""
+msgstr "%(related_user)s et %(second_user)s ont quitté votre groupe \"%(group_name)s \""
+
+#: bookwyrm/templates/notifications/items/leave.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others have left your group \"%(group_name)s \""
+msgstr "%(related_user)s et %(other_user_display_count)s autres ont quitté votre groupe \"%(group_name)s \""
#: bookwyrm/templates/notifications/items/mention.html:20
#, python-format
-msgid "mentioned you in a review of %(book_title)s "
-msgstr "vous a mentionné dans sa critique de %(book_title)s "
+msgid "%(related_user)s mentioned you in a review of %(book_title)s "
+msgstr "%(related_user)s vous a mentionné(e) dans une critique de %(book_title)s "
#: bookwyrm/templates/notifications/items/mention.html:26
#, python-format
-msgid "mentioned you in a comment on %(book_title)s "
-msgstr "vous a mentionné dans son commentaire sur %(book_title)s "
+msgid "%(related_user)s mentioned you in a comment on %(book_title)s "
+msgstr "%(related_user)s vous a mentionné(e) dans un commentaire sur %(book_title)s "
#: bookwyrm/templates/notifications/items/mention.html:32
#, python-format
-msgid "mentioned you in a quote from %(book_title)s "
-msgstr "vous a mentionné dans sa citation de %(book_title)s "
+msgid "%(related_user)s mentioned you in a quote from %(book_title)s "
+msgstr "%(related_user)s vous a mentionné(e) dans une citation de %(book_title)s "
#: bookwyrm/templates/notifications/items/mention.html:38
#, python-format
-msgid "mentioned you in a status "
-msgstr "vous a mentionné dans son statut "
+msgid "%(related_user)s mentioned you in a status "
+msgstr "%(related_user)s vous a mentionné(e) dans un statut "
#: bookwyrm/templates/notifications/items/remove.html:17
#, python-format
@@ -2694,28 +2846,30 @@ msgstr "Vous avez été retiré·e du groupe \"%(grou
#: bookwyrm/templates/notifications/items/reply.html:21
#, python-format
-msgid " replied to your review of %(book_title)s "
-msgstr "a répondu à votre critique de %(book_title)s "
+msgid "%(related_user)s replied to your review of %(book_title)s "
+msgstr "%(related_user)s a répondu à votre critique de %(book_title)s "
#: bookwyrm/templates/notifications/items/reply.html:27
#, python-format
-msgid "replied to your comment on %(book_title)s "
-msgstr "a répondu à votre commentaire sur %(book_title)s "
+msgid "%(related_user)s replied to your comment on %(book_title)s "
+msgstr "%(related_user)s a répondu à votre commentaire sur %(book_title)s "
#: bookwyrm/templates/notifications/items/reply.html:33
#, python-format
-msgid "replied to your quote from %(book_title)s "
-msgstr "a répondu à votre citation de %(book_title)s "
+msgid "%(related_user)s replied to your quote from %(book_title)s "
+msgstr "%(related_user)s a répondu à votre citation de %(book_title)s "
#: bookwyrm/templates/notifications/items/reply.html:39
#, python-format
-msgid "replied to your status "
-msgstr "a répondu à votre statut "
+msgid "%(related_user)s replied to your status "
+msgstr "%(related_user)s a répondu à votre statut "
#: bookwyrm/templates/notifications/items/report.html:15
#, python-format
-msgid "A new report needs moderation."
-msgstr "Un nouveau signalement a besoin d’être traité."
+msgid "A new report needs moderation"
+msgid_plural "%(display_count)s new reports need moderation"
+msgstr[0] "Un nouveau signalement a besoin d’être traité"
+msgstr[1] "%(display_count)s nouveaux signalements ont besoin d’être traités"
#: bookwyrm/templates/notifications/items/update.html:16
#, python-format
@@ -3199,13 +3353,13 @@ msgstr "Faux"
#: bookwyrm/templates/settings/announcements/announcement.html:57
#: bookwyrm/templates/settings/announcements/edit_announcement.html:79
-#: bookwyrm/templates/settings/dashboard/dashboard.html:94
+#: bookwyrm/templates/settings/dashboard/dashboard.html:105
msgid "Start date:"
msgstr "Date de début :"
#: bookwyrm/templates/settings/announcements/announcement.html:62
#: bookwyrm/templates/settings/announcements/edit_announcement.html:89
-#: bookwyrm/templates/settings/dashboard/dashboard.html:100
+#: bookwyrm/templates/settings/dashboard/dashboard.html:111
msgid "End date:"
msgstr "Date de fin :"
@@ -3365,7 +3519,7 @@ msgid "Dashboard"
msgstr "Tableau de bord"
#: bookwyrm/templates/settings/dashboard/dashboard.html:15
-#: bookwyrm/templates/settings/dashboard/dashboard.html:123
+#: bookwyrm/templates/settings/dashboard/dashboard.html:134
msgid "Total users"
msgstr "Nombre total d'utilisateurs·rices"
@@ -3385,55 +3539,64 @@ msgstr "Œuvres"
#: bookwyrm/templates/settings/dashboard/dashboard.html:43
#, python-format
+msgid "Your outgoing email address, %(email_sender)s
, may be misconfigured."
+msgstr "Votre adresse e-mail sortante, %(email_sender)s
, pourrait être mal configurée."
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:46
+msgid "Check the EMAIL_SENDER_NAME
and EMAIL_SENDER_DOMAIN
in your .env
."
+msgstr "Vérifiez EMAIL_SENDER_NAME
et EMAIL_SENDER_DOMAIN
dans votre .env
."
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:54
+#, python-format
msgid "%(display_count)s open report"
msgid_plural "%(display_count)s open reports"
msgstr[0] "%(display_count)s signalement ouvert"
msgstr[1] "%(display_count)s signalements ouverts"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:55
+#: bookwyrm/templates/settings/dashboard/dashboard.html:66
#, python-format
msgid "%(display_count)s domain needs review"
msgid_plural "%(display_count)s domains need review"
msgstr[0] "%(display_count)s domaine doit être vérifié"
msgstr[1] "%(display_count)s domaines doivent être vérifiés"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:67
+#: bookwyrm/templates/settings/dashboard/dashboard.html:78
#, python-format
msgid "%(display_count)s invite request"
msgid_plural "%(display_count)s invite requests"
msgstr[0] "%(display_count)s demande d'invitation"
msgstr[1] "%(display_count)s demandes d'invitation"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:79
+#: bookwyrm/templates/settings/dashboard/dashboard.html:90
#, python-format
msgid "An update is available! You're running v%(current)s and the latest release is %(available)s."
msgstr "Une mise à jour est disponible ! Vous utilisez la version%(current)s et la dernière version est %(available)s."
-#: bookwyrm/templates/settings/dashboard/dashboard.html:88
+#: bookwyrm/templates/settings/dashboard/dashboard.html:99
msgid "Instance Activity"
msgstr "Activité de l'instance"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:106
+#: bookwyrm/templates/settings/dashboard/dashboard.html:117
msgid "Interval:"
msgstr "Intervalle :"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:110
+#: bookwyrm/templates/settings/dashboard/dashboard.html:121
msgid "Days"
msgstr "Jours"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:111
+#: bookwyrm/templates/settings/dashboard/dashboard.html:122
msgid "Weeks"
msgstr "Semaines"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:129
+#: bookwyrm/templates/settings/dashboard/dashboard.html:140
msgid "User signup activity"
msgstr "Nouvelles inscriptions"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:135
+#: bookwyrm/templates/settings/dashboard/dashboard.html:146
msgid "Status activity"
msgstr "Nouveaux statuts"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:141
+#: bookwyrm/templates/settings/dashboard/dashboard.html:152
msgid "Works created"
msgstr "Œuvres créées"
@@ -3853,7 +4016,7 @@ msgstr "Aucun domaine en attente"
msgid "No domains currently blocked"
msgstr "Aucun domaine actuellement bloqué"
-#: bookwyrm/templates/settings/link_domains/link_table.html:39
+#: bookwyrm/templates/settings/link_domains/link_table.html:43
msgid "No links available for this domain."
msgstr "Aucun lien n’est disponible pour ce domaine."
@@ -3881,11 +4044,11 @@ msgstr "Le statut a été supprimé"
msgid "Reported links"
msgstr "Liens signalés"
-#: bookwyrm/templates/settings/reports/report.html:63
+#: bookwyrm/templates/settings/reports/report.html:65
msgid "Moderator Comments"
msgstr "Commentaires de l’équipe de modération"
-#: bookwyrm/templates/settings/reports/report.html:84
+#: bookwyrm/templates/settings/reports/report.html:86
#: bookwyrm/templates/snippets/create_status.html:26
msgid "Comment"
msgstr "Commentaire"
@@ -3895,12 +4058,17 @@ msgstr "Commentaire"
msgid "Report #%(report_id)s: Status posted by @%(username)s"
msgstr "Signalement #%(report_id)s : statut posté par @%(username)s"
-#: bookwyrm/templates/settings/reports/report_header.html:12
+#: bookwyrm/templates/settings/reports/report_header.html:13
#, python-format
msgid "Report #%(report_id)s: Link added by @%(username)s"
msgstr "Signalement #%(report_id)s : lien ajouté par @%(username)s"
-#: bookwyrm/templates/settings/reports/report_header.html:18
+#: bookwyrm/templates/settings/reports/report_header.html:17
+#, python-format
+msgid "Report #%(report_id)s: Link domain"
+msgstr "Rapport nº %(report_id)s : Domaine du lien"
+
+#: bookwyrm/templates/settings/reports/report_header.html:24
#, python-format
msgid "Report #%(report_id)s: User @%(username)s"
msgstr "Signalement #%(report_id)s : compte @%(username)s"
@@ -4163,11 +4331,15 @@ msgid "Active"
msgstr "Actif"
#: bookwyrm/templates/settings/users/user_admin.html:79
+msgid "Deleted"
+msgstr "Supprimé"
+
+#: bookwyrm/templates/settings/users/user_admin.html:85
#: bookwyrm/templates/settings/users/user_info.html:32
msgid "Inactive"
msgstr "Inactif"
-#: bookwyrm/templates/settings/users/user_admin.html:88
+#: bookwyrm/templates/settings/users/user_admin.html:94
#: bookwyrm/templates/settings/users/user_info.html:127
msgid "Not set"
msgstr "Non défini"
@@ -5172,15 +5344,6 @@ msgstr "Fichier CSV non valide"
msgid "Username or password are incorrect"
msgstr "Identifiant ou mot de passe incorrect"
-#: bookwyrm/views/landing/password.py:32
-msgid "No user with that email address was found."
-msgstr "Aucun compte avec cette adresse email n’a été trouvé."
-
-#: bookwyrm/views/landing/password.py:43
-#, python-brace-format
-msgid "A password reset link was sent to {email}"
-msgstr "Un lien de réinitialisation a été envoyé à {email}."
-
#: bookwyrm/views/rss_feed.py:34
#, python-brace-format
msgid "Status updates from {obj.display_name}"
diff --git a/locale/gl_ES/LC_MESSAGES/django.mo b/locale/gl_ES/LC_MESSAGES/django.mo
index 08eca4a48..ab178a376 100644
Binary files a/locale/gl_ES/LC_MESSAGES/django.mo and b/locale/gl_ES/LC_MESSAGES/django.mo differ
diff --git a/locale/gl_ES/LC_MESSAGES/django.po b/locale/gl_ES/LC_MESSAGES/django.po
index ac0d16262..876afbf1e 100644
--- a/locale/gl_ES/LC_MESSAGES/django.po
+++ b/locale/gl_ES/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-05-31 23:50+0000\n"
-"PO-Revision-Date: 2022-06-01 04:46\n"
+"POT-Creation-Date: 2022-07-07 17:47+0000\n"
+"PO-Revision-Date: 2022-07-08 13:09\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: Galician\n"
"Language: gl\n"
@@ -121,7 +121,7 @@ msgstr "Advertencia"
msgid "Danger"
msgstr "Perigo"
-#: bookwyrm/models/antispam.py:106 bookwyrm/models/antispam.py:140
+#: bookwyrm/models/antispam.py:101 bookwyrm/models/antispam.py:135
msgid "Automatically generated report"
msgstr "Denuncia creada automáticamente"
@@ -740,7 +740,7 @@ msgstr "ISNI:"
#: bookwyrm/templates/book/book.html:202
#: bookwyrm/templates/book/edit/edit_book.html:135
#: bookwyrm/templates/book/file_links/add_link_modal.html:60
-#: bookwyrm/templates/book/file_links/edit_links.html:82
+#: bookwyrm/templates/book/file_links/edit_links.html:86
#: bookwyrm/templates/groups/form.html:32
#: bookwyrm/templates/lists/bookmark_button.html:15
#: bookwyrm/templates/lists/edit_item_form.html:15
@@ -1218,16 +1218,21 @@ msgstr "Estado"
msgid "Actions"
msgstr "Accións"
-#: bookwyrm/templates/book/file_links/edit_links.html:53
+#: bookwyrm/templates/book/file_links/edit_links.html:48
+#: bookwyrm/templates/settings/link_domains/link_table.html:21
+msgid "Unknown user"
+msgstr "Usuaria descoñecida"
+
+#: bookwyrm/templates/book/file_links/edit_links.html:57
#: bookwyrm/templates/book/file_links/verification_modal.html:22
msgid "Report spam"
msgstr "Denunciar spam"
-#: bookwyrm/templates/book/file_links/edit_links.html:97
+#: bookwyrm/templates/book/file_links/edit_links.html:101
msgid "No links available for this book."
msgstr "Sen ligazóns para para este libro."
-#: bookwyrm/templates/book/file_links/edit_links.html:108
+#: bookwyrm/templates/book/file_links/edit_links.html:112
#: bookwyrm/templates/book/file_links/links.html:18
msgid "Add link to file"
msgstr "Engadir ligazón ao ficheiro"
@@ -1324,7 +1329,7 @@ msgstr "Código de confirmación:"
#: bookwyrm/templates/confirm_email/confirm_email.html:25
#: bookwyrm/templates/landing/layout.html:81
-#: bookwyrm/templates/settings/dashboard/dashboard.html:116
+#: bookwyrm/templates/settings/dashboard/dashboard.html:127
#: bookwyrm/templates/snippets/report_modal.html:53
msgid "Submit"
msgstr "Enviar"
@@ -1340,7 +1345,7 @@ msgstr "Reenviar ligazón de confirmación"
#: bookwyrm/templates/confirm_email/resend_modal.html:15
#: bookwyrm/templates/landing/layout.html:68
-#: bookwyrm/templates/landing/password_reset_request.html:18
+#: bookwyrm/templates/landing/password_reset_request.html:24
#: bookwyrm/templates/preferences/edit_user.html:53
#: bookwyrm/templates/snippets/register_form.html:27
msgid "Email address:"
@@ -1567,14 +1572,20 @@ msgstr "Foches convidada a unirte a %(site_name)s! Preme na ligazón para crear
msgid "Learn more about %(site_name)s:"
msgstr "Coñece máis acerca de %(site_name)s:"
-#: bookwyrm/templates/email/moderation_report/html_content.html:6
-#: bookwyrm/templates/email/moderation_report/text_content.html:5
+#: bookwyrm/templates/email/moderation_report/html_content.html:8
+#: bookwyrm/templates/email/moderation_report/text_content.html:6
#, python-format
-msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation. "
-msgstr "@%(reporter)s marcou o comportamento de @%(reportee)s para revisión. "
+msgid "@%(reporter)s has flagged a link domain for moderation."
+msgstr "@%(reporter)s marcou o dominio dunha ligazón para revisar."
-#: bookwyrm/templates/email/moderation_report/html_content.html:9
-#: bookwyrm/templates/email/moderation_report/text_content.html:7
+#: bookwyrm/templates/email/moderation_report/html_content.html:14
+#: bookwyrm/templates/email/moderation_report/text_content.html:10
+#, python-format
+msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation."
+msgstr "@%(reporter)s marcou o comportamento de @%(reportee)s para ser revisado."
+
+#: bookwyrm/templates/email/moderation_report/html_content.html:21
+#: bookwyrm/templates/email/moderation_report/text_content.html:15
msgid "View report"
msgstr "Ver denuncia"
@@ -2268,10 +2279,15 @@ msgid "Confirm password:"
msgstr "Confirma o contrasinal:"
#: bookwyrm/templates/landing/password_reset_request.html:14
+#, python-format
+msgid "A password reset link will be sent to %(email)s if there is an account using that email address."
+msgstr ""
+
+#: bookwyrm/templates/landing/password_reset_request.html:20
msgid "A link to reset your password will be sent to your email address"
msgstr "Enviaremos unha ligazón ao teu email para restablecer o contrasinal"
-#: bookwyrm/templates/landing/password_reset_request.html:28
+#: bookwyrm/templates/landing/password_reset_request.html:34
msgid "Reset password"
msgstr "Restablecer contrasinal"
@@ -2579,108 +2595,244 @@ msgstr "Tódalas listas"
msgid "Saved Lists"
msgstr "Listas gardadas"
-#: bookwyrm/templates/notifications/items/accept.html:16
+#: bookwyrm/templates/notifications/items/accept.html:18
#, python-format
-msgid "accepted your invitation to join group \"%(group_name)s \""
-msgstr "aceptou o teu convite para unirse ao grupo \"%(group_name)s \""
+msgid "%(related_user)s accepted your invitation to join group \"%(group_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/add.html:24
+#: bookwyrm/templates/notifications/items/accept.html:26
#, python-format
-msgid "added %(book_title)s to your list \"%(list_name)s \""
-msgstr "engadiu %(book_title)s á túa lista \"%(list_name)s \""
+msgid "%(related_user)s and %(second_user)s accepted your invitation to join group \"%(group_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/add.html:31
+#: bookwyrm/templates/notifications/items/accept.html:36
#, python-format
-msgid "suggested adding %(book_title)s to your list \"%(list_name)s \""
-msgstr "suxeriu engadir %(book_title)s á túa lista \"%(list_name)s \""
+msgid "%(related_user)s and %(other_user_display_count)s others accepted your invitation to join group \"%(group_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:19
+#: bookwyrm/templates/notifications/items/add.html:33
#, python-format
-msgid "boosted your review of %(book_title)s "
-msgstr "promoveu a túa recensión de %(book_title)s "
+msgid "%(related_user)s added %(book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:25
+#: bookwyrm/templates/notifications/items/add.html:39
#, python-format
-msgid "boosted your comment on%(book_title)s "
-msgstr "promoveu o teu comentario acerca de %(book_title)s "
+msgid "%(related_user)s suggested adding %(book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:31
+#: bookwyrm/templates/notifications/items/add.html:47
#, python-format
-msgid "boosted your quote from %(book_title)s "
-msgstr "promoveu a túa cita acerca de %(book_title)s "
+msgid "%(related_user)s added %(book_title)s and %(second_book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:37
+#: bookwyrm/templates/notifications/items/add.html:54
#, python-format
-msgid "boosted your status "
-msgstr "promoveu a túa publicación "
+msgid "%(related_user)s suggested adding %(book_title)s and %(second_book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/fav.html:19
+#: bookwyrm/templates/notifications/items/add.html:66
#, python-format
-msgid "liked your review of %(book_title)s "
-msgstr "gustoulle a túa recensión de %(book_title)s "
+msgid "%(related_user)s added %(book_title)s , %(second_book_title)s , and %(display_count)s other book to your list \"%(list_name)s \""
+msgid_plural "%(related_user)s added %(book_title)s , %(second_book_title)s , and %(display_count)s other books to your list \"%(list_name)s \""
+msgstr[0] ""
+msgstr[1] ""
-#: bookwyrm/templates/notifications/items/fav.html:25
+#: bookwyrm/templates/notifications/items/add.html:82
#, python-format
-msgid "liked your comment on %(book_title)s "
-msgstr "gustoulle o teu comentario para %(book_title)s "
+msgid "%(related_user)s suggested adding %(book_title)s , %(second_book_title)s , and %(display_count)s other book to your list \"%(list_name)s \""
+msgid_plural "%(related_user)s suggested adding %(book_title)s , %(second_book_title)s , and %(display_count)s other books to your list \"%(list_name)s \""
+msgstr[0] ""
+msgstr[1] ""
-#: bookwyrm/templates/notifications/items/fav.html:31
+#: bookwyrm/templates/notifications/items/boost.html:21
#, python-format
-msgid "liked your quote from %(book_title)s "
-msgstr "gustoulle a túa cita de %(book_title)s "
+msgid "%(related_user)s boosted your review of %(book_title)s "
+msgstr ""
-#: bookwyrm/templates/notifications/items/fav.html:37
+#: bookwyrm/templates/notifications/items/boost.html:27
#, python-format
-msgid "liked your status "
-msgstr "gustoulle a túa publicación "
+msgid "%(related_user)s and %(second_user)s boosted your review of %(book_title)s "
+msgstr ""
-#: bookwyrm/templates/notifications/items/follow.html:15
-msgid "followed you"
-msgstr "séguete"
+#: bookwyrm/templates/notifications/items/boost.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your review of %(book_title)s "
+msgstr ""
-#: bookwyrm/templates/notifications/items/follow_request.html:11
-msgid "sent you a follow request"
-msgstr "enviouche unha solicitude de seguimento"
+#: bookwyrm/templates/notifications/items/boost.html:44
+#, python-format
+msgid "%(related_user)s boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:50
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:59
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:67
+#, python-format
+msgid "%(related_user)s boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:73
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:82
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:90
+#, python-format
+msgid "%(related_user)s boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:96
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:105
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:21
+#, python-format
+msgid "%(related_user)s liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:27
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:44
+#, python-format
+msgid "%(related_user)s liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:50
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:59
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:67
+#, python-format
+msgid "%(related_user)s liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:73
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:82
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:90
+#, python-format
+msgid "%(related_user)s liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:96
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:105
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:16
+#, python-format
+msgid "%(related_user)s followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:20
+#, python-format
+msgid "%(related_user)s and %(second_user)s followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:25
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow_request.html:15
+#, python-format
+msgid "%(related_user)s sent you a follow request"
+msgstr ""
#: bookwyrm/templates/notifications/items/import.html:14
#, python-format
msgid "Your import completed."
msgstr "A importación completouse."
-#: bookwyrm/templates/notifications/items/invite.html:15
+#: bookwyrm/templates/notifications/items/invite.html:16
#, python-format
-msgid "invited you to join the group \"%(group_name)s \""
-msgstr "convidoute a unirte ao grupo \"%(group_name)s \""
+msgid "%(related_user)s invited you to join the group \"%(group_name)s \""
+msgstr ""
#: bookwyrm/templates/notifications/items/join.html:16
#, python-format
msgid "has joined your group \"%(group_name)s \""
msgstr "uniuse ao teu grupo \"%(group_name)s \""
-#: bookwyrm/templates/notifications/items/leave.html:16
+#: bookwyrm/templates/notifications/items/leave.html:18
#, python-format
-msgid "has left your group \"%(group_name)s \""
-msgstr "deixou o teu grupo \"%(group_name)s \""
+msgid "%(related_user)s has left your group \"%(group_name)s \""
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/leave.html:26
+#, python-format
+msgid "%(related_user)s and %(second_user)s have left your group \"%(group_name)s \""
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/leave.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others have left your group \"%(group_name)s \""
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:20
#, python-format
-msgid "mentioned you in a review of %(book_title)s "
-msgstr "mencionoute nunha recensión sobre %(book_title)s "
+msgid "%(related_user)s mentioned you in a review of %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:26
#, python-format
-msgid "mentioned you in a comment on %(book_title)s "
-msgstr "mencionoute nun comentario para %(book_title)s "
+msgid "%(related_user)s mentioned you in a comment on %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:32
#, python-format
-msgid "mentioned you in a quote from %(book_title)s "
-msgstr "mencionoute nunha cita en %(book_title)s "
+msgid "%(related_user)s mentioned you in a quote from %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:38
#, python-format
-msgid "mentioned you in a status "
-msgstr "mencionoute nun estado "
+msgid "%(related_user)s mentioned you in a status "
+msgstr ""
#: bookwyrm/templates/notifications/items/remove.html:17
#, python-format
@@ -2694,28 +2846,30 @@ msgstr "Foches eliminada do grupo \"%(group_name)s replied to your review of %(book_title)s "
-msgstr "respondeu á túa revisión de %(book_title)s "
+msgid "%(related_user)s replied to your review of %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:27
#, python-format
-msgid "replied to your comment on %(book_title)s "
-msgstr "respondeu ao teu comentario en %(book_title)s "
+msgid "%(related_user)s replied to your comment on %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:33
#, python-format
-msgid "replied to your quote from %(book_title)s "
-msgstr "respondeu á túa cita de %(book_title)s "
+msgid "%(related_user)s replied to your quote from %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:39
#, python-format
-msgid "replied to your status "
-msgstr "respondeu ao teu estado "
+msgid "%(related_user)s replied to your status "
+msgstr ""
#: bookwyrm/templates/notifications/items/report.html:15
#, python-format
-msgid "A new report needs moderation."
-msgstr "Hai unha nova denuncia para moderar."
+msgid "A new report needs moderation"
+msgid_plural "%(display_count)s new reports need moderation"
+msgstr[0] ""
+msgstr[1] ""
#: bookwyrm/templates/notifications/items/update.html:16
#, python-format
@@ -3199,13 +3353,13 @@ msgstr "Falso"
#: bookwyrm/templates/settings/announcements/announcement.html:57
#: bookwyrm/templates/settings/announcements/edit_announcement.html:79
-#: bookwyrm/templates/settings/dashboard/dashboard.html:94
+#: bookwyrm/templates/settings/dashboard/dashboard.html:105
msgid "Start date:"
msgstr "Data de inicio:"
#: bookwyrm/templates/settings/announcements/announcement.html:62
#: bookwyrm/templates/settings/announcements/edit_announcement.html:89
-#: bookwyrm/templates/settings/dashboard/dashboard.html:100
+#: bookwyrm/templates/settings/dashboard/dashboard.html:111
msgid "End date:"
msgstr "Data de fin:"
@@ -3365,7 +3519,7 @@ msgid "Dashboard"
msgstr "Taboleiro"
#: bookwyrm/templates/settings/dashboard/dashboard.html:15
-#: bookwyrm/templates/settings/dashboard/dashboard.html:123
+#: bookwyrm/templates/settings/dashboard/dashboard.html:134
msgid "Total users"
msgstr "Total de usuarias"
@@ -3385,55 +3539,64 @@ msgstr "Traballos"
#: bookwyrm/templates/settings/dashboard/dashboard.html:43
#, python-format
+msgid "Your outgoing email address, %(email_sender)s
, may be misconfigured."
+msgstr ""
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:46
+msgid "Check the EMAIL_SENDER_NAME
and EMAIL_SENDER_DOMAIN
in your .env
."
+msgstr ""
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:54
+#, python-format
msgid "%(display_count)s open report"
msgid_plural "%(display_count)s open reports"
msgstr[0] "%(display_count)s denuncia aberta"
msgstr[1] "%(display_count)s denuncias abertas"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:55
+#: bookwyrm/templates/settings/dashboard/dashboard.html:66
#, python-format
msgid "%(display_count)s domain needs review"
msgid_plural "%(display_count)s domains need review"
msgstr[0] "hai que revisar %(display_count)s dominio"
msgstr[1] "hai que revisar %(display_count)s dominios"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:67
+#: bookwyrm/templates/settings/dashboard/dashboard.html:78
#, python-format
msgid "%(display_count)s invite request"
msgid_plural "%(display_count)s invite requests"
msgstr[0] "%(display_count)s solicitude de convite"
msgstr[1] "%(display_count)s solicitudes de convite"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:79
+#: bookwyrm/templates/settings/dashboard/dashboard.html:90
#, python-format
msgid "An update is available! You're running v%(current)s and the latest release is %(available)s."
msgstr "Hai unha actualización dispoñible! Estás a executar v%(current)s e a última versión é %(available)s."
-#: bookwyrm/templates/settings/dashboard/dashboard.html:88
+#: bookwyrm/templates/settings/dashboard/dashboard.html:99
msgid "Instance Activity"
msgstr "Actividade na instancia"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:106
+#: bookwyrm/templates/settings/dashboard/dashboard.html:117
msgid "Interval:"
msgstr "Intervalo:"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:110
+#: bookwyrm/templates/settings/dashboard/dashboard.html:121
msgid "Days"
msgstr "Días"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:111
+#: bookwyrm/templates/settings/dashboard/dashboard.html:122
msgid "Weeks"
msgstr "Semanas"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:129
+#: bookwyrm/templates/settings/dashboard/dashboard.html:140
msgid "User signup activity"
msgstr "Rexistros de usuarias"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:135
+#: bookwyrm/templates/settings/dashboard/dashboard.html:146
msgid "Status activity"
msgstr "Actividade do estado"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:141
+#: bookwyrm/templates/settings/dashboard/dashboard.html:152
msgid "Works created"
msgstr "Traballos creados"
@@ -3853,7 +4016,7 @@ msgstr "Non hai dominios pendentes"
msgid "No domains currently blocked"
msgstr "Non hai dominios bloqueados"
-#: bookwyrm/templates/settings/link_domains/link_table.html:39
+#: bookwyrm/templates/settings/link_domains/link_table.html:43
msgid "No links available for this domain."
msgstr "Non hai ligazóns dispoñibles para este dominio."
@@ -3881,11 +4044,11 @@ msgstr "O estado foi eliminado"
msgid "Reported links"
msgstr "Ligazóns denunciadas"
-#: bookwyrm/templates/settings/reports/report.html:63
+#: bookwyrm/templates/settings/reports/report.html:65
msgid "Moderator Comments"
msgstr "Comentarios da moderación"
-#: bookwyrm/templates/settings/reports/report.html:84
+#: bookwyrm/templates/settings/reports/report.html:86
#: bookwyrm/templates/snippets/create_status.html:26
msgid "Comment"
msgstr "Comentario"
@@ -3895,12 +4058,17 @@ msgstr "Comentario"
msgid "Report #%(report_id)s: Status posted by @%(username)s"
msgstr "Denuncia #%(report_id)s: Estado publicado por @%(username)s"
-#: bookwyrm/templates/settings/reports/report_header.html:12
+#: bookwyrm/templates/settings/reports/report_header.html:13
#, python-format
msgid "Report #%(report_id)s: Link added by @%(username)s"
msgstr "Denuncia #%(report_id)s: Ligazón engadida por @%(username)s"
-#: bookwyrm/templates/settings/reports/report_header.html:18
+#: bookwyrm/templates/settings/reports/report_header.html:17
+#, python-format
+msgid "Report #%(report_id)s: Link domain"
+msgstr ""
+
+#: bookwyrm/templates/settings/reports/report_header.html:24
#, python-format
msgid "Report #%(report_id)s: User @%(username)s"
msgstr "Denuncia #%(report_id)s: Usuaria @%(username)s"
@@ -4163,11 +4331,15 @@ msgid "Active"
msgstr "Activa"
#: bookwyrm/templates/settings/users/user_admin.html:79
+msgid "Deleted"
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_admin.html:85
#: bookwyrm/templates/settings/users/user_info.html:32
msgid "Inactive"
msgstr "Inactiva"
-#: bookwyrm/templates/settings/users/user_admin.html:88
+#: bookwyrm/templates/settings/users/user_admin.html:94
#: bookwyrm/templates/settings/users/user_info.html:127
msgid "Not set"
msgstr "Non establecido"
@@ -5172,15 +5344,6 @@ msgstr "Non é un ficheiro csv válido"
msgid "Username or password are incorrect"
msgstr "As credenciais non son correctas"
-#: bookwyrm/views/landing/password.py:32
-msgid "No user with that email address was found."
-msgstr "Non atopamos unha usuaria con ese email."
-
-#: bookwyrm/views/landing/password.py:43
-#, python-brace-format
-msgid "A password reset link was sent to {email}"
-msgstr "Enviamos unha ligazón de restablecemento a {email}"
-
#: bookwyrm/views/rss_feed.py:34
#, python-brace-format
msgid "Status updates from {obj.display_name}"
diff --git a/locale/it_IT/LC_MESSAGES/django.mo b/locale/it_IT/LC_MESSAGES/django.mo
index 97519011a..8eca15d71 100644
Binary files a/locale/it_IT/LC_MESSAGES/django.mo and b/locale/it_IT/LC_MESSAGES/django.mo differ
diff --git a/locale/it_IT/LC_MESSAGES/django.po b/locale/it_IT/LC_MESSAGES/django.po
index 9ee240bf2..4e3115f05 100644
--- a/locale/it_IT/LC_MESSAGES/django.po
+++ b/locale/it_IT/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-05-31 23:50+0000\n"
-"PO-Revision-Date: 2022-06-01 00:55\n"
+"POT-Creation-Date: 2022-07-07 17:47+0000\n"
+"PO-Revision-Date: 2022-07-07 18:13\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: Italian\n"
"Language: it\n"
@@ -121,7 +121,7 @@ msgstr "Avviso"
msgid "Danger"
msgstr "Attenzione"
-#: bookwyrm/models/antispam.py:106 bookwyrm/models/antispam.py:140
+#: bookwyrm/models/antispam.py:101 bookwyrm/models/antispam.py:135
msgid "Automatically generated report"
msgstr "Rapporto generato automaticamente"
@@ -740,7 +740,7 @@ msgstr "ISNI:"
#: bookwyrm/templates/book/book.html:202
#: bookwyrm/templates/book/edit/edit_book.html:135
#: bookwyrm/templates/book/file_links/add_link_modal.html:60
-#: bookwyrm/templates/book/file_links/edit_links.html:82
+#: bookwyrm/templates/book/file_links/edit_links.html:86
#: bookwyrm/templates/groups/form.html:32
#: bookwyrm/templates/lists/bookmark_button.html:15
#: bookwyrm/templates/lists/edit_item_form.html:15
@@ -1218,16 +1218,21 @@ msgstr "Stato"
msgid "Actions"
msgstr "Azioni"
-#: bookwyrm/templates/book/file_links/edit_links.html:53
+#: bookwyrm/templates/book/file_links/edit_links.html:48
+#: bookwyrm/templates/settings/link_domains/link_table.html:21
+msgid "Unknown user"
+msgstr ""
+
+#: bookwyrm/templates/book/file_links/edit_links.html:57
#: bookwyrm/templates/book/file_links/verification_modal.html:22
msgid "Report spam"
msgstr "Segnala come spam"
-#: bookwyrm/templates/book/file_links/edit_links.html:97
+#: bookwyrm/templates/book/file_links/edit_links.html:101
msgid "No links available for this book."
msgstr "Nessun collegamento disponibile per questo libro."
-#: bookwyrm/templates/book/file_links/edit_links.html:108
+#: bookwyrm/templates/book/file_links/edit_links.html:112
#: bookwyrm/templates/book/file_links/links.html:18
msgid "Add link to file"
msgstr "Aggiungi collegamento al file"
@@ -1324,7 +1329,7 @@ msgstr "Codice di conferma:"
#: bookwyrm/templates/confirm_email/confirm_email.html:25
#: bookwyrm/templates/landing/layout.html:81
-#: bookwyrm/templates/settings/dashboard/dashboard.html:116
+#: bookwyrm/templates/settings/dashboard/dashboard.html:127
#: bookwyrm/templates/snippets/report_modal.html:53
msgid "Submit"
msgstr "Invia"
@@ -1340,7 +1345,7 @@ msgstr "Invia di nuovo email di conferma"
#: bookwyrm/templates/confirm_email/resend_modal.html:15
#: bookwyrm/templates/landing/layout.html:68
-#: bookwyrm/templates/landing/password_reset_request.html:18
+#: bookwyrm/templates/landing/password_reset_request.html:24
#: bookwyrm/templates/preferences/edit_user.html:53
#: bookwyrm/templates/snippets/register_form.html:27
msgid "Email address:"
@@ -1567,14 +1572,20 @@ msgstr "Sei invitato ad unirti a %(site_name)s! Clicca sul link qui sotto per cr
msgid "Learn more about %(site_name)s:"
msgstr "Ulteriori informazioni su %(site_name)s:"
-#: bookwyrm/templates/email/moderation_report/html_content.html:6
-#: bookwyrm/templates/email/moderation_report/text_content.html:5
+#: bookwyrm/templates/email/moderation_report/html_content.html:8
+#: bookwyrm/templates/email/moderation_report/text_content.html:6
#, python-format
-msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation. "
-msgstr "@%(reporter)s ha contrassegnato il comportamento di @%(reportee)s per la moderazione. "
+msgid "@%(reporter)s has flagged a link domain for moderation."
+msgstr ""
-#: bookwyrm/templates/email/moderation_report/html_content.html:9
-#: bookwyrm/templates/email/moderation_report/text_content.html:7
+#: bookwyrm/templates/email/moderation_report/html_content.html:14
+#: bookwyrm/templates/email/moderation_report/text_content.html:10
+#, python-format
+msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation."
+msgstr ""
+
+#: bookwyrm/templates/email/moderation_report/html_content.html:21
+#: bookwyrm/templates/email/moderation_report/text_content.html:15
msgid "View report"
msgstr "Visualizza report"
@@ -2268,10 +2279,15 @@ msgid "Confirm password:"
msgstr "Conferma la password:"
#: bookwyrm/templates/landing/password_reset_request.html:14
+#, python-format
+msgid "A password reset link will be sent to %(email)s if there is an account using that email address."
+msgstr ""
+
+#: bookwyrm/templates/landing/password_reset_request.html:20
msgid "A link to reset your password will be sent to your email address"
msgstr "Il link per reimpostare la password è stato inviato al tuo indirizzo email"
-#: bookwyrm/templates/landing/password_reset_request.html:28
+#: bookwyrm/templates/landing/password_reset_request.html:34
msgid "Reset password"
msgstr "Reimposta password"
@@ -2579,108 +2595,244 @@ msgstr "Tutte le liste"
msgid "Saved Lists"
msgstr "Liste Salvate"
-#: bookwyrm/templates/notifications/items/accept.html:16
+#: bookwyrm/templates/notifications/items/accept.html:18
#, python-format
-msgid "accepted your invitation to join group \"%(group_name)s \""
-msgstr "il tuo invito ad unirsi al gruppo \"%(group_name)s \" è stato accettato"
+msgid "%(related_user)s accepted your invitation to join group \"%(group_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/add.html:24
+#: bookwyrm/templates/notifications/items/accept.html:26
#, python-format
-msgid "added %(book_title)s to your list \"%(list_name)s \""
-msgstr "aggiunto %(book_title)s alla tua lista \"%(list_name)s \""
+msgid "%(related_user)s and %(second_user)s accepted your invitation to join group \"%(group_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/add.html:31
+#: bookwyrm/templates/notifications/items/accept.html:36
#, python-format
-msgid "suggested adding %(book_title)s to your list \"%(list_name)s \""
-msgstr "suggerimento aggiunto %(book_title)s alla tua lista \"%(list_name)s \""
+msgid "%(related_user)s and %(other_user_display_count)s others accepted your invitation to join group \"%(group_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:19
+#: bookwyrm/templates/notifications/items/add.html:33
#, python-format
-msgid "boosted your review of %(book_title)s "
-msgstr "ha potenziato la tua recensione di %(book_title)s "
+msgid "%(related_user)s added %(book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:25
+#: bookwyrm/templates/notifications/items/add.html:39
#, python-format
-msgid "boosted your comment on%(book_title)s "
-msgstr "ha potenziato il tuo commento su%(book_title)s "
+msgid "%(related_user)s suggested adding %(book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:31
+#: bookwyrm/templates/notifications/items/add.html:47
#, python-format
-msgid "boosted your quote from %(book_title)s "
-msgstr "ha potenziato la tua citazione da %(book_title)s "
+msgid "%(related_user)s added %(book_title)s and %(second_book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:37
+#: bookwyrm/templates/notifications/items/add.html:54
#, python-format
-msgid "boosted your status "
-msgstr "ha potenziato il tuo stato "
+msgid "%(related_user)s suggested adding %(book_title)s and %(second_book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/fav.html:19
+#: bookwyrm/templates/notifications/items/add.html:66
#, python-format
-msgid "liked your review of %(book_title)s "
-msgstr "ha apprezzato la tua recensione di %(book_title)s "
+msgid "%(related_user)s added %(book_title)s , %(second_book_title)s , and %(display_count)s other book to your list \"%(list_name)s \""
+msgid_plural "%(related_user)s added %(book_title)s , %(second_book_title)s , and %(display_count)s other books to your list \"%(list_name)s \""
+msgstr[0] ""
+msgstr[1] ""
-#: bookwyrm/templates/notifications/items/fav.html:25
+#: bookwyrm/templates/notifications/items/add.html:82
#, python-format
-msgid "liked your comment on %(book_title)s "
-msgstr "ha apprezzato il tuo commento su %(book_title)s "
+msgid "%(related_user)s suggested adding %(book_title)s , %(second_book_title)s , and %(display_count)s other book to your list \"%(list_name)s \""
+msgid_plural "%(related_user)s suggested adding %(book_title)s , %(second_book_title)s , and %(display_count)s other books to your list \"%(list_name)s \""
+msgstr[0] ""
+msgstr[1] ""
-#: bookwyrm/templates/notifications/items/fav.html:31
+#: bookwyrm/templates/notifications/items/boost.html:21
#, python-format
-msgid "liked your quote from %(book_title)s "
-msgstr "ha apprezzato la tua citazione da %(book_title)s "
+msgid "%(related_user)s boosted your review of %(book_title)s "
+msgstr ""
-#: bookwyrm/templates/notifications/items/fav.html:37
+#: bookwyrm/templates/notifications/items/boost.html:27
#, python-format
-msgid "liked your status "
-msgstr "ha messo \"mi piace\" al tuo stato "
+msgid "%(related_user)s and %(second_user)s boosted your review of %(book_title)s "
+msgstr ""
-#: bookwyrm/templates/notifications/items/follow.html:15
-msgid "followed you"
-msgstr "ha iniziato a seguirti"
+#: bookwyrm/templates/notifications/items/boost.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your review of %(book_title)s "
+msgstr ""
-#: bookwyrm/templates/notifications/items/follow_request.html:11
-msgid "sent you a follow request"
-msgstr "ha richiesto di seguirti"
+#: bookwyrm/templates/notifications/items/boost.html:44
+#, python-format
+msgid "%(related_user)s boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:50
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:59
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:67
+#, python-format
+msgid "%(related_user)s boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:73
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:82
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:90
+#, python-format
+msgid "%(related_user)s boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:96
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:105
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:21
+#, python-format
+msgid "%(related_user)s liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:27
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:44
+#, python-format
+msgid "%(related_user)s liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:50
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:59
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:67
+#, python-format
+msgid "%(related_user)s liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:73
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:82
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:90
+#, python-format
+msgid "%(related_user)s liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:96
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:105
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:16
+#, python-format
+msgid "%(related_user)s followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:20
+#, python-format
+msgid "%(related_user)s and %(second_user)s followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:25
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow_request.html:15
+#, python-format
+msgid "%(related_user)s sent you a follow request"
+msgstr ""
#: bookwyrm/templates/notifications/items/import.html:14
#, python-format
msgid "Your import completed."
msgstr "La tua importazione è stata completata."
-#: bookwyrm/templates/notifications/items/invite.html:15
+#: bookwyrm/templates/notifications/items/invite.html:16
#, python-format
-msgid "invited you to join the group \"%(group_name)s \""
-msgstr "ti ha invitato a partecipare al gruppo \"%(group_name)s \""
+msgid "%(related_user)s invited you to join the group \"%(group_name)s \""
+msgstr ""
#: bookwyrm/templates/notifications/items/join.html:16
#, python-format
msgid "has joined your group \"%(group_name)s \""
msgstr "è entrato nel tuo gruppo \"%(group_name)s \""
-#: bookwyrm/templates/notifications/items/leave.html:16
+#: bookwyrm/templates/notifications/items/leave.html:18
#, python-format
-msgid "has left your group \"%(group_name)s \""
-msgstr "ha abbandonato il tuo gruppo \"%(group_name)s \""
+msgid "%(related_user)s has left your group \"%(group_name)s \""
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/leave.html:26
+#, python-format
+msgid "%(related_user)s and %(second_user)s have left your group \"%(group_name)s \""
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/leave.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others have left your group \"%(group_name)s \""
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:20
#, python-format
-msgid "mentioned you in a review of %(book_title)s "
-msgstr "ti ha menzionato in una recensione di %(book_title)s "
+msgid "%(related_user)s mentioned you in a review of %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:26
#, python-format
-msgid "mentioned you in a comment on %(book_title)s "
-msgstr "ti ha menzionato in un commento su %(book_title)s "
+msgid "%(related_user)s mentioned you in a comment on %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:32
#, python-format
-msgid "mentioned you in a quote from %(book_title)s "
-msgstr "ti ha menzionato in una citazione da %(book_title)s "
+msgid "%(related_user)s mentioned you in a quote from %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:38
#, python-format
-msgid "mentioned you in a status "
-msgstr "ti ha menzionato in uno stato "
+msgid "%(related_user)s mentioned you in a status "
+msgstr ""
#: bookwyrm/templates/notifications/items/remove.html:17
#, python-format
@@ -2694,28 +2846,30 @@ msgstr "Sei stato rimosso dal gruppo \"%(group_name)s
#: bookwyrm/templates/notifications/items/reply.html:21
#, python-format
-msgid " replied to your review of %(book_title)s "
-msgstr "ha risposto alla tua recensione di %(book_title)s "
+msgid "%(related_user)s replied to your review of %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:27
#, python-format
-msgid "replied to your comment on %(book_title)s "
-msgstr "ha risposto al tuo commento su %(book_title)s "
+msgid "%(related_user)s replied to your comment on %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:33
#, python-format
-msgid "replied to your quote from %(book_title)s "
-msgstr "ha risposto alla tua citazione da %(book_title)s "
+msgid "%(related_user)s replied to your quote from %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:39
#, python-format
-msgid "replied to your status "
-msgstr "ha risposto al tuo stato "
+msgid "%(related_user)s replied to your status "
+msgstr ""
#: bookwyrm/templates/notifications/items/report.html:15
#, python-format
-msgid "A new report needs moderation."
-msgstr "Un nuovo report necessita di moderazione."
+msgid "A new report needs moderation"
+msgid_plural "%(display_count)s new reports need moderation"
+msgstr[0] ""
+msgstr[1] ""
#: bookwyrm/templates/notifications/items/update.html:16
#, python-format
@@ -3199,13 +3353,13 @@ msgstr "Falso"
#: bookwyrm/templates/settings/announcements/announcement.html:57
#: bookwyrm/templates/settings/announcements/edit_announcement.html:79
-#: bookwyrm/templates/settings/dashboard/dashboard.html:94
+#: bookwyrm/templates/settings/dashboard/dashboard.html:105
msgid "Start date:"
msgstr "Data d'inizio:"
#: bookwyrm/templates/settings/announcements/announcement.html:62
#: bookwyrm/templates/settings/announcements/edit_announcement.html:89
-#: bookwyrm/templates/settings/dashboard/dashboard.html:100
+#: bookwyrm/templates/settings/dashboard/dashboard.html:111
msgid "End date:"
msgstr "Data di fine:"
@@ -3365,7 +3519,7 @@ msgid "Dashboard"
msgstr "Dashboard"
#: bookwyrm/templates/settings/dashboard/dashboard.html:15
-#: bookwyrm/templates/settings/dashboard/dashboard.html:123
+#: bookwyrm/templates/settings/dashboard/dashboard.html:134
msgid "Total users"
msgstr "Totale utenti"
@@ -3385,55 +3539,64 @@ msgstr "Lavori"
#: bookwyrm/templates/settings/dashboard/dashboard.html:43
#, python-format
+msgid "Your outgoing email address, %(email_sender)s
, may be misconfigured."
+msgstr ""
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:46
+msgid "Check the EMAIL_SENDER_NAME
and EMAIL_SENDER_DOMAIN
in your .env
."
+msgstr ""
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:54
+#, python-format
msgid "%(display_count)s open report"
msgid_plural "%(display_count)s open reports"
msgstr[0] "%(display_count)s report aperto"
msgstr[1] "%(display_count)s reports aperti"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:55
+#: bookwyrm/templates/settings/dashboard/dashboard.html:66
#, python-format
msgid "%(display_count)s domain needs review"
msgid_plural "%(display_count)s domains need review"
msgstr[0] "%(display_count)s dominio necessita di una revisione"
msgstr[1] "%(display_count)s domini necessitano di una revisione"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:67
+#: bookwyrm/templates/settings/dashboard/dashboard.html:78
#, python-format
msgid "%(display_count)s invite request"
msgid_plural "%(display_count)s invite requests"
msgstr[0] "%(display_count)s richiesta d'invito"
msgstr[1] "%(display_count)s richieste d'invito"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:79
+#: bookwyrm/templates/settings/dashboard/dashboard.html:90
#, python-format
msgid "An update is available! You're running v%(current)s and the latest release is %(available)s."
msgstr "È disponibile un aggiornamento! Stai eseguendo v%(current)s e l'ultima versione è %(available)s."
-#: bookwyrm/templates/settings/dashboard/dashboard.html:88
+#: bookwyrm/templates/settings/dashboard/dashboard.html:99
msgid "Instance Activity"
msgstr "Attività di Istanza"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:106
+#: bookwyrm/templates/settings/dashboard/dashboard.html:117
msgid "Interval:"
msgstr "Intervallo:"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:110
+#: bookwyrm/templates/settings/dashboard/dashboard.html:121
msgid "Days"
msgstr "Giorni"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:111
+#: bookwyrm/templates/settings/dashboard/dashboard.html:122
msgid "Weeks"
msgstr "Settimane"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:129
+#: bookwyrm/templates/settings/dashboard/dashboard.html:140
msgid "User signup activity"
msgstr "Attività di registrazione dell'utente"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:135
+#: bookwyrm/templates/settings/dashboard/dashboard.html:146
msgid "Status activity"
msgstr "Attività di stato"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:141
+#: bookwyrm/templates/settings/dashboard/dashboard.html:152
msgid "Works created"
msgstr "Opere create"
@@ -3853,7 +4016,7 @@ msgstr "Nessun dominio attualmente in attesa"
msgid "No domains currently blocked"
msgstr "Nessun dominio attualmente bloccato"
-#: bookwyrm/templates/settings/link_domains/link_table.html:39
+#: bookwyrm/templates/settings/link_domains/link_table.html:43
msgid "No links available for this domain."
msgstr "Nessun collegamento disponibile per questo libro."
@@ -3881,11 +4044,11 @@ msgstr "Lo stato è stato eliminato"
msgid "Reported links"
msgstr "Collegamenti segnalati"
-#: bookwyrm/templates/settings/reports/report.html:63
+#: bookwyrm/templates/settings/reports/report.html:65
msgid "Moderator Comments"
msgstr "Commenti del moderatore"
-#: bookwyrm/templates/settings/reports/report.html:84
+#: bookwyrm/templates/settings/reports/report.html:86
#: bookwyrm/templates/snippets/create_status.html:26
msgid "Comment"
msgstr "Commenta"
@@ -3895,12 +4058,17 @@ msgstr "Commenta"
msgid "Report #%(report_id)s: Status posted by @%(username)s"
msgstr "Report #%(report_id)s: Stato pubblicato da @%(username)s"
-#: bookwyrm/templates/settings/reports/report_header.html:12
+#: bookwyrm/templates/settings/reports/report_header.html:13
#, python-format
msgid "Report #%(report_id)s: Link added by @%(username)s"
msgstr "Report #%(report_id)s: Collegamento aggiunto da @%(username)s"
-#: bookwyrm/templates/settings/reports/report_header.html:18
+#: bookwyrm/templates/settings/reports/report_header.html:17
+#, python-format
+msgid "Report #%(report_id)s: Link domain"
+msgstr ""
+
+#: bookwyrm/templates/settings/reports/report_header.html:24
#, python-format
msgid "Report #%(report_id)s: User @%(username)s"
msgstr "Report #%(report_id)s: %(username)s"
@@ -4163,11 +4331,15 @@ msgid "Active"
msgstr "Attivo"
#: bookwyrm/templates/settings/users/user_admin.html:79
+msgid "Deleted"
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_admin.html:85
#: bookwyrm/templates/settings/users/user_info.html:32
msgid "Inactive"
msgstr "Inattivo"
-#: bookwyrm/templates/settings/users/user_admin.html:88
+#: bookwyrm/templates/settings/users/user_admin.html:94
#: bookwyrm/templates/settings/users/user_info.html:127
msgid "Not set"
msgstr "Non impostato"
@@ -5172,15 +5344,6 @@ msgstr "Non è un file di csv valido"
msgid "Username or password are incorrect"
msgstr "Nome utente o password errati"
-#: bookwyrm/views/landing/password.py:32
-msgid "No user with that email address was found."
-msgstr "Non è stato trovato nessun utente con questo indirizzo email."
-
-#: bookwyrm/views/landing/password.py:43
-#, python-brace-format
-msgid "A password reset link was sent to {email}"
-msgstr "Il link per reimpostare la password è stato inviato a {email}"
-
#: bookwyrm/views/rss_feed.py:34
#, python-brace-format
msgid "Status updates from {obj.display_name}"
diff --git a/locale/lt_LT/LC_MESSAGES/django.mo b/locale/lt_LT/LC_MESSAGES/django.mo
index 91350fa48..a3fa30e43 100644
Binary files a/locale/lt_LT/LC_MESSAGES/django.mo and b/locale/lt_LT/LC_MESSAGES/django.mo differ
diff --git a/locale/lt_LT/LC_MESSAGES/django.po b/locale/lt_LT/LC_MESSAGES/django.po
index 0f33bc60c..5efb3c922 100644
--- a/locale/lt_LT/LC_MESSAGES/django.po
+++ b/locale/lt_LT/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-05-31 23:50+0000\n"
-"PO-Revision-Date: 2022-06-01 00:55\n"
+"POT-Creation-Date: 2022-07-07 17:47+0000\n"
+"PO-Revision-Date: 2022-07-07 18:12\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: Lithuanian\n"
"Language: lt\n"
@@ -121,7 +121,7 @@ msgstr "Įspėjimas"
msgid "Danger"
msgstr "Pavojus"
-#: bookwyrm/models/antispam.py:106 bookwyrm/models/antispam.py:140
+#: bookwyrm/models/antispam.py:101 bookwyrm/models/antispam.py:135
msgid "Automatically generated report"
msgstr "Automatiškai sugeneruota ataskaita"
@@ -748,7 +748,7 @@ msgstr "ISNI:"
#: bookwyrm/templates/book/book.html:202
#: bookwyrm/templates/book/edit/edit_book.html:135
#: bookwyrm/templates/book/file_links/add_link_modal.html:60
-#: bookwyrm/templates/book/file_links/edit_links.html:82
+#: bookwyrm/templates/book/file_links/edit_links.html:86
#: bookwyrm/templates/groups/form.html:32
#: bookwyrm/templates/lists/bookmark_button.html:15
#: bookwyrm/templates/lists/edit_item_form.html:15
@@ -1230,16 +1230,21 @@ msgstr "Būsena"
msgid "Actions"
msgstr "Veiksmai"
-#: bookwyrm/templates/book/file_links/edit_links.html:53
+#: bookwyrm/templates/book/file_links/edit_links.html:48
+#: bookwyrm/templates/settings/link_domains/link_table.html:21
+msgid "Unknown user"
+msgstr ""
+
+#: bookwyrm/templates/book/file_links/edit_links.html:57
#: bookwyrm/templates/book/file_links/verification_modal.html:22
msgid "Report spam"
msgstr "Pranešti apie brukalą"
-#: bookwyrm/templates/book/file_links/edit_links.html:97
+#: bookwyrm/templates/book/file_links/edit_links.html:101
msgid "No links available for this book."
msgstr "Šiai knygai nuorodų nėra."
-#: bookwyrm/templates/book/file_links/edit_links.html:108
+#: bookwyrm/templates/book/file_links/edit_links.html:112
#: bookwyrm/templates/book/file_links/links.html:18
msgid "Add link to file"
msgstr "Pridėti nuorodą į failą"
@@ -1336,7 +1341,7 @@ msgstr "Patvirtinimo kodas:"
#: bookwyrm/templates/confirm_email/confirm_email.html:25
#: bookwyrm/templates/landing/layout.html:81
-#: bookwyrm/templates/settings/dashboard/dashboard.html:116
+#: bookwyrm/templates/settings/dashboard/dashboard.html:127
#: bookwyrm/templates/snippets/report_modal.html:53
msgid "Submit"
msgstr "Siųsti"
@@ -1352,7 +1357,7 @@ msgstr "Dar kartą išsiųsti patvirtinimo nuorodą"
#: bookwyrm/templates/confirm_email/resend_modal.html:15
#: bookwyrm/templates/landing/layout.html:68
-#: bookwyrm/templates/landing/password_reset_request.html:18
+#: bookwyrm/templates/landing/password_reset_request.html:24
#: bookwyrm/templates/preferences/edit_user.html:53
#: bookwyrm/templates/snippets/register_form.html:27
msgid "Email address:"
@@ -1583,14 +1588,20 @@ msgstr "Esate pakviesti prisijungti prie %(site_name)s! Spauskite nuorodą žemi
msgid "Learn more about %(site_name)s:"
msgstr "Sužinoti daugiau apie %(site_name)s:"
-#: bookwyrm/templates/email/moderation_report/html_content.html:6
-#: bookwyrm/templates/email/moderation_report/text_content.html:5
+#: bookwyrm/templates/email/moderation_report/html_content.html:8
+#: bookwyrm/templates/email/moderation_report/text_content.html:6
#, python-format
-msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation. "
-msgstr "@%(reporter)s pranešė apie netinkamą @%(reportee)s veiklą. "
+msgid "@%(reporter)s has flagged a link domain for moderation."
+msgstr ""
-#: bookwyrm/templates/email/moderation_report/html_content.html:9
-#: bookwyrm/templates/email/moderation_report/text_content.html:7
+#: bookwyrm/templates/email/moderation_report/html_content.html:14
+#: bookwyrm/templates/email/moderation_report/text_content.html:10
+#, python-format
+msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation."
+msgstr ""
+
+#: bookwyrm/templates/email/moderation_report/html_content.html:21
+#: bookwyrm/templates/email/moderation_report/text_content.html:15
msgid "View report"
msgstr "Peržiūrėti raportą"
@@ -2292,10 +2303,15 @@ msgid "Confirm password:"
msgstr "Patvirtinti slaptažodį:"
#: bookwyrm/templates/landing/password_reset_request.html:14
+#, python-format
+msgid "A password reset link will be sent to %(email)s if there is an account using that email address."
+msgstr ""
+
+#: bookwyrm/templates/landing/password_reset_request.html:20
msgid "A link to reset your password will be sent to your email address"
msgstr "Jūsų el. pašto adresu bus išsiųsta nuoroda pakeisti slaptažodį"
-#: bookwyrm/templates/landing/password_reset_request.html:28
+#: bookwyrm/templates/landing/password_reset_request.html:34
msgid "Reset password"
msgstr "Atstatyti slaptažodį"
@@ -2603,108 +2619,248 @@ msgstr "Visi sąrašai"
msgid "Saved Lists"
msgstr "Išsaugoti sąrašai"
-#: bookwyrm/templates/notifications/items/accept.html:16
+#: bookwyrm/templates/notifications/items/accept.html:18
#, python-format
-msgid "accepted your invitation to join group \"%(group_name)s \""
-msgstr "priėmė jūsų kvietimą prisijungti prie grupės „%(group_name)s “"
+msgid "%(related_user)s accepted your invitation to join group \"%(group_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/add.html:24
+#: bookwyrm/templates/notifications/items/accept.html:26
#, python-format
-msgid "added %(book_title)s to your list \"%(list_name)s \""
-msgstr "į jūsų sąrašą „%(list_name)s “ pridėta %(book_title)s "
+msgid "%(related_user)s and %(second_user)s accepted your invitation to join group \"%(group_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/add.html:31
+#: bookwyrm/templates/notifications/items/accept.html:36
#, python-format
-msgid "suggested adding %(book_title)s to your list \"%(list_name)s \""
-msgstr "į sąrašą „%(list_name)s \" patariama pridėti %(book_title)s "
+msgid "%(related_user)s and %(other_user_display_count)s others accepted your invitation to join group \"%(group_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:19
+#: bookwyrm/templates/notifications/items/add.html:33
#, python-format
-msgid "boosted your review of %(book_title)s "
-msgstr "populiarino jūsų atsiliepimą apie %(book_title)s "
+msgid "%(related_user)s added %(book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:25
+#: bookwyrm/templates/notifications/items/add.html:39
#, python-format
-msgid "boosted your comment on%(book_title)s "
-msgstr "populiarino jūsų komentarą apie %(book_title)s "
+msgid "%(related_user)s suggested adding %(book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:31
+#: bookwyrm/templates/notifications/items/add.html:47
#, python-format
-msgid "boosted your quote from %(book_title)s "
-msgstr "populiarino jūsų citatą iš %(book_title)s "
+msgid "%(related_user)s added %(book_title)s and %(second_book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:37
+#: bookwyrm/templates/notifications/items/add.html:54
#, python-format
-msgid "boosted your status "
-msgstr "populiarino jūsų būseną "
+msgid "%(related_user)s suggested adding %(book_title)s and %(second_book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/fav.html:19
+#: bookwyrm/templates/notifications/items/add.html:66
#, python-format
-msgid "liked your review of %(book_title)s "
-msgstr "patiko jūsų atsiliepimas apie %(book_title)s "
+msgid "%(related_user)s added %(book_title)s , %(second_book_title)s , and %(display_count)s other book to your list \"%(list_name)s \""
+msgid_plural "%(related_user)s added %(book_title)s , %(second_book_title)s , and %(display_count)s other books to your list \"%(list_name)s \""
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
-#: bookwyrm/templates/notifications/items/fav.html:25
+#: bookwyrm/templates/notifications/items/add.html:82
#, python-format
-msgid "liked your comment on %(book_title)s "
-msgstr "patiko jūsų komentaras apie %(book_title)s "
+msgid "%(related_user)s suggested adding %(book_title)s , %(second_book_title)s , and %(display_count)s other book to your list \"%(list_name)s \""
+msgid_plural "%(related_user)s suggested adding %(book_title)s , %(second_book_title)s , and %(display_count)s other books to your list \"%(list_name)s \""
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
-#: bookwyrm/templates/notifications/items/fav.html:31
+#: bookwyrm/templates/notifications/items/boost.html:21
#, python-format
-msgid "liked your quote from %(book_title)s "
-msgstr "patiko jūsų citata iš %(book_title)s "
+msgid "%(related_user)s boosted your review of %(book_title)s "
+msgstr ""
-#: bookwyrm/templates/notifications/items/fav.html:37
+#: bookwyrm/templates/notifications/items/boost.html:27
#, python-format
-msgid "liked your status "
-msgstr "patiko jūsų būsena "
+msgid "%(related_user)s and %(second_user)s boosted your review of %(book_title)s "
+msgstr ""
-#: bookwyrm/templates/notifications/items/follow.html:15
-msgid "followed you"
-msgstr "pradėjo jus sekti"
+#: bookwyrm/templates/notifications/items/boost.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your review of %(book_title)s "
+msgstr ""
-#: bookwyrm/templates/notifications/items/follow_request.html:11
-msgid "sent you a follow request"
-msgstr "nori jus sekti"
+#: bookwyrm/templates/notifications/items/boost.html:44
+#, python-format
+msgid "%(related_user)s boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:50
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:59
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:67
+#, python-format
+msgid "%(related_user)s boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:73
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:82
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:90
+#, python-format
+msgid "%(related_user)s boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:96
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:105
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:21
+#, python-format
+msgid "%(related_user)s liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:27
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:44
+#, python-format
+msgid "%(related_user)s liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:50
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:59
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:67
+#, python-format
+msgid "%(related_user)s liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:73
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:82
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:90
+#, python-format
+msgid "%(related_user)s liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:96
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:105
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:16
+#, python-format
+msgid "%(related_user)s followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:20
+#, python-format
+msgid "%(related_user)s and %(second_user)s followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:25
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow_request.html:15
+#, python-format
+msgid "%(related_user)s sent you a follow request"
+msgstr ""
#: bookwyrm/templates/notifications/items/import.html:14
#, python-format
msgid "Your import completed."
msgstr "Jūsų importas baigtas."
-#: bookwyrm/templates/notifications/items/invite.html:15
+#: bookwyrm/templates/notifications/items/invite.html:16
#, python-format
-msgid "invited you to join the group \"%(group_name)s \""
-msgstr "jus pakvietė prisijungti prie grupės „%(group_name)s “"
+msgid "%(related_user)s invited you to join the group \"%(group_name)s \""
+msgstr ""
#: bookwyrm/templates/notifications/items/join.html:16
#, python-format
msgid "has joined your group \"%(group_name)s \""
msgstr "prisijungė prie jūsų grupės „%(group_name)s “"
-#: bookwyrm/templates/notifications/items/leave.html:16
+#: bookwyrm/templates/notifications/items/leave.html:18
#, python-format
-msgid "has left your group \"%(group_name)s \""
-msgstr "paliko jūsų grupę „%(group_name)s “"
+msgid "%(related_user)s has left your group \"%(group_name)s \""
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/leave.html:26
+#, python-format
+msgid "%(related_user)s and %(second_user)s have left your group \"%(group_name)s \""
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/leave.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others have left your group \"%(group_name)s \""
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:20
#, python-format
-msgid "mentioned you in a review of %(book_title)s "
-msgstr "paminėjo jus atsiliepime apie %(book_title)s "
+msgid "%(related_user)s mentioned you in a review of %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:26
#, python-format
-msgid "mentioned you in a comment on %(book_title)s "
-msgstr "paminėjo jus komentare apie %(book_title)s "
+msgid "%(related_user)s mentioned you in a comment on %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:32
#, python-format
-msgid "mentioned you in a quote from %(book_title)s "
-msgstr "paminėjo jus citatoje iš %(book_title)s "
+msgid "%(related_user)s mentioned you in a quote from %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:38
#, python-format
-msgid "mentioned you in a status "
-msgstr "paminėjo jus būsenoje "
+msgid "%(related_user)s mentioned you in a status "
+msgstr ""
#: bookwyrm/templates/notifications/items/remove.html:17
#, python-format
@@ -2718,28 +2874,32 @@ msgstr "Buvote pašalintas iš grupės „%(group_nam
#: bookwyrm/templates/notifications/items/reply.html:21
#, python-format
-msgid " replied to your review of %(book_title)s "
-msgstr "atsakė į jūsų atsiliepimą apie %(book_title)s "
+msgid "%(related_user)s replied to your review of %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:27
#, python-format
-msgid "replied to your comment on %(book_title)s "
-msgstr "atsakė į jūsų komentarą apie %(book_title)s "
+msgid "%(related_user)s replied to your comment on %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:33
#, python-format
-msgid "replied to your quote from %(book_title)s "
-msgstr "atsakė į jūsų citatą iš %(book_title)s "
+msgid "%(related_user)s replied to your quote from %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:39
#, python-format
-msgid "replied to your status "
-msgstr "atsakė į jūsų būseną "
+msgid "%(related_user)s replied to your status "
+msgstr ""
#: bookwyrm/templates/notifications/items/report.html:15
#, python-format
-msgid "A new report needs moderation."
-msgstr "Reikia moderuoti pranešimą ."
+msgid "A new report needs moderation"
+msgid_plural "%(display_count)s new reports need moderation"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+msgstr[3] ""
#: bookwyrm/templates/notifications/items/update.html:16
#, python-format
@@ -3223,13 +3383,13 @@ msgstr "Netiesa"
#: bookwyrm/templates/settings/announcements/announcement.html:57
#: bookwyrm/templates/settings/announcements/edit_announcement.html:79
-#: bookwyrm/templates/settings/dashboard/dashboard.html:94
+#: bookwyrm/templates/settings/dashboard/dashboard.html:105
msgid "Start date:"
msgstr "Pradžios data:"
#: bookwyrm/templates/settings/announcements/announcement.html:62
#: bookwyrm/templates/settings/announcements/edit_announcement.html:89
-#: bookwyrm/templates/settings/dashboard/dashboard.html:100
+#: bookwyrm/templates/settings/dashboard/dashboard.html:111
msgid "End date:"
msgstr "Pabaigos data:"
@@ -3389,7 +3549,7 @@ msgid "Dashboard"
msgstr "Suvestinė"
#: bookwyrm/templates/settings/dashboard/dashboard.html:15
-#: bookwyrm/templates/settings/dashboard/dashboard.html:123
+#: bookwyrm/templates/settings/dashboard/dashboard.html:134
msgid "Total users"
msgstr "Iš viso naudotojų"
@@ -3409,6 +3569,15 @@ msgstr "Darbai"
#: bookwyrm/templates/settings/dashboard/dashboard.html:43
#, python-format
+msgid "Your outgoing email address, %(email_sender)s
, may be misconfigured."
+msgstr ""
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:46
+msgid "Check the EMAIL_SENDER_NAME
and EMAIL_SENDER_DOMAIN
in your .env
."
+msgstr ""
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:54
+#, python-format
msgid "%(display_count)s open report"
msgid_plural "%(display_count)s open reports"
msgstr[0] "%(display_count)s atvira ataskaita"
@@ -3416,7 +3585,7 @@ msgstr[1] "%(display_count)s atviros ataskaitos"
msgstr[2] "%(display_count)s atviros ataskaitos"
msgstr[3] "%(display_count)s atvirų ataskaitų"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:55
+#: bookwyrm/templates/settings/dashboard/dashboard.html:66
#, python-format
msgid "%(display_count)s domain needs review"
msgid_plural "%(display_count)s domains need review"
@@ -3425,7 +3594,7 @@ msgstr[1] "%(display_count)s domenus reikia peržiūrėti"
msgstr[2] "%(display_count)s domenus reikia peržiūrėti"
msgstr[3] "%(display_count)s domenus reikia peržiūrėti"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:67
+#: bookwyrm/templates/settings/dashboard/dashboard.html:78
#, python-format
msgid "%(display_count)s invite request"
msgid_plural "%(display_count)s invite requests"
@@ -3434,36 +3603,36 @@ msgstr[1] "%(display_count)s prašymai pakviesti"
msgstr[2] "%(display_count)s prašymų pakviesti"
msgstr[3] "%(display_count)s prašymai pakviesti"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:79
+#: bookwyrm/templates/settings/dashboard/dashboard.html:90
#, python-format
msgid "An update is available! You're running v%(current)s and the latest release is %(available)s."
msgstr "Jau yra naujinys. Jūsų versija – %(current)s, o naujausia –%(available)s."
-#: bookwyrm/templates/settings/dashboard/dashboard.html:88
+#: bookwyrm/templates/settings/dashboard/dashboard.html:99
msgid "Instance Activity"
msgstr "Serverio statistika"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:106
+#: bookwyrm/templates/settings/dashboard/dashboard.html:117
msgid "Interval:"
msgstr "Intervalas:"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:110
+#: bookwyrm/templates/settings/dashboard/dashboard.html:121
msgid "Days"
msgstr "Dienos"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:111
+#: bookwyrm/templates/settings/dashboard/dashboard.html:122
msgid "Weeks"
msgstr "Savaitės"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:129
+#: bookwyrm/templates/settings/dashboard/dashboard.html:140
msgid "User signup activity"
msgstr "Naudotojo prisijungimo veikla"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:135
+#: bookwyrm/templates/settings/dashboard/dashboard.html:146
msgid "Status activity"
msgstr "Būsenos"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:141
+#: bookwyrm/templates/settings/dashboard/dashboard.html:152
msgid "Works created"
msgstr "Darbai sukurti"
@@ -3885,7 +4054,7 @@ msgstr "Nėra domenų, laukiančių patvirtinimo"
msgid "No domains currently blocked"
msgstr "Šiuo metu užblokuotų domenų nėra"
-#: bookwyrm/templates/settings/link_domains/link_table.html:39
+#: bookwyrm/templates/settings/link_domains/link_table.html:43
msgid "No links available for this domain."
msgstr "Šiam domenui nuorodų nėra."
@@ -3913,11 +4082,11 @@ msgstr "Būsena ištrinta"
msgid "Reported links"
msgstr "Raportuotos nuorodos"
-#: bookwyrm/templates/settings/reports/report.html:63
+#: bookwyrm/templates/settings/reports/report.html:65
msgid "Moderator Comments"
msgstr "Moderatoriaus komentarai"
-#: bookwyrm/templates/settings/reports/report.html:84
+#: bookwyrm/templates/settings/reports/report.html:86
#: bookwyrm/templates/snippets/create_status.html:26
msgid "Comment"
msgstr "Komentuoti"
@@ -3927,12 +4096,17 @@ msgstr "Komentuoti"
msgid "Report #%(report_id)s: Status posted by @%(username)s"
msgstr "Pranešimas #%(report_id)s: publikavo @%(username)s"
-#: bookwyrm/templates/settings/reports/report_header.html:12
+#: bookwyrm/templates/settings/reports/report_header.html:13
#, python-format
msgid "Report #%(report_id)s: Link added by @%(username)s"
msgstr "Pranešimas #%(report_id)s: nuorodą pridėjo @%(username)s"
-#: bookwyrm/templates/settings/reports/report_header.html:18
+#: bookwyrm/templates/settings/reports/report_header.html:17
+#, python-format
+msgid "Report #%(report_id)s: Link domain"
+msgstr ""
+
+#: bookwyrm/templates/settings/reports/report_header.html:24
#, python-format
msgid "Report #%(report_id)s: User @%(username)s"
msgstr "Pranešimas #%(report_id)s: naudotojas @%(username)s"
@@ -4195,11 +4369,15 @@ msgid "Active"
msgstr "Aktyvus"
#: bookwyrm/templates/settings/users/user_admin.html:79
+msgid "Deleted"
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_admin.html:85
#: bookwyrm/templates/settings/users/user_info.html:32
msgid "Inactive"
msgstr "Neaktyvus"
-#: bookwyrm/templates/settings/users/user_admin.html:88
+#: bookwyrm/templates/settings/users/user_admin.html:94
#: bookwyrm/templates/settings/users/user_info.html:127
msgid "Not set"
msgstr "Nenustatytas"
@@ -5222,15 +5400,6 @@ msgstr "Netinkamas csv failas"
msgid "Username or password are incorrect"
msgstr "Naudotojo vardas arba slaptažodis neteisingi"
-#: bookwyrm/views/landing/password.py:32
-msgid "No user with that email address was found."
-msgstr "Šiuo el. pašto adresu nerastas nei vienas narys."
-
-#: bookwyrm/views/landing/password.py:43
-#, python-brace-format
-msgid "A password reset link was sent to {email}"
-msgstr "Slaptažodžio atstatymo nuoroda išsiųsta į {email}"
-
#: bookwyrm/views/rss_feed.py:34
#, python-brace-format
msgid "Status updates from {obj.display_name}"
diff --git a/locale/no_NO/LC_MESSAGES/django.mo b/locale/no_NO/LC_MESSAGES/django.mo
index b7357cd25..e971057ad 100644
Binary files a/locale/no_NO/LC_MESSAGES/django.mo and b/locale/no_NO/LC_MESSAGES/django.mo differ
diff --git a/locale/no_NO/LC_MESSAGES/django.po b/locale/no_NO/LC_MESSAGES/django.po
index 4434f489b..8c05461f1 100644
--- a/locale/no_NO/LC_MESSAGES/django.po
+++ b/locale/no_NO/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-05-31 23:50+0000\n"
-"PO-Revision-Date: 2022-06-01 00:55\n"
+"POT-Creation-Date: 2022-07-07 17:47+0000\n"
+"PO-Revision-Date: 2022-07-07 18:12\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: Norwegian\n"
"Language: no\n"
@@ -121,7 +121,7 @@ msgstr ""
msgid "Danger"
msgstr ""
-#: bookwyrm/models/antispam.py:106 bookwyrm/models/antispam.py:140
+#: bookwyrm/models/antispam.py:101 bookwyrm/models/antispam.py:135
msgid "Automatically generated report"
msgstr ""
@@ -740,7 +740,7 @@ msgstr "ISNI:"
#: bookwyrm/templates/book/book.html:202
#: bookwyrm/templates/book/edit/edit_book.html:135
#: bookwyrm/templates/book/file_links/add_link_modal.html:60
-#: bookwyrm/templates/book/file_links/edit_links.html:82
+#: bookwyrm/templates/book/file_links/edit_links.html:86
#: bookwyrm/templates/groups/form.html:32
#: bookwyrm/templates/lists/bookmark_button.html:15
#: bookwyrm/templates/lists/edit_item_form.html:15
@@ -1218,16 +1218,21 @@ msgstr "Status"
msgid "Actions"
msgstr "Handlinger"
-#: bookwyrm/templates/book/file_links/edit_links.html:53
+#: bookwyrm/templates/book/file_links/edit_links.html:48
+#: bookwyrm/templates/settings/link_domains/link_table.html:21
+msgid "Unknown user"
+msgstr ""
+
+#: bookwyrm/templates/book/file_links/edit_links.html:57
#: bookwyrm/templates/book/file_links/verification_modal.html:22
msgid "Report spam"
msgstr "Rapporter spam"
-#: bookwyrm/templates/book/file_links/edit_links.html:97
+#: bookwyrm/templates/book/file_links/edit_links.html:101
msgid "No links available for this book."
msgstr "Ingen lenker er tilgjengelig for denne boka."
-#: bookwyrm/templates/book/file_links/edit_links.html:108
+#: bookwyrm/templates/book/file_links/edit_links.html:112
#: bookwyrm/templates/book/file_links/links.html:18
msgid "Add link to file"
msgstr "Legg til lenke til fil"
@@ -1324,7 +1329,7 @@ msgstr "Bekreftelseskode:"
#: bookwyrm/templates/confirm_email/confirm_email.html:25
#: bookwyrm/templates/landing/layout.html:81
-#: bookwyrm/templates/settings/dashboard/dashboard.html:116
+#: bookwyrm/templates/settings/dashboard/dashboard.html:127
#: bookwyrm/templates/snippets/report_modal.html:53
msgid "Submit"
msgstr "Send inn"
@@ -1340,7 +1345,7 @@ msgstr "Send e-post på nytt"
#: bookwyrm/templates/confirm_email/resend_modal.html:15
#: bookwyrm/templates/landing/layout.html:68
-#: bookwyrm/templates/landing/password_reset_request.html:18
+#: bookwyrm/templates/landing/password_reset_request.html:24
#: bookwyrm/templates/preferences/edit_user.html:53
#: bookwyrm/templates/snippets/register_form.html:27
msgid "Email address:"
@@ -1567,14 +1572,20 @@ msgstr "Du har blitt invitert til å delta i %(site_name)s! Klikk på lenken ned
msgid "Learn more about %(site_name)s:"
msgstr "Lær mer om %(site_name)s:"
-#: bookwyrm/templates/email/moderation_report/html_content.html:6
-#: bookwyrm/templates/email/moderation_report/text_content.html:5
+#: bookwyrm/templates/email/moderation_report/html_content.html:8
+#: bookwyrm/templates/email/moderation_report/text_content.html:6
#, python-format
-msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation. "
-msgstr "@%(reporter)s har flagget @%(reportee)s sin adferd for moderering. "
+msgid "@%(reporter)s has flagged a link domain for moderation."
+msgstr ""
-#: bookwyrm/templates/email/moderation_report/html_content.html:9
-#: bookwyrm/templates/email/moderation_report/text_content.html:7
+#: bookwyrm/templates/email/moderation_report/html_content.html:14
+#: bookwyrm/templates/email/moderation_report/text_content.html:10
+#, python-format
+msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation."
+msgstr ""
+
+#: bookwyrm/templates/email/moderation_report/html_content.html:21
+#: bookwyrm/templates/email/moderation_report/text_content.html:15
msgid "View report"
msgstr "Vis rapport"
@@ -2268,10 +2279,15 @@ msgid "Confirm password:"
msgstr "Gjenta passordet:"
#: bookwyrm/templates/landing/password_reset_request.html:14
+#, python-format
+msgid "A password reset link will be sent to %(email)s if there is an account using that email address."
+msgstr ""
+
+#: bookwyrm/templates/landing/password_reset_request.html:20
msgid "A link to reset your password will be sent to your email address"
msgstr "Lenke som lar deg lage nytt passord blir sendt til e-postadressen din"
-#: bookwyrm/templates/landing/password_reset_request.html:28
+#: bookwyrm/templates/landing/password_reset_request.html:34
msgid "Reset password"
msgstr "Nullstill passordet"
@@ -2579,108 +2595,244 @@ msgstr "Alle lister"
msgid "Saved Lists"
msgstr "Lagrede lister"
-#: bookwyrm/templates/notifications/items/accept.html:16
+#: bookwyrm/templates/notifications/items/accept.html:18
#, python-format
-msgid "accepted your invitation to join group \"%(group_name)s \""
-msgstr "aksepterte invitasjonen din om å bli med i gruppa \"%(group_name)s \""
+msgid "%(related_user)s accepted your invitation to join group \"%(group_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/add.html:24
+#: bookwyrm/templates/notifications/items/accept.html:26
#, python-format
-msgid "added %(book_title)s to your list \"%(list_name)s \""
-msgstr "la til %(book_title)s i lista di \"%(list_name)s \""
+msgid "%(related_user)s and %(second_user)s accepted your invitation to join group \"%(group_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/add.html:31
+#: bookwyrm/templates/notifications/items/accept.html:36
#, python-format
-msgid "suggested adding %(book_title)s to your list \"%(list_name)s \""
-msgstr "foreslo å legge til %(book_title)s i lista di \"%(list_name)s \""
+msgid "%(related_user)s and %(other_user_display_count)s others accepted your invitation to join group \"%(group_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:19
+#: bookwyrm/templates/notifications/items/add.html:33
#, python-format
-msgid "boosted your review of %(book_title)s "
-msgstr "støttet anmeldelsen din av %(book_title)s "
+msgid "%(related_user)s added %(book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:25
+#: bookwyrm/templates/notifications/items/add.html:39
#, python-format
-msgid "boosted your comment on%(book_title)s "
-msgstr "støttet kommentaren din til %(book_title)s "
+msgid "%(related_user)s suggested adding %(book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:31
+#: bookwyrm/templates/notifications/items/add.html:47
#, python-format
-msgid "boosted your quote from %(book_title)s "
-msgstr "støttet sitatet ditt fra %(book_title)s "
+msgid "%(related_user)s added %(book_title)s and %(second_book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:37
+#: bookwyrm/templates/notifications/items/add.html:54
#, python-format
-msgid "boosted your status "
-msgstr "støttet -statusen din "
+msgid "%(related_user)s suggested adding %(book_title)s and %(second_book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/fav.html:19
+#: bookwyrm/templates/notifications/items/add.html:66
#, python-format
-msgid "liked your review of %(book_title)s "
-msgstr "likte anmeldelsen din av %(book_title)s "
+msgid "%(related_user)s added %(book_title)s , %(second_book_title)s , and %(display_count)s other book to your list \"%(list_name)s \""
+msgid_plural "%(related_user)s added %(book_title)s , %(second_book_title)s , and %(display_count)s other books to your list \"%(list_name)s \""
+msgstr[0] ""
+msgstr[1] ""
-#: bookwyrm/templates/notifications/items/fav.html:25
+#: bookwyrm/templates/notifications/items/add.html:82
#, python-format
-msgid "liked your comment on %(book_title)s "
-msgstr "likte kommentaren din om %(book_title)s "
+msgid "%(related_user)s suggested adding %(book_title)s , %(second_book_title)s , and %(display_count)s other book to your list \"%(list_name)s \""
+msgid_plural "%(related_user)s suggested adding %(book_title)s , %(second_book_title)s , and %(display_count)s other books to your list \"%(list_name)s \""
+msgstr[0] ""
+msgstr[1] ""
-#: bookwyrm/templates/notifications/items/fav.html:31
+#: bookwyrm/templates/notifications/items/boost.html:21
#, python-format
-msgid "liked your quote from %(book_title)s "
-msgstr "likte sitatet ditt fra %(book_title)s "
+msgid "%(related_user)s boosted your review of %(book_title)s "
+msgstr ""
-#: bookwyrm/templates/notifications/items/fav.html:37
+#: bookwyrm/templates/notifications/items/boost.html:27
#, python-format
-msgid "liked your status "
-msgstr "likte statusen din "
+msgid "%(related_user)s and %(second_user)s boosted your review of %(book_title)s "
+msgstr ""
-#: bookwyrm/templates/notifications/items/follow.html:15
-msgid "followed you"
-msgstr "følger deg"
+#: bookwyrm/templates/notifications/items/boost.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your review of %(book_title)s "
+msgstr ""
-#: bookwyrm/templates/notifications/items/follow_request.html:11
-msgid "sent you a follow request"
-msgstr "har sendt deg en følgeforespørsel"
+#: bookwyrm/templates/notifications/items/boost.html:44
+#, python-format
+msgid "%(related_user)s boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:50
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:59
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:67
+#, python-format
+msgid "%(related_user)s boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:73
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:82
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:90
+#, python-format
+msgid "%(related_user)s boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:96
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:105
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:21
+#, python-format
+msgid "%(related_user)s liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:27
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:44
+#, python-format
+msgid "%(related_user)s liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:50
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:59
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:67
+#, python-format
+msgid "%(related_user)s liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:73
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:82
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:90
+#, python-format
+msgid "%(related_user)s liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:96
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:105
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:16
+#, python-format
+msgid "%(related_user)s followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:20
+#, python-format
+msgid "%(related_user)s and %(second_user)s followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:25
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow_request.html:15
+#, python-format
+msgid "%(related_user)s sent you a follow request"
+msgstr ""
#: bookwyrm/templates/notifications/items/import.html:14
#, python-format
msgid "Your import completed."
msgstr "Importen din er fullført."
-#: bookwyrm/templates/notifications/items/invite.html:15
+#: bookwyrm/templates/notifications/items/invite.html:16
#, python-format
-msgid "invited you to join the group \"%(group_name)s \""
-msgstr "inviterte deg til å bli med i gruppa \"%(group_name)s \""
+msgid "%(related_user)s invited you to join the group \"%(group_name)s \""
+msgstr ""
#: bookwyrm/templates/notifications/items/join.html:16
#, python-format
msgid "has joined your group \"%(group_name)s \""
msgstr "har blitt med i gruppa di \"%(group_name)s \""
-#: bookwyrm/templates/notifications/items/leave.html:16
+#: bookwyrm/templates/notifications/items/leave.html:18
#, python-format
-msgid "has left your group \"%(group_name)s \""
-msgstr "har forlatt gruppa di\"%(group_name)s \""
+msgid "%(related_user)s has left your group \"%(group_name)s \""
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/leave.html:26
+#, python-format
+msgid "%(related_user)s and %(second_user)s have left your group \"%(group_name)s \""
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/leave.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others have left your group \"%(group_name)s \""
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:20
#, python-format
-msgid "mentioned you in a review of %(book_title)s "
-msgstr "nevnte deg i en anmeldelse av %(book_title)s "
+msgid "%(related_user)s mentioned you in a review of %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:26
#, python-format
-msgid "mentioned you in a comment on %(book_title)s "
-msgstr "nevnte deg i en kommentar til %(book_title)s "
+msgid "%(related_user)s mentioned you in a comment on %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:32
#, python-format
-msgid "mentioned you in a quote from %(book_title)s "
-msgstr "nevnte deg i et sitat fra %(book_title)s "
+msgid "%(related_user)s mentioned you in a quote from %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:38
#, python-format
-msgid "mentioned you in a status "
-msgstr "nevnte deg i en status "
+msgid "%(related_user)s mentioned you in a status "
+msgstr ""
#: bookwyrm/templates/notifications/items/remove.html:17
#, python-format
@@ -2694,28 +2846,30 @@ msgstr "Du er fjernet fra %(group_name)s -gruppa"
#: bookwyrm/templates/notifications/items/reply.html:21
#, python-format
-msgid "replied to your review of %(book_title)s "
-msgstr "svarte på anmeldelse din av %(book_title)s "
+msgid "%(related_user)s replied to your review of %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:27
#, python-format
-msgid "replied to your comment on %(book_title)s "
-msgstr "svarte på kommentaren din til %(book_title)s "
+msgid "%(related_user)s replied to your comment on %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:33
#, python-format
-msgid "replied to your quote from %(book_title)s "
-msgstr "svarte på sitatet ditt fra %(book_title)s "
+msgid "%(related_user)s replied to your quote from %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:39
#, python-format
-msgid "replied to your status "
-msgstr "svarte på statusoppdateringen din "
+msgid "%(related_user)s replied to your status "
+msgstr ""
#: bookwyrm/templates/notifications/items/report.html:15
#, python-format
-msgid "A new report needs moderation."
-msgstr "En ny rapport må gjennom moderering."
+msgid "A new report needs moderation"
+msgid_plural "%(display_count)s new reports need moderation"
+msgstr[0] ""
+msgstr[1] ""
#: bookwyrm/templates/notifications/items/update.html:16
#, python-format
@@ -3197,13 +3351,13 @@ msgstr "Usant"
#: bookwyrm/templates/settings/announcements/announcement.html:57
#: bookwyrm/templates/settings/announcements/edit_announcement.html:79
-#: bookwyrm/templates/settings/dashboard/dashboard.html:94
+#: bookwyrm/templates/settings/dashboard/dashboard.html:105
msgid "Start date:"
msgstr "Startdato:"
#: bookwyrm/templates/settings/announcements/announcement.html:62
#: bookwyrm/templates/settings/announcements/edit_announcement.html:89
-#: bookwyrm/templates/settings/dashboard/dashboard.html:100
+#: bookwyrm/templates/settings/dashboard/dashboard.html:111
msgid "End date:"
msgstr "Sluttdato:"
@@ -3363,7 +3517,7 @@ msgid "Dashboard"
msgstr "Kontrollpanel"
#: bookwyrm/templates/settings/dashboard/dashboard.html:15
-#: bookwyrm/templates/settings/dashboard/dashboard.html:123
+#: bookwyrm/templates/settings/dashboard/dashboard.html:134
msgid "Total users"
msgstr "Totalt antall brukere"
@@ -3383,55 +3537,64 @@ msgstr "Verker"
#: bookwyrm/templates/settings/dashboard/dashboard.html:43
#, python-format
+msgid "Your outgoing email address, %(email_sender)s
, may be misconfigured."
+msgstr ""
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:46
+msgid "Check the EMAIL_SENDER_NAME
and EMAIL_SENDER_DOMAIN
in your .env
."
+msgstr ""
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:54
+#, python-format
msgid "%(display_count)s open report"
msgid_plural "%(display_count)s open reports"
msgstr[0] "%(display_count)s åpen rapport"
msgstr[1] "%(display_count)s åpne rapporter"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:55
+#: bookwyrm/templates/settings/dashboard/dashboard.html:66
#, python-format
msgid "%(display_count)s domain needs review"
msgid_plural "%(display_count)s domains need review"
msgstr[0] "%(display_count)s domene må godkjennes"
msgstr[1] "%(display_count)s domener må godkjennes"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:67
+#: bookwyrm/templates/settings/dashboard/dashboard.html:78
#, python-format
msgid "%(display_count)s invite request"
msgid_plural "%(display_count)s invite requests"
msgstr[0] "%(display_count)s invitasjonsforespørsel"
msgstr[1] "%(display_count)s invitasjonsforespørsler"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:79
+#: bookwyrm/templates/settings/dashboard/dashboard.html:90
#, python-format
msgid "An update is available! You're running v%(current)s and the latest release is %(available)s."
msgstr ""
-#: bookwyrm/templates/settings/dashboard/dashboard.html:88
+#: bookwyrm/templates/settings/dashboard/dashboard.html:99
msgid "Instance Activity"
msgstr "Instansaktivitet"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:106
+#: bookwyrm/templates/settings/dashboard/dashboard.html:117
msgid "Interval:"
msgstr "Intervall:"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:110
+#: bookwyrm/templates/settings/dashboard/dashboard.html:121
msgid "Days"
msgstr "Dager"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:111
+#: bookwyrm/templates/settings/dashboard/dashboard.html:122
msgid "Weeks"
msgstr "Uker"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:129
+#: bookwyrm/templates/settings/dashboard/dashboard.html:140
msgid "User signup activity"
msgstr "Brukerregistreringsaktivitet"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:135
+#: bookwyrm/templates/settings/dashboard/dashboard.html:146
msgid "Status activity"
msgstr "Statusaktivitet"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:141
+#: bookwyrm/templates/settings/dashboard/dashboard.html:152
msgid "Works created"
msgstr "Verker laget"
@@ -3851,7 +4014,7 @@ msgstr "Ingen domener venter for tiden på godkjenning"
msgid "No domains currently blocked"
msgstr "Ingen domener er for øyeblikket blokkert"
-#: bookwyrm/templates/settings/link_domains/link_table.html:39
+#: bookwyrm/templates/settings/link_domains/link_table.html:43
msgid "No links available for this domain."
msgstr "Ingen lenker tilgjengelig til dette domenet."
@@ -3879,11 +4042,11 @@ msgstr "Status er slettet"
msgid "Reported links"
msgstr "Rapporterte lenker"
-#: bookwyrm/templates/settings/reports/report.html:63
+#: bookwyrm/templates/settings/reports/report.html:65
msgid "Moderator Comments"
msgstr "Moderatorkommentarer"
-#: bookwyrm/templates/settings/reports/report.html:84
+#: bookwyrm/templates/settings/reports/report.html:86
#: bookwyrm/templates/snippets/create_status.html:26
msgid "Comment"
msgstr "Kommentar"
@@ -3893,12 +4056,17 @@ msgstr "Kommentar"
msgid "Report #%(report_id)s: Status posted by @%(username)s"
msgstr "Rapportér #%(report_id)s: Status postet av @%(username)s"
-#: bookwyrm/templates/settings/reports/report_header.html:12
+#: bookwyrm/templates/settings/reports/report_header.html:13
#, python-format
msgid "Report #%(report_id)s: Link added by @%(username)s"
msgstr "Rapportér #%(report_id)s: Lenke lagt til av @%(username)s"
-#: bookwyrm/templates/settings/reports/report_header.html:18
+#: bookwyrm/templates/settings/reports/report_header.html:17
+#, python-format
+msgid "Report #%(report_id)s: Link domain"
+msgstr ""
+
+#: bookwyrm/templates/settings/reports/report_header.html:24
#, python-format
msgid "Report #%(report_id)s: User @%(username)s"
msgstr "Rapportér #%(report_id)s: bruker @%(username)s"
@@ -4161,11 +4329,15 @@ msgid "Active"
msgstr "Aktiv"
#: bookwyrm/templates/settings/users/user_admin.html:79
+msgid "Deleted"
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_admin.html:85
#: bookwyrm/templates/settings/users/user_info.html:32
msgid "Inactive"
msgstr "Inaktiv"
-#: bookwyrm/templates/settings/users/user_admin.html:88
+#: bookwyrm/templates/settings/users/user_admin.html:94
#: bookwyrm/templates/settings/users/user_info.html:127
msgid "Not set"
msgstr "Ikke angitt"
@@ -5170,15 +5342,6 @@ msgstr "Ikke en gyldig csv-fil"
msgid "Username or password are incorrect"
msgstr "Feil brukernavn eller passord"
-#: bookwyrm/views/landing/password.py:32
-msgid "No user with that email address was found."
-msgstr "Ingen bruker med den e-postadressen ble funnet."
-
-#: bookwyrm/views/landing/password.py:43
-#, python-brace-format
-msgid "A password reset link was sent to {email}"
-msgstr "En lenke for tilbakestilling av passord er sendt til {email}"
-
#: bookwyrm/views/rss_feed.py:34
#, python-brace-format
msgid "Status updates from {obj.display_name}"
diff --git a/locale/pt_BR/LC_MESSAGES/django.mo b/locale/pt_BR/LC_MESSAGES/django.mo
index 917f0cd45..48000c2f2 100644
Binary files a/locale/pt_BR/LC_MESSAGES/django.mo and b/locale/pt_BR/LC_MESSAGES/django.mo differ
diff --git a/locale/pt_BR/LC_MESSAGES/django.po b/locale/pt_BR/LC_MESSAGES/django.po
index aa0534052..10e311104 100644
--- a/locale/pt_BR/LC_MESSAGES/django.po
+++ b/locale/pt_BR/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-05-31 23:50+0000\n"
-"PO-Revision-Date: 2022-06-01 00:55\n"
+"POT-Creation-Date: 2022-07-07 17:47+0000\n"
+"PO-Revision-Date: 2022-07-07 18:12\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: Portuguese, Brazilian\n"
"Language: pt\n"
@@ -121,7 +121,7 @@ msgstr "Atenção"
msgid "Danger"
msgstr "Perigo"
-#: bookwyrm/models/antispam.py:106 bookwyrm/models/antispam.py:140
+#: bookwyrm/models/antispam.py:101 bookwyrm/models/antispam.py:135
msgid "Automatically generated report"
msgstr "Relatório gerado automaticamente"
@@ -740,7 +740,7 @@ msgstr "ISNI:"
#: bookwyrm/templates/book/book.html:202
#: bookwyrm/templates/book/edit/edit_book.html:135
#: bookwyrm/templates/book/file_links/add_link_modal.html:60
-#: bookwyrm/templates/book/file_links/edit_links.html:82
+#: bookwyrm/templates/book/file_links/edit_links.html:86
#: bookwyrm/templates/groups/form.html:32
#: bookwyrm/templates/lists/bookmark_button.html:15
#: bookwyrm/templates/lists/edit_item_form.html:15
@@ -1218,16 +1218,21 @@ msgstr "Publicação"
msgid "Actions"
msgstr "Ações"
-#: bookwyrm/templates/book/file_links/edit_links.html:53
+#: bookwyrm/templates/book/file_links/edit_links.html:48
+#: bookwyrm/templates/settings/link_domains/link_table.html:21
+msgid "Unknown user"
+msgstr ""
+
+#: bookwyrm/templates/book/file_links/edit_links.html:57
#: bookwyrm/templates/book/file_links/verification_modal.html:22
msgid "Report spam"
msgstr "Denunciar spam"
-#: bookwyrm/templates/book/file_links/edit_links.html:97
+#: bookwyrm/templates/book/file_links/edit_links.html:101
msgid "No links available for this book."
msgstr "Nenhum link disponível para este livro."
-#: bookwyrm/templates/book/file_links/edit_links.html:108
+#: bookwyrm/templates/book/file_links/edit_links.html:112
#: bookwyrm/templates/book/file_links/links.html:18
msgid "Add link to file"
msgstr "Adicionar link ao arquivo"
@@ -1324,7 +1329,7 @@ msgstr "Código de confirmação:"
#: bookwyrm/templates/confirm_email/confirm_email.html:25
#: bookwyrm/templates/landing/layout.html:81
-#: bookwyrm/templates/settings/dashboard/dashboard.html:116
+#: bookwyrm/templates/settings/dashboard/dashboard.html:127
#: bookwyrm/templates/snippets/report_modal.html:53
msgid "Submit"
msgstr "Enviar"
@@ -1340,7 +1345,7 @@ msgstr "Reenviar link de confirmação"
#: bookwyrm/templates/confirm_email/resend_modal.html:15
#: bookwyrm/templates/landing/layout.html:68
-#: bookwyrm/templates/landing/password_reset_request.html:18
+#: bookwyrm/templates/landing/password_reset_request.html:24
#: bookwyrm/templates/preferences/edit_user.html:53
#: bookwyrm/templates/snippets/register_form.html:27
msgid "Email address:"
@@ -1567,14 +1572,20 @@ msgstr "Você recebeu um convite para juntar-se a %(site_name)s! Clique no link
msgid "Learn more about %(site_name)s:"
msgstr "Saiba mais sobre %(site_name)s:"
-#: bookwyrm/templates/email/moderation_report/html_content.html:6
-#: bookwyrm/templates/email/moderation_report/text_content.html:5
+#: bookwyrm/templates/email/moderation_report/html_content.html:8
+#: bookwyrm/templates/email/moderation_report/text_content.html:6
#, python-format
-msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation. "
-msgstr "@%(reporter)s sinalizou o comportamento de @%(reportee)s para moderação. "
+msgid "@%(reporter)s has flagged a link domain for moderation."
+msgstr ""
-#: bookwyrm/templates/email/moderation_report/html_content.html:9
-#: bookwyrm/templates/email/moderation_report/text_content.html:7
+#: bookwyrm/templates/email/moderation_report/html_content.html:14
+#: bookwyrm/templates/email/moderation_report/text_content.html:10
+#, python-format
+msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation."
+msgstr ""
+
+#: bookwyrm/templates/email/moderation_report/html_content.html:21
+#: bookwyrm/templates/email/moderation_report/text_content.html:15
msgid "View report"
msgstr "Ver denúncia"
@@ -2268,10 +2279,15 @@ msgid "Confirm password:"
msgstr "Confirmar senha:"
#: bookwyrm/templates/landing/password_reset_request.html:14
+#, python-format
+msgid "A password reset link will be sent to %(email)s if there is an account using that email address."
+msgstr ""
+
+#: bookwyrm/templates/landing/password_reset_request.html:20
msgid "A link to reset your password will be sent to your email address"
msgstr "Um link para redefinir sua senha será enviada para seu e-mail"
-#: bookwyrm/templates/landing/password_reset_request.html:28
+#: bookwyrm/templates/landing/password_reset_request.html:34
msgid "Reset password"
msgstr "Redefinir senha"
@@ -2579,108 +2595,244 @@ msgstr "Todas as listas"
msgid "Saved Lists"
msgstr "Listas salvas"
-#: bookwyrm/templates/notifications/items/accept.html:16
+#: bookwyrm/templates/notifications/items/accept.html:18
#, python-format
-msgid "accepted your invitation to join group \"%(group_name)s \""
-msgstr "aceitou seu convite para participar do grupo \"%(group_name)s \""
+msgid "%(related_user)s accepted your invitation to join group \"%(group_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/add.html:24
+#: bookwyrm/templates/notifications/items/accept.html:26
#, python-format
-msgid "added %(book_title)s to your list \"%(list_name)s \""
-msgstr "adicionou %(book_title)s à sua lista \"%(list_name)s \""
+msgid "%(related_user)s and %(second_user)s accepted your invitation to join group \"%(group_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/add.html:31
+#: bookwyrm/templates/notifications/items/accept.html:36
#, python-format
-msgid "suggested adding %(book_title)s to your list \"%(list_name)s \""
-msgstr "sugeriu adicionar %(book_title)s à sua lista \"%(list_name)s \""
+msgid "%(related_user)s and %(other_user_display_count)s others accepted your invitation to join group \"%(group_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:19
+#: bookwyrm/templates/notifications/items/add.html:33
#, python-format
-msgid "boosted your review of %(book_title)s "
-msgstr "compartilhou sua resenha de %(book_title)s "
+msgid "%(related_user)s added %(book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:25
+#: bookwyrm/templates/notifications/items/add.html:39
#, python-format
-msgid "boosted your comment on%(book_title)s "
-msgstr "compartilhou seu comentário sobre %(book_title)s "
+msgid "%(related_user)s suggested adding %(book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:31
+#: bookwyrm/templates/notifications/items/add.html:47
#, python-format
-msgid "boosted your quote from %(book_title)s "
-msgstr "compartilhou sua citação de %(book_title)s "
+msgid "%(related_user)s added %(book_title)s and %(second_book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:37
+#: bookwyrm/templates/notifications/items/add.html:54
#, python-format
-msgid "boosted your status "
-msgstr "compartilhou sua publicação "
+msgid "%(related_user)s suggested adding %(book_title)s and %(second_book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/fav.html:19
+#: bookwyrm/templates/notifications/items/add.html:66
#, python-format
-msgid "liked your review of %(book_title)s "
-msgstr "curtiu sua resenha de %(book_title)s "
+msgid "%(related_user)s added %(book_title)s , %(second_book_title)s , and %(display_count)s other book to your list \"%(list_name)s \""
+msgid_plural "%(related_user)s added %(book_title)s , %(second_book_title)s , and %(display_count)s other books to your list \"%(list_name)s \""
+msgstr[0] ""
+msgstr[1] ""
-#: bookwyrm/templates/notifications/items/fav.html:25
+#: bookwyrm/templates/notifications/items/add.html:82
#, python-format
-msgid "liked your comment on %(book_title)s "
-msgstr "curtiu seu comentário sobre %(book_title)s "
+msgid "%(related_user)s suggested adding %(book_title)s , %(second_book_title)s , and %(display_count)s other book to your list \"%(list_name)s \""
+msgid_plural "%(related_user)s suggested adding %(book_title)s , %(second_book_title)s , and %(display_count)s other books to your list \"%(list_name)s \""
+msgstr[0] ""
+msgstr[1] ""
-#: bookwyrm/templates/notifications/items/fav.html:31
+#: bookwyrm/templates/notifications/items/boost.html:21
#, python-format
-msgid "liked your quote from %(book_title)s "
-msgstr "curtiu sua citação de %(book_title)s "
+msgid "%(related_user)s boosted your review of %(book_title)s "
+msgstr ""
-#: bookwyrm/templates/notifications/items/fav.html:37
+#: bookwyrm/templates/notifications/items/boost.html:27
#, python-format
-msgid "liked your status "
-msgstr "curtiu sua publicação "
+msgid "%(related_user)s and %(second_user)s boosted your review of %(book_title)s "
+msgstr ""
-#: bookwyrm/templates/notifications/items/follow.html:15
-msgid "followed you"
-msgstr "te seguiu"
+#: bookwyrm/templates/notifications/items/boost.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your review of %(book_title)s "
+msgstr ""
-#: bookwyrm/templates/notifications/items/follow_request.html:11
-msgid "sent you a follow request"
-msgstr "pediu para te seguir"
+#: bookwyrm/templates/notifications/items/boost.html:44
+#, python-format
+msgid "%(related_user)s boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:50
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:59
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:67
+#, python-format
+msgid "%(related_user)s boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:73
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:82
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:90
+#, python-format
+msgid "%(related_user)s boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:96
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:105
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:21
+#, python-format
+msgid "%(related_user)s liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:27
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:44
+#, python-format
+msgid "%(related_user)s liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:50
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:59
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:67
+#, python-format
+msgid "%(related_user)s liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:73
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:82
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:90
+#, python-format
+msgid "%(related_user)s liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:96
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:105
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:16
+#, python-format
+msgid "%(related_user)s followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:20
+#, python-format
+msgid "%(related_user)s and %(second_user)s followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:25
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow_request.html:15
+#, python-format
+msgid "%(related_user)s sent you a follow request"
+msgstr ""
#: bookwyrm/templates/notifications/items/import.html:14
#, python-format
msgid "Your import completed."
msgstr "Sua importação foi concluída."
-#: bookwyrm/templates/notifications/items/invite.html:15
+#: bookwyrm/templates/notifications/items/invite.html:16
#, python-format
-msgid "invited you to join the group \"%(group_name)s \""
-msgstr "te convidou para participar do grupo \"%(group_name)s \""
+msgid "%(related_user)s invited you to join the group \"%(group_name)s \""
+msgstr ""
#: bookwyrm/templates/notifications/items/join.html:16
#, python-format
msgid "has joined your group \"%(group_name)s \""
msgstr "entrou em seu grupo \"%(group_name)s \""
-#: bookwyrm/templates/notifications/items/leave.html:16
+#: bookwyrm/templates/notifications/items/leave.html:18
#, python-format
-msgid "has left your group \"%(group_name)s \""
-msgstr "saiu de seu grupo \"%(group_name)s \""
+msgid "%(related_user)s has left your group \"%(group_name)s \""
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/leave.html:26
+#, python-format
+msgid "%(related_user)s and %(second_user)s have left your group \"%(group_name)s \""
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/leave.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others have left your group \"%(group_name)s \""
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:20
#, python-format
-msgid "mentioned you in a review of %(book_title)s "
-msgstr "te mencionou em uma resenha de %(book_title)s "
+msgid "%(related_user)s mentioned you in a review of %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:26
#, python-format
-msgid "mentioned you in a comment on %(book_title)s "
-msgstr "te mencionou em um comentário sobre %(book_title)s "
+msgid "%(related_user)s mentioned you in a comment on %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:32
#, python-format
-msgid "mentioned you in a quote from %(book_title)s "
-msgstr "te mencionou em uma citação de %(book_title)s "
+msgid "%(related_user)s mentioned you in a quote from %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:38
#, python-format
-msgid "mentioned you in a status "
-msgstr "te mencionou em uma publicação "
+msgid "%(related_user)s mentioned you in a status "
+msgstr ""
#: bookwyrm/templates/notifications/items/remove.html:17
#, python-format
@@ -2694,28 +2846,30 @@ msgstr "Você foi excluído(a) do grupo \"%(group_nam
#: bookwyrm/templates/notifications/items/reply.html:21
#, python-format
-msgid " replied to your review of %(book_title)s "
-msgstr "respondeu à sua resenha de %(book_title)s "
+msgid "%(related_user)s replied to your review of %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:27
#, python-format
-msgid "replied to your comment on %(book_title)s "
-msgstr "respondeu ao seu comentário sobre %(book_title)s "
+msgid "%(related_user)s replied to your comment on %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:33
#, python-format
-msgid "replied to your quote from %(book_title)s "
-msgstr "respondeu à sua citação de %(book_title)s "
+msgid "%(related_user)s replied to your quote from %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:39
#, python-format
-msgid "replied to your status "
-msgstr "respondeu à sua publicação "
+msgid "%(related_user)s replied to your status "
+msgstr ""
#: bookwyrm/templates/notifications/items/report.html:15
#, python-format
-msgid "A new report needs moderation."
-msgstr "Uma nova denúncia para moderação."
+msgid "A new report needs moderation"
+msgid_plural "%(display_count)s new reports need moderation"
+msgstr[0] ""
+msgstr[1] ""
#: bookwyrm/templates/notifications/items/update.html:16
#, python-format
@@ -3199,13 +3353,13 @@ msgstr "Falso"
#: bookwyrm/templates/settings/announcements/announcement.html:57
#: bookwyrm/templates/settings/announcements/edit_announcement.html:79
-#: bookwyrm/templates/settings/dashboard/dashboard.html:94
+#: bookwyrm/templates/settings/dashboard/dashboard.html:105
msgid "Start date:"
msgstr "Data de início:"
#: bookwyrm/templates/settings/announcements/announcement.html:62
#: bookwyrm/templates/settings/announcements/edit_announcement.html:89
-#: bookwyrm/templates/settings/dashboard/dashboard.html:100
+#: bookwyrm/templates/settings/dashboard/dashboard.html:111
msgid "End date:"
msgstr "Data final:"
@@ -3365,7 +3519,7 @@ msgid "Dashboard"
msgstr "Painel"
#: bookwyrm/templates/settings/dashboard/dashboard.html:15
-#: bookwyrm/templates/settings/dashboard/dashboard.html:123
+#: bookwyrm/templates/settings/dashboard/dashboard.html:134
msgid "Total users"
msgstr "Total de usuários"
@@ -3385,55 +3539,64 @@ msgstr "Obras"
#: bookwyrm/templates/settings/dashboard/dashboard.html:43
#, python-format
+msgid "Your outgoing email address, %(email_sender)s
, may be misconfigured."
+msgstr ""
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:46
+msgid "Check the EMAIL_SENDER_NAME
and EMAIL_SENDER_DOMAIN
in your .env
."
+msgstr ""
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:54
+#, python-format
msgid "%(display_count)s open report"
msgid_plural "%(display_count)s open reports"
msgstr[0] "%(display_count)s denúncia aberta"
msgstr[1] "%(display_count)s denúncias abertas"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:55
+#: bookwyrm/templates/settings/dashboard/dashboard.html:66
#, python-format
msgid "%(display_count)s domain needs review"
msgid_plural "%(display_count)s domains need review"
msgstr[0] "%(display_count)s domínio precisa ser analisado"
msgstr[1] "%(display_count)s domínios precisam ser analisados"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:67
+#: bookwyrm/templates/settings/dashboard/dashboard.html:78
#, python-format
msgid "%(display_count)s invite request"
msgid_plural "%(display_count)s invite requests"
msgstr[0] "%(display_count)s pedido de convite"
msgstr[1] "%(display_count)s pedidos de convite"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:79
+#: bookwyrm/templates/settings/dashboard/dashboard.html:90
#, python-format
msgid "An update is available! You're running v%(current)s and the latest release is %(available)s."
msgstr "Há uma atualização disponível! Você está usando a v%(current)s e o último lançamento é %(available)s."
-#: bookwyrm/templates/settings/dashboard/dashboard.html:88
+#: bookwyrm/templates/settings/dashboard/dashboard.html:99
msgid "Instance Activity"
msgstr "Atividade da instância"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:106
+#: bookwyrm/templates/settings/dashboard/dashboard.html:117
msgid "Interval:"
msgstr "Intervalo:"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:110
+#: bookwyrm/templates/settings/dashboard/dashboard.html:121
msgid "Days"
msgstr "Dias"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:111
+#: bookwyrm/templates/settings/dashboard/dashboard.html:122
msgid "Weeks"
msgstr "Semanas"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:129
+#: bookwyrm/templates/settings/dashboard/dashboard.html:140
msgid "User signup activity"
msgstr "Novos usuários"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:135
+#: bookwyrm/templates/settings/dashboard/dashboard.html:146
msgid "Status activity"
msgstr "Publicações"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:141
+#: bookwyrm/templates/settings/dashboard/dashboard.html:152
msgid "Works created"
msgstr "Obras criadas"
@@ -3853,7 +4016,7 @@ msgstr "Nenhum domínio pendente de aprovação"
msgid "No domains currently blocked"
msgstr "Nenhum domínio bloqueado"
-#: bookwyrm/templates/settings/link_domains/link_table.html:39
+#: bookwyrm/templates/settings/link_domains/link_table.html:43
msgid "No links available for this domain."
msgstr "Nenhum link disponível para este domínio."
@@ -3881,11 +4044,11 @@ msgstr "A publicação foi excluída"
msgid "Reported links"
msgstr "Links denunciados"
-#: bookwyrm/templates/settings/reports/report.html:63
+#: bookwyrm/templates/settings/reports/report.html:65
msgid "Moderator Comments"
msgstr "Comentários da moderação"
-#: bookwyrm/templates/settings/reports/report.html:84
+#: bookwyrm/templates/settings/reports/report.html:86
#: bookwyrm/templates/snippets/create_status.html:26
msgid "Comment"
msgstr "Comentar"
@@ -3895,12 +4058,17 @@ msgstr "Comentar"
msgid "Report #%(report_id)s: Status posted by @%(username)s"
msgstr "Denúncia #%(report_id)s: Publicação de @%(username)s"
-#: bookwyrm/templates/settings/reports/report_header.html:12
+#: bookwyrm/templates/settings/reports/report_header.html:13
#, python-format
msgid "Report #%(report_id)s: Link added by @%(username)s"
msgstr "Denúncia #%(report_id)s: Link adicionado por @%(username)s"
-#: bookwyrm/templates/settings/reports/report_header.html:18
+#: bookwyrm/templates/settings/reports/report_header.html:17
+#, python-format
+msgid "Report #%(report_id)s: Link domain"
+msgstr ""
+
+#: bookwyrm/templates/settings/reports/report_header.html:24
#, python-format
msgid "Report #%(report_id)s: User @%(username)s"
msgstr "Denúncia #%(report_id)s: Usuário @%(username)s"
@@ -4163,11 +4331,15 @@ msgid "Active"
msgstr "Ativo"
#: bookwyrm/templates/settings/users/user_admin.html:79
+msgid "Deleted"
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_admin.html:85
#: bookwyrm/templates/settings/users/user_info.html:32
msgid "Inactive"
msgstr "Inativo"
-#: bookwyrm/templates/settings/users/user_admin.html:88
+#: bookwyrm/templates/settings/users/user_admin.html:94
#: bookwyrm/templates/settings/users/user_info.html:127
msgid "Not set"
msgstr "Não definido"
@@ -5172,15 +5344,6 @@ msgstr "Não é um arquivo csv válido"
msgid "Username or password are incorrect"
msgstr "Nome de usuário ou senha incorretos"
-#: bookwyrm/views/landing/password.py:32
-msgid "No user with that email address was found."
-msgstr "Não há nenhum usuário com este e-mail."
-
-#: bookwyrm/views/landing/password.py:43
-#, python-brace-format
-msgid "A password reset link was sent to {email}"
-msgstr "Um link para redefinição da senha foi enviado para {email}"
-
#: bookwyrm/views/rss_feed.py:34
#, python-brace-format
msgid "Status updates from {obj.display_name}"
diff --git a/locale/pt_PT/LC_MESSAGES/django.mo b/locale/pt_PT/LC_MESSAGES/django.mo
index 07b9f009f..2134e8e11 100644
Binary files a/locale/pt_PT/LC_MESSAGES/django.mo and b/locale/pt_PT/LC_MESSAGES/django.mo differ
diff --git a/locale/pt_PT/LC_MESSAGES/django.po b/locale/pt_PT/LC_MESSAGES/django.po
index cdfb2b890..2519ed976 100644
--- a/locale/pt_PT/LC_MESSAGES/django.po
+++ b/locale/pt_PT/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-05-31 23:50+0000\n"
-"PO-Revision-Date: 2022-06-01 00:55\n"
+"POT-Creation-Date: 2022-07-07 17:47+0000\n"
+"PO-Revision-Date: 2022-07-07 18:12\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: Portuguese\n"
"Language: pt\n"
@@ -121,7 +121,7 @@ msgstr "Alerta"
msgid "Danger"
msgstr "Perigo"
-#: bookwyrm/models/antispam.py:106 bookwyrm/models/antispam.py:140
+#: bookwyrm/models/antispam.py:101 bookwyrm/models/antispam.py:135
msgid "Automatically generated report"
msgstr "Relatório gerado automaticamente"
@@ -740,7 +740,7 @@ msgstr "ISNI:"
#: bookwyrm/templates/book/book.html:202
#: bookwyrm/templates/book/edit/edit_book.html:135
#: bookwyrm/templates/book/file_links/add_link_modal.html:60
-#: bookwyrm/templates/book/file_links/edit_links.html:82
+#: bookwyrm/templates/book/file_links/edit_links.html:86
#: bookwyrm/templates/groups/form.html:32
#: bookwyrm/templates/lists/bookmark_button.html:15
#: bookwyrm/templates/lists/edit_item_form.html:15
@@ -1218,16 +1218,21 @@ msgstr "Estado"
msgid "Actions"
msgstr "Acções"
-#: bookwyrm/templates/book/file_links/edit_links.html:53
+#: bookwyrm/templates/book/file_links/edit_links.html:48
+#: bookwyrm/templates/settings/link_domains/link_table.html:21
+msgid "Unknown user"
+msgstr ""
+
+#: bookwyrm/templates/book/file_links/edit_links.html:57
#: bookwyrm/templates/book/file_links/verification_modal.html:22
msgid "Report spam"
msgstr "Denunciar spam"
-#: bookwyrm/templates/book/file_links/edit_links.html:97
+#: bookwyrm/templates/book/file_links/edit_links.html:101
msgid "No links available for this book."
msgstr "Não existem links disponíveis para este livro."
-#: bookwyrm/templates/book/file_links/edit_links.html:108
+#: bookwyrm/templates/book/file_links/edit_links.html:112
#: bookwyrm/templates/book/file_links/links.html:18
msgid "Add link to file"
msgstr ""
@@ -1324,7 +1329,7 @@ msgstr "Código de confirmação:"
#: bookwyrm/templates/confirm_email/confirm_email.html:25
#: bookwyrm/templates/landing/layout.html:81
-#: bookwyrm/templates/settings/dashboard/dashboard.html:116
+#: bookwyrm/templates/settings/dashboard/dashboard.html:127
#: bookwyrm/templates/snippets/report_modal.html:53
msgid "Submit"
msgstr "Submeter"
@@ -1340,7 +1345,7 @@ msgstr "Reenviar um E-Mail de confirmação"
#: bookwyrm/templates/confirm_email/resend_modal.html:15
#: bookwyrm/templates/landing/layout.html:68
-#: bookwyrm/templates/landing/password_reset_request.html:18
+#: bookwyrm/templates/landing/password_reset_request.html:24
#: bookwyrm/templates/preferences/edit_user.html:53
#: bookwyrm/templates/snippets/register_form.html:27
msgid "Email address:"
@@ -1567,14 +1572,20 @@ msgstr "Estás convidado a juntar-te a %(site_name)s! Clica no link abaixo para
msgid "Learn more about %(site_name)s:"
msgstr "Saiba mais sobre %(site_name)s:"
-#: bookwyrm/templates/email/moderation_report/html_content.html:6
-#: bookwyrm/templates/email/moderation_report/text_content.html:5
+#: bookwyrm/templates/email/moderation_report/html_content.html:8
+#: bookwyrm/templates/email/moderation_report/text_content.html:6
#, python-format
-msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation. "
-msgstr "@%(reporter)s marcou o comportamento de @%(reportee)s para moderação. "
+msgid "@%(reporter)s has flagged a link domain for moderation."
+msgstr ""
-#: bookwyrm/templates/email/moderation_report/html_content.html:9
-#: bookwyrm/templates/email/moderation_report/text_content.html:7
+#: bookwyrm/templates/email/moderation_report/html_content.html:14
+#: bookwyrm/templates/email/moderation_report/text_content.html:10
+#, python-format
+msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation."
+msgstr ""
+
+#: bookwyrm/templates/email/moderation_report/html_content.html:21
+#: bookwyrm/templates/email/moderation_report/text_content.html:15
msgid "View report"
msgstr "Ver denúncia"
@@ -2268,10 +2279,15 @@ msgid "Confirm password:"
msgstr "Confirmar palavra-passe:"
#: bookwyrm/templates/landing/password_reset_request.html:14
+#, python-format
+msgid "A password reset link will be sent to %(email)s if there is an account using that email address."
+msgstr ""
+
+#: bookwyrm/templates/landing/password_reset_request.html:20
msgid "A link to reset your password will be sent to your email address"
msgstr "O link para redefinir a tua palavra-passe foi enviado para o teu E-Mail"
-#: bookwyrm/templates/landing/password_reset_request.html:28
+#: bookwyrm/templates/landing/password_reset_request.html:34
msgid "Reset password"
msgstr "Redefinir palavra-passe"
@@ -2579,108 +2595,244 @@ msgstr "Todas as listas"
msgid "Saved Lists"
msgstr "Listas salvas"
-#: bookwyrm/templates/notifications/items/accept.html:16
+#: bookwyrm/templates/notifications/items/accept.html:18
#, python-format
-msgid "accepted your invitation to join group \"%(group_name)s \""
-msgstr "aceitou o teu convite para participar no grupo \"%(group_name)s \""
+msgid "%(related_user)s accepted your invitation to join group \"%(group_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/add.html:24
+#: bookwyrm/templates/notifications/items/accept.html:26
#, python-format
-msgid "added %(book_title)s to your list \"%(list_name)s \""
-msgstr "adicionou o livro %(book_title)s à tua lista \"%(list_name)s \""
+msgid "%(related_user)s and %(second_user)s accepted your invitation to join group \"%(group_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/add.html:31
+#: bookwyrm/templates/notifications/items/accept.html:36
#, python-format
-msgid "suggested adding %(book_title)s to your list \"%(list_name)s \""
-msgstr "sugeriu adicionar o livro %(book_title)s à tua lista \"%(list_name)s \""
+msgid "%(related_user)s and %(other_user_display_count)s others accepted your invitation to join group \"%(group_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:19
+#: bookwyrm/templates/notifications/items/add.html:33
#, python-format
-msgid "boosted your review of %(book_title)s "
-msgstr "partilhou a tua critica de %(book_title)s "
+msgid "%(related_user)s added %(book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:25
+#: bookwyrm/templates/notifications/items/add.html:39
#, python-format
-msgid "boosted your comment on%(book_title)s "
-msgstr "partilhou o teu comentário em %(book_title)s "
+msgid "%(related_user)s suggested adding %(book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:31
+#: bookwyrm/templates/notifications/items/add.html:47
#, python-format
-msgid "boosted your quote from %(book_title)s "
-msgstr "partilhou a tua citação de %(book_title)s "
+msgid "%(related_user)s added %(book_title)s and %(second_book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:37
+#: bookwyrm/templates/notifications/items/add.html:54
#, python-format
-msgid "boosted your status "
-msgstr "partilhou o teu estado "
+msgid "%(related_user)s suggested adding %(book_title)s and %(second_book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/fav.html:19
+#: bookwyrm/templates/notifications/items/add.html:66
#, python-format
-msgid "liked your review of %(book_title)s "
-msgstr "gostou da tua critica de %(book_title)s "
+msgid "%(related_user)s added %(book_title)s , %(second_book_title)s , and %(display_count)s other book to your list \"%(list_name)s \""
+msgid_plural "%(related_user)s added %(book_title)s , %(second_book_title)s , and %(display_count)s other books to your list \"%(list_name)s \""
+msgstr[0] ""
+msgstr[1] ""
-#: bookwyrm/templates/notifications/items/fav.html:25
+#: bookwyrm/templates/notifications/items/add.html:82
#, python-format
-msgid "liked your comment on %(book_title)s "
-msgstr "gostou do teu comentário em %(book_title)s "
+msgid "%(related_user)s suggested adding %(book_title)s , %(second_book_title)s , and %(display_count)s other book to your list \"%(list_name)s \""
+msgid_plural "%(related_user)s suggested adding %(book_title)s , %(second_book_title)s , and %(display_count)s other books to your list \"%(list_name)s \""
+msgstr[0] ""
+msgstr[1] ""
-#: bookwyrm/templates/notifications/items/fav.html:31
+#: bookwyrm/templates/notifications/items/boost.html:21
#, python-format
-msgid "liked your quote from %(book_title)s "
-msgstr "gostou da tua citação de %(book_title)s "
+msgid "%(related_user)s boosted your review of %(book_title)s "
+msgstr ""
-#: bookwyrm/templates/notifications/items/fav.html:37
+#: bookwyrm/templates/notifications/items/boost.html:27
#, python-format
-msgid "liked your status "
-msgstr "gostou do teu estado "
+msgid "%(related_user)s and %(second_user)s boosted your review of %(book_title)s "
+msgstr ""
-#: bookwyrm/templates/notifications/items/follow.html:15
-msgid "followed you"
-msgstr "seguiu-te"
+#: bookwyrm/templates/notifications/items/boost.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your review of %(book_title)s "
+msgstr ""
-#: bookwyrm/templates/notifications/items/follow_request.html:11
-msgid "sent you a follow request"
-msgstr "enviou um pedido para seguir-te"
+#: bookwyrm/templates/notifications/items/boost.html:44
+#, python-format
+msgid "%(related_user)s boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:50
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:59
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:67
+#, python-format
+msgid "%(related_user)s boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:73
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:82
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:90
+#, python-format
+msgid "%(related_user)s boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:96
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:105
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:21
+#, python-format
+msgid "%(related_user)s liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:27
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:44
+#, python-format
+msgid "%(related_user)s liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:50
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:59
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:67
+#, python-format
+msgid "%(related_user)s liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:73
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:82
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:90
+#, python-format
+msgid "%(related_user)s liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:96
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:105
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:16
+#, python-format
+msgid "%(related_user)s followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:20
+#, python-format
+msgid "%(related_user)s and %(second_user)s followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:25
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow_request.html:15
+#, python-format
+msgid "%(related_user)s sent you a follow request"
+msgstr ""
#: bookwyrm/templates/notifications/items/import.html:14
#, python-format
msgid "Your import completed."
msgstr "A tua importação de foi concluída."
-#: bookwyrm/templates/notifications/items/invite.html:15
+#: bookwyrm/templates/notifications/items/invite.html:16
#, python-format
-msgid "invited you to join the group \"%(group_name)s \""
-msgstr "convidou-te para participares no grupo \"%(group_name)s \""
+msgid "%(related_user)s invited you to join the group \"%(group_name)s \""
+msgstr ""
#: bookwyrm/templates/notifications/items/join.html:16
#, python-format
msgid "has joined your group \"%(group_name)s \""
msgstr "juntou-se ao teu grupo \"%(group_name)s \""
-#: bookwyrm/templates/notifications/items/leave.html:16
+#: bookwyrm/templates/notifications/items/leave.html:18
#, python-format
-msgid "has left your group \"%(group_name)s \""
-msgstr "saiu do teu grupo \"%(group_name)s \""
+msgid "%(related_user)s has left your group \"%(group_name)s \""
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/leave.html:26
+#, python-format
+msgid "%(related_user)s and %(second_user)s have left your group \"%(group_name)s \""
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/leave.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others have left your group \"%(group_name)s \""
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:20
#, python-format
-msgid "mentioned you in a review of %(book_title)s "
-msgstr "mencionou-te numa crítica de %(book_title)s "
+msgid "%(related_user)s mentioned you in a review of %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:26
#, python-format
-msgid "mentioned you in a comment on %(book_title)s "
-msgstr "mencionou-te num comentário em %(book_title)s "
+msgid "%(related_user)s mentioned you in a comment on %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:32
#, python-format
-msgid "mentioned you in a quote from %(book_title)s "
-msgstr "mencionou-te numa citação de %(book_title)s "
+msgid "%(related_user)s mentioned you in a quote from %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:38
#, python-format
-msgid "mentioned you in a status "
-msgstr "mencionou-te num estado "
+msgid "%(related_user)s mentioned you in a status "
+msgstr ""
#: bookwyrm/templates/notifications/items/remove.html:17
#, python-format
@@ -2694,28 +2846,30 @@ msgstr "Tu foste removido do grupo \"%(group_name)s
#: bookwyrm/templates/notifications/items/reply.html:21
#, python-format
-msgid " replied to your review of %(book_title)s "
-msgstr "respondeu à tua crítica de %(book_title)s "
+msgid "%(related_user)s replied to your review of %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:27
#, python-format
-msgid "replied to your comment on %(book_title)s "
-msgstr "respondeu ao teu comentário em %(book_title)s "
+msgid "%(related_user)s replied to your comment on %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:33
#, python-format
-msgid "replied to your quote from %(book_title)s "
-msgstr "respondeu à tua citação de %(book_title)s "
+msgid "%(related_user)s replied to your quote from %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:39
#, python-format
-msgid "replied to your status "
-msgstr "respondeu ao teu estado "
+msgid "%(related_user)s replied to your status "
+msgstr ""
#: bookwyrm/templates/notifications/items/report.html:15
#, python-format
-msgid "A new report needs moderation."
-msgstr "Uma nova denúncia precisa de moderação."
+msgid "A new report needs moderation"
+msgid_plural "%(display_count)s new reports need moderation"
+msgstr[0] ""
+msgstr[1] ""
#: bookwyrm/templates/notifications/items/update.html:16
#, python-format
@@ -3199,13 +3353,13 @@ msgstr "Falso"
#: bookwyrm/templates/settings/announcements/announcement.html:57
#: bookwyrm/templates/settings/announcements/edit_announcement.html:79
-#: bookwyrm/templates/settings/dashboard/dashboard.html:94
+#: bookwyrm/templates/settings/dashboard/dashboard.html:105
msgid "Start date:"
msgstr "Data de início:"
#: bookwyrm/templates/settings/announcements/announcement.html:62
#: bookwyrm/templates/settings/announcements/edit_announcement.html:89
-#: bookwyrm/templates/settings/dashboard/dashboard.html:100
+#: bookwyrm/templates/settings/dashboard/dashboard.html:111
msgid "End date:"
msgstr "Data de conclusão:"
@@ -3365,7 +3519,7 @@ msgid "Dashboard"
msgstr "Painel de controlo"
#: bookwyrm/templates/settings/dashboard/dashboard.html:15
-#: bookwyrm/templates/settings/dashboard/dashboard.html:123
+#: bookwyrm/templates/settings/dashboard/dashboard.html:134
msgid "Total users"
msgstr "Total de utilizadores"
@@ -3385,55 +3539,64 @@ msgstr "Obras"
#: bookwyrm/templates/settings/dashboard/dashboard.html:43
#, python-format
+msgid "Your outgoing email address, %(email_sender)s
, may be misconfigured."
+msgstr ""
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:46
+msgid "Check the EMAIL_SENDER_NAME
and EMAIL_SENDER_DOMAIN
in your .env
."
+msgstr ""
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:54
+#, python-format
msgid "%(display_count)s open report"
msgid_plural "%(display_count)s open reports"
msgstr[0] "%(display_count)s denúncia aberta"
msgstr[1] "%(display_count)s denúncias abertas"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:55
+#: bookwyrm/templates/settings/dashboard/dashboard.html:66
#, python-format
msgid "%(display_count)s domain needs review"
msgid_plural "%(display_count)s domains need review"
msgstr[0] ""
msgstr[1] ""
-#: bookwyrm/templates/settings/dashboard/dashboard.html:67
+#: bookwyrm/templates/settings/dashboard/dashboard.html:78
#, python-format
msgid "%(display_count)s invite request"
msgid_plural "%(display_count)s invite requests"
msgstr[0] "%(display_count)s pedido de convite"
msgstr[1] "%(display_count)s pedidos de convite"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:79
+#: bookwyrm/templates/settings/dashboard/dashboard.html:90
#, python-format
msgid "An update is available! You're running v%(current)s and the latest release is %(available)s."
msgstr "Uma atualização está disponível! Estás a correr a versão v%(current)s e a mais recente é a %(available)s."
-#: bookwyrm/templates/settings/dashboard/dashboard.html:88
+#: bookwyrm/templates/settings/dashboard/dashboard.html:99
msgid "Instance Activity"
msgstr "Atividade do domínio"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:106
+#: bookwyrm/templates/settings/dashboard/dashboard.html:117
msgid "Interval:"
msgstr "Intervalo:"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:110
+#: bookwyrm/templates/settings/dashboard/dashboard.html:121
msgid "Days"
msgstr "Dias"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:111
+#: bookwyrm/templates/settings/dashboard/dashboard.html:122
msgid "Weeks"
msgstr "Semanas"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:129
+#: bookwyrm/templates/settings/dashboard/dashboard.html:140
msgid "User signup activity"
msgstr "Atividade de inscrição do utilizador"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:135
+#: bookwyrm/templates/settings/dashboard/dashboard.html:146
msgid "Status activity"
msgstr "Atividade de estado"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:141
+#: bookwyrm/templates/settings/dashboard/dashboard.html:152
msgid "Works created"
msgstr "Obras criadas"
@@ -3853,7 +4016,7 @@ msgstr "Nenhum domínio pendente no momento"
msgid "No domains currently blocked"
msgstr "Sem domínios bloqueado no momento"
-#: bookwyrm/templates/settings/link_domains/link_table.html:39
+#: bookwyrm/templates/settings/link_domains/link_table.html:43
msgid "No links available for this domain."
msgstr "Não existem links disponíveis para este domínio."
@@ -3881,11 +4044,11 @@ msgstr "O estado foi eliminado"
msgid "Reported links"
msgstr "Links reportados"
-#: bookwyrm/templates/settings/reports/report.html:63
+#: bookwyrm/templates/settings/reports/report.html:65
msgid "Moderator Comments"
msgstr "Comentários do Moderador"
-#: bookwyrm/templates/settings/reports/report.html:84
+#: bookwyrm/templates/settings/reports/report.html:86
#: bookwyrm/templates/snippets/create_status.html:26
msgid "Comment"
msgstr "Comentar"
@@ -3895,12 +4058,17 @@ msgstr "Comentar"
msgid "Report #%(report_id)s: Status posted by @%(username)s"
msgstr "Reportar #%(report_id)s: Estado publicado por @%(username)s"
-#: bookwyrm/templates/settings/reports/report_header.html:12
+#: bookwyrm/templates/settings/reports/report_header.html:13
#, python-format
msgid "Report #%(report_id)s: Link added by @%(username)s"
msgstr "Reportar #%(report_id)s: Link adicionado por @%(username)s"
-#: bookwyrm/templates/settings/reports/report_header.html:18
+#: bookwyrm/templates/settings/reports/report_header.html:17
+#, python-format
+msgid "Report #%(report_id)s: Link domain"
+msgstr ""
+
+#: bookwyrm/templates/settings/reports/report_header.html:24
#, python-format
msgid "Report #%(report_id)s: User @%(username)s"
msgstr "Reportar #%(report_id)s: Utilizador @%(username)s"
@@ -4163,11 +4331,15 @@ msgid "Active"
msgstr "Ativo"
#: bookwyrm/templates/settings/users/user_admin.html:79
+msgid "Deleted"
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_admin.html:85
#: bookwyrm/templates/settings/users/user_info.html:32
msgid "Inactive"
msgstr "Inativo"
-#: bookwyrm/templates/settings/users/user_admin.html:88
+#: bookwyrm/templates/settings/users/user_admin.html:94
#: bookwyrm/templates/settings/users/user_info.html:127
msgid "Not set"
msgstr "Não definido"
@@ -5172,15 +5344,6 @@ msgstr "Não é um ficheiro csv válido"
msgid "Username or password are incorrect"
msgstr "Nome de utilizador ou palavra-passe incorretos"
-#: bookwyrm/views/landing/password.py:32
-msgid "No user with that email address was found."
-msgstr "Não foi encontrado nenhum utilizador com este E-Mail."
-
-#: bookwyrm/views/landing/password.py:43
-#, python-brace-format
-msgid "A password reset link was sent to {email}"
-msgstr "Um link para redefinir a palavra-passe foi enviado para este {email}"
-
#: bookwyrm/views/rss_feed.py:34
#, python-brace-format
msgid "Status updates from {obj.display_name}"
diff --git a/locale/ro_RO/LC_MESSAGES/django.mo b/locale/ro_RO/LC_MESSAGES/django.mo
index 4134a5e33..b5af8e059 100644
Binary files a/locale/ro_RO/LC_MESSAGES/django.mo and b/locale/ro_RO/LC_MESSAGES/django.mo differ
diff --git a/locale/ro_RO/LC_MESSAGES/django.po b/locale/ro_RO/LC_MESSAGES/django.po
index 0270a93fa..54af51b70 100644
--- a/locale/ro_RO/LC_MESSAGES/django.po
+++ b/locale/ro_RO/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-05-31 23:50+0000\n"
-"PO-Revision-Date: 2022-06-01 00:55\n"
+"POT-Creation-Date: 2022-07-07 17:47+0000\n"
+"PO-Revision-Date: 2022-07-07 18:12\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: Romanian\n"
"Language: ro\n"
@@ -121,7 +121,7 @@ msgstr "Avertisment"
msgid "Danger"
msgstr "Pericol"
-#: bookwyrm/models/antispam.py:106 bookwyrm/models/antispam.py:140
+#: bookwyrm/models/antispam.py:101 bookwyrm/models/antispam.py:135
msgid "Automatically generated report"
msgstr "Raport generat automat"
@@ -744,7 +744,7 @@ msgstr "ISNI:"
#: bookwyrm/templates/book/book.html:202
#: bookwyrm/templates/book/edit/edit_book.html:135
#: bookwyrm/templates/book/file_links/add_link_modal.html:60
-#: bookwyrm/templates/book/file_links/edit_links.html:82
+#: bookwyrm/templates/book/file_links/edit_links.html:86
#: bookwyrm/templates/groups/form.html:32
#: bookwyrm/templates/lists/bookmark_button.html:15
#: bookwyrm/templates/lists/edit_item_form.html:15
@@ -1224,16 +1224,21 @@ msgstr "Status"
msgid "Actions"
msgstr "Acțiuni"
-#: bookwyrm/templates/book/file_links/edit_links.html:53
+#: bookwyrm/templates/book/file_links/edit_links.html:48
+#: bookwyrm/templates/settings/link_domains/link_table.html:21
+msgid "Unknown user"
+msgstr ""
+
+#: bookwyrm/templates/book/file_links/edit_links.html:57
#: bookwyrm/templates/book/file_links/verification_modal.html:22
msgid "Report spam"
msgstr "Raportați spam"
-#: bookwyrm/templates/book/file_links/edit_links.html:97
+#: bookwyrm/templates/book/file_links/edit_links.html:101
msgid "No links available for this book."
msgstr "Nicio legătură disponibilă pentru această carte."
-#: bookwyrm/templates/book/file_links/edit_links.html:108
+#: bookwyrm/templates/book/file_links/edit_links.html:112
#: bookwyrm/templates/book/file_links/links.html:18
msgid "Add link to file"
msgstr "Adăugați o legătură către fișier"
@@ -1330,7 +1335,7 @@ msgstr "Cod de confirmare:"
#: bookwyrm/templates/confirm_email/confirm_email.html:25
#: bookwyrm/templates/landing/layout.html:81
-#: bookwyrm/templates/settings/dashboard/dashboard.html:116
+#: bookwyrm/templates/settings/dashboard/dashboard.html:127
#: bookwyrm/templates/snippets/report_modal.html:53
msgid "Submit"
msgstr "Trimiteți"
@@ -1346,7 +1351,7 @@ msgstr "Retrimiteți legătura de confirmare"
#: bookwyrm/templates/confirm_email/resend_modal.html:15
#: bookwyrm/templates/landing/layout.html:68
-#: bookwyrm/templates/landing/password_reset_request.html:18
+#: bookwyrm/templates/landing/password_reset_request.html:24
#: bookwyrm/templates/preferences/edit_user.html:53
#: bookwyrm/templates/snippets/register_form.html:27
msgid "Email address:"
@@ -1575,14 +1580,20 @@ msgstr "Sunteți invitat să vă alăturați %(site_name)s! Clic pe legătura de
msgid "Learn more about %(site_name)s:"
msgstr "Aflați mai multe despre %(site_name)s:"
-#: bookwyrm/templates/email/moderation_report/html_content.html:6
-#: bookwyrm/templates/email/moderation_report/text_content.html:5
+#: bookwyrm/templates/email/moderation_report/html_content.html:8
+#: bookwyrm/templates/email/moderation_report/text_content.html:6
#, python-format
-msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation. "
-msgstr "@%(reporter)s a marcat comportamentul (lui) %(reportee)s pentru moderare. "
+msgid "@%(reporter)s has flagged a link domain for moderation."
+msgstr ""
-#: bookwyrm/templates/email/moderation_report/html_content.html:9
-#: bookwyrm/templates/email/moderation_report/text_content.html:7
+#: bookwyrm/templates/email/moderation_report/html_content.html:14
+#: bookwyrm/templates/email/moderation_report/text_content.html:10
+#, python-format
+msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation."
+msgstr ""
+
+#: bookwyrm/templates/email/moderation_report/html_content.html:21
+#: bookwyrm/templates/email/moderation_report/text_content.html:15
msgid "View report"
msgstr "Vizualizați raportul"
@@ -2280,10 +2291,15 @@ msgid "Confirm password:"
msgstr "Confirmați parola:"
#: bookwyrm/templates/landing/password_reset_request.html:14
+#, python-format
+msgid "A password reset link will be sent to %(email)s if there is an account using that email address."
+msgstr ""
+
+#: bookwyrm/templates/landing/password_reset_request.html:20
msgid "A link to reset your password will be sent to your email address"
msgstr "O legătură pentru reinițializarea parolei dvs. va fi trimisă la adresa dvs."
-#: bookwyrm/templates/landing/password_reset_request.html:28
+#: bookwyrm/templates/landing/password_reset_request.html:34
msgid "Reset password"
msgstr "Reinițializați parola"
@@ -2591,108 +2607,246 @@ msgstr "Toate listele"
msgid "Saved Lists"
msgstr "Listele salvate"
-#: bookwyrm/templates/notifications/items/accept.html:16
+#: bookwyrm/templates/notifications/items/accept.html:18
#, python-format
-msgid "accepted your invitation to join group \"%(group_name)s \""
-msgstr "a acceptat invitația dvs. de a se alătura grupului „%(group_name)s ”"
+msgid "%(related_user)s accepted your invitation to join group \"%(group_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/add.html:24
+#: bookwyrm/templates/notifications/items/accept.html:26
#, python-format
-msgid "added %(book_title)s to your list \"%(list_name)s \""
-msgstr "a adăugat %(book_title)s listei dvs. „%(list_name)s ”"
+msgid "%(related_user)s and %(second_user)s accepted your invitation to join group \"%(group_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/add.html:31
+#: bookwyrm/templates/notifications/items/accept.html:36
#, python-format
-msgid "suggested adding %(book_title)s to your list \"%(list_name)s \""
-msgstr "a sugerat adăugarea %(book_title)s la lista dvs. „%(list_name)s ”"
+msgid "%(related_user)s and %(other_user_display_count)s others accepted your invitation to join group \"%(group_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:19
+#: bookwyrm/templates/notifications/items/add.html:33
#, python-format
-msgid "boosted your review of %(book_title)s "
-msgstr "a partajat recenzia dvs. a %(book_title)s "
+msgid "%(related_user)s added %(book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:25
+#: bookwyrm/templates/notifications/items/add.html:39
#, python-format
-msgid "boosted your comment on%(book_title)s "
-msgstr "a partajat comentariul dvs. despre %(book_title)s "
+msgid "%(related_user)s suggested adding %(book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:31
+#: bookwyrm/templates/notifications/items/add.html:47
#, python-format
-msgid "boosted your quote from %(book_title)s "
-msgstr "a partajat citatul dvs. din %(book_title)s "
+msgid "%(related_user)s added %(book_title)s and %(second_book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:37
+#: bookwyrm/templates/notifications/items/add.html:54
#, python-format
-msgid "boosted your status "
-msgstr "a partajat statusul dvs. "
+msgid "%(related_user)s suggested adding %(book_title)s and %(second_book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/fav.html:19
+#: bookwyrm/templates/notifications/items/add.html:66
#, python-format
-msgid "liked your review of %(book_title)s "
-msgstr "i-a plăcut recenzia dvs. despre %(book_title)s "
+msgid "%(related_user)s added %(book_title)s , %(second_book_title)s , and %(display_count)s other book to your list \"%(list_name)s \""
+msgid_plural "%(related_user)s added %(book_title)s , %(second_book_title)s , and %(display_count)s other books to your list \"%(list_name)s \""
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
-#: bookwyrm/templates/notifications/items/fav.html:25
+#: bookwyrm/templates/notifications/items/add.html:82
#, python-format
-msgid "liked your comment on %(book_title)s "
-msgstr "i-a plăcut comentariul dvs. despre %(book_title)s "
+msgid "%(related_user)s suggested adding %(book_title)s , %(second_book_title)s , and %(display_count)s other book to your list \"%(list_name)s \""
+msgid_plural "%(related_user)s suggested adding %(book_title)s , %(second_book_title)s , and %(display_count)s other books to your list \"%(list_name)s \""
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
-#: bookwyrm/templates/notifications/items/fav.html:31
+#: bookwyrm/templates/notifications/items/boost.html:21
#, python-format
-msgid "liked your quote from %(book_title)s "
-msgstr "i-a plăcut citatul dvs. despre %(book_title)s "
+msgid "%(related_user)s boosted your review of %(book_title)s "
+msgstr ""
-#: bookwyrm/templates/notifications/items/fav.html:37
+#: bookwyrm/templates/notifications/items/boost.html:27
#, python-format
-msgid "liked your status "
-msgstr "i-a plăcut statusul dvs. "
+msgid "%(related_user)s and %(second_user)s boosted your review of %(book_title)s "
+msgstr ""
-#: bookwyrm/templates/notifications/items/follow.html:15
-msgid "followed you"
-msgstr "vă urmărește"
+#: bookwyrm/templates/notifications/items/boost.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your review of %(book_title)s "
+msgstr ""
-#: bookwyrm/templates/notifications/items/follow_request.html:11
-msgid "sent you a follow request"
-msgstr "v-a trimis o cerere de urmărire"
+#: bookwyrm/templates/notifications/items/boost.html:44
+#, python-format
+msgid "%(related_user)s boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:50
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:59
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:67
+#, python-format
+msgid "%(related_user)s boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:73
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:82
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:90
+#, python-format
+msgid "%(related_user)s boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:96
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:105
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:21
+#, python-format
+msgid "%(related_user)s liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:27
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:44
+#, python-format
+msgid "%(related_user)s liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:50
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:59
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:67
+#, python-format
+msgid "%(related_user)s liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:73
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:82
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:90
+#, python-format
+msgid "%(related_user)s liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:96
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:105
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:16
+#, python-format
+msgid "%(related_user)s followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:20
+#, python-format
+msgid "%(related_user)s and %(second_user)s followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:25
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow_request.html:15
+#, python-format
+msgid "%(related_user)s sent you a follow request"
+msgstr ""
#: bookwyrm/templates/notifications/items/import.html:14
#, python-format
msgid "Your import completed."
msgstr "importul dvs. s-a terminat."
-#: bookwyrm/templates/notifications/items/invite.html:15
+#: bookwyrm/templates/notifications/items/invite.html:16
#, python-format
-msgid "invited you to join the group \"%(group_name)s \""
-msgstr "v-a invitat să vă alăturați grupului „%(group_name)s ”"
+msgid "%(related_user)s invited you to join the group \"%(group_name)s \""
+msgstr ""
#: bookwyrm/templates/notifications/items/join.html:16
#, python-format
msgid "has joined your group \"%(group_name)s \""
msgstr "s-a alăturat grupului dvs „%(group_name)s ”"
-#: bookwyrm/templates/notifications/items/leave.html:16
+#: bookwyrm/templates/notifications/items/leave.html:18
#, python-format
-msgid "has left your group \"%(group_name)s \""
-msgstr "a părăsit grupul dvs. „%(group_name)s ”"
+msgid "%(related_user)s has left your group \"%(group_name)s \""
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/leave.html:26
+#, python-format
+msgid "%(related_user)s and %(second_user)s have left your group \"%(group_name)s \""
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/leave.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others have left your group \"%(group_name)s \""
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:20
#, python-format
-msgid "mentioned you in a review of %(book_title)s "
-msgstr "v-a menționat într-o recenzie a %(book_title)s "
+msgid "%(related_user)s mentioned you in a review of %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:26
#, python-format
-msgid "mentioned you in a comment on %(book_title)s "
-msgstr "v-a menționat într-un comentariu despre %(book_title)s "
+msgid "%(related_user)s mentioned you in a comment on %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:32
#, python-format
-msgid "mentioned you in a quote from %(book_title)s "
-msgstr "v-a menționat într-un citat despre %(book_title)s "
+msgid "%(related_user)s mentioned you in a quote from %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:38
#, python-format
-msgid "mentioned you in a status "
-msgstr "v-a menționat într-un status "
+msgid "%(related_user)s mentioned you in a status "
+msgstr ""
#: bookwyrm/templates/notifications/items/remove.html:17
#, python-format
@@ -2706,28 +2860,31 @@ msgstr "Ați fost înlăturat de la grupul „%(group
#: bookwyrm/templates/notifications/items/reply.html:21
#, python-format
-msgid " replied to your review of %(book_title)s "
-msgstr "a răspuns recenziei dvs. despre %(book_title)s "
+msgid "%(related_user)s replied to your review of %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:27
#, python-format
-msgid "replied to your comment on %(book_title)s "
-msgstr "a răspuns comentariului dvs. despre %(book_title)s "
+msgid "%(related_user)s replied to your comment on %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:33
#, python-format
-msgid "replied to your quote from %(book_title)s "
-msgstr "a răspuns citatului dvs. din %(book_title)s "
+msgid "%(related_user)s replied to your quote from %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:39
#, python-format
-msgid "replied to your status "
-msgstr "a răspuns statusului dvs."
+msgid "%(related_user)s replied to your status "
+msgstr ""
#: bookwyrm/templates/notifications/items/report.html:15
#, python-format
-msgid "A new report needs moderation."
-msgstr "Un raport nou are nevoie de moderare."
+msgid "A new report needs moderation"
+msgid_plural "%(display_count)s new reports need moderation"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
#: bookwyrm/templates/notifications/items/update.html:16
#, python-format
@@ -3210,13 +3367,13 @@ msgstr "Fals"
#: bookwyrm/templates/settings/announcements/announcement.html:57
#: bookwyrm/templates/settings/announcements/edit_announcement.html:79
-#: bookwyrm/templates/settings/dashboard/dashboard.html:94
+#: bookwyrm/templates/settings/dashboard/dashboard.html:105
msgid "Start date:"
msgstr "Data de început:"
#: bookwyrm/templates/settings/announcements/announcement.html:62
#: bookwyrm/templates/settings/announcements/edit_announcement.html:89
-#: bookwyrm/templates/settings/dashboard/dashboard.html:100
+#: bookwyrm/templates/settings/dashboard/dashboard.html:111
msgid "End date:"
msgstr "Data de sfârșit:"
@@ -3376,7 +3533,7 @@ msgid "Dashboard"
msgstr "Tablou de bord"
#: bookwyrm/templates/settings/dashboard/dashboard.html:15
-#: bookwyrm/templates/settings/dashboard/dashboard.html:123
+#: bookwyrm/templates/settings/dashboard/dashboard.html:134
msgid "Total users"
msgstr "Număr total de utilizatori"
@@ -3396,13 +3553,22 @@ msgstr "Opere"
#: bookwyrm/templates/settings/dashboard/dashboard.html:43
#, python-format
+msgid "Your outgoing email address, %(email_sender)s
, may be misconfigured."
+msgstr ""
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:46
+msgid "Check the EMAIL_SENDER_NAME
and EMAIL_SENDER_DOMAIN
in your .env
."
+msgstr ""
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:54
+#, python-format
msgid "%(display_count)s open report"
msgid_plural "%(display_count)s open reports"
msgstr[0] "%(display_count)s raport deschis"
msgstr[1] ""
msgstr[2] "%(display_count)s raporturi dechise"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:55
+#: bookwyrm/templates/settings/dashboard/dashboard.html:66
#, python-format
msgid "%(display_count)s domain needs review"
msgid_plural "%(display_count)s domains need review"
@@ -3410,7 +3576,7 @@ msgstr[0] "%(display_count)s domeniu care necesită revizuire"
msgstr[1] ""
msgstr[2] "%(display_count)s domenii care necesită revizii"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:67
+#: bookwyrm/templates/settings/dashboard/dashboard.html:78
#, python-format
msgid "%(display_count)s invite request"
msgid_plural "%(display_count)s invite requests"
@@ -3418,36 +3584,36 @@ msgstr[0] "%(display_count)s cerere de invitare"
msgstr[1] ""
msgstr[2] "%(display_count)s cereri de invitare"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:79
+#: bookwyrm/templates/settings/dashboard/dashboard.html:90
#, python-format
msgid "An update is available! You're running v%(current)s and the latest release is %(available)s."
msgstr "O actualizare este disponibilă! Rulați în prezent v%(current)s, iar cea mai nouă versiune este %(available)s."
-#: bookwyrm/templates/settings/dashboard/dashboard.html:88
+#: bookwyrm/templates/settings/dashboard/dashboard.html:99
msgid "Instance Activity"
msgstr "Activitatea instanței"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:106
+#: bookwyrm/templates/settings/dashboard/dashboard.html:117
msgid "Interval:"
msgstr "Interval:"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:110
+#: bookwyrm/templates/settings/dashboard/dashboard.html:121
msgid "Days"
msgstr "Zile"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:111
+#: bookwyrm/templates/settings/dashboard/dashboard.html:122
msgid "Weeks"
msgstr "Săptămâni"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:129
+#: bookwyrm/templates/settings/dashboard/dashboard.html:140
msgid "User signup activity"
msgstr "Activitate de înscriere a utilizatorilor"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:135
+#: bookwyrm/templates/settings/dashboard/dashboard.html:146
msgid "Status activity"
msgstr "Activitate stare"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:141
+#: bookwyrm/templates/settings/dashboard/dashboard.html:152
msgid "Works created"
msgstr "Opere create"
@@ -3868,7 +4034,7 @@ msgstr "Niciun domeniu în așteptare"
msgid "No domains currently blocked"
msgstr "Niciun domeniu blocat"
-#: bookwyrm/templates/settings/link_domains/link_table.html:39
+#: bookwyrm/templates/settings/link_domains/link_table.html:43
msgid "No links available for this domain."
msgstr "Nicio legătură disponibilă pentru acest domeniu."
@@ -3896,11 +4062,11 @@ msgstr "Statusul a fost șters"
msgid "Reported links"
msgstr "Raportați legături"
-#: bookwyrm/templates/settings/reports/report.html:63
+#: bookwyrm/templates/settings/reports/report.html:65
msgid "Moderator Comments"
msgstr "Comentarile moderatorului"
-#: bookwyrm/templates/settings/reports/report.html:84
+#: bookwyrm/templates/settings/reports/report.html:86
#: bookwyrm/templates/snippets/create_status.html:26
msgid "Comment"
msgstr "Comentariu"
@@ -3910,12 +4076,17 @@ msgstr "Comentariu"
msgid "Report #%(report_id)s: Status posted by @%(username)s"
msgstr "Raport #%(report_id)s: statut postat de @%(username)s"
-#: bookwyrm/templates/settings/reports/report_header.html:12
+#: bookwyrm/templates/settings/reports/report_header.html:13
#, python-format
msgid "Report #%(report_id)s: Link added by @%(username)s"
msgstr "Raport #%(report_id)s: legătură adăugată de @%(username)s"
-#: bookwyrm/templates/settings/reports/report_header.html:18
+#: bookwyrm/templates/settings/reports/report_header.html:17
+#, python-format
+msgid "Report #%(report_id)s: Link domain"
+msgstr ""
+
+#: bookwyrm/templates/settings/reports/report_header.html:24
#, python-format
msgid "Report #%(report_id)s: User @%(username)s"
msgstr "Raport #%(report_id)s: utilizator @%(username)s"
@@ -4178,11 +4349,15 @@ msgid "Active"
msgstr "Activ"
#: bookwyrm/templates/settings/users/user_admin.html:79
+msgid "Deleted"
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_admin.html:85
#: bookwyrm/templates/settings/users/user_info.html:32
msgid "Inactive"
msgstr "Inactiv"
-#: bookwyrm/templates/settings/users/user_admin.html:88
+#: bookwyrm/templates/settings/users/user_admin.html:94
#: bookwyrm/templates/settings/users/user_info.html:127
msgid "Not set"
msgstr "Neconfigurat"
@@ -5197,15 +5372,6 @@ msgstr "Nu este un fișier csv valid"
msgid "Username or password are incorrect"
msgstr "Numele de utilizator sau parola greșite"
-#: bookwyrm/views/landing/password.py:32
-msgid "No user with that email address was found."
-msgstr "Nu a fost găsit niciun utilizator cu această adresă de email."
-
-#: bookwyrm/views/landing/password.py:43
-#, python-brace-format
-msgid "A password reset link was sent to {email}"
-msgstr "O legătură cu resetarea parolei a fost trimisă la {email}"
-
#: bookwyrm/views/rss_feed.py:34
#, python-brace-format
msgid "Status updates from {obj.display_name}"
diff --git a/locale/sv_SE/LC_MESSAGES/django.mo b/locale/sv_SE/LC_MESSAGES/django.mo
index e565450b1..47c4f1939 100644
Binary files a/locale/sv_SE/LC_MESSAGES/django.mo and b/locale/sv_SE/LC_MESSAGES/django.mo differ
diff --git a/locale/sv_SE/LC_MESSAGES/django.po b/locale/sv_SE/LC_MESSAGES/django.po
index 093254edd..03002a581 100644
--- a/locale/sv_SE/LC_MESSAGES/django.po
+++ b/locale/sv_SE/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-05-31 23:50+0000\n"
-"PO-Revision-Date: 2022-06-01 00:55\n"
+"POT-Creation-Date: 2022-07-07 17:47+0000\n"
+"PO-Revision-Date: 2022-07-07 18:12\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: Swedish\n"
"Language: sv\n"
@@ -121,7 +121,7 @@ msgstr "Varning"
msgid "Danger"
msgstr "Observera"
-#: bookwyrm/models/antispam.py:106 bookwyrm/models/antispam.py:140
+#: bookwyrm/models/antispam.py:101 bookwyrm/models/antispam.py:135
msgid "Automatically generated report"
msgstr "Automatiskt genererad rapport"
@@ -740,7 +740,7 @@ msgstr "ISNI:"
#: bookwyrm/templates/book/book.html:202
#: bookwyrm/templates/book/edit/edit_book.html:135
#: bookwyrm/templates/book/file_links/add_link_modal.html:60
-#: bookwyrm/templates/book/file_links/edit_links.html:82
+#: bookwyrm/templates/book/file_links/edit_links.html:86
#: bookwyrm/templates/groups/form.html:32
#: bookwyrm/templates/lists/bookmark_button.html:15
#: bookwyrm/templates/lists/edit_item_form.html:15
@@ -1218,16 +1218,21 @@ msgstr "Status"
msgid "Actions"
msgstr "Åtgärder"
-#: bookwyrm/templates/book/file_links/edit_links.html:53
+#: bookwyrm/templates/book/file_links/edit_links.html:48
+#: bookwyrm/templates/settings/link_domains/link_table.html:21
+msgid "Unknown user"
+msgstr ""
+
+#: bookwyrm/templates/book/file_links/edit_links.html:57
#: bookwyrm/templates/book/file_links/verification_modal.html:22
msgid "Report spam"
msgstr "Rapportera skräppost"
-#: bookwyrm/templates/book/file_links/edit_links.html:97
+#: bookwyrm/templates/book/file_links/edit_links.html:101
msgid "No links available for this book."
msgstr "Inga länkar tillgängliga för den här boken."
-#: bookwyrm/templates/book/file_links/edit_links.html:108
+#: bookwyrm/templates/book/file_links/edit_links.html:112
#: bookwyrm/templates/book/file_links/links.html:18
msgid "Add link to file"
msgstr "Lägg till länk till filen"
@@ -1324,7 +1329,7 @@ msgstr "Bekräftelsekod:"
#: bookwyrm/templates/confirm_email/confirm_email.html:25
#: bookwyrm/templates/landing/layout.html:81
-#: bookwyrm/templates/settings/dashboard/dashboard.html:116
+#: bookwyrm/templates/settings/dashboard/dashboard.html:127
#: bookwyrm/templates/snippets/report_modal.html:53
msgid "Submit"
msgstr "Skicka in"
@@ -1340,7 +1345,7 @@ msgstr "Skicka bekräftelselänken igen"
#: bookwyrm/templates/confirm_email/resend_modal.html:15
#: bookwyrm/templates/landing/layout.html:68
-#: bookwyrm/templates/landing/password_reset_request.html:18
+#: bookwyrm/templates/landing/password_reset_request.html:24
#: bookwyrm/templates/preferences/edit_user.html:53
#: bookwyrm/templates/snippets/register_form.html:27
msgid "Email address:"
@@ -1567,14 +1572,20 @@ msgstr "Du är inbjuden att gå med i %(site_name)s! Klicka på länken nedan f
msgid "Learn more about %(site_name)s:"
msgstr "Lär dig mer om %(site_name)s:"
-#: bookwyrm/templates/email/moderation_report/html_content.html:6
-#: bookwyrm/templates/email/moderation_report/text_content.html:5
+#: bookwyrm/templates/email/moderation_report/html_content.html:8
+#: bookwyrm/templates/email/moderation_report/text_content.html:6
#, python-format
-msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation. "
-msgstr "@%(reporter)s har flaggat beteende av @%(reportee)s för moderering. "
+msgid "@%(reporter)s has flagged a link domain for moderation."
+msgstr ""
-#: bookwyrm/templates/email/moderation_report/html_content.html:9
-#: bookwyrm/templates/email/moderation_report/text_content.html:7
+#: bookwyrm/templates/email/moderation_report/html_content.html:14
+#: bookwyrm/templates/email/moderation_report/text_content.html:10
+#, python-format
+msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation."
+msgstr ""
+
+#: bookwyrm/templates/email/moderation_report/html_content.html:21
+#: bookwyrm/templates/email/moderation_report/text_content.html:15
msgid "View report"
msgstr "Visa rapport"
@@ -2268,10 +2279,15 @@ msgid "Confirm password:"
msgstr "Bekräfta lösenordet:"
#: bookwyrm/templates/landing/password_reset_request.html:14
+#, python-format
+msgid "A password reset link will be sent to %(email)s if there is an account using that email address."
+msgstr ""
+
+#: bookwyrm/templates/landing/password_reset_request.html:20
msgid "A link to reset your password will be sent to your email address"
msgstr "En länk för att återställa ditt lösenord kommer att skickas till din e-postadress"
-#: bookwyrm/templates/landing/password_reset_request.html:28
+#: bookwyrm/templates/landing/password_reset_request.html:34
msgid "Reset password"
msgstr "Återställ lösenordet"
@@ -2579,108 +2595,244 @@ msgstr "Alla listor"
msgid "Saved Lists"
msgstr "Sparade listor"
-#: bookwyrm/templates/notifications/items/accept.html:16
+#: bookwyrm/templates/notifications/items/accept.html:18
#, python-format
-msgid "accepted your invitation to join group \"%(group_name)s \""
-msgstr "accepterade din inbjudning att gå med i gruppen \"%(group_name)s \""
+msgid "%(related_user)s accepted your invitation to join group \"%(group_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/add.html:24
+#: bookwyrm/templates/notifications/items/accept.html:26
#, python-format
-msgid "added %(book_title)s to your list \"%(list_name)s \""
-msgstr "lade till %(book_title)s till din lista \"%(list_name)s \""
+msgid "%(related_user)s and %(second_user)s accepted your invitation to join group \"%(group_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/add.html:31
+#: bookwyrm/templates/notifications/items/accept.html:36
#, python-format
-msgid "suggested adding %(book_title)s to your list \"%(list_name)s \""
-msgstr "föreslog att du skulle lägga till %(book_title)s till din lista \"%(list_name)s \""
+msgid "%(related_user)s and %(other_user_display_count)s others accepted your invitation to join group \"%(group_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:19
+#: bookwyrm/templates/notifications/items/add.html:33
#, python-format
-msgid "boosted your review of %(book_title)s "
-msgstr "ökade din recension av %(book_title)s "
+msgid "%(related_user)s added %(book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:25
+#: bookwyrm/templates/notifications/items/add.html:39
#, python-format
-msgid "boosted your comment on%(book_title)s "
-msgstr "ökade din kommentar på%(book_title)s "
+msgid "%(related_user)s suggested adding %(book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:31
+#: bookwyrm/templates/notifications/items/add.html:47
#, python-format
-msgid "boosted your quote from %(book_title)s "
-msgstr "ökade ditt citat på%(book_title)s "
+msgid "%(related_user)s added %(book_title)s and %(second_book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:37
+#: bookwyrm/templates/notifications/items/add.html:54
#, python-format
-msgid "boosted your status "
-msgstr "ökade din status "
+msgid "%(related_user)s suggested adding %(book_title)s and %(second_book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/fav.html:19
+#: bookwyrm/templates/notifications/items/add.html:66
#, python-format
-msgid "liked your review of %(book_title)s "
-msgstr "gillade din recension av %(book_title)s "
+msgid "%(related_user)s added %(book_title)s , %(second_book_title)s , and %(display_count)s other book to your list \"%(list_name)s \""
+msgid_plural "%(related_user)s added %(book_title)s , %(second_book_title)s , and %(display_count)s other books to your list \"%(list_name)s \""
+msgstr[0] ""
+msgstr[1] ""
-#: bookwyrm/templates/notifications/items/fav.html:25
+#: bookwyrm/templates/notifications/items/add.html:82
#, python-format
-msgid "liked your comment on %(book_title)s "
-msgstr "gillade din kommentar av %(book_title)s "
+msgid "%(related_user)s suggested adding %(book_title)s , %(second_book_title)s , and %(display_count)s other book to your list \"%(list_name)s \""
+msgid_plural "%(related_user)s suggested adding %(book_title)s , %(second_book_title)s , and %(display_count)s other books to your list \"%(list_name)s \""
+msgstr[0] ""
+msgstr[1] ""
-#: bookwyrm/templates/notifications/items/fav.html:31
+#: bookwyrm/templates/notifications/items/boost.html:21
#, python-format
-msgid "liked your quote from %(book_title)s "
-msgstr "gillade ditt citat från %(book_title)s "
+msgid "%(related_user)s boosted your review of %(book_title)s "
+msgstr ""
-#: bookwyrm/templates/notifications/items/fav.html:37
+#: bookwyrm/templates/notifications/items/boost.html:27
#, python-format
-msgid "liked your status "
-msgstr "gillade din status "
+msgid "%(related_user)s and %(second_user)s boosted your review of %(book_title)s "
+msgstr ""
-#: bookwyrm/templates/notifications/items/follow.html:15
-msgid "followed you"
-msgstr "följde dig"
+#: bookwyrm/templates/notifications/items/boost.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your review of %(book_title)s "
+msgstr ""
-#: bookwyrm/templates/notifications/items/follow_request.html:11
-msgid "sent you a follow request"
-msgstr "skickade en förfrågning om att följa till dig"
+#: bookwyrm/templates/notifications/items/boost.html:44
+#, python-format
+msgid "%(related_user)s boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:50
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:59
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:67
+#, python-format
+msgid "%(related_user)s boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:73
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:82
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:90
+#, python-format
+msgid "%(related_user)s boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:96
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:105
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:21
+#, python-format
+msgid "%(related_user)s liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:27
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:44
+#, python-format
+msgid "%(related_user)s liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:50
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:59
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:67
+#, python-format
+msgid "%(related_user)s liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:73
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:82
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:90
+#, python-format
+msgid "%(related_user)s liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:96
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:105
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:16
+#, python-format
+msgid "%(related_user)s followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:20
+#, python-format
+msgid "%(related_user)s and %(second_user)s followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:25
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow_request.html:15
+#, python-format
+msgid "%(related_user)s sent you a follow request"
+msgstr ""
#: bookwyrm/templates/notifications/items/import.html:14
#, python-format
msgid "Your import completed."
msgstr "Din import slutfördes."
-#: bookwyrm/templates/notifications/items/invite.html:15
+#: bookwyrm/templates/notifications/items/invite.html:16
#, python-format
-msgid "invited you to join the group \"%(group_name)s \""
-msgstr "bjöd in dig att gå med i gruppen \"%(group_name)s \""
+msgid "%(related_user)s invited you to join the group \"%(group_name)s \""
+msgstr ""
#: bookwyrm/templates/notifications/items/join.html:16
#, python-format
msgid "has joined your group \"%(group_name)s \""
msgstr "har anslutit sig till din grupp \"%(group_name)s \""
-#: bookwyrm/templates/notifications/items/leave.html:16
+#: bookwyrm/templates/notifications/items/leave.html:18
#, python-format
-msgid "has left your group \"%(group_name)s \""
-msgstr "har lämnat din grupp \"%(group_name)s \""
+msgid "%(related_user)s has left your group \"%(group_name)s \""
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/leave.html:26
+#, python-format
+msgid "%(related_user)s and %(second_user)s have left your group \"%(group_name)s \""
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/leave.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others have left your group \"%(group_name)s \""
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:20
#, python-format
-msgid "mentioned you in a review of %(book_title)s "
-msgstr "nämnde dig i en recension av %(book_title)s "
+msgid "%(related_user)s mentioned you in a review of %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:26
#, python-format
-msgid "mentioned you in a comment on %(book_title)s "
-msgstr "nämnde dig i en kommentar på %(book_title)s "
+msgid "%(related_user)s mentioned you in a comment on %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:32
#, python-format
-msgid "mentioned you in a quote from %(book_title)s "
-msgstr "nämnde dig i ett citat från %(book_title)s "
+msgid "%(related_user)s mentioned you in a quote from %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:38
#, python-format
-msgid "mentioned you in a status "
-msgstr "nämnde dig i en status "
+msgid "%(related_user)s mentioned you in a status "
+msgstr ""
#: bookwyrm/templates/notifications/items/remove.html:17
#, python-format
@@ -2694,28 +2846,30 @@ msgstr "Du har tagits bort från gruppen \"%(group_na
#: bookwyrm/templates/notifications/items/reply.html:21
#, python-format
-msgid " replied to your review of %(book_title)s "
-msgstr "svarade på din recension av %(book_title)s "
+msgid "%(related_user)s replied to your review of %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:27
#, python-format
-msgid "replied to your comment on %(book_title)s "
-msgstr "svarade på din kommentar av %(book_title)s "
+msgid "%(related_user)s replied to your comment on %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:33
#, python-format
-msgid "replied to your quote from %(book_title)s "
-msgstr "svarade på ditt citat av %(book_title)s "
+msgid "%(related_user)s replied to your quote from %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:39
#, python-format
-msgid "replied to your status "
-msgstr "svarade på din status "
+msgid "%(related_user)s replied to your status "
+msgstr ""
#: bookwyrm/templates/notifications/items/report.html:15
#, python-format
-msgid "A new report needs moderation."
-msgstr "En ny rapport behöver moderering."
+msgid "A new report needs moderation"
+msgid_plural "%(display_count)s new reports need moderation"
+msgstr[0] ""
+msgstr[1] ""
#: bookwyrm/templates/notifications/items/update.html:16
#, python-format
@@ -3199,13 +3353,13 @@ msgstr "Falskt"
#: bookwyrm/templates/settings/announcements/announcement.html:57
#: bookwyrm/templates/settings/announcements/edit_announcement.html:79
-#: bookwyrm/templates/settings/dashboard/dashboard.html:94
+#: bookwyrm/templates/settings/dashboard/dashboard.html:105
msgid "Start date:"
msgstr "Startdatum:"
#: bookwyrm/templates/settings/announcements/announcement.html:62
#: bookwyrm/templates/settings/announcements/edit_announcement.html:89
-#: bookwyrm/templates/settings/dashboard/dashboard.html:100
+#: bookwyrm/templates/settings/dashboard/dashboard.html:111
msgid "End date:"
msgstr "Slutdatum:"
@@ -3365,7 +3519,7 @@ msgid "Dashboard"
msgstr "Översiktspanel"
#: bookwyrm/templates/settings/dashboard/dashboard.html:15
-#: bookwyrm/templates/settings/dashboard/dashboard.html:123
+#: bookwyrm/templates/settings/dashboard/dashboard.html:134
msgid "Total users"
msgstr "Totalt antal användare"
@@ -3385,55 +3539,64 @@ msgstr "Verk"
#: bookwyrm/templates/settings/dashboard/dashboard.html:43
#, python-format
+msgid "Your outgoing email address, %(email_sender)s
, may be misconfigured."
+msgstr ""
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:46
+msgid "Check the EMAIL_SENDER_NAME
and EMAIL_SENDER_DOMAIN
in your .env
."
+msgstr ""
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:54
+#, python-format
msgid "%(display_count)s open report"
msgid_plural "%(display_count)s open reports"
msgstr[0] "%(display_count)s öppen rapport"
msgstr[1] "%(display_count)s öppna rapporter"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:55
+#: bookwyrm/templates/settings/dashboard/dashboard.html:66
#, python-format
msgid "%(display_count)s domain needs review"
msgid_plural "%(display_count)s domains need review"
msgstr[0] "%(display_count)s domänen behöver granskning"
msgstr[1] "%(display_count)s domänerna behöver granskning"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:67
+#: bookwyrm/templates/settings/dashboard/dashboard.html:78
#, python-format
msgid "%(display_count)s invite request"
msgid_plural "%(display_count)s invite requests"
msgstr[0] "%(display_count)s inbjudningsförfrågning"
msgstr[1] "%(display_count)s inbjudningsförfrågningar"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:79
+#: bookwyrm/templates/settings/dashboard/dashboard.html:90
#, python-format
msgid "An update is available! You're running v%(current)s and the latest release is %(available)s."
msgstr "En uppdatering är tillgänglig! Du kör v%(current)s och den senaste versionen är %(available)s."
-#: bookwyrm/templates/settings/dashboard/dashboard.html:88
+#: bookwyrm/templates/settings/dashboard/dashboard.html:99
msgid "Instance Activity"
msgstr "Instansaktivitet"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:106
+#: bookwyrm/templates/settings/dashboard/dashboard.html:117
msgid "Interval:"
msgstr "Intervall:"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:110
+#: bookwyrm/templates/settings/dashboard/dashboard.html:121
msgid "Days"
msgstr "Dagar"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:111
+#: bookwyrm/templates/settings/dashboard/dashboard.html:122
msgid "Weeks"
msgstr "Veckor"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:129
+#: bookwyrm/templates/settings/dashboard/dashboard.html:140
msgid "User signup activity"
msgstr "Användarens registreringsaktivitet"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:135
+#: bookwyrm/templates/settings/dashboard/dashboard.html:146
msgid "Status activity"
msgstr "Statusaktivitet"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:141
+#: bookwyrm/templates/settings/dashboard/dashboard.html:152
msgid "Works created"
msgstr "Skapade verk"
@@ -3853,7 +4016,7 @@ msgstr "Inga domäner väntar för närvarande"
msgid "No domains currently blocked"
msgstr "Inga domäner är blockerade för närvarande"
-#: bookwyrm/templates/settings/link_domains/link_table.html:39
+#: bookwyrm/templates/settings/link_domains/link_table.html:43
msgid "No links available for this domain."
msgstr "Inga länkar tillgängliga för den här domänen."
@@ -3881,11 +4044,11 @@ msgstr "Statusen har tagits bort"
msgid "Reported links"
msgstr "Rapporterade länkar"
-#: bookwyrm/templates/settings/reports/report.html:63
+#: bookwyrm/templates/settings/reports/report.html:65
msgid "Moderator Comments"
msgstr "Moderatorns kommentarer"
-#: bookwyrm/templates/settings/reports/report.html:84
+#: bookwyrm/templates/settings/reports/report.html:86
#: bookwyrm/templates/snippets/create_status.html:26
msgid "Comment"
msgstr "Kommentar"
@@ -3895,12 +4058,17 @@ msgstr "Kommentar"
msgid "Report #%(report_id)s: Status posted by @%(username)s"
msgstr "Rapport #%(report_id)s: Status publicerades av @%(username)s"
-#: bookwyrm/templates/settings/reports/report_header.html:12
+#: bookwyrm/templates/settings/reports/report_header.html:13
#, python-format
msgid "Report #%(report_id)s: Link added by @%(username)s"
msgstr "Rapport #%(report_id)s: Länken lades till av @%(username)s"
-#: bookwyrm/templates/settings/reports/report_header.html:18
+#: bookwyrm/templates/settings/reports/report_header.html:17
+#, python-format
+msgid "Report #%(report_id)s: Link domain"
+msgstr ""
+
+#: bookwyrm/templates/settings/reports/report_header.html:24
#, python-format
msgid "Report #%(report_id)s: User @%(username)s"
msgstr "Rapport #%(report_id)s: Användare @%(username)s"
@@ -4163,11 +4331,15 @@ msgid "Active"
msgstr "Aktiv"
#: bookwyrm/templates/settings/users/user_admin.html:79
+msgid "Deleted"
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_admin.html:85
#: bookwyrm/templates/settings/users/user_info.html:32
msgid "Inactive"
msgstr "Inaktiv"
-#: bookwyrm/templates/settings/users/user_admin.html:88
+#: bookwyrm/templates/settings/users/user_admin.html:94
#: bookwyrm/templates/settings/users/user_info.html:127
msgid "Not set"
msgstr "Inte inställd"
@@ -5172,15 +5344,6 @@ msgstr "Inte en giltig csv-fil"
msgid "Username or password are incorrect"
msgstr "Användarnamnet eller lösenordet är felaktigt"
-#: bookwyrm/views/landing/password.py:32
-msgid "No user with that email address was found."
-msgstr "Ingen användare med den e-postadress hittades."
-
-#: bookwyrm/views/landing/password.py:43
-#, python-brace-format
-msgid "A password reset link was sent to {email}"
-msgstr "En länk för återställning av lösenordet har skickats till {email}"
-
#: bookwyrm/views/rss_feed.py:34
#, python-brace-format
msgid "Status updates from {obj.display_name}"
diff --git a/locale/zh_Hans/LC_MESSAGES/django.mo b/locale/zh_Hans/LC_MESSAGES/django.mo
index 992a69576..1d1227f80 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 5eb151b0a..effa15933 100644
--- a/locale/zh_Hans/LC_MESSAGES/django.po
+++ b/locale/zh_Hans/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-05-31 23:50+0000\n"
-"PO-Revision-Date: 2022-06-01 00:55\n"
+"POT-Creation-Date: 2022-07-07 17:47+0000\n"
+"PO-Revision-Date: 2022-07-07 18:12\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: Chinese Simplified\n"
"Language: zh\n"
@@ -121,7 +121,7 @@ msgstr "警告"
msgid "Danger"
msgstr "危险"
-#: bookwyrm/models/antispam.py:106 bookwyrm/models/antispam.py:140
+#: bookwyrm/models/antispam.py:101 bookwyrm/models/antispam.py:135
msgid "Automatically generated report"
msgstr "自动生成的举报"
@@ -736,7 +736,7 @@ msgstr "ISNI:"
#: bookwyrm/templates/book/book.html:202
#: bookwyrm/templates/book/edit/edit_book.html:135
#: bookwyrm/templates/book/file_links/add_link_modal.html:60
-#: bookwyrm/templates/book/file_links/edit_links.html:82
+#: bookwyrm/templates/book/file_links/edit_links.html:86
#: bookwyrm/templates/groups/form.html:32
#: bookwyrm/templates/lists/bookmark_button.html:15
#: bookwyrm/templates/lists/edit_item_form.html:15
@@ -1212,16 +1212,21 @@ msgstr "状态"
msgid "Actions"
msgstr "动作"
-#: bookwyrm/templates/book/file_links/edit_links.html:53
+#: bookwyrm/templates/book/file_links/edit_links.html:48
+#: bookwyrm/templates/settings/link_domains/link_table.html:21
+msgid "Unknown user"
+msgstr ""
+
+#: bookwyrm/templates/book/file_links/edit_links.html:57
#: bookwyrm/templates/book/file_links/verification_modal.html:22
msgid "Report spam"
msgstr "举报垃圾信息"
-#: bookwyrm/templates/book/file_links/edit_links.html:97
+#: bookwyrm/templates/book/file_links/edit_links.html:101
msgid "No links available for this book."
msgstr "此书没有可用链接。"
-#: bookwyrm/templates/book/file_links/edit_links.html:108
+#: bookwyrm/templates/book/file_links/edit_links.html:112
#: bookwyrm/templates/book/file_links/links.html:18
msgid "Add link to file"
msgstr "为文件添加链接"
@@ -1318,7 +1323,7 @@ msgstr "确认代码:"
#: bookwyrm/templates/confirm_email/confirm_email.html:25
#: bookwyrm/templates/landing/layout.html:81
-#: bookwyrm/templates/settings/dashboard/dashboard.html:116
+#: bookwyrm/templates/settings/dashboard/dashboard.html:127
#: bookwyrm/templates/snippets/report_modal.html:53
msgid "Submit"
msgstr "提交"
@@ -1334,7 +1339,7 @@ msgstr "重新发送确认链接"
#: bookwyrm/templates/confirm_email/resend_modal.html:15
#: bookwyrm/templates/landing/layout.html:68
-#: bookwyrm/templates/landing/password_reset_request.html:18
+#: bookwyrm/templates/landing/password_reset_request.html:24
#: bookwyrm/templates/preferences/edit_user.html:53
#: bookwyrm/templates/snippets/register_form.html:27
msgid "Email address:"
@@ -1559,14 +1564,20 @@ msgstr "你受邀请加入 %(site_name)s!点击下面的连接来创建帐号
msgid "Learn more about %(site_name)s:"
msgstr "进一步了解 %(site_name)s"
-#: bookwyrm/templates/email/moderation_report/html_content.html:6
-#: bookwyrm/templates/email/moderation_report/text_content.html:5
+#: bookwyrm/templates/email/moderation_report/html_content.html:8
+#: bookwyrm/templates/email/moderation_report/text_content.html:6
#, python-format
-msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation. "
-msgstr "@%(reporter)s 标记了 @%(reportee)s 的行为需要进行审核。 "
+msgid "@%(reporter)s has flagged a link domain for moderation."
+msgstr ""
-#: bookwyrm/templates/email/moderation_report/html_content.html:9
-#: bookwyrm/templates/email/moderation_report/text_content.html:7
+#: bookwyrm/templates/email/moderation_report/html_content.html:14
+#: bookwyrm/templates/email/moderation_report/text_content.html:10
+#, python-format
+msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation."
+msgstr ""
+
+#: bookwyrm/templates/email/moderation_report/html_content.html:21
+#: bookwyrm/templates/email/moderation_report/text_content.html:15
msgid "View report"
msgstr "查看报告"
@@ -2256,10 +2267,15 @@ msgid "Confirm password:"
msgstr "确认密码:"
#: bookwyrm/templates/landing/password_reset_request.html:14
+#, python-format
+msgid "A password reset link will be sent to %(email)s if there is an account using that email address."
+msgstr ""
+
+#: bookwyrm/templates/landing/password_reset_request.html:20
msgid "A link to reset your password will be sent to your email address"
msgstr "重设你的密码的链接将会被发送到你的邮箱地址"
-#: bookwyrm/templates/landing/password_reset_request.html:28
+#: bookwyrm/templates/landing/password_reset_request.html:34
msgid "Reset password"
msgstr "重设密码"
@@ -2567,108 +2583,242 @@ msgstr "所有列表"
msgid "Saved Lists"
msgstr "保存的列表"
-#: bookwyrm/templates/notifications/items/accept.html:16
+#: bookwyrm/templates/notifications/items/accept.html:18
#, python-format
-msgid "accepted your invitation to join group \"%(group_name)s \""
-msgstr "接受了您的邀请,加入了 \"%(group_name)s \" 群组"
+msgid "%(related_user)s accepted your invitation to join group \"%(group_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/add.html:24
+#: bookwyrm/templates/notifications/items/accept.html:26
#, python-format
-msgid "added %(book_title)s to your list \"%(list_name)s \""
-msgstr "添加了 %(book_title)s 到你的列表 “%(list_name)s ”"
+msgid "%(related_user)s and %(second_user)s accepted your invitation to join group \"%(group_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/add.html:31
+#: bookwyrm/templates/notifications/items/accept.html:36
#, python-format
-msgid "suggested adding %(book_title)s to your list \"%(list_name)s \""
-msgstr "建议了添加 %(book_title)s 到你的列表 “%(list_name)s ” 中"
+msgid "%(related_user)s and %(other_user_display_count)s others accepted your invitation to join group \"%(group_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:19
+#: bookwyrm/templates/notifications/items/add.html:33
#, python-format
-msgid "boosted your review of %(book_title)s "
-msgstr "转发了你的 对 %(book_title)s 的书评 "
+msgid "%(related_user)s added %(book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:25
+#: bookwyrm/templates/notifications/items/add.html:39
#, python-format
-msgid "boosted your comment on%(book_title)s "
-msgstr "转发了你的 对 %(book_title)s 的评论 "
+msgid "%(related_user)s suggested adding %(book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:31
+#: bookwyrm/templates/notifications/items/add.html:47
#, python-format
-msgid "boosted your quote from %(book_title)s "
-msgstr "转发了你的 对 %(book_title)s 的引用 "
+msgid "%(related_user)s added %(book_title)s and %(second_book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:37
+#: bookwyrm/templates/notifications/items/add.html:54
#, python-format
-msgid "boosted your status "
-msgstr "转发了你的 状态 "
+msgid "%(related_user)s suggested adding %(book_title)s and %(second_book_title)s to your list \"%(list_name)s \""
+msgstr ""
-#: bookwyrm/templates/notifications/items/fav.html:19
+#: bookwyrm/templates/notifications/items/add.html:66
#, python-format
-msgid "liked your review of %(book_title)s "
-msgstr "喜欢了你 对 %(book_title)s 的书评 "
+msgid "%(related_user)s added %(book_title)s , %(second_book_title)s , and %(display_count)s other book to your list \"%(list_name)s \""
+msgid_plural "%(related_user)s added %(book_title)s , %(second_book_title)s , and %(display_count)s other books to your list \"%(list_name)s \""
+msgstr[0] ""
-#: bookwyrm/templates/notifications/items/fav.html:25
+#: bookwyrm/templates/notifications/items/add.html:82
#, python-format
-msgid "liked your comment on %(book_title)s "
-msgstr "喜欢了你的 对 %(book_title)s 的评论 "
+msgid "%(related_user)s suggested adding %(book_title)s , %(second_book_title)s , and %(display_count)s other book to your list \"%(list_name)s \""
+msgid_plural "%(related_user)s suggested adding %(book_title)s , %(second_book_title)s , and %(display_count)s other books to your list \"%(list_name)s \""
+msgstr[0] ""
-#: bookwyrm/templates/notifications/items/fav.html:31
+#: bookwyrm/templates/notifications/items/boost.html:21
#, python-format
-msgid "liked your quote from %(book_title)s "
-msgstr "喜欢了你的 对 %(book_title)s 的引用 "
+msgid "%(related_user)s boosted your review of %(book_title)s "
+msgstr ""
-#: bookwyrm/templates/notifications/items/fav.html:37
+#: bookwyrm/templates/notifications/items/boost.html:27
#, python-format
-msgid "liked your status "
-msgstr "喜欢了你的 状态 "
+msgid "%(related_user)s and %(second_user)s boosted your review of %(book_title)s "
+msgstr ""
-#: bookwyrm/templates/notifications/items/follow.html:15
-msgid "followed you"
-msgstr "关注了你"
+#: bookwyrm/templates/notifications/items/boost.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your review of %(book_title)s "
+msgstr ""
-#: bookwyrm/templates/notifications/items/follow_request.html:11
-msgid "sent you a follow request"
-msgstr "向你发送了关注请求"
+#: bookwyrm/templates/notifications/items/boost.html:44
+#, python-format
+msgid "%(related_user)s boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:50
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:59
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:67
+#, python-format
+msgid "%(related_user)s boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:73
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:82
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:90
+#, python-format
+msgid "%(related_user)s boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:96
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:105
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:21
+#, python-format
+msgid "%(related_user)s liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:27
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:44
+#, python-format
+msgid "%(related_user)s liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:50
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:59
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:67
+#, python-format
+msgid "%(related_user)s liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:73
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:82
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:90
+#, python-format
+msgid "%(related_user)s liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:96
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:105
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:16
+#, python-format
+msgid "%(related_user)s followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:20
+#, python-format
+msgid "%(related_user)s and %(second_user)s followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:25
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow_request.html:15
+#, python-format
+msgid "%(related_user)s sent you a follow request"
+msgstr ""
#: bookwyrm/templates/notifications/items/import.html:14
#, python-format
msgid "Your import completed."
msgstr "你的 导入 已完成。"
-#: bookwyrm/templates/notifications/items/invite.html:15
+#: bookwyrm/templates/notifications/items/invite.html:16
#, python-format
-msgid "invited you to join the group \"%(group_name)s \""
-msgstr "邀请您加入群组 \"%(group_name)s \""
+msgid "%(related_user)s invited you to join the group \"%(group_name)s \""
+msgstr ""
#: bookwyrm/templates/notifications/items/join.html:16
#, python-format
msgid "has joined your group \"%(group_name)s \""
msgstr "已加入您的群组 \"%(group_name)s \""
-#: bookwyrm/templates/notifications/items/leave.html:16
+#: bookwyrm/templates/notifications/items/leave.html:18
#, python-format
-msgid "has left your group \"%(group_name)s \""
-msgstr "退出了您的群组 \"%(group_name)s \""
+msgid "%(related_user)s has left your group \"%(group_name)s \""
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/leave.html:26
+#, python-format
+msgid "%(related_user)s and %(second_user)s have left your group \"%(group_name)s \""
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/leave.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others have left your group \"%(group_name)s \""
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:20
#, python-format
-msgid "mentioned you in a review of %(book_title)s "
-msgstr "在 对 %(book_title)s 的书评 里提到了你"
+msgid "%(related_user)s mentioned you in a review of %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:26
#, python-format
-msgid "mentioned you in a comment on %(book_title)s "
-msgstr "在 对 %(book_title)s 的评论 里提到了你"
+msgid "%(related_user)s mentioned you in a comment on %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:32
#, python-format
-msgid "mentioned you in a quote from %(book_title)s "
-msgstr "在 对 %(book_title)s 的引用 中提到了你"
+msgid "%(related_user)s mentioned you in a quote from %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:38
#, python-format
-msgid "mentioned you in a status "
-msgstr "在 状态 中提到了你"
+msgid "%(related_user)s mentioned you in a status "
+msgstr ""
#: bookwyrm/templates/notifications/items/remove.html:17
#, python-format
@@ -2682,28 +2832,29 @@ msgstr "您已经被从 \"%(group_name)s \" 组中
#: bookwyrm/templates/notifications/items/reply.html:21
#, python-format
-msgid "replied to your review of %(book_title)s "
-msgstr "回复 了你的 对 %(book_title)s 的书评 "
+msgid "%(related_user)s replied to your review of %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:27
#, python-format
-msgid "replied to your comment on %(book_title)s "
-msgstr "回复 了你的 对 %(book_title)s 的评论 "
+msgid "%(related_user)s replied to your comment on %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:33
#, python-format
-msgid "replied to your quote from %(book_title)s "
-msgstr "回复 了你 对 %(book_title)s 中的引用 "
+msgid "%(related_user)s replied to your quote from %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:39
#, python-format
-msgid "replied to your status "
-msgstr "回复 了你的 状态 "
+msgid "%(related_user)s replied to your status "
+msgstr ""
#: bookwyrm/templates/notifications/items/report.html:15
#, python-format
-msgid "A new report needs moderation."
-msgstr "有新的 报告 需要仲裁。"
+msgid "A new report needs moderation"
+msgid_plural "%(display_count)s new reports need moderation"
+msgstr[0] ""
#: bookwyrm/templates/notifications/items/update.html:16
#, python-format
@@ -3187,13 +3338,13 @@ msgstr "否"
#: bookwyrm/templates/settings/announcements/announcement.html:57
#: bookwyrm/templates/settings/announcements/edit_announcement.html:79
-#: bookwyrm/templates/settings/dashboard/dashboard.html:94
+#: bookwyrm/templates/settings/dashboard/dashboard.html:105
msgid "Start date:"
msgstr "开始日期:"
#: bookwyrm/templates/settings/announcements/announcement.html:62
#: bookwyrm/templates/settings/announcements/edit_announcement.html:89
-#: bookwyrm/templates/settings/dashboard/dashboard.html:100
+#: bookwyrm/templates/settings/dashboard/dashboard.html:111
msgid "End date:"
msgstr "结束日期:"
@@ -3353,7 +3504,7 @@ msgid "Dashboard"
msgstr "仪表盘"
#: bookwyrm/templates/settings/dashboard/dashboard.html:15
-#: bookwyrm/templates/settings/dashboard/dashboard.html:123
+#: bookwyrm/templates/settings/dashboard/dashboard.html:134
msgid "Total users"
msgstr "用户总数"
@@ -3373,52 +3524,61 @@ msgstr "作品"
#: bookwyrm/templates/settings/dashboard/dashboard.html:43
#, python-format
+msgid "Your outgoing email address, %(email_sender)s
, may be misconfigured."
+msgstr ""
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:46
+msgid "Check the EMAIL_SENDER_NAME
and EMAIL_SENDER_DOMAIN
in your .env
."
+msgstr ""
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:54
+#, python-format
msgid "%(display_count)s open report"
msgid_plural "%(display_count)s open reports"
msgstr[0] "%(display_count)s 条待处理报告"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:55
+#: bookwyrm/templates/settings/dashboard/dashboard.html:66
#, python-format
msgid "%(display_count)s domain needs review"
msgid_plural "%(display_count)s domains need review"
msgstr[0] "%(display_count)s 个域名需要审核"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:67
+#: bookwyrm/templates/settings/dashboard/dashboard.html:78
#, python-format
msgid "%(display_count)s invite request"
msgid_plural "%(display_count)s invite requests"
msgstr[0] "%(display_count)s 条邀请请求"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:79
+#: bookwyrm/templates/settings/dashboard/dashboard.html:90
#, python-format
msgid "An update is available! You're running v%(current)s and the latest release is %(available)s."
msgstr "有可用的更新!最新版本为:%(available)s,但你当前运行的版本为:%(current)s。"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:88
+#: bookwyrm/templates/settings/dashboard/dashboard.html:99
msgid "Instance Activity"
msgstr "实例活动"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:106
+#: bookwyrm/templates/settings/dashboard/dashboard.html:117
msgid "Interval:"
msgstr "区段:"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:110
+#: bookwyrm/templates/settings/dashboard/dashboard.html:121
msgid "Days"
msgstr "天"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:111
+#: bookwyrm/templates/settings/dashboard/dashboard.html:122
msgid "Weeks"
msgstr "周"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:129
+#: bookwyrm/templates/settings/dashboard/dashboard.html:140
msgid "User signup activity"
msgstr "用户注册活动"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:135
+#: bookwyrm/templates/settings/dashboard/dashboard.html:146
msgid "Status activity"
msgstr "状态动态"
-#: bookwyrm/templates/settings/dashboard/dashboard.html:141
+#: bookwyrm/templates/settings/dashboard/dashboard.html:152
msgid "Works created"
msgstr "创建的作品"
@@ -3837,7 +3997,7 @@ msgstr "没有当前待处理的域名"
msgid "No domains currently blocked"
msgstr "目前没有屏蔽的域名"
-#: bookwyrm/templates/settings/link_domains/link_table.html:39
+#: bookwyrm/templates/settings/link_domains/link_table.html:43
msgid "No links available for this domain."
msgstr "此域名没有可用链接。"
@@ -3865,11 +4025,11 @@ msgstr "状态已被删除"
msgid "Reported links"
msgstr "报告的链接"
-#: bookwyrm/templates/settings/reports/report.html:63
+#: bookwyrm/templates/settings/reports/report.html:65
msgid "Moderator Comments"
msgstr "监察员评论"
-#: bookwyrm/templates/settings/reports/report.html:84
+#: bookwyrm/templates/settings/reports/report.html:86
#: bookwyrm/templates/snippets/create_status.html:26
msgid "Comment"
msgstr "评论"
@@ -3879,12 +4039,17 @@ msgstr "评论"
msgid "Report #%(report_id)s: Status posted by @%(username)s"
msgstr "报告 #%(report_id)s:由 @%(username)s 发布的状态"
-#: bookwyrm/templates/settings/reports/report_header.html:12
+#: bookwyrm/templates/settings/reports/report_header.html:13
#, python-format
msgid "Report #%(report_id)s: Link added by @%(username)s"
msgstr "报告 #%(report_id)s:由 @%(username)s 添加的链接"
-#: bookwyrm/templates/settings/reports/report_header.html:18
+#: bookwyrm/templates/settings/reports/report_header.html:17
+#, python-format
+msgid "Report #%(report_id)s: Link domain"
+msgstr ""
+
+#: bookwyrm/templates/settings/reports/report_header.html:24
#, python-format
msgid "Report #%(report_id)s: User @%(username)s"
msgstr "报告 #%(report_id)s:用户 %(username)s"
@@ -4147,11 +4312,15 @@ msgid "Active"
msgstr "活跃"
#: bookwyrm/templates/settings/users/user_admin.html:79
+msgid "Deleted"
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_admin.html:85
#: bookwyrm/templates/settings/users/user_info.html:32
msgid "Inactive"
msgstr "停用"
-#: bookwyrm/templates/settings/users/user_admin.html:88
+#: bookwyrm/templates/settings/users/user_admin.html:94
#: bookwyrm/templates/settings/users/user_info.html:127
msgid "Not set"
msgstr "未设置"
@@ -5147,15 +5316,6 @@ msgstr "不是有效的 csv 文件"
msgid "Username or password are incorrect"
msgstr "用户名或密码不正确"
-#: bookwyrm/views/landing/password.py:32
-msgid "No user with that email address was found."
-msgstr "没有找到使用该邮箱的用户。"
-
-#: bookwyrm/views/landing/password.py:43
-#, python-brace-format
-msgid "A password reset link was sent to {email}"
-msgstr "密码重置连接已发送给 {email}"
-
#: bookwyrm/views/rss_feed.py:34
#, python-brace-format
msgid "Status updates from {obj.display_name}"
diff --git a/locale/zh_Hant/LC_MESSAGES/django.mo b/locale/zh_Hant/LC_MESSAGES/django.mo
index 50dfadffc..f9ca27be9 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 429a7f0b1..cb0c7244a 100644
--- a/locale/zh_Hant/LC_MESSAGES/django.po
+++ b/locale/zh_Hant/LC_MESSAGES/django.po
@@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2022-05-31 23:50+0000\n"
-"PO-Revision-Date: 2022-06-01 00:55\n"
+"POT-Creation-Date: 2022-07-07 17:47+0000\n"
+"PO-Revision-Date: 2022-07-07 18:12\n"
"Last-Translator: Mouse Reeve \n"
"Language-Team: Chinese Traditional\n"
"Language: zh\n"
@@ -121,7 +121,7 @@ msgstr ""
msgid "Danger"
msgstr ""
-#: bookwyrm/models/antispam.py:106 bookwyrm/models/antispam.py:140
+#: bookwyrm/models/antispam.py:101 bookwyrm/models/antispam.py:135
msgid "Automatically generated report"
msgstr ""
@@ -736,7 +736,7 @@ msgstr ""
#: bookwyrm/templates/book/book.html:202
#: bookwyrm/templates/book/edit/edit_book.html:135
#: bookwyrm/templates/book/file_links/add_link_modal.html:60
-#: bookwyrm/templates/book/file_links/edit_links.html:82
+#: bookwyrm/templates/book/file_links/edit_links.html:86
#: bookwyrm/templates/groups/form.html:32
#: bookwyrm/templates/lists/bookmark_button.html:15
#: bookwyrm/templates/lists/edit_item_form.html:15
@@ -1212,16 +1212,21 @@ msgstr "狀態"
msgid "Actions"
msgstr "動作"
-#: bookwyrm/templates/book/file_links/edit_links.html:53
+#: bookwyrm/templates/book/file_links/edit_links.html:48
+#: bookwyrm/templates/settings/link_domains/link_table.html:21
+msgid "Unknown user"
+msgstr ""
+
+#: bookwyrm/templates/book/file_links/edit_links.html:57
#: bookwyrm/templates/book/file_links/verification_modal.html:22
msgid "Report spam"
msgstr ""
-#: bookwyrm/templates/book/file_links/edit_links.html:97
+#: bookwyrm/templates/book/file_links/edit_links.html:101
msgid "No links available for this book."
msgstr ""
-#: bookwyrm/templates/book/file_links/edit_links.html:108
+#: bookwyrm/templates/book/file_links/edit_links.html:112
#: bookwyrm/templates/book/file_links/links.html:18
msgid "Add link to file"
msgstr ""
@@ -1318,7 +1323,7 @@ msgstr ""
#: bookwyrm/templates/confirm_email/confirm_email.html:25
#: bookwyrm/templates/landing/layout.html:81
-#: bookwyrm/templates/settings/dashboard/dashboard.html:116
+#: bookwyrm/templates/settings/dashboard/dashboard.html:127
#: bookwyrm/templates/snippets/report_modal.html:53
msgid "Submit"
msgstr "提交"
@@ -1334,7 +1339,7 @@ msgstr ""
#: bookwyrm/templates/confirm_email/resend_modal.html:15
#: bookwyrm/templates/landing/layout.html:68
-#: bookwyrm/templates/landing/password_reset_request.html:18
+#: bookwyrm/templates/landing/password_reset_request.html:24
#: bookwyrm/templates/preferences/edit_user.html:53
#: bookwyrm/templates/snippets/register_form.html:27
msgid "Email address:"
@@ -1559,14 +1564,20 @@ msgstr "你受邀請加入 %(site_name)s!點選下面的連結來建立帳號
msgid "Learn more about %(site_name)s:"
msgstr ""
-#: bookwyrm/templates/email/moderation_report/html_content.html:6
-#: bookwyrm/templates/email/moderation_report/text_content.html:5
+#: bookwyrm/templates/email/moderation_report/html_content.html:8
+#: bookwyrm/templates/email/moderation_report/text_content.html:6
#, python-format
-msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation. "
+msgid "@%(reporter)s has flagged a link domain for moderation."
msgstr ""
-#: bookwyrm/templates/email/moderation_report/html_content.html:9
-#: bookwyrm/templates/email/moderation_report/text_content.html:7
+#: bookwyrm/templates/email/moderation_report/html_content.html:14
+#: bookwyrm/templates/email/moderation_report/text_content.html:10
+#, python-format
+msgid "@%(reporter)s has flagged behavior by @%(reportee)s for moderation."
+msgstr ""
+
+#: bookwyrm/templates/email/moderation_report/html_content.html:21
+#: bookwyrm/templates/email/moderation_report/text_content.html:15
msgid "View report"
msgstr ""
@@ -2256,10 +2267,15 @@ msgid "Confirm password:"
msgstr "確認密碼:"
#: bookwyrm/templates/landing/password_reset_request.html:14
+#, python-format
+msgid "A password reset link will be sent to %(email)s if there is an account using that email address."
+msgstr ""
+
+#: bookwyrm/templates/landing/password_reset_request.html:20
msgid "A link to reset your password will be sent to your email address"
msgstr "重設你的密碼的連結將會被發送到你的郵箱地址"
-#: bookwyrm/templates/landing/password_reset_request.html:28
+#: bookwyrm/templates/landing/password_reset_request.html:34
msgid "Reset password"
msgstr "重設密碼"
@@ -2567,77 +2583,201 @@ msgstr ""
msgid "Saved Lists"
msgstr ""
-#: bookwyrm/templates/notifications/items/accept.html:16
+#: bookwyrm/templates/notifications/items/accept.html:18
#, python-format
-msgid "accepted your invitation to join group \"%(group_name)s \""
+msgid "%(related_user)s accepted your invitation to join group \"%(group_name)s \""
msgstr ""
-#: bookwyrm/templates/notifications/items/add.html:24
+#: bookwyrm/templates/notifications/items/accept.html:26
#, python-format
-msgid "added %(book_title)s to your list \"%(list_name)s \""
+msgid "%(related_user)s and %(second_user)s accepted your invitation to join group \"%(group_name)s \""
msgstr ""
-#: bookwyrm/templates/notifications/items/add.html:31
+#: bookwyrm/templates/notifications/items/accept.html:36
#, python-format
-msgid "suggested adding %(book_title)s to your list \"%(list_name)s \""
+msgid "%(related_user)s and %(other_user_display_count)s others accepted your invitation to join group \"%(group_name)s \""
msgstr ""
-#: bookwyrm/templates/notifications/items/boost.html:19
+#: bookwyrm/templates/notifications/items/add.html:33
#, python-format
-msgid "boosted your review of %(book_title)s "
-msgstr "轉發了你的 對 %(book_title)s 的書評 "
-
-#: bookwyrm/templates/notifications/items/boost.html:25
-#, python-format
-msgid "boosted your comment on%(book_title)s "
-msgstr "轉發了你的 對 %(book_title)s 的評論 "
-
-#: bookwyrm/templates/notifications/items/boost.html:31
-#, python-format
-msgid "boosted your quote from %(book_title)s "
-msgstr "轉發了你的 對 %(book_title)s 的引用 "
-
-#: bookwyrm/templates/notifications/items/boost.html:37
-#, python-format
-msgid "boosted your status "
-msgstr "轉發了你的 狀態 "
-
-#: bookwyrm/templates/notifications/items/fav.html:19
-#, python-format
-msgid "liked your review of %(book_title)s "
+msgid "%(related_user)s added %(book_title)s to your list \"%(list_name)s \""
msgstr ""
-#: bookwyrm/templates/notifications/items/fav.html:25
+#: bookwyrm/templates/notifications/items/add.html:39
#, python-format
-msgid "liked your comment on %(book_title)s "
+msgid "%(related_user)s suggested adding %(book_title)s to your list \"%(list_name)s \""
msgstr ""
-#: bookwyrm/templates/notifications/items/fav.html:31
+#: bookwyrm/templates/notifications/items/add.html:47
#, python-format
-msgid "liked your quote from %(book_title)s "
+msgid "%(related_user)s added %(book_title)s and %(second_book_title)s to your list \"%(list_name)s \""
msgstr ""
-#: bookwyrm/templates/notifications/items/fav.html:37
+#: bookwyrm/templates/notifications/items/add.html:54
#, python-format
-msgid "liked your status "
+msgid "%(related_user)s suggested adding %(book_title)s and %(second_book_title)s to your list \"%(list_name)s \""
msgstr ""
-#: bookwyrm/templates/notifications/items/follow.html:15
-msgid "followed you"
-msgstr "關注了你"
+#: bookwyrm/templates/notifications/items/add.html:66
+#, python-format
+msgid "%(related_user)s added %(book_title)s , %(second_book_title)s , and %(display_count)s other book to your list \"%(list_name)s \""
+msgid_plural "%(related_user)s added %(book_title)s , %(second_book_title)s , and %(display_count)s other books to your list \"%(list_name)s \""
+msgstr[0] ""
-#: bookwyrm/templates/notifications/items/follow_request.html:11
-msgid "sent you a follow request"
-msgstr "向你傳送了關注請求"
+#: bookwyrm/templates/notifications/items/add.html:82
+#, python-format
+msgid "%(related_user)s suggested adding %(book_title)s , %(second_book_title)s , and %(display_count)s other book to your list \"%(list_name)s \""
+msgid_plural "%(related_user)s suggested adding %(book_title)s , %(second_book_title)s , and %(display_count)s other books to your list \"%(list_name)s \""
+msgstr[0] ""
+
+#: bookwyrm/templates/notifications/items/boost.html:21
+#, python-format
+msgid "%(related_user)s boosted your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:27
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:44
+#, python-format
+msgid "%(related_user)s boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:50
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:59
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:67
+#, python-format
+msgid "%(related_user)s boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:73
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:82
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:90
+#, python-format
+msgid "%(related_user)s boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:96
+#, python-format
+msgid "%(related_user)s and %(second_user)s boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/boost.html:105
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others boosted your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:21
+#, python-format
+msgid "%(related_user)s liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:27
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your review of %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:44
+#, python-format
+msgid "%(related_user)s liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:50
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:59
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your comment on %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:67
+#, python-format
+msgid "%(related_user)s liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:73
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:82
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your quote from %(book_title)s "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:90
+#, python-format
+msgid "%(related_user)s liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:96
+#, python-format
+msgid "%(related_user)s and %(second_user)s liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/fav.html:105
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others liked your status "
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:16
+#, python-format
+msgid "%(related_user)s followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:20
+#, python-format
+msgid "%(related_user)s and %(second_user)s followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow.html:25
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others followed you"
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/follow_request.html:15
+#, python-format
+msgid "%(related_user)s sent you a follow request"
+msgstr ""
#: bookwyrm/templates/notifications/items/import.html:14
#, python-format
msgid "Your import completed."
msgstr "你的 匯入 已完成。"
-#: bookwyrm/templates/notifications/items/invite.html:15
+#: bookwyrm/templates/notifications/items/invite.html:16
#, python-format
-msgid "invited you to join the group \"%(group_name)s \""
+msgid "%(related_user)s invited you to join the group \"%(group_name)s \""
msgstr ""
#: bookwyrm/templates/notifications/items/join.html:16
@@ -2645,30 +2785,40 @@ msgstr ""
msgid "has joined your group \"%(group_name)s \""
msgstr ""
-#: bookwyrm/templates/notifications/items/leave.html:16
+#: bookwyrm/templates/notifications/items/leave.html:18
#, python-format
-msgid "has left your group \"%(group_name)s \""
+msgid "%(related_user)s has left your group \"%(group_name)s \""
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/leave.html:26
+#, python-format
+msgid "%(related_user)s and %(second_user)s have left your group \"%(group_name)s \""
+msgstr ""
+
+#: bookwyrm/templates/notifications/items/leave.html:36
+#, python-format
+msgid "%(related_user)s and %(other_user_display_count)s others have left your group \"%(group_name)s \""
msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:20
#, python-format
-msgid "mentioned you in a review of %(book_title)s "
-msgstr "在 對 %(book_title)s 的書評 裡提到了你"
+msgid "%(related_user)s mentioned you in a review of %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:26
#, python-format
-msgid "mentioned you in a comment on %(book_title)s "
-msgstr "在 對 %(book_title)s 的評論 裡提到了你"
+msgid "%(related_user)s mentioned you in a comment on %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:32
#, python-format
-msgid "mentioned you in a quote from %(book_title)s "
-msgstr "在 對 %(book_title)s 的引用 中提到了你"
+msgid "%(related_user)s mentioned you in a quote from %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/mention.html:38
#, python-format
-msgid "mentioned you in a status "
-msgstr "在 狀態 中提到了你"
+msgid "%(related_user)s mentioned you in a status "
+msgstr ""
#: bookwyrm/templates/notifications/items/remove.html:17
#, python-format
@@ -2682,28 +2832,29 @@ msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:21
#, python-format
-msgid "replied to your review of %(book_title)s "
-msgstr "回覆 了你的 對 %(book_title)s 的書評 "
+msgid "%(related_user)s replied to your review of %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:27
#, python-format
-msgid "replied to your comment on %(book_title)s "
-msgstr "回覆 了你的 對 %(book_title)s 的評論 "
+msgid "%(related_user)s replied to your comment on %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:33
#, python-format
-msgid "replied to your quote from %(book_title)s "
-msgstr "回覆 了你 對 %(book_title)s 中的引用 "
+msgid "%(related_user)s replied to your quote from %(book_title)s "
+msgstr ""
#: bookwyrm/templates/notifications/items/reply.html:39
#, python-format
-msgid "replied to your status "
-msgstr "回覆 了你的 狀態 "
+msgid "%(related_user)s replied to your status "
+msgstr ""
#: bookwyrm/templates/notifications/items/report.html:15
#, python-format
-msgid "A new report needs moderation."
-msgstr "有新的 舉報 需要仲裁。"
+msgid "A new report needs moderation"
+msgid_plural "%(display_count)s new reports need moderation"
+msgstr[0] ""
#: bookwyrm/templates/notifications/items/update.html:16
#, python-format
@@ -3185,13 +3336,13 @@ msgstr "否"
#: bookwyrm/templates/settings/announcements/announcement.html:57
#: bookwyrm/templates/settings/announcements/edit_announcement.html:79
-#: bookwyrm/templates/settings/dashboard/dashboard.html:94
+#: bookwyrm/templates/settings/dashboard/dashboard.html:105
msgid "Start date:"
msgstr "開始日期:"
#: bookwyrm/templates/settings/announcements/announcement.html:62
#: bookwyrm/templates/settings/announcements/edit_announcement.html:89
-#: bookwyrm/templates/settings/dashboard/dashboard.html:100
+#: bookwyrm/templates/settings/dashboard/dashboard.html:111
msgid "End date:"
msgstr "結束日期:"
@@ -3351,7 +3502,7 @@ msgid "Dashboard"
msgstr ""
#: bookwyrm/templates/settings/dashboard/dashboard.html:15
-#: bookwyrm/templates/settings/dashboard/dashboard.html:123
+#: bookwyrm/templates/settings/dashboard/dashboard.html:134
msgid "Total users"
msgstr ""
@@ -3371,52 +3522,61 @@ msgstr ""
#: bookwyrm/templates/settings/dashboard/dashboard.html:43
#, python-format
+msgid "Your outgoing email address, %(email_sender)s
, may be misconfigured."
+msgstr ""
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:46
+msgid "Check the EMAIL_SENDER_NAME
and EMAIL_SENDER_DOMAIN
in your .env
."
+msgstr ""
+
+#: bookwyrm/templates/settings/dashboard/dashboard.html:54
+#, python-format
msgid "%(display_count)s open report"
msgid_plural "%(display_count)s open reports"
msgstr[0] ""
-#: bookwyrm/templates/settings/dashboard/dashboard.html:55
+#: bookwyrm/templates/settings/dashboard/dashboard.html:66
#, python-format
msgid "%(display_count)s domain needs review"
msgid_plural "%(display_count)s domains need review"
msgstr[0] ""
-#: bookwyrm/templates/settings/dashboard/dashboard.html:67
+#: bookwyrm/templates/settings/dashboard/dashboard.html:78
#, python-format
msgid "%(display_count)s invite request"
msgid_plural "%(display_count)s invite requests"
msgstr[0] ""
-#: bookwyrm/templates/settings/dashboard/dashboard.html:79
+#: bookwyrm/templates/settings/dashboard/dashboard.html:90
#, python-format
msgid "An update is available! You're running v%(current)s and the latest release is %(available)s."
msgstr ""
-#: bookwyrm/templates/settings/dashboard/dashboard.html:88
+#: bookwyrm/templates/settings/dashboard/dashboard.html:99
msgid "Instance Activity"
msgstr ""
-#: bookwyrm/templates/settings/dashboard/dashboard.html:106
+#: bookwyrm/templates/settings/dashboard/dashboard.html:117
msgid "Interval:"
msgstr ""
-#: bookwyrm/templates/settings/dashboard/dashboard.html:110
+#: bookwyrm/templates/settings/dashboard/dashboard.html:121
msgid "Days"
msgstr ""
-#: bookwyrm/templates/settings/dashboard/dashboard.html:111
+#: bookwyrm/templates/settings/dashboard/dashboard.html:122
msgid "Weeks"
msgstr ""
-#: bookwyrm/templates/settings/dashboard/dashboard.html:129
+#: bookwyrm/templates/settings/dashboard/dashboard.html:140
msgid "User signup activity"
msgstr ""
-#: bookwyrm/templates/settings/dashboard/dashboard.html:135
+#: bookwyrm/templates/settings/dashboard/dashboard.html:146
msgid "Status activity"
msgstr ""
-#: bookwyrm/templates/settings/dashboard/dashboard.html:141
+#: bookwyrm/templates/settings/dashboard/dashboard.html:152
msgid "Works created"
msgstr ""
@@ -3835,7 +3995,7 @@ msgstr ""
msgid "No domains currently blocked"
msgstr ""
-#: bookwyrm/templates/settings/link_domains/link_table.html:39
+#: bookwyrm/templates/settings/link_domains/link_table.html:43
msgid "No links available for this domain."
msgstr ""
@@ -3863,11 +4023,11 @@ msgstr "狀態已被刪除"
msgid "Reported links"
msgstr ""
-#: bookwyrm/templates/settings/reports/report.html:63
+#: bookwyrm/templates/settings/reports/report.html:65
msgid "Moderator Comments"
msgstr "監察員評論"
-#: bookwyrm/templates/settings/reports/report.html:84
+#: bookwyrm/templates/settings/reports/report.html:86
#: bookwyrm/templates/snippets/create_status.html:26
msgid "Comment"
msgstr "評論"
@@ -3877,12 +4037,17 @@ msgstr "評論"
msgid "Report #%(report_id)s: Status posted by @%(username)s"
msgstr ""
-#: bookwyrm/templates/settings/reports/report_header.html:12
+#: bookwyrm/templates/settings/reports/report_header.html:13
#, python-format
msgid "Report #%(report_id)s: Link added by @%(username)s"
msgstr ""
-#: bookwyrm/templates/settings/reports/report_header.html:18
+#: bookwyrm/templates/settings/reports/report_header.html:17
+#, python-format
+msgid "Report #%(report_id)s: Link domain"
+msgstr ""
+
+#: bookwyrm/templates/settings/reports/report_header.html:24
#, python-format
msgid "Report #%(report_id)s: User @%(username)s"
msgstr ""
@@ -4145,11 +4310,15 @@ msgid "Active"
msgstr "活躍"
#: bookwyrm/templates/settings/users/user_admin.html:79
+msgid "Deleted"
+msgstr ""
+
+#: bookwyrm/templates/settings/users/user_admin.html:85
#: bookwyrm/templates/settings/users/user_info.html:32
msgid "Inactive"
msgstr "停用"
-#: bookwyrm/templates/settings/users/user_admin.html:88
+#: bookwyrm/templates/settings/users/user_admin.html:94
#: bookwyrm/templates/settings/users/user_info.html:127
msgid "Not set"
msgstr "未設定"
@@ -5145,15 +5314,6 @@ msgstr "不是有效的 csv 檔案"
msgid "Username or password are incorrect"
msgstr ""
-#: bookwyrm/views/landing/password.py:32
-msgid "No user with that email address was found."
-msgstr "沒有找到使用該郵箱的使用者。"
-
-#: bookwyrm/views/landing/password.py:43
-#, python-brace-format
-msgid "A password reset link was sent to {email}"
-msgstr "密碼重置連結已傳送給 {email}"
-
#: bookwyrm/views/rss_feed.py:34
#, python-brace-format
msgid "Status updates from {obj.display_name}"
diff --git a/requirements.txt b/requirements.txt
index 0155782cc..6ab3103b9 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,7 +1,8 @@
aiohttp==3.8.1
+bleach==5.0.1
celery==5.2.2
colorthief==0.2.1
-Django==3.2.13
+Django==3.2.14
django-celery-beat==2.2.1
django-compressor==2.4.1
django-imagekit==4.1.0