Merge branch 'main' into production

This commit is contained in:
Mouse Reeve 2023-03-13 08:17:12 -07:00
commit 6d404558c3
114 changed files with 5133 additions and 2361 deletions

View file

@ -121,6 +121,12 @@ OTEL_SERVICE_NAME=
# https://docs.djangoproject.com/en/3.2/ref/settings/#secure-proxy-ssl-header # https://docs.djangoproject.com/en/3.2/ref/settings/#secure-proxy-ssl-header
HTTP_X_FORWARDED_PROTO=false HTTP_X_FORWARDED_PROTO=false
# TOTP settings
# TWO_FACTOR_LOGIN_VALIDITY_WINDOW sets the number of codes either side
# which will be accepted.
TWO_FACTOR_LOGIN_VALIDITY_WINDOW=2
TWO_FACTOR_LOGIN_MAX_SECONDS=60
# Additional hosts to allow in the Content-Security-Policy, "self" (should be DOMAIN) # Additional hosts to allow in the Content-Security-Policy, "self" (should be DOMAIN)
# and AWS_S3_CUSTOM_DOMAIN (if used) are added by default. # and AWS_S3_CUSTOM_DOMAIN (if used) are added by default.
# Value should be a comma-separated list of host names. # Value should be a comma-separated list of host names.

View file

@ -3,7 +3,7 @@ import inspect
import sys import sys
from .base_activity import ActivityEncoder, Signature, naive_parse from .base_activity import ActivityEncoder, Signature, naive_parse
from .base_activity import Link, Mention from .base_activity import Link, Mention, Hashtag
from .base_activity import ActivitySerializerError, resolve_remote_id from .base_activity import ActivitySerializerError, resolve_remote_id
from .image import Document, Image from .image import Document, Image
from .note import Note, GeneratedNote, Article, Comment, Quotation from .note import Note, GeneratedNote, Article, Comment, Quotation

View file

@ -100,9 +100,27 @@ class ActivityObject:
# pylint: disable=too-many-locals,too-many-branches,too-many-arguments # pylint: disable=too-many-locals,too-many-branches,too-many-arguments
def to_model( def to_model(
self, model=None, instance=None, allow_create=True, save=True, overwrite=True self,
model=None,
instance=None,
allow_create=True,
save=True,
overwrite=True,
allow_external_connections=True,
): ):
"""convert from an activity to a model instance""" """convert from an activity to a model instance. Args:
model: the django model that this object is being converted to
(will guess if not known)
instance: an existing database entry that is going to be updated by
this activity
allow_create: whether a new object should be created if there is no
existing object is provided or found matching the remote_id
save: store in the database if true, return an unsaved model obj if false
overwrite: replace fields in the database with this activity if true,
only update blank fields if false
allow_external_connections: look up missing data if true,
throw an exception if false and an external connection is needed
"""
model = model or get_model_from_type(self.type) model = model or get_model_from_type(self.type)
# only reject statuses if we're potentially creating them # only reject statuses if we're potentially creating them
@ -127,7 +145,10 @@ class ActivityObject:
for field in instance.simple_fields: for field in instance.simple_fields:
try: try:
changed = field.set_field_from_activity( changed = field.set_field_from_activity(
instance, self, overwrite=overwrite instance,
self,
overwrite=overwrite,
allow_external_connections=allow_external_connections,
) )
if changed: if changed:
update_fields.append(field.name) update_fields.append(field.name)
@ -138,7 +159,11 @@ class ActivityObject:
# too early and jank up users # too early and jank up users
for field in instance.image_fields: for field in instance.image_fields:
changed = field.set_field_from_activity( changed = field.set_field_from_activity(
instance, self, save=save, overwrite=overwrite instance,
self,
save=save,
overwrite=overwrite,
allow_external_connections=allow_external_connections,
) )
if changed: if changed:
update_fields.append(field.name) update_fields.append(field.name)
@ -161,8 +186,12 @@ class ActivityObject:
# add many to many fields, which have to be set post-save # add many to many fields, which have to be set post-save
for field in instance.many_to_many_fields: for field in instance.many_to_many_fields:
# mention books/users, for example # mention books/users/hashtags, for example
field.set_field_from_activity(instance, self) field.set_field_from_activity(
instance,
self,
allow_external_connections=allow_external_connections,
)
# reversed relationships in the models # reversed relationships in the models
for ( for (
@ -212,7 +241,7 @@ class ActivityObject:
return data return data
@app.task(queue=MEDIUM) @app.task(queue=MEDIUM, ignore_result=True)
@transaction.atomic @transaction.atomic
def set_related_field( def set_related_field(
model_name, origin_model_name, related_field_name, related_remote_id, data model_name, origin_model_name, related_field_name, related_remote_id, data
@ -266,10 +295,22 @@ def get_model_from_type(activity_type):
return model[0] return model[0]
# pylint: disable=too-many-arguments
def resolve_remote_id( def resolve_remote_id(
remote_id, model=None, refresh=False, save=True, get_activity=False remote_id,
model=None,
refresh=False,
save=True,
get_activity=False,
allow_external_connections=True,
): ):
"""take a remote_id and return an instance, creating if necessary""" """take a remote_id and return an instance, creating if necessary. Args:
remote_id: the unique url for looking up the object in the db or by http
model: a string or object representing the model that corresponds to the object
save: whether to return an unsaved database entry or a saved one
get_activity: whether to return the activitypub object or the model object
allow_external_connections: whether to make http connections
"""
if model: # a bonus check we can do if we already know the model if model: # a bonus check we can do if we already know the model
if isinstance(model, str): if isinstance(model, str):
model = apps.get_model(f"bookwyrm.{model}", require_ready=True) model = apps.get_model(f"bookwyrm.{model}", require_ready=True)
@ -277,6 +318,13 @@ def resolve_remote_id(
if result and not refresh: if result and not refresh:
return result if not get_activity else result.to_activity_dataclass() return result if not get_activity else result.to_activity_dataclass()
# The above block will return the object if it already exists in the database.
# If it doesn't, an external connection would be needed, so check if that's cool
if not allow_external_connections:
raise ActivitySerializerError(
"Unable to serialize object without making external HTTP requests"
)
# load the data and create the object # load the data and create the object
try: try:
data = get_data(remote_id) data = get_data(remote_id)
@ -378,3 +426,10 @@ class Mention(Link):
"""a subtype of Link for mentioning an actor""" """a subtype of Link for mentioning an actor"""
type: str = "Mention" type: str = "Mention"
@dataclass(init=False)
class Hashtag(Link):
"""a subtype of Link for mentioning a hashtag"""
type: str = "Hashtag"

View file

@ -1,9 +1,12 @@
""" note serializer and children thereof """ """ note serializer and children thereof """
from dataclasses import dataclass, field from dataclasses import dataclass, field
from typing import Dict, List from typing import Dict, List
from django.apps import apps import re
from .base_activity import ActivityObject, Link from django.apps import apps
from django.db import IntegrityError, transaction
from .base_activity import ActivityObject, ActivitySerializerError, Link
from .image import Document from .image import Document
@ -38,6 +41,47 @@ class Note(ActivityObject):
updated: str = None updated: str = None
type: str = "Note" type: str = "Note"
# pylint: disable=too-many-arguments
def to_model(
self,
model=None,
instance=None,
allow_create=True,
save=True,
overwrite=True,
allow_external_connections=True,
):
instance = super().to_model(
model, instance, allow_create, save, overwrite, allow_external_connections
)
if instance is None:
return instance
# Replace links to hashtags in content with local URLs
changed_content = False
for hashtag in instance.mention_hashtags.all():
updated_content = re.sub(
rf'(<a href=")[^"]*(" data-mention="hashtag">{hashtag.name}</a>)',
rf"\1{hashtag.remote_id}\2",
instance.content,
flags=re.IGNORECASE,
)
if instance.content != updated_content:
instance.content = updated_content
changed_content = True
if not save or not changed_content:
return instance
with transaction.atomic():
try:
instance.save(broadcast=False, update_fields=["content"])
except IntegrityError as e:
raise ActivitySerializerError(e)
return instance
@dataclass(init=False) @dataclass(init=False)
class Article(Note): class Article(Note):

View file

@ -14,12 +14,12 @@ class Verb(ActivityObject):
actor: str actor: str
object: ActivityObject object: ActivityObject
def action(self): def action(self, allow_external_connections=True):
"""usually we just want to update and save""" """usually we just want to update and save"""
# self.object may return None if the object is invalid in an expected way # self.object may return None if the object is invalid in an expected way
# ie, Question type # ie, Question type
if self.object: if self.object:
self.object.to_model() self.object.to_model(allow_external_connections=allow_external_connections)
# pylint: disable=invalid-name # pylint: disable=invalid-name
@ -42,7 +42,7 @@ class Delete(Verb):
cc: List[str] = field(default_factory=lambda: []) cc: List[str] = field(default_factory=lambda: [])
type: str = "Delete" type: str = "Delete"
def action(self): def action(self, allow_external_connections=True):
"""find and delete the activity object""" """find and delete the activity object"""
if not self.object: if not self.object:
return return
@ -52,7 +52,11 @@ class Delete(Verb):
model = apps.get_model("bookwyrm.User") model = apps.get_model("bookwyrm.User")
obj = model.find_existing_by_remote_id(self.object) obj = model.find_existing_by_remote_id(self.object)
else: else:
obj = self.object.to_model(save=False, allow_create=False) obj = self.object.to_model(
save=False,
allow_create=False,
allow_external_connections=allow_external_connections,
)
if obj: if obj:
obj.delete() obj.delete()
@ -67,11 +71,13 @@ class Update(Verb):
to: List[str] to: List[str]
type: str = "Update" type: str = "Update"
def action(self): def action(self, allow_external_connections=True):
"""update a model instance from the dataclass""" """update a model instance from the dataclass"""
if not self.object: if not self.object:
return return
self.object.to_model(allow_create=False) self.object.to_model(
allow_create=False, allow_external_connections=allow_external_connections
)
@dataclass(init=False) @dataclass(init=False)
@ -80,7 +86,7 @@ class Undo(Verb):
type: str = "Undo" type: str = "Undo"
def action(self): def action(self, allow_external_connections=True):
"""find and remove the activity object""" """find and remove the activity object"""
if isinstance(self.object, str): if isinstance(self.object, str):
# it may be that something should be done with these, but idk what # it may be that something should be done with these, but idk what
@ -92,13 +98,28 @@ class Undo(Verb):
model = None model = None
if self.object.type == "Follow": if self.object.type == "Follow":
model = apps.get_model("bookwyrm.UserFollows") model = apps.get_model("bookwyrm.UserFollows")
obj = self.object.to_model(model=model, save=False, allow_create=False) obj = self.object.to_model(
model=model,
save=False,
allow_create=False,
allow_external_connections=allow_external_connections,
)
if not obj: if not obj:
# this could be a follow request not a follow proper # this could be a follow request not a follow proper
model = apps.get_model("bookwyrm.UserFollowRequest") model = apps.get_model("bookwyrm.UserFollowRequest")
obj = self.object.to_model(model=model, save=False, allow_create=False) obj = self.object.to_model(
model=model,
save=False,
allow_create=False,
allow_external_connections=allow_external_connections,
)
else: else:
obj = self.object.to_model(model=model, save=False, allow_create=False) obj = self.object.to_model(
model=model,
save=False,
allow_create=False,
allow_external_connections=allow_external_connections,
)
if not obj: if not obj:
# if we don't have the object, we can't undo it. happens a lot with boosts # if we don't have the object, we can't undo it. happens a lot with boosts
return return
@ -112,9 +133,9 @@ class Follow(Verb):
object: str object: str
type: str = "Follow" type: str = "Follow"
def action(self): def action(self, allow_external_connections=True):
"""relationship save""" """relationship save"""
self.to_model() self.to_model(allow_external_connections=allow_external_connections)
@dataclass(init=False) @dataclass(init=False)
@ -124,9 +145,9 @@ class Block(Verb):
object: str object: str
type: str = "Block" type: str = "Block"
def action(self): def action(self, allow_external_connections=True):
"""relationship save""" """relationship save"""
self.to_model() self.to_model(allow_external_connections=allow_external_connections)
@dataclass(init=False) @dataclass(init=False)
@ -136,7 +157,7 @@ class Accept(Verb):
object: Follow object: Follow
type: str = "Accept" type: str = "Accept"
def action(self): def action(self, allow_external_connections=True):
"""accept a request""" """accept a request"""
obj = self.object.to_model(save=False, allow_create=True) obj = self.object.to_model(save=False, allow_create=True)
obj.accept() obj.accept()
@ -149,7 +170,7 @@ class Reject(Verb):
object: Follow object: Follow
type: str = "Reject" type: str = "Reject"
def action(self): def action(self, allow_external_connections=True):
"""reject a follow request""" """reject a follow request"""
obj = self.object.to_model(save=False, allow_create=False) obj = self.object.to_model(save=False, allow_create=False)
obj.reject() obj.reject()
@ -163,7 +184,7 @@ class Add(Verb):
object: CollectionItem object: CollectionItem
type: str = "Add" type: str = "Add"
def action(self): def action(self, allow_external_connections=True):
"""figure out the target to assign the item to a collection""" """figure out the target to assign the item to a collection"""
target = resolve_remote_id(self.target) target = resolve_remote_id(self.target)
item = self.object.to_model(save=False) item = self.object.to_model(save=False)
@ -177,7 +198,7 @@ class Remove(Add):
type: str = "Remove" type: str = "Remove"
def action(self): def action(self, allow_external_connections=True):
"""find and remove the activity object""" """find and remove the activity object"""
obj = self.object.to_model(save=False, allow_create=False) obj = self.object.to_model(save=False, allow_create=False)
if obj: if obj:
@ -191,9 +212,9 @@ class Like(Verb):
object: str object: str
type: str = "Like" type: str = "Like"
def action(self): def action(self, allow_external_connections=True):
"""like""" """like"""
self.to_model() self.to_model(allow_external_connections=allow_external_connections)
# pylint: disable=invalid-name # pylint: disable=invalid-name
@ -207,6 +228,6 @@ class Announce(Verb):
object: str object: str
type: str = "Announce" type: str = "Announce"
def action(self): def action(self, allow_external_connections=True):
"""boost""" """boost"""
self.to_model() self.to_model(allow_external_connections=allow_external_connections)

View file

@ -13,18 +13,18 @@ from bookwyrm.tasks import app, LOW, MEDIUM, HIGH
class ActivityStream(RedisStore): class ActivityStream(RedisStore):
"""a category of activity stream (like home, local, books)""" """a category of activity stream (like home, local, books)"""
def stream_id(self, user): def stream_id(self, user_id):
"""the redis key for this user's instance of this stream""" """the redis key for this user's instance of this stream"""
return f"{user.id}-{self.key}" return f"{user_id}-{self.key}"
def unread_id(self, user): def unread_id(self, user_id):
"""the redis key for this user's unread count for this stream""" """the redis key for this user's unread count for this stream"""
stream_id = self.stream_id(user) stream_id = self.stream_id(user_id)
return f"{stream_id}-unread" return f"{stream_id}-unread"
def unread_by_status_type_id(self, user): def unread_by_status_type_id(self, user_id):
"""the redis key for this user's unread count for this stream""" """the redis key for this user's unread count for this stream"""
stream_id = self.stream_id(user) stream_id = self.stream_id(user_id)
return f"{stream_id}-unread-by-type" return f"{stream_id}-unread-by-type"
def get_rank(self, obj): # pylint: disable=no-self-use def get_rank(self, obj): # pylint: disable=no-self-use
@ -37,12 +37,12 @@ class ActivityStream(RedisStore):
pipeline = self.add_object_to_related_stores(status, execute=False) pipeline = self.add_object_to_related_stores(status, execute=False)
if increment_unread: if increment_unread:
for user in self.get_audience(status): for user_id in self.get_audience(status):
# add to the unread status count # add to the unread status count
pipeline.incr(self.unread_id(user)) pipeline.incr(self.unread_id(user_id))
# add to the unread status count for status type # add to the unread status count for status type
pipeline.hincrby( pipeline.hincrby(
self.unread_by_status_type_id(user), get_status_type(status), 1 self.unread_by_status_type_id(user_id), get_status_type(status), 1
) )
# and go! # and go!
@ -52,21 +52,21 @@ class ActivityStream(RedisStore):
"""add a user's statuses to another user's feed""" """add a user's statuses to another user's feed"""
# only add the statuses that the viewer should be able to see (ie, not dms) # only add the statuses that the viewer should be able to see (ie, not dms)
statuses = models.Status.privacy_filter(viewer).filter(user=user) statuses = models.Status.privacy_filter(viewer).filter(user=user)
self.bulk_add_objects_to_store(statuses, self.stream_id(viewer)) self.bulk_add_objects_to_store(statuses, self.stream_id(viewer.id))
def remove_user_statuses(self, viewer, user): def remove_user_statuses(self, viewer, user):
"""remove a user's status from another user's feed""" """remove a user's status from another user's feed"""
# remove all so that followers only statuses are removed # remove all so that followers only statuses are removed
statuses = user.status_set.all() statuses = user.status_set.all()
self.bulk_remove_objects_from_store(statuses, self.stream_id(viewer)) self.bulk_remove_objects_from_store(statuses, self.stream_id(viewer.id))
def get_activity_stream(self, user): def get_activity_stream(self, user):
"""load the statuses to be displayed""" """load the statuses to be displayed"""
# clear unreads for this feed # clear unreads for this feed
r.set(self.unread_id(user), 0) r.set(self.unread_id(user.id), 0)
r.delete(self.unread_by_status_type_id(user)) r.delete(self.unread_by_status_type_id(user.id))
statuses = self.get_store(self.stream_id(user)) statuses = self.get_store(self.stream_id(user.id))
return ( return (
models.Status.objects.select_subclasses() models.Status.objects.select_subclasses()
.filter(id__in=statuses) .filter(id__in=statuses)
@ -83,11 +83,11 @@ class ActivityStream(RedisStore):
def get_unread_count(self, user): def get_unread_count(self, user):
"""get the unread status count for this user's feed""" """get the unread status count for this user's feed"""
return int(r.get(self.unread_id(user)) or 0) return int(r.get(self.unread_id(user.id)) or 0)
def get_unread_count_by_status_type(self, user): def get_unread_count_by_status_type(self, user):
"""get the unread status count for this user's feed's status types""" """get the unread status count for this user's feed's status types"""
status_types = r.hgetall(self.unread_by_status_type_id(user)) status_types = r.hgetall(self.unread_by_status_type_id(user.id))
return { return {
str(key.decode("utf-8")): int(value) or 0 str(key.decode("utf-8")): int(value) or 0
for key, value in status_types.items() for key, value in status_types.items()
@ -95,9 +95,9 @@ class ActivityStream(RedisStore):
def populate_streams(self, user): def populate_streams(self, user):
"""go from zero to a timeline""" """go from zero to a timeline"""
self.populate_store(self.stream_id(user)) self.populate_store(self.stream_id(user.id))
def get_audience(self, status): # pylint: disable=no-self-use def _get_audience(self, status): # pylint: disable=no-self-use
"""given a status, what users should see it""" """given a status, what users should see it"""
# direct messages don't appeard in feeds, direct comments/reviews/etc do # direct messages don't appeard in feeds, direct comments/reviews/etc do
if status.privacy == "direct" and status.status_type == "Note": if status.privacy == "direct" and status.status_type == "Note":
@ -136,8 +136,12 @@ class ActivityStream(RedisStore):
) )
return audience.distinct() return audience.distinct()
def get_audience(self, status): # pylint: disable=no-self-use
"""given a status, what users should see it"""
return [user.id for user in self._get_audience(status)]
def get_stores_for_object(self, obj): def get_stores_for_object(self, obj):
return [self.stream_id(u) for u in self.get_audience(obj)] return [self.stream_id(user_id) for user_id in self.get_audience(obj)]
def get_statuses_for_user(self, user): # pylint: disable=no-self-use def get_statuses_for_user(self, user): # pylint: disable=no-self-use
"""given a user, what statuses should they see on this stream""" """given a user, what statuses should they see on this stream"""
@ -157,13 +161,14 @@ class HomeStream(ActivityStream):
key = "home" key = "home"
def get_audience(self, status): def get_audience(self, status):
audience = super().get_audience(status) audience = super()._get_audience(status)
if not audience: if not audience:
return [] return []
return audience.filter( # if the user is the post's author
Q(id=status.user.id) # if the user is the post's author ids_self = [user.id for user in audience.filter(Q(id=status.user.id))]
| Q(following=status.user) # if the user is following the author # if the user is following the author
).distinct() ids_following = [user.id for user in audience.filter(Q(following=status.user))]
return ids_self + ids_following
def get_statuses_for_user(self, user): def get_statuses_for_user(self, user):
return models.Status.privacy_filter( return models.Status.privacy_filter(
@ -183,11 +188,11 @@ class LocalStream(ActivityStream):
key = "local" key = "local"
def get_audience(self, status): def _get_audience(self, status):
# this stream wants no part in non-public statuses # this stream wants no part in non-public statuses
if status.privacy != "public" or not status.user.local: if status.privacy != "public" or not status.user.local:
return [] return []
return super().get_audience(status) return super()._get_audience(status)
def get_statuses_for_user(self, user): def get_statuses_for_user(self, user):
# all public statuses by a local user # all public statuses by a local user
@ -202,7 +207,7 @@ class BooksStream(ActivityStream):
key = "books" key = "books"
def get_audience(self, status): def _get_audience(self, status):
"""anyone with the mentioned book on their shelves""" """anyone with the mentioned book on their shelves"""
# only show public statuses on the books feed, # only show public statuses on the books feed,
# and only statuses that mention books # and only statuses that mention books
@ -217,7 +222,7 @@ class BooksStream(ActivityStream):
else status.mention_books.first().parent_work else status.mention_books.first().parent_work
) )
audience = super().get_audience(status) audience = super()._get_audience(status)
if not audience: if not audience:
return [] return []
return audience.filter(shelfbook__book__parent_work=work).distinct() return audience.filter(shelfbook__book__parent_work=work).distinct()
@ -244,38 +249,38 @@ class BooksStream(ActivityStream):
def add_book_statuses(self, user, book): def add_book_statuses(self, user, book):
"""add statuses about a book to a user's feed""" """add statuses about a book to a user's feed"""
work = book.parent_work work = book.parent_work
statuses = ( statuses = models.Status.privacy_filter(
models.Status.privacy_filter(
user, user,
privacy_levels=["public"], privacy_levels=["public"],
) )
.filter(
Q(comment__book__parent_work=work) book_comments = statuses.filter(Q(comment__book__parent_work=work))
| Q(quotation__book__parent_work=work) book_quotations = statuses.filter(Q(quotation__book__parent_work=work))
| Q(review__book__parent_work=work) book_reviews = statuses.filter(Q(review__book__parent_work=work))
| Q(mention_books__parent_work=work) book_mentions = statuses.filter(Q(mention_books__parent_work=work))
)
.distinct() self.bulk_add_objects_to_store(book_comments, self.stream_id(user.id))
) self.bulk_add_objects_to_store(book_quotations, self.stream_id(user.id))
self.bulk_add_objects_to_store(statuses, self.stream_id(user)) self.bulk_add_objects_to_store(book_reviews, self.stream_id(user.id))
self.bulk_add_objects_to_store(book_mentions, self.stream_id(user.id))
def remove_book_statuses(self, user, book): def remove_book_statuses(self, user, book):
"""add statuses about a book to a user's feed""" """add statuses about a book to a user's feed"""
work = book.parent_work work = book.parent_work
statuses = ( statuses = models.Status.privacy_filter(
models.Status.privacy_filter(
user, user,
privacy_levels=["public"], privacy_levels=["public"],
) )
.filter(
Q(comment__book__parent_work=work) book_comments = statuses.filter(Q(comment__book__parent_work=work))
| Q(quotation__book__parent_work=work) book_quotations = statuses.filter(Q(quotation__book__parent_work=work))
| Q(review__book__parent_work=work) book_reviews = statuses.filter(Q(review__book__parent_work=work))
| Q(mention_books__parent_work=work) book_mentions = statuses.filter(Q(mention_books__parent_work=work))
)
.distinct() self.bulk_remove_objects_from_store(book_comments, self.stream_id(user.id))
) self.bulk_remove_objects_from_store(book_quotations, self.stream_id(user.id))
self.bulk_remove_objects_from_store(statuses, self.stream_id(user)) self.bulk_remove_objects_from_store(book_reviews, self.stream_id(user.id))
self.bulk_remove_objects_from_store(book_mentions, self.stream_id(user.id))
# determine which streams are enabled in settings.py # determine which streams are enabled in settings.py
@ -466,7 +471,7 @@ def remove_statuses_on_unshelve(sender, instance, *args, **kwargs):
# ---- TASKS # ---- TASKS
@app.task(queue=LOW) @app.task(queue=LOW, ignore_result=True)
def add_book_statuses_task(user_id, book_id): def add_book_statuses_task(user_id, book_id):
"""add statuses related to a book on shelve""" """add statuses related to a book on shelve"""
user = models.User.objects.get(id=user_id) user = models.User.objects.get(id=user_id)
@ -474,7 +479,7 @@ def add_book_statuses_task(user_id, book_id):
BooksStream().add_book_statuses(user, book) BooksStream().add_book_statuses(user, book)
@app.task(queue=LOW) @app.task(queue=LOW, ignore_result=True)
def remove_book_statuses_task(user_id, book_id): def remove_book_statuses_task(user_id, book_id):
"""remove statuses about a book from a user's books feed""" """remove statuses about a book from a user's books feed"""
user = models.User.objects.get(id=user_id) user = models.User.objects.get(id=user_id)
@ -482,7 +487,7 @@ def remove_book_statuses_task(user_id, book_id):
BooksStream().remove_book_statuses(user, book) BooksStream().remove_book_statuses(user, book)
@app.task(queue=MEDIUM) @app.task(queue=MEDIUM, ignore_result=True)
def populate_stream_task(stream, user_id): def populate_stream_task(stream, user_id):
"""background task for populating an empty activitystream""" """background task for populating an empty activitystream"""
user = models.User.objects.get(id=user_id) user = models.User.objects.get(id=user_id)
@ -490,7 +495,7 @@ def populate_stream_task(stream, user_id):
stream.populate_streams(user) stream.populate_streams(user)
@app.task(queue=MEDIUM) @app.task(queue=MEDIUM, ignore_result=True)
def remove_status_task(status_ids): def remove_status_task(status_ids):
"""remove a status from any stream it might be in""" """remove a status from any stream it might be in"""
# this can take an id or a list of ids # this can take an id or a list of ids
@ -503,7 +508,7 @@ def remove_status_task(status_ids):
stream.remove_object_from_related_stores(status) stream.remove_object_from_related_stores(status)
@app.task(queue=HIGH) @app.task(queue=HIGH, ignore_result=True)
def add_status_task(status_id, increment_unread=False): def add_status_task(status_id, increment_unread=False):
"""add a status to any stream it should be in""" """add a status to any stream it should be in"""
status = models.Status.objects.select_subclasses().get(id=status_id) status = models.Status.objects.select_subclasses().get(id=status_id)
@ -515,7 +520,7 @@ def add_status_task(status_id, increment_unread=False):
stream.add_status(status, increment_unread=increment_unread) stream.add_status(status, increment_unread=increment_unread)
@app.task(queue=MEDIUM) @app.task(queue=MEDIUM, ignore_result=True)
def remove_user_statuses_task(viewer_id, user_id, stream_list=None): def remove_user_statuses_task(viewer_id, user_id, stream_list=None):
"""remove all statuses by a user from a viewer's stream""" """remove all statuses by a user from a viewer's stream"""
stream_list = [streams[s] for s in stream_list] if stream_list else streams.values() stream_list = [streams[s] for s in stream_list] if stream_list else streams.values()
@ -525,7 +530,7 @@ def remove_user_statuses_task(viewer_id, user_id, stream_list=None):
stream.remove_user_statuses(viewer, user) stream.remove_user_statuses(viewer, user)
@app.task(queue=MEDIUM) @app.task(queue=MEDIUM, ignore_result=True)
def add_user_statuses_task(viewer_id, user_id, stream_list=None): def add_user_statuses_task(viewer_id, user_id, stream_list=None):
"""add all statuses by a user to a viewer's stream""" """add all statuses by a user to a viewer's stream"""
stream_list = [streams[s] for s in stream_list] if stream_list else streams.values() stream_list = [streams[s] for s in stream_list] if stream_list else streams.values()
@ -535,7 +540,7 @@ def add_user_statuses_task(viewer_id, user_id, stream_list=None):
stream.add_user_statuses(viewer, user) stream.add_user_statuses(viewer, user)
@app.task(queue=MEDIUM) @app.task(queue=MEDIUM, ignore_result=True)
def handle_boost_task(boost_id): def handle_boost_task(boost_id):
"""remove the original post and other, earlier boosts""" """remove the original post and other, earlier boosts"""
instance = models.Status.objects.get(id=boost_id) instance = models.Status.objects.get(id=boost_id)

View file

@ -143,7 +143,7 @@ def get_or_create_connector(remote_id):
return load_connector(connector_info) return load_connector(connector_info)
@app.task(queue=LOW) @app.task(queue=LOW, ignore_result=True)
def load_more_data(connector_id, book_id): def load_more_data(connector_id, book_id):
"""background the work of getting all 10,000 editions of LoTR""" """background the work of getting all 10,000 editions of LoTR"""
connector_info = models.Connector.objects.get(id=connector_id) connector_info = models.Connector.objects.get(id=connector_id)
@ -152,7 +152,7 @@ def load_more_data(connector_id, book_id):
connector.expand_book_data(book) connector.expand_book_data(book)
@app.task(queue=LOW) @app.task(queue=LOW, ignore_result=True)
def create_edition_task(connector_id, work_id, data): def create_edition_task(connector_id, work_id, data):
"""separate task for each of the 10,000 editions of LoTR""" """separate task for each of the 10,000 editions of LoTR"""
connector_info = models.Connector.objects.get(id=connector_id) connector_info = models.Connector.objects.get(id=connector_id)

View file

@ -75,7 +75,7 @@ def format_email(email_name, data):
return (subject, html_content, text_content) return (subject, html_content, text_content)
@app.task(queue=HIGH) @app.task(queue=HIGH, ignore_result=True)
def send_email(recipient, subject, html_content, text_content): def send_email(recipient, subject, html_content, text_content):
"""use a task to send the email""" """use a task to send the email"""
email = EmailMultiAlternatives( email = EmailMultiAlternatives(

View file

@ -8,6 +8,7 @@ import pyotp
from bookwyrm import models from bookwyrm import models
from bookwyrm.settings import DOMAIN from bookwyrm.settings import DOMAIN
from bookwyrm.settings import TWO_FACTOR_LOGIN_VALIDITY_WINDOW
from .custom_form import CustomForm from .custom_form import CustomForm
@ -108,7 +109,7 @@ class Confirm2FAForm(CustomForm):
otp = self.data.get("otp") otp = self.data.get("otp")
totp = pyotp.TOTP(self.instance.otp_secret) totp = pyotp.TOTP(self.instance.otp_secret)
if not totp.verify(otp): if not totp.verify(otp, valid_window=TWO_FACTOR_LOGIN_VALIDITY_WINDOW):
if self.instance.hotp_secret: if self.instance.hotp_secret:
# maybe it's a backup code? # maybe it's a backup code?

View file

@ -53,6 +53,7 @@ class QuotationForm(CustomForm):
"sensitive", "sensitive",
"privacy", "privacy",
"position", "position",
"endposition",
"position_mode", "position_mode",
] ]

View file

@ -217,14 +217,14 @@ def add_list_on_account_create_command(user_id):
# ---- TASKS # ---- TASKS
@app.task(queue=MEDIUM) @app.task(queue=MEDIUM, ignore_result=True)
def populate_lists_task(user_id): def populate_lists_task(user_id):
"""background task for populating an empty list stream""" """background task for populating an empty list stream"""
user = models.User.objects.get(id=user_id) user = models.User.objects.get(id=user_id)
ListsStream().populate_lists(user) ListsStream().populate_lists(user)
@app.task(queue=MEDIUM) @app.task(queue=MEDIUM, ignore_result=True)
def remove_list_task(list_id, re_add=False): def remove_list_task(list_id, re_add=False):
"""remove a list from any stream it might be in""" """remove a list from any stream it might be in"""
stores = models.User.objects.filter(local=True, is_active=True).values_list( stores = models.User.objects.filter(local=True, is_active=True).values_list(
@ -239,14 +239,14 @@ def remove_list_task(list_id, re_add=False):
add_list_task.delay(list_id) add_list_task.delay(list_id)
@app.task(queue=HIGH) @app.task(queue=HIGH, ignore_result=True)
def add_list_task(list_id): def add_list_task(list_id):
"""add a list to any stream it should be in""" """add a list to any stream it should be in"""
book_list = models.List.objects.get(id=list_id) book_list = models.List.objects.get(id=list_id)
ListsStream().add_list(book_list) ListsStream().add_list(book_list)
@app.task(queue=MEDIUM) @app.task(queue=MEDIUM, ignore_result=True)
def remove_user_lists_task(viewer_id, user_id, exclude_privacy=None): def remove_user_lists_task(viewer_id, user_id, exclude_privacy=None):
"""remove all lists by a user from a viewer's stream""" """remove all lists by a user from a viewer's stream"""
viewer = models.User.objects.get(id=viewer_id) viewer = models.User.objects.get(id=viewer_id)
@ -254,7 +254,7 @@ def remove_user_lists_task(viewer_id, user_id, exclude_privacy=None):
ListsStream().remove_user_lists(viewer, user, exclude_privacy=exclude_privacy) ListsStream().remove_user_lists(viewer, user, exclude_privacy=exclude_privacy)
@app.task(queue=MEDIUM) @app.task(queue=MEDIUM, ignore_result=True)
def add_user_lists_task(viewer_id, user_id): def add_user_lists_task(viewer_id, user_id):
"""add all lists by a user to a viewer's stream""" """add all lists by a user to a viewer's stream"""
viewer = models.User.objects.get(id=viewer_id) viewer = models.User.objects.get(id=viewer_id)

View file

@ -0,0 +1,35 @@
# Generated by Django 3.2.16 on 2023-01-30 12:40
import django.core.validators
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
("auth", "0012_alter_user_first_name_max_length"),
("bookwyrm", "0173_default_user_auth_group_setting"),
]
operations = [
migrations.AddField(
model_name="quotation",
name="endposition",
field=models.IntegerField(
blank=True,
null=True,
validators=[django.core.validators.MinValueValidator(0)],
),
),
migrations.AlterField(
model_name="sitesettings",
name="default_user_auth_group",
field=models.ForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.PROTECT,
to="auth.group",
),
),
]

View file

@ -0,0 +1,46 @@
# Generated by Django 3.2.18 on 2023-02-22 17:42
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("bookwyrm", "0174_auto_20230130_1240"),
]
operations = [
migrations.AddField(
model_name="notification",
name="related_link_domains",
field=models.ManyToManyField(to="bookwyrm.LinkDomain"),
),
migrations.AlterField(
model_name="notification",
name="notification_type",
field=models.CharField(
choices=[
("FAVORITE", "Favorite"),
("REPLY", "Reply"),
("MENTION", "Mention"),
("TAG", "Tag"),
("FOLLOW", "Follow"),
("FOLLOW_REQUEST", "Follow Request"),
("BOOST", "Boost"),
("IMPORT", "Import"),
("ADD", "Add"),
("REPORT", "Report"),
("LINK_DOMAIN", "Link Domain"),
("INVITE", "Invite"),
("ACCEPT", "Accept"),
("JOIN", "Join"),
("LEAVE", "Leave"),
("REMOVE", "Remove"),
("GROUP_PRIVACY", "Group Privacy"),
("GROUP_NAME", "Group Name"),
("GROUP_DESCRIPTION", "Group Description"),
],
max_length=255,
),
),
]

View file

@ -0,0 +1,53 @@
# Generated by Django 3.2.16 on 2022-12-17 19:28
import bookwyrm.models.fields
import django.contrib.postgres.fields.citext
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("bookwyrm", "0174_auto_20230130_1240"),
]
operations = [
migrations.CreateModel(
name="Hashtag",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("created_date", models.DateTimeField(auto_now_add=True)),
("updated_date", models.DateTimeField(auto_now=True)),
(
"remote_id",
bookwyrm.models.fields.RemoteIdField(
max_length=255,
null=True,
validators=[bookwyrm.models.fields.validate_remote_id],
),
),
(
"name",
django.contrib.postgres.fields.citext.CICharField(max_length=256),
),
],
options={
"abstract": False,
},
),
migrations.AddField(
model_name="status",
name="mention_hashtags",
field=bookwyrm.models.fields.TagField(
related_name="mention_hashtag", to="bookwyrm.Hashtag"
),
),
]

View file

@ -0,0 +1,13 @@
# Generated by Django 3.2.18 on 2023-03-12 23:41
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("bookwyrm", "0174_auto_20230222_1742"),
("bookwyrm", "0176_hashtag_support"),
]
operations = []

View file

@ -34,6 +34,8 @@ from .antispam import EmailBlocklist, IPBlocklist, AutoMod, automod_task
from .notification import Notification from .notification import Notification
from .hashtag import Hashtag
cls_members = inspect.getmembers(sys.modules[__name__], inspect.isclass) cls_members = inspect.getmembers(sys.modules[__name__], inspect.isclass)
activity_models = { activity_models = {
c[1].activity_serializer.__name__: c[1] c[1].activity_serializer.__name__: c[1]

View file

@ -506,7 +506,7 @@ def unfurl_related_field(related_field, sort_field=None):
return related_field.remote_id return related_field.remote_id
@app.task(queue=BROADCAST) @app.task(queue=BROADCAST, ignore_result=True)
def broadcast_task(sender_id: int, activity: str, recipients: List[str]): def broadcast_task(sender_id: int, activity: str, recipients: List[str]):
"""the celery task for broadcast""" """the celery task for broadcast"""
user_model = apps.get_model("bookwyrm.User", require_ready=True) user_model = apps.get_model("bookwyrm.User", require_ready=True)

View file

@ -65,7 +65,7 @@ class AutoMod(AdminModel):
created_by = models.ForeignKey("User", on_delete=models.PROTECT) created_by = models.ForeignKey("User", on_delete=models.PROTECT)
@app.task(queue=LOW) @app.task(queue=LOW, ignore_result=True)
def automod_task(): def automod_task():
"""Create reports""" """Create reports"""
if not AutoMod.objects.exists(): if not AutoMod.objects.exists():

View file

@ -7,6 +7,7 @@ from urllib.parse import urljoin
import dateutil.parser import dateutil.parser
from dateutil.parser import ParserError from dateutil.parser import ParserError
from django.contrib.postgres.fields import ArrayField as DjangoArrayField from django.contrib.postgres.fields import ArrayField as DjangoArrayField
from django.contrib.postgres.fields import CICharField as DjangoCICharField
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django.db import models from django.db import models
from django.forms import ClearableFileInput, ImageField as DjangoImageField from django.forms import ClearableFileInput, ImageField as DjangoImageField
@ -67,7 +68,9 @@ class ActivitypubFieldMixin:
self.activitypub_field = activitypub_field self.activitypub_field = activitypub_field
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
def set_field_from_activity(self, instance, data, overwrite=True): def set_field_from_activity(
self, instance, data, overwrite=True, allow_external_connections=True
):
"""helper function for assinging a value to the field. Returns if changed""" """helper function for assinging a value to the field. Returns if changed"""
try: try:
value = getattr(data, self.get_activitypub_field()) value = getattr(data, self.get_activitypub_field())
@ -76,7 +79,9 @@ class ActivitypubFieldMixin:
if self.get_activitypub_field() != "attributedTo": if self.get_activitypub_field() != "attributedTo":
raise raise
value = getattr(data, "actor") value = getattr(data, "actor")
formatted = self.field_from_activity(value) formatted = self.field_from_activity(
value, allow_external_connections=allow_external_connections
)
if formatted is None or formatted is MISSING or formatted == {}: if formatted is None or formatted is MISSING or formatted == {}:
return False return False
@ -116,7 +121,8 @@ class ActivitypubFieldMixin:
return {self.activitypub_wrapper: value} return {self.activitypub_wrapper: value}
return value return value
def field_from_activity(self, value): # pylint: disable=unused-argument
def field_from_activity(self, value, allow_external_connections=True):
"""formatter to convert activitypub into a model value""" """formatter to convert activitypub into a model value"""
if value and hasattr(self, "activitypub_wrapper"): if value and hasattr(self, "activitypub_wrapper"):
value = value.get(self.activitypub_wrapper) value = value.get(self.activitypub_wrapper)
@ -138,7 +144,7 @@ class ActivitypubRelatedFieldMixin(ActivitypubFieldMixin):
self.load_remote = load_remote self.load_remote = load_remote
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
def field_from_activity(self, value): def field_from_activity(self, value, allow_external_connections=True):
if not value: if not value:
return None return None
@ -159,7 +165,11 @@ class ActivitypubRelatedFieldMixin(ActivitypubFieldMixin):
if not self.load_remote: if not self.load_remote:
# only look in the local database # only look in the local database
return related_model.find_existing_by_remote_id(value) return related_model.find_existing_by_remote_id(value)
return activitypub.resolve_remote_id(value, model=related_model) return activitypub.resolve_remote_id(
value,
model=related_model,
allow_external_connections=allow_external_connections,
)
class RemoteIdField(ActivitypubFieldMixin, models.CharField): class RemoteIdField(ActivitypubFieldMixin, models.CharField):
@ -219,7 +229,9 @@ class PrivacyField(ActivitypubFieldMixin, models.CharField):
super().__init__(*args, max_length=255, choices=PrivacyLevels, default="public") super().__init__(*args, max_length=255, choices=PrivacyLevels, default="public")
# pylint: disable=invalid-name # pylint: disable=invalid-name
def set_field_from_activity(self, instance, data, overwrite=True): def set_field_from_activity(
self, instance, data, overwrite=True, allow_external_connections=True
):
if not overwrite: if not overwrite:
return False return False
@ -234,7 +246,11 @@ class PrivacyField(ActivitypubFieldMixin, models.CharField):
break break
if not user_field: if not user_field:
raise ValidationError("No user field found for privacy", data) raise ValidationError("No user field found for privacy", data)
user = activitypub.resolve_remote_id(getattr(data, user_field), model="User") user = activitypub.resolve_remote_id(
getattr(data, user_field),
model="User",
allow_external_connections=allow_external_connections,
)
if to == [self.public]: if to == [self.public]:
setattr(instance, self.name, "public") setattr(instance, self.name, "public")
@ -295,13 +311,17 @@ class ManyToManyField(ActivitypubFieldMixin, models.ManyToManyField):
self.link_only = link_only self.link_only = link_only
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
def set_field_from_activity(self, instance, data, overwrite=True): def set_field_from_activity(
self, instance, data, overwrite=True, allow_external_connections=True
):
"""helper function for assigning a value to the field""" """helper function for assigning a value to the field"""
if not overwrite and getattr(instance, self.name).exists(): if not overwrite and getattr(instance, self.name).exists():
return False return False
value = getattr(data, self.get_activitypub_field()) value = getattr(data, self.get_activitypub_field())
formatted = self.field_from_activity(value) formatted = self.field_from_activity(
value, allow_external_connections=allow_external_connections
)
if formatted is None or formatted is MISSING: if formatted is None or formatted is MISSING:
return False return False
getattr(instance, self.name).set(formatted) getattr(instance, self.name).set(formatted)
@ -313,7 +333,7 @@ class ManyToManyField(ActivitypubFieldMixin, models.ManyToManyField):
return f"{value.instance.remote_id}/{self.name}" return f"{value.instance.remote_id}/{self.name}"
return [i.remote_id for i in value.all()] return [i.remote_id for i in value.all()]
def field_from_activity(self, value): def field_from_activity(self, value, allow_external_connections=True):
if value is None or value is MISSING: if value is None or value is MISSING:
return None return None
if not isinstance(value, list): if not isinstance(value, list):
@ -326,7 +346,11 @@ class ManyToManyField(ActivitypubFieldMixin, models.ManyToManyField):
except ValidationError: except ValidationError:
continue continue
items.append( items.append(
activitypub.resolve_remote_id(remote_id, model=self.related_model) activitypub.resolve_remote_id(
remote_id,
model=self.related_model,
allow_external_connections=allow_external_connections,
)
) )
return items return items
@ -353,7 +377,7 @@ class TagField(ManyToManyField):
) )
return tags return tags
def field_from_activity(self, value): def field_from_activity(self, value, allow_external_connections=True):
if not isinstance(value, list): if not isinstance(value, list):
return None return None
items = [] items = []
@ -365,8 +389,21 @@ class TagField(ManyToManyField):
if tag_type != self.related_model.activity_serializer.type: if tag_type != self.related_model.activity_serializer.type:
# tags can contain multiple types # tags can contain multiple types
continue continue
if tag_type == "Hashtag":
# we already have all data to create hashtags,
# no need to fetch from remote
item = self.related_model.activity_serializer(**link_json)
hashtag = item.to_model(model=self.related_model, save=True)
items.append(hashtag)
else:
# for other tag types we fetch them remotely
items.append( items.append(
activitypub.resolve_remote_id(link.href, model=self.related_model) activitypub.resolve_remote_id(
link.href,
model=self.related_model,
allow_external_connections=allow_external_connections,
)
) )
return items return items
@ -390,11 +427,15 @@ class ImageField(ActivitypubFieldMixin, models.ImageField):
self.alt_field = alt_field self.alt_field = alt_field
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
# pylint: disable=arguments-differ,arguments-renamed # pylint: disable=arguments-differ,arguments-renamed,too-many-arguments
def set_field_from_activity(self, instance, data, save=True, overwrite=True): def set_field_from_activity(
self, instance, data, save=True, overwrite=True, allow_external_connections=True
):
"""helper function for assinging a value to the field""" """helper function for assinging a value to the field"""
value = getattr(data, self.get_activitypub_field()) value = getattr(data, self.get_activitypub_field())
formatted = self.field_from_activity(value) formatted = self.field_from_activity(
value, allow_external_connections=allow_external_connections
)
if formatted is None or formatted is MISSING: if formatted is None or formatted is MISSING:
return False return False
@ -426,7 +467,7 @@ class ImageField(ActivitypubFieldMixin, models.ImageField):
return activitypub.Document(url=url, name=alt) return activitypub.Document(url=url, name=alt)
def field_from_activity(self, value): def field_from_activity(self, value, allow_external_connections=True):
image_slug = value image_slug = value
# when it's an inline image (User avatar/icon, Book cover), it's a json # when it's an inline image (User avatar/icon, Book cover), it's a json
# blob, but when it's an attached image, it's just a url # blob, but when it's an attached image, it's just a url
@ -481,7 +522,7 @@ class DateTimeField(ActivitypubFieldMixin, models.DateTimeField):
return None return None
return value.isoformat() return value.isoformat()
def field_from_activity(self, value): def field_from_activity(self, value, allow_external_connections=True):
try: try:
date_value = dateutil.parser.parse(value) date_value = dateutil.parser.parse(value)
try: try:
@ -495,7 +536,7 @@ class DateTimeField(ActivitypubFieldMixin, models.DateTimeField):
class HtmlField(ActivitypubFieldMixin, models.TextField): class HtmlField(ActivitypubFieldMixin, models.TextField):
"""a text field for storing html""" """a text field for storing html"""
def field_from_activity(self, value): def field_from_activity(self, value, allow_external_connections=True):
if not value or value == MISSING: if not value or value == MISSING:
return None return None
return clean(value) return clean(value)
@ -515,6 +556,10 @@ class CharField(ActivitypubFieldMixin, models.CharField):
"""activitypub-aware char field""" """activitypub-aware char field"""
class CICharField(ActivitypubFieldMixin, DjangoCICharField):
"""activitypub-aware cichar field"""
class URLField(ActivitypubFieldMixin, models.URLField): class URLField(ActivitypubFieldMixin, models.URLField):
"""activitypub-aware url field""" """activitypub-aware url field"""

View file

@ -0,0 +1,23 @@
""" model for tags """
from bookwyrm import activitypub
from .activitypub_mixin import ActivitypubMixin
from .base_model import BookWyrmModel
from .fields import CICharField
class Hashtag(ActivitypubMixin, BookWyrmModel):
"a hashtag which can be used in statuses"
name = CICharField(
max_length=256,
blank=False,
null=False,
activitypub_field="name",
deduplication_field=True,
)
name_field = "name"
activity_serializer = activitypub.Hashtag
def __repr__(self):
return f"<{self.__class__} id={self.id} name={self.name}>"

View file

@ -327,7 +327,7 @@ class ImportItem(models.Model):
) )
@app.task(queue=IMPORTS) @app.task(queue=IMPORTS, ignore_result=True)
def start_import_task(job_id): def start_import_task(job_id):
"""trigger the child tasks for each row""" """trigger the child tasks for each row"""
job = ImportJob.objects.get(id=job_id) job = ImportJob.objects.get(id=job_id)
@ -346,7 +346,7 @@ def start_import_task(job_id):
job.save() job.save()
@app.task(queue=IMPORTS) @app.task(queue=IMPORTS, ignore_result=True)
def import_item_task(item_id): def import_item_task(item_id):
"""resolve a row into a book""" """resolve a row into a book"""
item = ImportItem.objects.get(id=item_id) item = ImportItem.objects.get(id=item_id)

View file

@ -2,8 +2,8 @@
from django.db import models, transaction from django.db import models, transaction
from django.dispatch import receiver from django.dispatch import receiver
from .base_model import BookWyrmModel from .base_model import BookWyrmModel
from . import Boost, Favorite, GroupMemberInvitation, ImportJob, ListItem, Report from . import Boost, Favorite, GroupMemberInvitation, ImportJob, LinkDomain
from . import Status, User, UserFollowRequest from . import ListItem, Report, Status, User, UserFollowRequest
class Notification(BookWyrmModel): class Notification(BookWyrmModel):
@ -28,6 +28,7 @@ class Notification(BookWyrmModel):
# Admin # Admin
REPORT = "REPORT" REPORT = "REPORT"
LINK_DOMAIN = "LINK_DOMAIN"
# Groups # Groups
INVITE = "INVITE" INVITE = "INVITE"
@ -43,7 +44,7 @@ class Notification(BookWyrmModel):
NotificationType = models.TextChoices( NotificationType = models.TextChoices(
# there has got be a better way to do this # there has got be a better way to do this
"NotificationType", "NotificationType",
f"{FAVORITE} {REPLY} {MENTION} {TAG} {FOLLOW} {FOLLOW_REQUEST} {BOOST} {IMPORT} {ADD} {REPORT} {INVITE} {ACCEPT} {JOIN} {LEAVE} {REMOVE} {GROUP_PRIVACY} {GROUP_NAME} {GROUP_DESCRIPTION}", f"{FAVORITE} {REPLY} {MENTION} {TAG} {FOLLOW} {FOLLOW_REQUEST} {BOOST} {IMPORT} {ADD} {REPORT} {LINK_DOMAIN} {INVITE} {ACCEPT} {JOIN} {LEAVE} {REMOVE} {GROUP_PRIVACY} {GROUP_NAME} {GROUP_DESCRIPTION}",
) )
user = models.ForeignKey("User", on_delete=models.CASCADE) user = models.ForeignKey("User", on_delete=models.CASCADE)
@ -64,6 +65,7 @@ class Notification(BookWyrmModel):
"ListItem", symmetrical=False, related_name="notifications" "ListItem", symmetrical=False, related_name="notifications"
) )
related_reports = models.ManyToManyField("Report", symmetrical=False) related_reports = models.ManyToManyField("Report", symmetrical=False)
related_link_domains = models.ManyToManyField("LinkDomain", symmetrical=False)
@classmethod @classmethod
@transaction.atomic @transaction.atomic
@ -241,6 +243,26 @@ def notify_admins_on_report(sender, instance, created, *args, **kwargs):
notification.related_reports.add(instance) notification.related_reports.add(instance)
@receiver(models.signals.post_save, sender=LinkDomain)
@transaction.atomic
# pylint: disable=unused-argument
def notify_admins_on_link_domain(sender, instance, created, *args, **kwargs):
"""a new link domain needs to be verified"""
if not created:
# otherwise you'll get a notification when you approve a domain
return
# moderators and superusers should be notified
admins = User.admins()
for admin in admins:
notification, _ = Notification.objects.get_or_create(
user=admin,
notification_type=Notification.LINK_DOMAIN,
read=False,
)
notification.related_link_domains.add(instance)
@receiver(models.signals.post_save, sender=GroupMemberInvitation) @receiver(models.signals.post_save, sender=GroupMemberInvitation)
# pylint: disable=unused-argument # pylint: disable=unused-argument
def notify_user_on_group_invite(sender, instance, *args, **kwargs): def notify_user_on_group_invite(sender, instance, *args, **kwargs):

View file

@ -171,7 +171,11 @@ class UserFollowRequest(ActivitypubMixin, UserRelationship):
return return
with transaction.atomic(): with transaction.atomic():
try:
UserFollows.from_request(self) UserFollows.from_request(self)
except IntegrityError:
# this just means we already saved this relationship
pass
if self.id: if self.id:
self.delete() self.delete()

View file

@ -34,6 +34,7 @@ class Status(OrderedCollectionPageMixin, BookWyrmModel):
raw_content = models.TextField(blank=True, null=True) raw_content = models.TextField(blank=True, null=True)
mention_users = fields.TagField("User", related_name="mention_user") mention_users = fields.TagField("User", related_name="mention_user")
mention_books = fields.TagField("Edition", related_name="mention_book") mention_books = fields.TagField("Edition", related_name="mention_book")
mention_hashtags = fields.TagField("Hashtag", related_name="mention_hashtag")
local = models.BooleanField(default=True) local = models.BooleanField(default=True)
content_warning = fields.CharField( content_warning = fields.CharField(
max_length=500, blank=True, null=True, activitypub_field="summary" max_length=500, blank=True, null=True, activitypub_field="summary"
@ -329,6 +330,9 @@ class Quotation(BookStatus):
position = models.IntegerField( position = models.IntegerField(
validators=[MinValueValidator(0)], null=True, blank=True validators=[MinValueValidator(0)], null=True, blank=True
) )
endposition = models.IntegerField(
validators=[MinValueValidator(0)], null=True, blank=True
)
position_mode = models.CharField( position_mode = models.CharField(
max_length=3, max_length=3,
choices=ProgressMode.choices, choices=ProgressMode.choices,

View file

@ -469,7 +469,7 @@ class KeyPair(ActivitypubMixin, BookWyrmModel):
return super().save(*args, **kwargs) return super().save(*args, **kwargs)
@app.task(queue=LOW) @app.task(queue=LOW, ignore_result=True)
def set_remote_server(user_id): def set_remote_server(user_id):
"""figure out the user's remote server in the background""" """figure out the user's remote server in the background"""
user = User.objects.get(id=user_id) user = User.objects.get(id=user_id)
@ -513,7 +513,7 @@ def get_or_create_remote_server(domain, refresh=False):
return server return server
@app.task(queue=LOW) @app.task(queue=LOW, ignore_result=True)
def get_remote_reviews(outbox): def get_remote_reviews(outbox):
"""ingest reviews by a new remote bookwyrm user""" """ingest reviews by a new remote bookwyrm user"""
outbox_page = outbox + "?page=true&type=Review" outbox_page = outbox + "?page=true&type=Review"

View file

@ -420,7 +420,7 @@ def save_and_cleanup(image, instance=None):
# pylint: disable=invalid-name # pylint: disable=invalid-name
@app.task(queue=LOW) @app.task(queue=LOW, ignore_result=True)
def generate_site_preview_image_task(): def generate_site_preview_image_task():
"""generate preview_image for the website""" """generate preview_image for the website"""
if not settings.ENABLE_PREVIEW_IMAGES: if not settings.ENABLE_PREVIEW_IMAGES:
@ -445,7 +445,7 @@ def generate_site_preview_image_task():
# pylint: disable=invalid-name # pylint: disable=invalid-name
@app.task(queue=LOW) @app.task(queue=LOW, ignore_result=True)
def generate_edition_preview_image_task(book_id): def generate_edition_preview_image_task(book_id):
"""generate preview_image for a book""" """generate preview_image for a book"""
if not settings.ENABLE_PREVIEW_IMAGES: if not settings.ENABLE_PREVIEW_IMAGES:
@ -470,7 +470,7 @@ def generate_edition_preview_image_task(book_id):
save_and_cleanup(image, instance=book) save_and_cleanup(image, instance=book)
@app.task(queue=LOW) @app.task(queue=LOW, ignore_result=True)
def generate_user_preview_image_task(user_id): def generate_user_preview_image_task(user_id):
"""generate preview_image for a user""" """generate preview_image for a user"""
if not settings.ENABLE_PREVIEW_IMAGES: if not settings.ENABLE_PREVIEW_IMAGES:
@ -496,7 +496,7 @@ def generate_user_preview_image_task(user_id):
save_and_cleanup(image, instance=user) save_and_cleanup(image, instance=user)
@app.task(queue=LOW) @app.task(queue=LOW, ignore_result=True)
def remove_user_preview_image_task(user_id): def remove_user_preview_image_task(user_id):
"""remove preview_image for a user""" """remove preview_image for a user"""
if not settings.ENABLE_PREVIEW_IMAGES: if not settings.ENABLE_PREVIEW_IMAGES:

View file

@ -11,7 +11,7 @@ from django.utils.translation import gettext_lazy as _
env = Env() env = Env()
env.read_env() env.read_env()
DOMAIN = env("DOMAIN") DOMAIN = env("DOMAIN")
VERSION = "0.5.5" VERSION = "0.6.0"
RELEASE_API = env( RELEASE_API = env(
"RELEASE_API", "RELEASE_API",
@ -21,7 +21,7 @@ RELEASE_API = env(
PAGE_LENGTH = env("PAGE_LENGTH", 15) PAGE_LENGTH = env("PAGE_LENGTH", 15)
DEFAULT_LANGUAGE = env("DEFAULT_LANGUAGE", "English") DEFAULT_LANGUAGE = env("DEFAULT_LANGUAGE", "English")
JS_CACHE = "cd848b9a" JS_CACHE = "a7d4e720"
# email # email
EMAIL_BACKEND = env("EMAIL_BACKEND", "django.core.mail.backends.smtp.EmailBackend") EMAIL_BACKEND = env("EMAIL_BACKEND", "django.core.mail.backends.smtp.EmailBackend")
@ -378,7 +378,8 @@ OTEL_EXPORTER_OTLP_ENDPOINT = env("OTEL_EXPORTER_OTLP_ENDPOINT", None)
OTEL_EXPORTER_OTLP_HEADERS = env("OTEL_EXPORTER_OTLP_HEADERS", None) OTEL_EXPORTER_OTLP_HEADERS = env("OTEL_EXPORTER_OTLP_HEADERS", None)
OTEL_SERVICE_NAME = env("OTEL_SERVICE_NAME", None) OTEL_SERVICE_NAME = env("OTEL_SERVICE_NAME", None)
TWO_FACTOR_LOGIN_MAX_SECONDS = 60 TWO_FACTOR_LOGIN_MAX_SECONDS = env.int("TWO_FACTOR_LOGIN_MAX_SECONDS", 60)
TWO_FACTOR_LOGIN_VALIDITY_WINDOW = env.int("TWO_FACTOR_LOGIN_VALIDITY_WINDOW", 2)
HTTP_X_FORWARDED_PROTO = env.bool("SECURE_PROXY_SSL_HEADER", False) HTTP_X_FORWARDED_PROTO = env.bool("SECURE_PROXY_SSL_HEADER", False)
if HTTP_X_FORWARDED_PROTO: if HTTP_X_FORWARDED_PROTO:

View file

@ -95,7 +95,6 @@ let BookWyrm = new (class {
/** /**
* Update a counter with recurring requests to the API * Update a counter with recurring requests to the API
* The delay is slightly randomized and increased on each cycle.
* *
* @param {Object} counter - DOM node * @param {Object} counter - DOM node
* @param {int} delay - frequency for polling in ms * @param {int} delay - frequency for polling in ms
@ -104,16 +103,19 @@ let BookWyrm = new (class {
polling(counter, delay) { polling(counter, delay) {
const bookwyrm = this; const bookwyrm = this;
delay = delay || 10000; delay = delay || 5 * 60 * 1000 + (Math.random() - 0.5) * 30 * 1000;
delay += Math.random() * 1000;
setTimeout( setTimeout(
function () { function () {
fetch("/api/updates/" + counter.dataset.poll) fetch("/api/updates/" + counter.dataset.poll)
.then((response) => response.json()) .then((response) => response.json())
.then((data) => bookwyrm.updateCountElement(counter, data)); .then((data) => {
bookwyrm.updateCountElement(counter, data);
bookwyrm.polling(counter, delay * 1.25); bookwyrm.polling(counter);
})
.catch(() => {
bookwyrm.polling(counter, delay * 1.1);
});
}, },
delay, delay,
counter counter

View file

@ -237,41 +237,41 @@ def domain_level_update(sender, instance, created, update_fields=None, **kwargs)
# ------------------- TASKS # ------------------- TASKS
@app.task(queue=LOW) @app.task(queue=LOW, ignore_result=True)
def rerank_suggestions_task(user_id): def rerank_suggestions_task(user_id):
"""do the hard work in celery""" """do the hard work in celery"""
suggested_users.rerank_user_suggestions(user_id) suggested_users.rerank_user_suggestions(user_id)
@app.task(queue=LOW) @app.task(queue=LOW, ignore_result=True)
def rerank_user_task(user_id, update_only=False): def rerank_user_task(user_id, update_only=False):
"""do the hard work in celery""" """do the hard work in celery"""
user = models.User.objects.get(id=user_id) user = models.User.objects.get(id=user_id)
suggested_users.rerank_obj(user, update_only=update_only) suggested_users.rerank_obj(user, update_only=update_only)
@app.task(queue=LOW) @app.task(queue=LOW, ignore_result=True)
def remove_user_task(user_id): def remove_user_task(user_id):
"""do the hard work in celery""" """do the hard work in celery"""
user = models.User.objects.get(id=user_id) user = models.User.objects.get(id=user_id)
suggested_users.remove_object_from_related_stores(user) suggested_users.remove_object_from_related_stores(user)
@app.task(queue=MEDIUM) @app.task(queue=MEDIUM, ignore_result=True)
def remove_suggestion_task(user_id, suggested_user_id): def remove_suggestion_task(user_id, suggested_user_id):
"""remove a specific user from a specific user's suggestions""" """remove a specific user from a specific user's suggestions"""
suggested_user = models.User.objects.get(id=suggested_user_id) suggested_user = models.User.objects.get(id=suggested_user_id)
suggested_users.remove_suggestion(user_id, suggested_user) suggested_users.remove_suggestion(user_id, suggested_user)
@app.task(queue=LOW) @app.task(queue=LOW, ignore_result=True)
def bulk_remove_instance_task(instance_id): def bulk_remove_instance_task(instance_id):
"""remove a bunch of users from recs""" """remove a bunch of users from recs"""
for user in models.User.objects.filter(federated_server__id=instance_id): for user in models.User.objects.filter(federated_server__id=instance_id):
suggested_users.remove_object_from_related_stores(user) suggested_users.remove_object_from_related_stores(user)
@app.task(queue=LOW) @app.task(queue=LOW, ignore_result=True)
def bulk_add_instance_task(instance_id): def bulk_add_instance_task(instance_id):
"""remove a bunch of users from recs""" """remove a bunch of users from recs"""
for user in models.User.objects.filter(federated_server__id=instance_id): for user in models.User.objects.filter(federated_server__id=instance_id):

View file

@ -82,6 +82,8 @@
src="{% static "images/no_cover.jpg" %}" src="{% static "images/no_cover.jpg" %}"
alt="" alt=""
aria-hidden="true" aria-hidden="true"
loading="lazy"
decoding="async"
> >
<span class="cover-caption"> <span class="cover-caption">
<span>{{ book.alt_text }}</span> <span>{{ book.alt_text }}</span>

View file

@ -5,7 +5,7 @@
<div class="modal-background" data-modal-close></div><!-- modal background --> <div class="modal-background" data-modal-close></div><!-- modal background -->
<div class="modal-card is-align-items-center" role="dialog" aria-modal="true" tabindex="-1" aria-label="{% trans 'Book cover preview' %}"> <div class="modal-card is-align-items-center" role="dialog" aria-modal="true" tabindex="-1" aria-label="{% trans 'Book cover preview' %}">
<div class="cover-container"> <div class="cover-container">
<img class="book-cover" src="{% get_media_prefix %}{{ book.cover }}" itemprop="thumbnailUrl" alt=""> <img class="book-cover" src="{% get_media_prefix %}{{ book.cover }}" itemprop="thumbnailUrl" alt="" loading="lazy" decoding="async">
</div> </div>
</div> </div>
<button type="button" data-modal-close class="modal-close is-large" aria-label="{% trans 'Close' %}"></button> <button type="button" data-modal-close class="modal-close is-large" aria-label="{% trans 'Close' %}"></button>

View file

@ -37,6 +37,14 @@
{% endif %} {% endif %}
</header> </header>
{% if form.errors %}
<div class="block">
<p class="notification is-danger is-light">
{% trans "Failed to save book, see errors below for more information." %}
</p>
</div>
{% endif %}
<form <form
class="block" class="block"
{% if book.id %} {% if book.id %}

View file

@ -2,7 +2,7 @@
<div style="font-family: BlinkMacSystemFont,-apple-system,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Fira Sans','Droid Sans','Helvetica Neue',Helvetica,Arial,sans-serif; border-radius: 6px; background-color: #efefef; max-width: 632px;"> <div style="font-family: BlinkMacSystemFont,-apple-system,'Segoe UI',Roboto,Oxygen,Ubuntu,Cantarell,'Fira Sans','Droid Sans','Helvetica Neue',Helvetica,Arial,sans-serif; border-radius: 6px; background-color: #efefef; max-width: 632px;">
<div style="padding: 1rem; overflow: auto;"> <div style="padding: 1rem; overflow: auto;">
<div style="float: left; margin-right: 1rem;"> <div style="float: left; margin-right: 1rem;">
<a style="color: #3273dc;" href="https://{{ domain }}" style="text-decoration: none;"><img src="{{ logo }}" alt="logo"></a> <a style="color: #3273dc;" href="https://{{ domain }}" style="text-decoration: none;"><img src="{{ logo }}" alt="logo" loading="lazy" decoding="async"></a>
</div> </div>
<div> <div>
<a style="color: black; text-decoration: none" href="https://{{ domain }}" style="text-decoration: none;"><strong>{{ site_name }}</strong><br> <a style="color: black; text-decoration: none" href="https://{{ domain }}" style="text-decoration: none;"><strong>{{ site_name }}</strong><br>

View file

@ -17,7 +17,7 @@
<header class="section py-3"> <header class="section py-3">
<a href="/" class="is-flex is-align-items-center"> <a href="/" class="is-flex is-align-items-center">
<img class="image logo is-flex-shrink-0" style="height: 32px" src="{% if site.logo_small %}{% get_media_prefix %}{{ site.logo_small }}{% else %}{% static "images/logo-small.png" %}{% endif %}" alt="{% blocktrans with site_name=site.name %}{{ site_name }} home page{% endblocktrans %}"> <img class="image logo is-flex-shrink-0" style="height: 32px" src="{% if site.logo_small %}{% get_media_prefix %}{{ site.logo_small }}{% else %}{% static "images/logo-small.png" %}{% endif %}" alt="{% blocktrans with site_name=site.name %}{{ site_name }} home page{% endblocktrans %}" loading="lazy" decoding="async">
<span class="title is-5 ml-2">{{ site.name }}</span> <span class="title is-5 ml-2">{{ site.name }}</span>
</a> </a>
</header> </header>

View file

@ -23,7 +23,7 @@
{% block panel %}{% endblock %} {% block panel %}{% endblock %}
{% if activities %} {% if activities %}
{% include 'snippets/pagination.html' with page=activities path=path anchor="#feed" %} {% include 'snippets/pagination.html' with page=activities path=path anchor="#feed" mode="chronological" %}
{% endif %} {% endif %}
</div> </div>
</div> </div>

View file

@ -15,6 +15,8 @@
src="{% if site.logo_small %}{% get_media_prefix %}{{ site.logo_small }}{% else %}{% static "images/logo-small.png" %}{% endif %}" src="{% if site.logo_small %}{% get_media_prefix %}{{ site.logo_small }}{% else %}{% static "images/logo-small.png" %}{% endif %}"
aria-hidden="true" aria-hidden="true"
alt="{{ site.name }}" alt="{{ site.name }}"
loading="lazy"
decoding="async"
> >
<h1 class="modal-card-title" id="get_started_header"> <h1 class="modal-card-title" id="get_started_header">
{% blocktrans %}Welcome to {{ site_name }}!{% endblocktrans %} {% blocktrans %}Welcome to {{ site_name }}!{% endblocktrans %}

View file

@ -0,0 +1,32 @@
{% extends "layout.html" %}
{% load i18n %}
{% block title %}{{ hashtag }}{% endblock %}
{% block content %}
<div class="container is-max-desktop">
<section class="block">
<header class="block content has-text-centered">
<h1 class="title">{{ hashtag }}</h1>
<p class="subtitle">
{% blocktrans trimmed with site_name=site.name %}
See tagged statuses in the local {{ site_name }} community
{% endblocktrans %}
</p>
</header>
{% for activity in activities %}
<div class="block">
{% include 'snippets/status/status.html' with status=activity %}
</div>
{% endfor %}
{% if not activities %}
<div class="block">
<p>{% trans "No activities for this hashtag yet!" %}</p>
</div>
{% endif %}
{% include 'snippets/pagination.html' with page=activities path=path %}
</section>
</div>
{% endblock %}

View file

@ -28,7 +28,7 @@
{% with notification_count=request.user.unread_notification_count has_unread_mentions=request.user.has_unread_mentions %} {% with notification_count=request.user.unread_notification_count has_unread_mentions=request.user.has_unread_mentions %}
<div class="navbar-brand"> <div class="navbar-brand">
<a class="navbar-item" href="/"> <a class="navbar-item" href="/">
<img class="image logo" src="{% if site.logo_small %}{% get_media_prefix %}{{ site.logo_small }}{% else %}{% static "images/logo-small.png" %}{% endif %}" alt="{% blocktrans with site_name=site.name %}{{ site_name }} home page{% endblocktrans %}"> <img class="image logo" src="{% if site.logo_small %}{% get_media_prefix %}{{ site.logo_small }}{% else %}{% static "images/logo-small.png" %}{% endif %}" alt="{% blocktrans with site_name=site.name %}{{ site_name }} home page{% endblocktrans %}" loading="lazy" decoding="async">
</a> </a>
<form class="navbar-item column is-align-items-start pt-5" action="{% url 'search' %}"> <form class="navbar-item column is-align-items-start pt-5" action="{% url 'search' %}">
<div class="field has-addons"> <div class="field has-addons">

View file

@ -17,6 +17,8 @@
{% include 'notifications/items/add.html' %} {% include 'notifications/items/add.html' %}
{% elif notification.notification_type == 'REPORT' %} {% elif notification.notification_type == 'REPORT' %}
{% include 'notifications/items/report.html' %} {% include 'notifications/items/report.html' %}
{% elif notification.notification_type == 'LINK_DOMAIN' %}
{% include 'notifications/items/link_domain.html' %}
{% elif notification.notification_type == 'INVITE' %} {% elif notification.notification_type == 'INVITE' %}
{% include 'notifications/items/invite.html' %} {% include 'notifications/items/invite.html' %}
{% elif notification.notification_type == 'ACCEPT' %} {% elif notification.notification_type == 'ACCEPT' %}

View file

@ -0,0 +1,20 @@
{% extends 'notifications/items/layout.html' %}
{% load humanize %}
{% load i18n %}
{% block primary_link %}{% spaceless %}
{% url 'settings-link-domain' %}
{% endspaceless %}{% endblock %}
{% block icon %}
<span class="icon icon-warning"></span>
{% endblock %}
{% block description %}
{% url 'settings-link-domain' as path %}
{% blocktrans trimmed count counter=notification.related_link_domains.count with display_count=notification.related_link_domains.count|intcomma %}
A new <a href="{{ path }}">link domain</a> needs review
{% plural %}
{{ display_count }} new <a href="{{ path }}">link domains</a> need moderation
{% endblocktrans %}
{% endblock %}

View file

@ -21,7 +21,7 @@
<nav class="navbar" aria-label="main navigation"> <nav class="navbar" aria-label="main navigation">
<div class="container"> <div class="container">
<div class="navbar-brand"> <div class="navbar-brand">
<img class="image logo navbar-item" src="{% if site.logo_small %}{% get_media_prefix %}{{ site.logo_small }}{% else %}{% static 'images/logo-small.png' %}{% endif %}" alt="Home page"> <img class="image logo navbar-item" src="{% if site.logo_small %}{% get_media_prefix %}{{ site.logo_small }}{% else %}{% static 'images/logo-small.png' %}{% endif %}" alt="Home page" loading="lazy" decoding="async">
<h2 class="navbar-item subtitle">{% block heading %}{% endblock %}</h2> <h2 class="navbar-item subtitle">{% block heading %}{% endblock %}</h2>
</div> </div>
</div> </div>

View file

@ -13,6 +13,8 @@
class="image logo" class="image logo"
src="{% if site.logo_small %}{% get_media_prefix %}{{ site.logo_small }}{% else %}{% static "images/logo-small.png" %}{% endif %}" src="{% if site.logo_small %}{% get_media_prefix %}{{ site.logo_small }}{% else %}{% static "images/logo-small.png" %}{% endif %}"
alt="{% blocktrans with site_name=site.name %}{{ site_name }} home page{% endblocktrans %}" alt="{% blocktrans with site_name=site.name %}{{ site_name }} home page{% endblocktrans %}"
loading="lazy"
decoding="async"
> >
</span> </span>
<div class="navbar-item is-align-items-start pt-5 is-flex-grow-1"> <div class="navbar-item is-align-items-start pt-5 is-flex-grow-1">

View file

@ -3,7 +3,7 @@
<div class="columns"> <div class="columns">
<div class="column is-narrow is-hidden-mobile"> <div class="column is-narrow is-hidden-mobile">
<figure class="block is-w-{% if size %}{{ size }}{% else %}xl{% endif %}"> <figure class="block is-w-{% if size %}{{ size }}{% else %}xl{% endif %}">
<img src="{% if site.logo %}{% get_media_prefix %}{{ site.logo }}{% else %}{% static "images/logo.png" %}{% endif %}" alt="BookWyrm logo"> <img src="{% if site.logo %}{% get_media_prefix %}{{ site.logo }}{% else %}{% static "images/logo.png" %}{% endif %}" alt="BookWyrm logo" loading="lazy" decoding="async">
</figure> </figure>
</div> </div>
<div class="content"> <div class="content">

View file

@ -5,4 +5,6 @@
src="{% if user.avatar %}{% get_media_prefix %}{{ user.avatar }}{% else %}{% static "images/default_avi.jpg" %}{% endif %}" src="{% if user.avatar %}{% get_media_prefix %}{{ user.avatar }}{% else %}{% static "images/default_avi.jpg" %}{% endif %}"
{% if ariaHide %}aria-hidden="true"{% endif %} {% if ariaHide %}aria-hidden="true"{% endif %}
alt="{{ user.alt_text }}" alt="{{ user.alt_text }}"
loading="lazy"
decoding="async"
> >

View file

@ -13,6 +13,8 @@
src="{{ book.cover }}" src="{{ book.cover }}"
itemprop="thumbnailUrl" itemprop="thumbnailUrl"
alt="{{ book.alt_text|default:'' }}" alt="{{ book.alt_text|default:'' }}"
loading="lazy"
decoding="async"
> >
{% else %} {% else %}

View file

@ -65,6 +65,22 @@ uuid: a unique identifier used to make html "id" attributes unique and clarify j
{% if not draft %}data-cache-draft="id_position_{{ book.id }}_{{ type }}"{% endif %} {% if not draft %}data-cache-draft="id_position_{{ book.id }}_{{ type }}"{% endif %}
> >
</div> </div>
<div class="button is-static">
{% trans "to" %}
</div>
<div class="control">
<input
aria-label="{% if draft.position_mode == 'PG' %}Page{% else %}Percent{% endif %}"
class="input"
type="number"
min="0"
name="endposition"
size="3"
value="{% firstof draft.endposition '' %}"
id="endposition_{{ uuid }}"
{% if not draft %}data-cache-draft="id_endposition_{{ book.id }}_{{ type }}"{% endif %}
>
</div>
</div> </div>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -9,7 +9,11 @@
{% endif %}> {% endif %}>
<span class="icon icon-arrow-left" aria-hidden="true"></span> <span class="icon icon-arrow-left" aria-hidden="true"></span>
{% if mode == "chronological" %}
{% trans "Newer" %}
{% else %}
{% trans "Previous" %} {% trans "Previous" %}
{% endif %}
</a> </a>
<a <a
@ -20,7 +24,11 @@
aria-hidden="true" aria-hidden="true"
{% endif %}> {% endif %}>
{% if mode == "chronological" %}
{% trans "Older" %}
{% else %}
{% trans "Next" %} {% trans "Next" %}
{% endif %}
<span class="icon icon-arrow-right" aria-hidden="true"></span> <span class="icon icon-arrow-right" aria-hidden="true"></span>
</a> </a>

View file

@ -99,9 +99,9 @@
&mdash; {% include 'snippets/book_titleby.html' with book=status.book %} &mdash; {% include 'snippets/book_titleby.html' with book=status.book %}
{% if status.position %} {% if status.position %}
{% if status.position_mode == 'PG' %} {% if status.position_mode == 'PG' %}
{% blocktrans with page=status.position|intcomma %}(Page {{ page }}){% endblocktrans %} {% blocktrans with page=status.position|intcomma %}(Page {{ page }}{% endblocktrans%}{% if status.endposition and status.endposition != status.position %} - {% blocktrans with endpage=status.endposition|intcomma %}{{ endpage }}{% endblocktrans %}{% endif%})
{% else %} {% else %}
{% blocktrans with percent=status.position %}({{ percent }}%){% endblocktrans %} {% blocktrans with percent=status.position %}({{ percent }}%{% endblocktrans %}{% if status.endposition and status.endposition != status.position %}{% blocktrans with endpercent=status.endposition|intcomma %} - {{ endpercent }}%{% endblocktrans %}{% endif %})
{% endif %} {% endif %}
{% endif %} {% endif %}
</p> </p>
@ -133,6 +133,8 @@
alt="{{ attachment.caption }}" alt="{{ attachment.caption }}"
title="{{ attachment.caption }}" title="{{ attachment.caption }}"
{% endif %} {% endif %}
loading="lazy"
decoding="async"
> >
</a> </a>
</figure> </figure>

View file

@ -15,7 +15,7 @@
<div class="container"> <div class="container">
<div class="navbar-brand"> <div class="navbar-brand">
<a class="navbar-item" href="/"> <a class="navbar-item" href="/">
<img class="image logo" src="{% if site.logo_small %}{% get_media_prefix %}{{ site.logo_small }}{% else %}{% static "images/logo-small.png" %}{% endif %}" alt="{% blocktrans with site_name=site.name %}{{ site_name }} home page{% endblocktrans %}"> <img class="image logo" src="{% if site.logo_small %}{% get_media_prefix %}{{ site.logo_small }}{% else %}{% static "images/logo-small.png" %}{% endif %}" alt="{% blocktrans with site_name=site.name %}{{ site_name }} home page{% endblocktrans %}" loading="lazy" decoding="async">
</a> </a>
</div> </div>
</div> </div>

View file

@ -15,7 +15,7 @@
<div class="container"> <div class="container">
<div class="navbar-brand"> <div class="navbar-brand">
<a class="navbar-item" href="/"> <a class="navbar-item" href="/">
<img class="image logo" src="{% if site.logo_small %}{% get_media_prefix %}{{ site.logo_small }}{% else %}{% static "images/logo-small.png" %}{% endif %}" alt="{% blocktrans with site_name=site.name %}{{ site_name }} home page{% endblocktrans %}"> <img class="image logo" src="{% if site.logo_small %}{% get_media_prefix %}{{ site.logo_small }}{% else %}{% static "images/logo-small.png" %}{% endif %}" alt="{% blocktrans with site_name=site.name %}{{ site_name }} home page{% endblocktrans %}" loading="lazy" decoding="async">
</a> </a>
</div> </div>
</div> </div>

View file

@ -25,6 +25,6 @@
</div> </div>
{% endif %} {% endif %}
{% include 'snippets/pagination.html' with page=activities path=path %} {% include 'snippets/pagination.html' with page=activities path=path mode="chronological" %}
</div> </div>
{% endblock %} {% endblock %}

View file

@ -130,7 +130,7 @@
</div> </div>
{% endif %} {% endif %}
{% include 'snippets/pagination.html' with page=activities path=user.local_path anchor="#feed" %} {% include 'snippets/pagination.html' with page=activities path=user.local_path anchor="#feed" mode="chronological" %}
</div> </div>
{% endblock %} {% endblock %}

View file

@ -183,12 +183,21 @@ class BaseActivity(TestCase):
"name": "gerald j. books", "name": "gerald j. books",
"href": "http://book.com/book", "href": "http://book.com/book",
}, },
{
"type": "Hashtag",
"name": "#BookClub",
"href": "http://example.com/tags/BookClub",
},
], ],
) )
update_data.to_model(model=models.Status, instance=status) update_data.to_model(model=models.Status, instance=status)
self.assertEqual(status.mention_users.first(), self.user) self.assertEqual(status.mention_users.first(), self.user)
self.assertEqual(status.mention_books.first(), book) self.assertEqual(status.mention_books.first(), book)
hashtag = models.Hashtag.objects.filter(name="#BookClub").first()
self.assertIsNotNone(hashtag)
self.assertEqual(status.mention_hashtags.first(), hashtag)
@responses.activate @responses.activate
def test_to_model_one_to_many(self, *_): def test_to_model_one_to_many(self, *_):
"""these are reversed relationships, where the secondary object """these are reversed relationships, where the secondary object

View file

@ -0,0 +1,64 @@
""" tests functionality specifically for the Note ActivityPub dataclass"""
from unittest.mock import patch
from django.test import TestCase
from bookwyrm import activitypub
from bookwyrm import models
class Note(TestCase):
"""the model-linked ActivityPub dataclass for Note-based types"""
# pylint: disable=invalid-name
def setUp(self):
"""create a shared user"""
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.user = models.User.objects.create_user(
"mouse", "mouse@mouse.mouse", "mouseword", local=True, localname="mouse"
)
self.user.remote_id = "https://test-instance.org/user/critic"
self.user.save(broadcast=False, update_fields=["remote_id"])
self.book = models.Edition.objects.create(
title="Test Edition", remote_id="http://book.com/book"
)
def test_to_model_hashtag_postprocess_content(self):
"""test that hashtag links are post-processed and link to local URLs"""
update_data = activitypub.Comment(
id="https://test-instance.org/user/critic/comment/42",
attributedTo=self.user.remote_id,
inReplyToBook=self.book.remote_id,
content="<p>This is interesting "
+ '<a href="https://test-instance.org/hashtag/2" data-mention="hashtag">'
+ "#bookclub</a></p>",
published="2023-02-17T23:12:59.398030+00:00",
to=[],
cc=[],
tag=[
{
"type": "Edition",
"name": "gerald j. books",
"href": "http://book.com/book",
},
{
"type": "Hashtag",
"name": "#BookClub",
"href": "https://test-instance.org/hashtag/2",
},
],
)
instance = update_data.to_model(model=models.Status)
self.assertIsNotNone(instance)
hashtag = models.Hashtag.objects.filter(name="#BookClub").first()
self.assertIsNotNone(hashtag)
self.assertEqual(
instance.content,
"<p>This is interesting "
+ f'<a href="{hashtag.remote_id}" data-mention="hashtag">'
+ "#bookclub</a></p>",
)

View file

@ -53,18 +53,18 @@ class Activitystreams(TestCase):
def test_activitystream_class_ids(self, *_): def test_activitystream_class_ids(self, *_):
"""the abstract base class for stream objects""" """the abstract base class for stream objects"""
self.assertEqual( self.assertEqual(
self.test_stream.stream_id(self.local_user), self.test_stream.stream_id(self.local_user.id),
f"{self.local_user.id}-test", f"{self.local_user.id}-test",
) )
self.assertEqual( self.assertEqual(
self.test_stream.unread_id(self.local_user), self.test_stream.unread_id(self.local_user.id),
f"{self.local_user.id}-test-unread", f"{self.local_user.id}-test-unread",
) )
def test_unread_by_status_type_id(self, *_): def test_unread_by_status_type_id(self, *_):
"""stream for status type""" """stream for status type"""
self.assertEqual( self.assertEqual(
self.test_stream.unread_by_status_type_id(self.local_user), self.test_stream.unread_by_status_type_id(self.local_user.id),
f"{self.local_user.id}-test-unread-by-type", f"{self.local_user.id}-test-unread-by-type",
) )
@ -118,9 +118,9 @@ class Activitystreams(TestCase):
) )
users = self.test_stream.get_audience(status) users = self.test_stream.get_audience(status)
# remote users don't have feeds # remote users don't have feeds
self.assertFalse(self.remote_user in users) self.assertFalse(self.remote_user.id in users)
self.assertTrue(self.local_user in users) self.assertTrue(self.local_user.id in users)
self.assertTrue(self.another_user in users) self.assertTrue(self.another_user.id in users)
def test_abstractstream_get_audience_direct(self, *_): def test_abstractstream_get_audience_direct(self, *_):
"""get a list of users that should see a status""" """get a list of users that should see a status"""
@ -141,9 +141,9 @@ class Activitystreams(TestCase):
) )
status.mention_users.add(self.local_user) status.mention_users.add(self.local_user)
users = self.test_stream.get_audience(status) users = self.test_stream.get_audience(status)
self.assertTrue(self.local_user in users) self.assertTrue(self.local_user.id in users)
self.assertFalse(self.another_user in users) self.assertFalse(self.another_user.id in users)
self.assertFalse(self.remote_user in users) self.assertFalse(self.remote_user.id in users)
def test_abstractstream_get_audience_followers_remote_user(self, *_): def test_abstractstream_get_audience_followers_remote_user(self, *_):
"""get a list of users that should see a status""" """get a list of users that should see a status"""
@ -153,7 +153,7 @@ class Activitystreams(TestCase):
privacy="followers", privacy="followers",
) )
users = self.test_stream.get_audience(status) users = self.test_stream.get_audience(status)
self.assertFalse(users.exists()) self.assertEqual(users, [])
def test_abstractstream_get_audience_followers_self(self, *_): def test_abstractstream_get_audience_followers_self(self, *_):
"""get a list of users that should see a status""" """get a list of users that should see a status"""
@ -164,9 +164,9 @@ class Activitystreams(TestCase):
book=self.book, book=self.book,
) )
users = self.test_stream.get_audience(status) users = self.test_stream.get_audience(status)
self.assertTrue(self.local_user in users) self.assertTrue(self.local_user.id in users)
self.assertFalse(self.another_user in users) self.assertFalse(self.another_user.id in users)
self.assertFalse(self.remote_user in users) self.assertFalse(self.remote_user.id in users)
def test_abstractstream_get_audience_followers_with_mention(self, *_): def test_abstractstream_get_audience_followers_with_mention(self, *_):
"""get a list of users that should see a status""" """get a list of users that should see a status"""
@ -179,9 +179,9 @@ class Activitystreams(TestCase):
status.mention_users.add(self.local_user) status.mention_users.add(self.local_user)
users = self.test_stream.get_audience(status) users = self.test_stream.get_audience(status)
self.assertTrue(self.local_user in users) self.assertTrue(self.local_user.id in users)
self.assertFalse(self.another_user in users) self.assertFalse(self.another_user.id in users)
self.assertFalse(self.remote_user in users) self.assertFalse(self.remote_user.id in users)
def test_abstractstream_get_audience_followers_with_relationship(self, *_): def test_abstractstream_get_audience_followers_with_relationship(self, *_):
"""get a list of users that should see a status""" """get a list of users that should see a status"""
@ -193,6 +193,6 @@ class Activitystreams(TestCase):
book=self.book, book=self.book,
) )
users = self.test_stream.get_audience(status) users = self.test_stream.get_audience(status)
self.assertFalse(self.local_user in users) self.assertFalse(self.local_user.id in users)
self.assertFalse(self.another_user in users) self.assertFalse(self.another_user.id in users)
self.assertFalse(self.remote_user in users) self.assertFalse(self.remote_user.id in users)

View file

@ -1,4 +1,6 @@
""" testing activitystreams """ """ testing activitystreams """
import itertools
from unittest.mock import patch from unittest.mock import patch
from django.test import TestCase from django.test import TestCase
from bookwyrm import activitystreams, models from bookwyrm import activitystreams, models
@ -69,12 +71,29 @@ class Activitystreams(TestCase):
shelf=self.local_user.shelf_set.first(), shelf=self.local_user.shelf_set.first(),
book=self.book, book=self.book,
) )
class RedisMockCounter:
"""keep track of calls to mock redis store"""
calls = []
def bulk_add_objects_to_store(self, objs, store):
"""keep track of bulk_add_objects_to_store calls"""
self.calls.append((objs, store))
redis_mock_counter = RedisMockCounter()
with patch( with patch(
"bookwyrm.activitystreams.BooksStream.bulk_add_objects_to_store" "bookwyrm.activitystreams.BooksStream.bulk_add_objects_to_store"
) as redis_mock: ) as redis_mock:
redis_mock.side_effect = redis_mock_counter.bulk_add_objects_to_store
activitystreams.BooksStream().add_book_statuses(self.local_user, self.book) activitystreams.BooksStream().add_book_statuses(self.local_user, self.book)
args = redis_mock.call_args[0]
queryset = args[0] self.assertEqual(sum(map(lambda x: x[0].count(), redis_mock_counter.calls)), 1)
self.assertEqual(queryset.count(), 1) self.assertTrue(
self.assertTrue(status in queryset) status
self.assertEqual(args[1], f"{self.local_user.id}-books") in itertools.chain.from_iterable(
map(lambda x: x[0], redis_mock_counter.calls)
)
)
for call in redis_mock_counter.calls:
self.assertEqual(call[1], f"{self.local_user.id}-books")

View file

@ -44,7 +44,7 @@ class Activitystreams(TestCase):
user=self.remote_user, content="hi", privacy="public" user=self.remote_user, content="hi", privacy="public"
) )
users = activitystreams.HomeStream().get_audience(status) users = activitystreams.HomeStream().get_audience(status)
self.assertFalse(users.exists()) self.assertEqual(users, [])
def test_homestream_get_audience_with_mentions(self, *_): def test_homestream_get_audience_with_mentions(self, *_):
"""get a list of users that should see a status""" """get a list of users that should see a status"""
@ -53,8 +53,8 @@ class Activitystreams(TestCase):
) )
status.mention_users.add(self.local_user) status.mention_users.add(self.local_user)
users = activitystreams.HomeStream().get_audience(status) users = activitystreams.HomeStream().get_audience(status)
self.assertFalse(self.local_user in users) self.assertFalse(self.local_user.id in users)
self.assertFalse(self.another_user in users) self.assertFalse(self.another_user.id in users)
def test_homestream_get_audience_with_relationship(self, *_): def test_homestream_get_audience_with_relationship(self, *_):
"""get a list of users that should see a status""" """get a list of users that should see a status"""
@ -63,5 +63,5 @@ class Activitystreams(TestCase):
user=self.remote_user, content="hi", privacy="public" user=self.remote_user, content="hi", privacy="public"
) )
users = activitystreams.HomeStream().get_audience(status) users = activitystreams.HomeStream().get_audience(status)
self.assertTrue(self.local_user in users) self.assertTrue(self.local_user.id in users)
self.assertFalse(self.another_user in users) self.assertFalse(self.another_user.id in users)

View file

@ -54,8 +54,8 @@ class Activitystreams(TestCase):
user=self.local_user, content="hi", privacy="public" user=self.local_user, content="hi", privacy="public"
) )
users = activitystreams.LocalStream().get_audience(status) users = activitystreams.LocalStream().get_audience(status)
self.assertTrue(self.local_user in users) self.assertTrue(self.local_user.id in users)
self.assertTrue(self.another_user in users) self.assertTrue(self.another_user.id in users)
def test_localstream_get_audience_unlisted(self, *_): def test_localstream_get_audience_unlisted(self, *_):
"""get a list of users that should see a status""" """get a list of users that should see a status"""
@ -88,7 +88,7 @@ class Activitystreams(TestCase):
) )
# yes book, yes audience # yes book, yes audience
audience = activitystreams.BooksStream().get_audience(status) audience = activitystreams.BooksStream().get_audience(status)
self.assertTrue(self.local_user in audience) self.assertTrue(self.local_user.id in audience)
def test_localstream_get_audience_books_book_field(self, *_): def test_localstream_get_audience_books_book_field(self, *_):
"""get a list of users that should see a status""" """get a list of users that should see a status"""
@ -102,7 +102,7 @@ class Activitystreams(TestCase):
) )
# yes book, yes audience # yes book, yes audience
audience = activitystreams.BooksStream().get_audience(status) audience = activitystreams.BooksStream().get_audience(status)
self.assertTrue(self.local_user in audience) self.assertTrue(self.local_user.id in audience)
def test_localstream_get_audience_books_alternate_edition(self, *_): def test_localstream_get_audience_books_alternate_edition(self, *_):
"""get a list of users that should see a status""" """get a list of users that should see a status"""
@ -119,7 +119,7 @@ class Activitystreams(TestCase):
) )
# yes book, yes audience # yes book, yes audience
audience = activitystreams.BooksStream().get_audience(status) audience = activitystreams.BooksStream().get_audience(status)
self.assertTrue(self.local_user in audience) self.assertTrue(self.local_user.id in audience)
def test_localstream_get_audience_books_non_public(self, *_): def test_localstream_get_audience_books_non_public(self, *_):
"""get a list of users that should see a status""" """get a list of users that should see a status"""

View file

@ -265,7 +265,7 @@ class Status(TestCase):
self.assertEqual(activity["attachment"][0]["type"], "Document") self.assertEqual(activity["attachment"][0]["type"], "Document")
self.assertTrue( self.assertTrue(
re.match( re.match(
r"https:\/\/your.domain.here\/images\/covers\/test_[A-z0-9]+.jpg", r"https:\/\/your.domain.here\/images\/covers\/test(_[A-z0-9]+)?.jpg",
activity["attachment"][0]["url"], activity["attachment"][0]["url"],
) )
) )

View file

@ -95,6 +95,7 @@ class Signature(TestCase):
def test_correct_signature(self): def test_correct_signature(self):
"""this one should just work""" """this one should just work"""
with patch("bookwyrm.models.relationship.UserFollowRequest.accept"):
response = self.send_test_request(sender=self.mouse) response = self.send_test_request(sender=self.mouse)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
@ -124,8 +125,12 @@ class Signature(TestCase):
) )
with patch("bookwyrm.models.user.get_remote_reviews.delay"): with patch("bookwyrm.models.user.get_remote_reviews.delay"):
with patch(
"bookwyrm.models.relationship.UserFollowRequest.accept"
) as accept_mock:
response = self.send_test_request(sender=self.fake_remote) response = self.send_test_request(sender=self.fake_remote)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertTrue(accept_mock.called)
@responses.activate @responses.activate
def test_key_needs_refresh(self): def test_key_needs_refresh(self):
@ -148,16 +153,28 @@ class Signature(TestCase):
with patch("bookwyrm.models.user.get_remote_reviews.delay"): with patch("bookwyrm.models.user.get_remote_reviews.delay"):
# Key correct: # Key correct:
with patch(
"bookwyrm.models.relationship.UserFollowRequest.accept"
) as accept_mock:
response = self.send_test_request(sender=self.fake_remote) response = self.send_test_request(sender=self.fake_remote)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertTrue(accept_mock.called)
# Old key is cached, so still works: # Old key is cached, so still works:
with patch(
"bookwyrm.models.relationship.UserFollowRequest.accept"
) as accept_mock:
response = self.send_test_request(sender=self.fake_remote) response = self.send_test_request(sender=self.fake_remote)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertTrue(accept_mock.called)
# Try with new key: # Try with new key:
with patch(
"bookwyrm.models.relationship.UserFollowRequest.accept"
) as accept_mock:
response = self.send_test_request(sender=new_sender) response = self.send_test_request(sender=new_sender)
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
self.assertTrue(accept_mock.called)
# Now the old key will fail: # Now the old key will fail:
response = self.send_test_request(sender=self.fake_remote) response = self.send_test_request(sender=self.fake_remote)

View file

@ -257,6 +257,33 @@ class BookViews(TestCase):
self.assertEqual(mock.call_args[0][0], "https://openlibrary.org/book/123") self.assertEqual(mock.call_args[0][0], "https://openlibrary.org/book/123")
self.assertEqual(result.status_code, 302) self.assertEqual(result.status_code, 302)
@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async")
@patch("bookwyrm.activitystreams.add_status_task.delay")
def test_quotation_endposition(self, *_):
"""make sure the endposition is served as well"""
view = views.Book.as_view()
_ = models.Quotation.objects.create(
user=self.local_user,
book=self.book,
content="hi",
quote="wow",
position=12,
endposition=13,
)
request = self.factory.get("")
request.user = self.local_user
with patch("bookwyrm.views.books.books.is_api_request") as is_api:
is_api.return_value = False
result = view(request, self.book.id, user_statuses="quotation")
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
print(result.render())
self.assertEqual(result.status_code, 200)
self.assertEqual(result.context_data["statuses"].object_list[0].endposition, 13)
def _setup_cover_url(): def _setup_cover_url():
"""creates cover url mock""" """creates cover url mock"""

View file

@ -1,7 +1,7 @@
""" test for app action functionality """ """ test for app action functionality """
from unittest.mock import patch from unittest.mock import patch
from django.http import StreamingHttpResponse from django.http import HttpResponse
from django.test import TestCase from django.test import TestCase
from django.test.client import RequestFactory from django.test.client import RequestFactory
@ -57,13 +57,12 @@ class ExportViews(TestCase):
request = self.factory.post("") request = self.factory.post("")
request.user = self.local_user request.user = self.local_user
export = views.Export.as_view()(request) export = views.Export.as_view()(request)
self.assertIsInstance(export, StreamingHttpResponse) self.assertIsInstance(export, HttpResponse)
self.assertEqual(export.status_code, 200) self.assertEqual(export.status_code, 200)
result = list(export.streaming_content)
# pylint: disable=line-too-long # pylint: disable=line-too-long
self.assertEqual( self.assertEqual(
result[0], export.content,
b"title,author_text,remote_id,openlibrary_key,inventaire_id,librarything_key,goodreads_key,bnf_id,viaf,wikidata,asin,aasin,isfdb,isbn_10,isbn_13,oclc_number,rating,review_name,review_cw,review_content\r\n", b"title,author_text,remote_id,openlibrary_key,inventaire_id,librarything_key,goodreads_key,bnf_id,viaf,wikidata,asin,aasin,isfdb,isbn_10,isbn_13,oclc_number,rating,review_name,review_cw,review_content\r\nTest Book,,"
+ self.book.remote_id.encode("utf-8")
+ b",,,,,beep,,,,,,123456789X,9781234567890,,,,,\r\n",
) )
expected = f"Test Book,,{self.book.remote_id},,,,,beep,,,,,,123456789X,9781234567890,,,,,\r\n"
self.assertEqual(result[1].decode("utf-8"), expected)

View file

@ -11,6 +11,7 @@ from bookwyrm.tests.validate_html import validate_html
class DiscoverViews(TestCase): class DiscoverViews(TestCase):
"""pages you land on without really trying""" """pages you land on without really trying"""
# pylint: disable=invalid-name
def setUp(self): def setUp(self):
"""we need basic test data and mocks""" """we need basic test data and mocks"""
self.factory = RequestFactory() self.factory = RequestFactory()
@ -43,7 +44,7 @@ class DiscoverViews(TestCase):
@patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async") @patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async")
@patch("bookwyrm.activitystreams.add_status_task.delay") @patch("bookwyrm.activitystreams.add_status_task.delay")
def test_discover_page(self, *_): def test_discover_page_with_posts(self, *_):
"""there are so many views, this just makes sure it LOADS""" """there are so many views, this just makes sure it LOADS"""
view = views.Discover.as_view() view = views.Discover.as_view()
request = self.factory.get("") request = self.factory.get("")
@ -53,17 +54,34 @@ class DiscoverViews(TestCase):
title="hi", parent_work=models.Work.objects.create(title="work") title="hi", parent_work=models.Work.objects.create(title="work")
) )
models.ReviewRating.objects.create(
book=book,
user=self.local_user,
rating=4,
)
models.Review.objects.create(
book=book,
user=self.local_user,
content="hello",
rating=4,
)
models.Comment.objects.create( models.Comment.objects.create(
book=book, book=book,
user=self.local_user, user=self.local_user,
content="hello", content="hello",
) )
models.Quotation.objects.create(
book=book,
user=self.local_user,
quote="beep",
content="hello",
)
models.Status.objects.create(user=self.local_user, content="beep") models.Status.objects.create(user=self.local_user, content="beep")
with patch( with patch(
"bookwyrm.activitystreams.ActivityStream.get_activity_stream" "bookwyrm.activitystreams.ActivityStream.get_activity_stream"
) as mock: ) as mock:
mock.return_value = models.Status.objects.all() mock.return_value = models.Status.objects.select_subclasses().all()
result = view(request) result = view(request)
self.assertEqual(mock.call_count, 1) self.assertEqual(mock.call_count, 1)
self.assertEqual(result.status_code, 200) self.assertEqual(result.status_code, 200)

View file

@ -0,0 +1,197 @@
""" tests for hashtag view """
from unittest.mock import patch
from django.contrib.auth.models import AnonymousUser
from django.http import Http404
from django.template.response import TemplateResponse
from django.test import TestCase
from django.test.client import RequestFactory
from bookwyrm import models, views
from bookwyrm.tests.validate_html import validate_html
class HashtagView(TestCase):
"""hashtag view"""
def setUp(self):
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.com",
"mouseword",
local=True,
localname="mouse",
remote_id="https://example.com/users/mouse",
)
self.follower_user = models.User.objects.create_user(
"follower@local.com",
"follower@email.com",
"followerword",
local=True,
localname="follower",
remote_id="https://example.com/users/follower",
)
self.local_user.followers.add(self.follower_user)
self.other_user = models.User.objects.create_user(
"other@local.com",
"other@email.com",
"otherword",
local=True,
localname="other",
remote_id="https://example.com/users/other",
)
self.work = models.Work.objects.create(title="Test Work")
self.book = models.Edition.objects.create(
title="Example Edition",
remote_id="https://example.com/book/1",
parent_work=self.work,
)
self.hashtag_bookclub = models.Hashtag.objects.create(name="#BookClub")
with patch(
"bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"
), patch("bookwyrm.activitystreams.add_status_task.delay"):
self.statuses_bookclub = [
models.Comment.objects.create(
book=self.book, user=self.local_user, content="#BookClub"
),
]
for status in self.statuses_bookclub:
status.mention_hashtags.add(self.hashtag_bookclub)
self.anonymous_user = AnonymousUser
self.anonymous_user.is_authenticated = False
models.SiteSettings.objects.create()
def test_hashtag_page(self):
"""just make sure it loads"""
view = views.Hashtag.as_view()
request = self.factory.get("")
request.user = self.local_user
result = view(request, self.hashtag_bookclub.id)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
self.assertEqual(len(result.context_data["activities"]), 1)
def test_privacy_direct(self):
"""ensure statuses with privacy set to direct are always filtered out"""
view = views.Hashtag.as_view()
request = self.factory.get("")
hashtag = models.Hashtag.objects.create(name="#test")
with patch(
"bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"
), patch("bookwyrm.activitystreams.add_status_task.delay"):
status = models.Comment.objects.create(
user=self.local_user, book=self.book, content="#test", privacy="direct"
)
status.mention_hashtags.add(hashtag)
for user in [
self.local_user,
self.follower_user,
self.other_user,
self.anonymous_user,
]:
request.user = user
result = view(request, hashtag.id)
self.assertNotIn(status, result.context_data["activities"])
def test_privacy_unlisted(self):
"""ensure statuses with privacy set to unlisted are always filtered out"""
view = views.Hashtag.as_view()
request = self.factory.get("")
hashtag = models.Hashtag.objects.create(name="#test")
with patch(
"bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"
), patch("bookwyrm.activitystreams.add_status_task.delay"):
status = models.Comment.objects.create(
user=self.local_user,
book=self.book,
content="#test",
privacy="unlisted",
)
status.mention_hashtags.add(hashtag)
for user in [
self.local_user,
self.follower_user,
self.other_user,
self.anonymous_user,
]:
request.user = user
result = view(request, hashtag.id)
self.assertNotIn(status, result.context_data["activities"])
def test_privacy_following(self):
"""ensure only creator and followers can see statuses with privacy
set to followers"""
view = views.Hashtag.as_view()
request = self.factory.get("")
hashtag = models.Hashtag.objects.create(name="#test")
with patch(
"bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"
), patch("bookwyrm.activitystreams.add_status_task.delay"):
status = models.Comment.objects.create(
user=self.local_user,
book=self.book,
content="#test",
privacy="followers",
)
status.mention_hashtags.add(hashtag)
for user in [self.local_user, self.follower_user]:
request.user = user
result = view(request, hashtag.id)
self.assertIn(status, result.context_data["activities"])
for user in [self.other_user, self.anonymous_user]:
request.user = user
result = view(request, hashtag.id)
self.assertNotIn(status, result.context_data["activities"])
def test_not_found(self):
"""make sure 404 is rendered"""
view = views.Hashtag.as_view()
request = self.factory.get("")
request.user = self.local_user
with self.assertRaises(Http404):
view(request, 42)
def test_empty(self):
"""hashtag without any statuses should still render"""
view = views.Hashtag.as_view()
request = self.factory.get("")
request.user = self.local_user
hashtag_empty = models.Hashtag.objects.create(name="#empty")
result = view(request, hashtag_empty.id)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
self.assertEqual(len(result.context_data["activities"]), 0)
def test_logged_out(self):
"""make sure it loads all activities"""
view = views.Hashtag.as_view()
request = self.factory.get("")
request.user = self.anonymous_user
result = view(request, self.hashtag_bookclub.id)
self.assertIsInstance(result, TemplateResponse)
validate_html(result.render())
self.assertEqual(result.status_code, 200)
self.assertEqual(len(result.context_data["activities"]), 1)

View file

@ -6,7 +6,7 @@ from django.test import TestCase, TransactionTestCase
from django.test.client import RequestFactory from django.test.client import RequestFactory
from bookwyrm import forms, models, views from bookwyrm import forms, models, views
from bookwyrm.views.status import find_mentions from bookwyrm.views.status import find_mentions, find_or_create_hashtags
from bookwyrm.settings import DOMAIN from bookwyrm.settings import DOMAIN
from bookwyrm.tests.validate_html import validate_html from bookwyrm.tests.validate_html import validate_html
@ -95,6 +95,7 @@ class StatusViews(TestCase):
local=True, local=True,
localname="nutria", localname="nutria",
) )
self.existing_hashtag = models.Hashtag.objects.create(name="#existing")
with patch("bookwyrm.models.user.set_remote_server"): with patch("bookwyrm.models.user.set_remote_server"):
self.remote_user = models.User.objects.create_user( self.remote_user = models.User.objects.create_user(
"rat", "rat",
@ -333,6 +334,71 @@ class StatusViews(TestCase):
result = find_mentions(self.local_user, "@beep@beep.com") result = find_mentions(self.local_user, "@beep@beep.com")
self.assertEqual(result, {}) self.assertEqual(result, {})
def test_create_status_hashtags(self, *_):
"""#mention a hashtag in a post"""
view = views.CreateStatus.as_view()
form = forms.CommentForm(
{
"content": "this is an #EXISTING hashtag but all uppercase, "
+ "this one is #NewTag.",
"user": self.local_user.id,
"book": self.book.id,
"privacy": "public",
}
)
request = self.factory.post("", form.data)
request.user = self.local_user
view(request, "comment")
status = models.Status.objects.get()
hashtags = models.Hashtag.objects.all()
self.assertEqual(len(hashtags), 2)
self.assertEqual(list(status.mention_hashtags.all()), list(hashtags))
hashtag_exising = models.Hashtag.objects.filter(name="#existing").first()
hashtag_new = models.Hashtag.objects.filter(name="#NewTag").first()
self.assertEqual(
status.content,
"<p>this is an "
+ f'<a href="{hashtag_exising.remote_id}" data-mention="hashtag">'
+ "#EXISTING</a> hashtag but all uppercase, this one is "
+ f'<a href="{hashtag_new.remote_id}" data-mention="hashtag">'
+ "#NewTag</a>.</p>",
)
def test_find_or_create_hashtags(self, *_):
"""detect and look up #hashtags"""
result = find_or_create_hashtags("no hashtag to be found here")
self.assertEqual(result, {})
result = find_or_create_hashtags("#existing")
self.assertEqual(result["#existing"], self.existing_hashtag)
result = find_or_create_hashtags("leading text #existing")
self.assertEqual(result["#existing"], self.existing_hashtag)
result = find_or_create_hashtags("leading #existing trailing")
self.assertEqual(result["#existing"], self.existing_hashtag)
self.assertIsNone(models.Hashtag.objects.filter(name="new").first())
result = find_or_create_hashtags("leading #new trailing")
new_hashtag = models.Hashtag.objects.filter(name="#new").first()
self.assertIsNotNone(new_hashtag)
self.assertEqual(result["#new"], new_hashtag)
result = find_or_create_hashtags("leading #existing #new trailing")
self.assertEqual(result["#existing"], self.existing_hashtag)
self.assertEqual(result["#new"], new_hashtag)
result = find_or_create_hashtags("#Braunbär")
hashtag = models.Hashtag.objects.filter(name="#Braunbär").first()
self.assertEqual(result["#Braunbär"], hashtag)
result = find_or_create_hashtags("#ひぐま")
hashtag = models.Hashtag.objects.filter(name="#ひぐま").first()
self.assertEqual(result["#ひぐま"], hashtag)
def test_format_links_simple_url(self, *_): def test_format_links_simple_url(self, *_):
"""find and format urls into a tags""" """find and format urls into a tags"""
url = "http://www.fish.com/" url = "http://www.fish.com/"

View file

@ -356,6 +356,15 @@ urlpatterns = [
name="notifications", name="notifications",
), ),
re_path(r"^directory/?", views.Directory.as_view(), name="directory"), re_path(r"^directory/?", views.Directory.as_view(), name="directory"),
# hashtag
re_path(
r"^hashtag/(?P<hashtag_id>\d+)/?$", views.Hashtag.as_view(), name="hashtag"
),
re_path(
rf"^hashtag/(?P<hashtag_id>\d+){regex.SLUG}/?$",
views.Hashtag.as_view(),
name="hashtag",
),
# Get started # Get started
re_path( re_path(
r"^get-started/profile/?$", r"^get-started/profile/?$",
@ -764,3 +773,6 @@ urlpatterns = [
), ),
path("guided-tour/<tour>", views.toggle_guided_tour), path("guided-tour/<tour>", views.toggle_guided_tour),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
# pylint: disable=invalid-name
handler500 = "bookwyrm.views.server_error"

View file

@ -7,5 +7,6 @@ USERNAME = rf"{LOCALNAME}(@{DOMAIN})?"
STRICT_USERNAME = rf"(\B{STRICT_LOCALNAME}(@{DOMAIN})?\b)" STRICT_USERNAME = rf"(\B{STRICT_LOCALNAME}(@{DOMAIN})?\b)"
FULL_USERNAME = rf"{LOCALNAME}@{DOMAIN}\b" FULL_USERNAME = rf"{LOCALNAME}@{DOMAIN}\b"
SLUG = r"/s/(?P<slug>[-_a-z0-9]*)" SLUG = r"/s/(?P<slug>[-_a-z0-9]*)"
HASHTAG = r"(#[^!@#$%^&*(),.?\":{}|<>\s]+)"
# should match (BookWyrm/1.0.0; or (BookWyrm/99.1.2; # should match (BookWyrm/1.0.0; or (BookWyrm/99.1.2;
BOOKWYRM_USER_AGENT = r"\(BookWyrm/[0-9]+\.[0-9]+\.[0-9]+;" BOOKWYRM_USER_AGENT = r"\(BookWyrm/[0-9]+\.[0-9]+\.[0-9]+;"

View file

@ -21,6 +21,6 @@ def clean(input_text):
"ol", "ol",
"li", "li",
], ],
attributes=["href", "rel", "src", "alt"], attributes=["href", "rel", "src", "alt", "data-mention"],
strip=True, strip=True,
) )

View file

@ -130,6 +130,7 @@ from .group import (
accept_membership, accept_membership,
reject_membership, reject_membership,
) )
from .hashtag import Hashtag
from .inbox import Inbox from .inbox import Inbox
from .interaction import Favorite, Unfavorite, Boost, Unboost from .interaction import Favorite, Unfavorite, Boost, Unboost
from .isbn import Isbn from .isbn import Isbn
@ -164,3 +165,4 @@ from .annual_summary import (
summary_add_key, summary_add_key,
summary_revoke_key, summary_revoke_key,
) )
from .server_error import server_error

View file

@ -16,7 +16,6 @@ from csp.decorators import csp_update
from bookwyrm import models, settings from bookwyrm import models, settings
from bookwyrm.connectors.abstract_connector import get_data from bookwyrm.connectors.abstract_connector import get_data
from bookwyrm.connectors.connector_manager import ConnectorException
from bookwyrm.utils import regex from bookwyrm.utils import regex
@ -61,6 +60,7 @@ class Dashboard(View):
) )
# check version # check version
try: try:
release = get_data(settings.RELEASE_API, timeout=3) release = get_data(settings.RELEASE_API, timeout=3)
available_version = release.get("tag_name", None) available_version = release.get("tag_name", None)
@ -69,7 +69,7 @@ class Dashboard(View):
): ):
data["current_version"] = settings.VERSION data["current_version"] = settings.VERSION
data["available_version"] = available_version data["available_version"] = available_version
except ConnectorException: except: # pylint: disable= bare-except
pass pass
return TemplateResponse(request, "settings/dashboard/dashboard.html", data) return TemplateResponse(request, "settings/dashboard/dashboard.html", data)

54
bookwyrm/views/hashtag.py Normal file
View file

@ -0,0 +1,54 @@
""" listing statuses for a given hashtag """
from django.core.paginator import Paginator
from django.db.models import Q
from django.views import View
from django.shortcuts import get_object_or_404
from django.template.response import TemplateResponse
from bookwyrm import models
from bookwyrm.settings import PAGE_LENGTH
from bookwyrm.views.helpers import maybe_redirect_local_path
# pylint: disable= no-self-use
class Hashtag(View):
"""listing statuses for a given hashtag"""
# pylint: disable=unused-argument
def get(self, request, hashtag_id, slug=None):
"""show hashtag with related statuses"""
hashtag = get_object_or_404(models.Hashtag, id=hashtag_id)
if redirect_local_path := maybe_redirect_local_path(request, hashtag):
return redirect_local_path
activities = (
models.Status.privacy_filter(
request.user,
)
.filter(
Q(mention_hashtags=hashtag),
)
.exclude(
privacy__in=["direct", "unlisted"],
)
.select_related(
"user",
"reply_parent",
"review__book",
"comment__book",
"quotation__book",
)
.prefetch_related(
"mention_books",
"mention_users",
"attachments",
)
)
paginated = Paginator(activities, PAGE_LENGTH)
data = {
"hashtag": hashtag.name,
"activities": paginated.get_page(request.GET.get("page", 1)),
}
return TemplateResponse(request, "hashtag.html", data)

View file

@ -64,7 +64,7 @@ class Inbox(View):
high = ["Follow", "Accept", "Reject", "Block", "Unblock", "Undo"] high = ["Follow", "Accept", "Reject", "Block", "Unblock", "Undo"]
priority = HIGH if activity_json["type"] in high else MEDIUM priority = HIGH if activity_json["type"] in high else MEDIUM
activity_task.apply_async(args=(activity_json,), queue=priority) sometimes_async_activity_task(activity_json, queue=priority)
return HttpResponse() return HttpResponse()
@ -102,7 +102,20 @@ def raise_is_blocked_activity(activity_json):
raise PermissionDenied() raise PermissionDenied()
@app.task(queue=MEDIUM) def sometimes_async_activity_task(activity_json, queue=MEDIUM):
"""Sometimes we can effectively respond to a request without queuing a new task,
and whever that is possible, we should do it."""
activity = activitypub.parse(activity_json)
# try resolving this activity without making any http requests
try:
activity.action(allow_external_connections=False)
except activitypub.ActivitySerializerError:
# if that doesn't work, run it asynchronously
activity_task.apply_async(args=(activity_json,), queue=queue)
@app.task(queue=MEDIUM, ignore_result=True)
def activity_task(activity_json): def activity_task(activity_json):
"""do something with this json we think is legit""" """do something with this json we think is legit"""
# lets see if the activitypub module can make sense of this json # lets see if the activitypub module can make sense of this json

View file

@ -1,9 +1,10 @@
""" Let users export their book data """ """ Let users export their book data """
import csv import csv
import io
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.db.models import Q from django.db.models import Q
from django.http import StreamingHttpResponse from django.http import HttpResponse
from django.template.response import TemplateResponse from django.template.response import TemplateResponse
from django.views import View from django.views import View
from django.utils.decorators import method_decorator from django.utils.decorators import method_decorator
@ -20,8 +21,8 @@ class Export(View):
return TemplateResponse(request, "preferences/export.html") return TemplateResponse(request, "preferences/export.html")
def post(self, request): def post(self, request):
"""Streaming the csv file of a user's book data""" """Download the csv file of a user's book data"""
data = ( books = (
models.Edition.viewer_aware_objects(request.user) models.Edition.viewer_aware_objects(request.user)
.filter( .filter(
Q(shelves__user=request.user) Q(shelves__user=request.user)
@ -33,24 +34,9 @@ class Export(View):
.distinct() .distinct()
) )
generator = csv_row_generator(data, request.user) csv_string = io.StringIO()
writer = csv.writer(csv_string)
pseudo_buffer = Echo()
writer = csv.writer(pseudo_buffer)
# for testing, if you want to see the results in the browser:
# from django.http import JsonResponse
# return JsonResponse(list(generator), safe=False)
return StreamingHttpResponse(
(writer.writerow(row) for row in generator),
content_type="text/csv",
headers={
"Content-Disposition": 'attachment; filename="bookwyrm-export.csv"'
},
)
def csv_row_generator(books, user):
"""generate a csv entry for the user's book"""
deduplication_fields = [ deduplication_fields = [
f.name f.name
for f in models.Edition._meta.get_fields() # pylint: disable=protected-access for f in models.Edition._meta.get_fields() # pylint: disable=protected-access
@ -61,11 +47,14 @@ def csv_row_generator(books, user):
+ deduplication_fields + deduplication_fields
+ ["rating", "review_name", "review_cw", "review_content"] + ["rating", "review_name", "review_cw", "review_content"]
) )
yield fields writer.writerow(fields)
for book in books: for book in books:
# I think this is more efficient than doing a subquery in the view? but idk # I think this is more efficient than doing a subquery in the view? but idk
review_rating = ( review_rating = (
models.Review.objects.filter(user=user, book=book, rating__isnull=False) models.Review.objects.filter(
user=request.user, book=book, rating__isnull=False
)
.order_by("-published_date") .order_by("-published_date")
.first() .first()
) )
@ -73,7 +62,9 @@ def csv_row_generator(books, user):
book.rating = review_rating.rating if review_rating else None book.rating = review_rating.rating if review_rating else None
review = ( review = (
models.Review.objects.filter(user=user, book=book, content__isnull=False) models.Review.objects.filter(
user=request.user, book=book, content__isnull=False
)
.order_by("-published_date") .order_by("-published_date")
.first() .first()
) )
@ -81,15 +72,12 @@ def csv_row_generator(books, user):
book.review_name = review.name book.review_name = review.name
book.review_cw = review.content_warning book.review_cw = review.content_warning
book.review_content = review.raw_content book.review_content = review.raw_content
yield [getattr(book, field, "") or "" for field in fields] writer.writerow([getattr(book, field, "") or "" for field in fields])
return HttpResponse(
class Echo: csv_string.getvalue(),
"""An object that implements just the write method of the file-like content_type="text/csv",
interface. (https://docs.djangoproject.com/en/3.2/howto/outputting-csv/) headers={
""" "Content-Disposition": 'attachment; filename="bookwyrm-export.csv"'
},
# pylint: disable=no-self-use )
def write(self, value):
"""Write the value by returning it, instead of storing in a buffer."""
return value

View file

@ -0,0 +1,8 @@
"""custom 500 handler to enable context processors"""
from django.template.response import TemplateResponse
def server_error(request):
"""server error page"""
return TemplateResponse(request, "500.html")

View file

@ -115,6 +115,19 @@ class CreateStatus(View):
if status.reply_parent: if status.reply_parent:
status.mention_users.add(status.reply_parent.user) status.mention_users.add(status.reply_parent.user)
# inspect the text for hashtags
for (mention_text, mention_hashtag) in find_or_create_hashtags(content).items():
# add them to status mentions fk
status.mention_hashtags.add(mention_hashtag)
# turn the mention into a link
content = re.sub(
rf"{mention_text}\b(?!@)",
rf'<a href="{mention_hashtag.remote_id}" data-mention="hashtag">'
+ rf"{mention_text}</a>",
content,
)
# deduplicate mentions # deduplicate mentions
status.mention_users.set(set(status.mention_users.all())) status.mention_users.set(set(status.mention_users.all()))
@ -237,6 +250,38 @@ def find_mentions(user, content):
return username_dict return username_dict
def find_or_create_hashtags(content):
"""detect #hashtags in raw status content
it stores hashtags case-sensitive, but ensures that an existing
hashtag with different case are found and re-used. for example,
an existing #BookWyrm hashtag will be found and used even if the
status content is using #bookwyrm.
"""
if not content:
return {}
found_hashtags = {t.lower(): t for t in re.findall(regex.HASHTAG, content)}
if len(found_hashtags) == 0:
return {}
known_hashtags = {
t.name.lower(): t
for t in models.Hashtag.objects.filter(
Q(name__in=found_hashtags.keys())
).distinct()
}
not_found = found_hashtags.keys() - known_hashtags.keys()
for lower_name in not_found:
tag_name = found_hashtags[lower_name]
mention_hashtag = models.Hashtag(name=tag_name)
mention_hashtag.save()
known_hashtags[lower_name] = mention_hashtag
return {found_hashtags[k]: v for k, v in known_hashtags.items()}
def format_links(content): def format_links(content):
"""detect and format links""" """detect and format links"""
validator = URLValidator() validator = URLValidator()

8
bw-dev
View file

@ -1,4 +1,4 @@
#!/bin/bash #!/usr/bin/env bash
# exit on errors # exit on errors
set -e set -e
@ -32,8 +32,8 @@ function runweb {
docker-compose run --rm web "$@" docker-compose run --rm web "$@"
} }
function rundb { function execdb {
docker-compose run --rm db $@ docker-compose exec db $@
} }
function execweb { function execweb {
@ -110,7 +110,7 @@ case "$CMD" in
runweb python manage.py shell runweb python manage.py shell
;; ;;
dbshell) dbshell)
rundb psql -U ${POSTGRES_USER} ${POSTGRES_DB} execdb psql -U ${POSTGRES_USER} ${POSTGRES_DB}
;; ;;
restart_celery) restart_celery)
docker-compose restart celery_worker docker-compose restart celery_worker

View file

@ -26,6 +26,9 @@ CELERY_RESULT_SERIALIZER = "json"
CELERY_BEAT_SCHEDULER = "django_celery_beat.schedulers:DatabaseScheduler" CELERY_BEAT_SCHEDULER = "django_celery_beat.schedulers:DatabaseScheduler"
CELERY_TIMEZONE = env("TIME_ZONE", "UTC") CELERY_TIMEZONE = env("TIME_ZONE", "UTC")
CELERY_WORKER_CONCURRENCY = env("CELERY_WORKER_CONCURRENCY", None)
CELERY_TASK_SOFT_TIME_LIMIT = env("CELERY_TASK_SOFT_TIME_LIMIT", None)
FLOWER_PORT = env("FLOWER_PORT") FLOWER_PORT = env("FLOWER_PORT")
INSTALLED_APPS = INSTALLED_APPS + [ INSTALLED_APPS = INSTALLED_APPS + [

View file

@ -6,7 +6,7 @@ After=network.target postgresql.service redis.service
User=bookwyrm User=bookwyrm
Group=bookwyrm Group=bookwyrm
WorkingDirectory=/opt/bookwyrm/ WorkingDirectory=/opt/bookwyrm/
ExecStart=/opt/bookwyrm/venv/bin/celery -A celerywyrm worker -l info -Q high_priority,medium_priority,low_priority,import,broadcast ExecStart=/opt/bookwyrm/venv/bin/celery -A celerywyrm worker -l info -Q high_priority,medium_priority,low_priority,imports,broadcast
StandardOutput=journal StandardOutput=journal
StandardError=inherit StandardError=inherit

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: bookwyrm\n" "Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-11 22:46+0000\n" "POT-Creation-Date: 2023-01-30 08:21+0000\n"
"PO-Revision-Date: 2023-01-13 10:51\n" "PO-Revision-Date: 2023-01-30 19:36\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n" "Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Catalan\n" "Language-Team: Catalan\n"
"Language: ca\n" "Language: ca\n"
@ -256,14 +256,14 @@ msgstr "Seguidors"
msgid "Private" msgid "Private"
msgstr "Privat" msgstr "Privat"
#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:157 #: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:168
#: bookwyrm/templates/settings/imports/imports.html:67 #: bookwyrm/templates/settings/imports/imports.html:98
#: bookwyrm/templates/settings/users/user_admin.html:81 #: bookwyrm/templates/settings/users/user_admin.html:81
#: bookwyrm/templates/settings/users/user_info.html:28 #: bookwyrm/templates/settings/users/user_info.html:28
msgid "Active" msgid "Active"
msgstr "Actiu" msgstr "Actiu"
#: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:155 #: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:166
msgid "Complete" msgid "Complete"
msgstr "Complet" msgstr "Complet"
@ -316,19 +316,19 @@ msgstr "Citacions"
msgid "Everything else" msgid "Everything else"
msgstr "Tota la resta" msgstr "Tota la resta"
#: bookwyrm/settings.py:214 #: bookwyrm/settings.py:217
msgid "Home Timeline" msgid "Home Timeline"
msgstr "Línia de temps Inici" msgstr "Línia de temps Inici"
#: bookwyrm/settings.py:214 #: bookwyrm/settings.py:217
msgid "Home" msgid "Home"
msgstr "Inici" msgstr "Inici"
#: bookwyrm/settings.py:215 #: bookwyrm/settings.py:218
msgid "Books Timeline" msgid "Books Timeline"
msgstr "Cronologia dels llibres" msgstr "Cronologia dels llibres"
#: bookwyrm/settings.py:215 #: bookwyrm/settings.py:218
#: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/guided_tour/user_profile.html:101
#: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:22
#: bookwyrm/templates/search/layout.html:43 #: bookwyrm/templates/search/layout.html:43
@ -336,75 +336,75 @@ msgstr "Cronologia dels llibres"
msgid "Books" msgid "Books"
msgstr "Llibres" msgstr "Llibres"
#: bookwyrm/settings.py:287 #: bookwyrm/settings.py:290
msgid "English" msgid "English"
msgstr "English (Anglès)" msgstr "English (Anglès)"
#: bookwyrm/settings.py:288 #: bookwyrm/settings.py:291
msgid "Català (Catalan)" msgid "Català (Catalan)"
msgstr "Català" msgstr "Català"
#: bookwyrm/settings.py:289 #: bookwyrm/settings.py:292
msgid "Deutsch (German)" msgid "Deutsch (German)"
msgstr "Deutsch (Alemany)" msgstr "Deutsch (Alemany)"
#: bookwyrm/settings.py:290 #: bookwyrm/settings.py:293
msgid "Español (Spanish)" msgid "Español (Spanish)"
msgstr "Español (espanyol)" msgstr "Español (espanyol)"
#: bookwyrm/settings.py:291 #: bookwyrm/settings.py:294
msgid "Euskara (Basque)" msgid "Euskara (Basque)"
msgstr "Euskera (Basc)" msgstr "Euskera (Basc)"
#: bookwyrm/settings.py:292 #: bookwyrm/settings.py:295
msgid "Galego (Galician)" msgid "Galego (Galician)"
msgstr "Galego (gallec)" msgstr "Galego (gallec)"
#: bookwyrm/settings.py:293 #: bookwyrm/settings.py:296
msgid "Italiano (Italian)" msgid "Italiano (Italian)"
msgstr "Italiano (italià)" msgstr "Italiano (italià)"
#: bookwyrm/settings.py:294 #: bookwyrm/settings.py:297
msgid "Suomi (Finnish)" msgid "Suomi (Finnish)"
msgstr "Suomi (finès)" msgstr "Suomi (finès)"
#: bookwyrm/settings.py:295 #: bookwyrm/settings.py:298
msgid "Français (French)" msgid "Français (French)"
msgstr "Français (francès)" msgstr "Français (francès)"
#: bookwyrm/settings.py:296 #: bookwyrm/settings.py:299
msgid "Lietuvių (Lithuanian)" msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (Lituà)" msgstr "Lietuvių (Lituà)"
#: bookwyrm/settings.py:297 #: bookwyrm/settings.py:300
msgid "Norsk (Norwegian)" msgid "Norsk (Norwegian)"
msgstr "Norsk (noruec)" msgstr "Norsk (noruec)"
#: bookwyrm/settings.py:298 #: bookwyrm/settings.py:301
msgid "Polski (Polish)" msgid "Polski (Polish)"
msgstr "Polski (polonès)" msgstr "Polski (polonès)"
#: bookwyrm/settings.py:299 #: bookwyrm/settings.py:302
msgid "Português do Brasil (Brazilian Portuguese)" msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português do Brasil (portuguès del Brasil)" msgstr "Português do Brasil (portuguès del Brasil)"
#: bookwyrm/settings.py:300 #: bookwyrm/settings.py:303
msgid "Português Europeu (European Portuguese)" msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Portuguès europeu)" msgstr "Português Europeu (Portuguès europeu)"
#: bookwyrm/settings.py:301 #: bookwyrm/settings.py:304
msgid "Română (Romanian)" msgid "Română (Romanian)"
msgstr "Română (romanès)" msgstr "Română (romanès)"
#: bookwyrm/settings.py:302 #: bookwyrm/settings.py:305
msgid "Svenska (Swedish)" msgid "Svenska (Swedish)"
msgstr "Svenska (suec)" msgstr "Svenska (suec)"
#: bookwyrm/settings.py:303 #: bookwyrm/settings.py:306
msgid "简体中文 (Simplified Chinese)" msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (xinès simplificat)" msgstr "简体中文 (xinès simplificat)"
#: bookwyrm/settings.py:304 #: bookwyrm/settings.py:307
msgid "繁體中文 (Traditional Chinese)" msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (xinès tradicional)" msgstr "繁體中文 (xinès tradicional)"
@ -847,10 +847,10 @@ msgstr "ISNI:"
#: bookwyrm/templates/settings/announcements/edit_announcement.html:120 #: bookwyrm/templates/settings/announcements/edit_announcement.html:120
#: bookwyrm/templates/settings/federation/edit_instance.html:98 #: bookwyrm/templates/settings/federation/edit_instance.html:98
#: bookwyrm/templates/settings/federation/instance.html:105 #: bookwyrm/templates/settings/federation/instance.html:105
#: bookwyrm/templates/settings/registration.html:79 #: bookwyrm/templates/settings/registration.html:96
#: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/registration_limited.html:76
#: bookwyrm/templates/settings/site.html:144 #: bookwyrm/templates/settings/site.html:144
#: bookwyrm/templates/settings/users/user_moderation_actions.html:69 #: bookwyrm/templates/settings/users/user_moderation_actions.html:75
#: bookwyrm/templates/shelf/form.html:25 #: bookwyrm/templates/shelf/form.html:25
#: bookwyrm/templates/snippets/reading_modals/layout.html:18 #: bookwyrm/templates/snippets/reading_modals/layout.html:18
msgid "Save" msgid "Save"
@ -1160,7 +1160,7 @@ msgstr "Es tracta d'una publicació nova"
#: bookwyrm/templates/guided_tour/user_profile.html:89 #: bookwyrm/templates/guided_tour/user_profile.html:89
#: bookwyrm/templates/guided_tour/user_profile.html:112 #: bookwyrm/templates/guided_tour/user_profile.html:112
#: bookwyrm/templates/guided_tour/user_profile.html:135 #: bookwyrm/templates/guided_tour/user_profile.html:135
#: bookwyrm/templates/user_menu.html:18 #: bookwyrm/templates/user/user.html:87 bookwyrm/templates/user_menu.html:18
msgid "Back" msgid "Back"
msgstr "Enrere" msgstr "Enrere"
@ -1372,7 +1372,7 @@ msgid "Domain"
msgstr "Domini" msgstr "Domini"
#: bookwyrm/templates/book/file_links/edit_links.html:36 #: bookwyrm/templates/book/file_links/edit_links.html:36
#: bookwyrm/templates/import/import.html:122 #: bookwyrm/templates/import/import.html:133
#: bookwyrm/templates/import/import_status.html:134 #: bookwyrm/templates/import/import_status.html:134
#: bookwyrm/templates/settings/announcements/announcements.html:37 #: bookwyrm/templates/settings/announcements/announcements.html:37
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:48 #: bookwyrm/templates/settings/invites/manage_invite_requests.html:48
@ -1385,7 +1385,7 @@ msgstr "Estat"
#: bookwyrm/templates/book/file_links/edit_links.html:37 #: bookwyrm/templates/book/file_links/edit_links.html:37
#: bookwyrm/templates/settings/announcements/announcements.html:41 #: bookwyrm/templates/settings/announcements/announcements.html:41
#: bookwyrm/templates/settings/federation/instance.html:112 #: bookwyrm/templates/settings/federation/instance.html:112
#: bookwyrm/templates/settings/imports/imports.html:110 #: bookwyrm/templates/settings/imports/imports.html:141
#: bookwyrm/templates/settings/reports/report_links_table.html:6 #: bookwyrm/templates/settings/reports/report_links_table.html:6
#: bookwyrm/templates/settings/themes.html:99 #: bookwyrm/templates/settings/themes.html:99
msgid "Actions" msgid "Actions"
@ -1905,13 +1905,13 @@ msgid "Add to your books"
msgstr "Afegir als vostres llibres" msgstr "Afegir als vostres llibres"
#: bookwyrm/templates/get_started/book_preview.html:10 #: bookwyrm/templates/get_started/book_preview.html:10
#: bookwyrm/templates/shelf/shelf.html:86 bookwyrm/templates/user/user.html:33 #: bookwyrm/templates/shelf/shelf.html:86 bookwyrm/templates/user/user.html:37
#: bookwyrm/templatetags/shelf_tags.py:48 #: bookwyrm/templatetags/shelf_tags.py:48
msgid "To Read" msgid "To Read"
msgstr "Pendent de llegir" msgstr "Pendent de llegir"
#: bookwyrm/templates/get_started/book_preview.html:11 #: bookwyrm/templates/get_started/book_preview.html:11
#: bookwyrm/templates/shelf/shelf.html:87 bookwyrm/templates/user/user.html:34 #: bookwyrm/templates/shelf/shelf.html:87 bookwyrm/templates/user/user.html:38
#: bookwyrm/templatetags/shelf_tags.py:50 #: bookwyrm/templatetags/shelf_tags.py:50
msgid "Currently Reading" msgid "Currently Reading"
msgstr "Lectures actuals" msgstr "Lectures actuals"
@ -1921,12 +1921,12 @@ msgstr "Lectures actuals"
#: bookwyrm/templates/snippets/shelf_selector.html:46 #: bookwyrm/templates/snippets/shelf_selector.html:46
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24 #: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12 #: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12
#: bookwyrm/templates/user/user.html:35 bookwyrm/templatetags/shelf_tags.py:52 #: bookwyrm/templates/user/user.html:39 bookwyrm/templatetags/shelf_tags.py:52
msgid "Read" msgid "Read"
msgstr "Llegits" msgstr "Llegits"
#: bookwyrm/templates/get_started/book_preview.html:13 #: bookwyrm/templates/get_started/book_preview.html:13
#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:36 #: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:40
msgid "Stopped Reading" msgid "Stopped Reading"
msgstr "Deixat de llegir" msgstr "Deixat de llegir"
@ -2642,7 +2642,7 @@ msgid "This is your user profile. All your latest activities will be listed here
msgstr "Aquesta és la vostra pàgina d'usuari. Totes les vostres activitats es mostraran aquí. Altres membres de Bookwyrm poden veure parts d'aquesta pàgina, depèn de com tingueu la configuració de privacitat." msgstr "Aquesta és la vostra pàgina d'usuari. Totes les vostres activitats es mostraran aquí. Altres membres de Bookwyrm poden veure parts d'aquesta pàgina, depèn de com tingueu la configuració de privacitat."
#: bookwyrm/templates/guided_tour/user_profile.html:11 #: bookwyrm/templates/guided_tour/user_profile.html:11
#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:10 #: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:14
msgid "User Profile" msgid "User Profile"
msgstr "Perfil de l'usuari" msgstr "Perfil de l'usuari"
@ -2689,85 +2689,100 @@ msgstr "Importa Llibres"
msgid "Not a valid CSV file" msgid "Not a valid CSV file"
msgstr "Fitxer CSV no vàlid" msgstr "Fitxer CSV no vàlid"
#: bookwyrm/templates/import/import.html:22 #: bookwyrm/templates/import/import.html:20
#, python-format
msgid "Currently you are allowed to import %(import_size_limit)s books every %(import_limit_reset)s days."
msgstr "Actualment es permet la importació de %(import_size_limit)s llibres cada %(import_limit_reset)s dies."
#: bookwyrm/templates/import/import.html:21
#, python-format
msgid "You have %(allowed_imports)s left."
msgstr "Et resten %(allowed_imports)s per importar."
#: bookwyrm/templates/import/import.html:28
#, python-format #, python-format
msgid "On average, recent imports have taken %(hours)s hours." msgid "On average, recent imports have taken %(hours)s hours."
msgstr "Les importacions recents han durat %(hours)s de mitjana." msgstr "Les importacions recents han durat %(hours)s de mitjana."
#: bookwyrm/templates/import/import.html:26 #: bookwyrm/templates/import/import.html:32
#, python-format #, python-format
msgid "On average, recent imports have taken %(minutes)s minutes." msgid "On average, recent imports have taken %(minutes)s minutes."
msgstr "Les importacions recents han durat %(minutes)s de mitjana." msgstr "Les importacions recents han durat %(minutes)s de mitjana."
#: bookwyrm/templates/import/import.html:41 #: bookwyrm/templates/import/import.html:47
msgid "Data source:" msgid "Data source:"
msgstr "Font de la informació:" msgstr "Font de la informació:"
#: bookwyrm/templates/import/import.html:47 #: bookwyrm/templates/import/import.html:53
msgid "Goodreads (CSV)" msgid "Goodreads (CSV)"
msgstr "Goodreads (CSV)" msgstr "Goodreads (CSV)"
#: bookwyrm/templates/import/import.html:50 #: bookwyrm/templates/import/import.html:56
msgid "Storygraph (CSV)" msgid "Storygraph (CSV)"
msgstr "Storygraph (CSV)" msgstr "Storygraph (CSV)"
#: bookwyrm/templates/import/import.html:53 #: bookwyrm/templates/import/import.html:59
msgid "LibraryThing (TSV)" msgid "LibraryThing (TSV)"
msgstr "LibraryThing (TSV)" msgstr "LibraryThing (TSV)"
#: bookwyrm/templates/import/import.html:56 #: bookwyrm/templates/import/import.html:62
msgid "OpenLibrary (CSV)" msgid "OpenLibrary (CSV)"
msgstr "OpenLibrary (CSV)" msgstr "OpenLibrary (CSV)"
#: bookwyrm/templates/import/import.html:59 #: bookwyrm/templates/import/import.html:65
msgid "Calibre (CSV)" msgid "Calibre (CSV)"
msgstr "Calibre (CSV)" msgstr "Calibre (CSV)"
#: bookwyrm/templates/import/import.html:65 #: bookwyrm/templates/import/import.html:71
msgid "You can download your Goodreads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Import/Export page</a> of your Goodreads account." msgid "You can download your Goodreads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Import/Export page</a> of your Goodreads account."
msgstr "Podeu descarregar-vos les vostres dades de Goodreads des de la pàgina d'<a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Importa/Exporta</a> del vostre compte de Goodreads." msgstr "Podeu descarregar-vos les vostres dades de Goodreads des de la pàgina d'<a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Importa/Exporta</a> del vostre compte de Goodreads."
#: bookwyrm/templates/import/import.html:74 #: bookwyrm/templates/import/import.html:80
msgid "Data file:" msgid "Data file:"
msgstr "Arxiu de dades:" msgstr "Arxiu de dades:"
#: bookwyrm/templates/import/import.html:82 #: bookwyrm/templates/import/import.html:88
msgid "Include reviews" msgid "Include reviews"
msgstr "Inclou ressenyes" msgstr "Inclou ressenyes"
#: bookwyrm/templates/import/import.html:87 #: bookwyrm/templates/import/import.html:93
msgid "Privacy setting for imported reviews:" msgid "Privacy setting for imported reviews:"
msgstr "Configuració de privacitat per les ressenyes importades:" msgstr "Configuració de privacitat per les ressenyes importades:"
#: bookwyrm/templates/import/import.html:93 #: bookwyrm/templates/import/import.html:100
#: bookwyrm/templates/import/import.html:102
#: bookwyrm/templates/preferences/layout.html:35 #: bookwyrm/templates/preferences/layout.html:35
#: bookwyrm/templates/settings/federation/instance_blocklist.html:78 #: bookwyrm/templates/settings/federation/instance_blocklist.html:78
msgid "Import" msgid "Import"
msgstr "Importa" msgstr "Importa"
#: bookwyrm/templates/import/import.html:101 #: bookwyrm/templates/import/import.html:103
msgid "You've reached the import limit."
msgstr "Has arribat al límit d'importacions."
#: bookwyrm/templates/import/import.html:112
msgid "Imports are temporarily disabled; thank you for your patience." msgid "Imports are temporarily disabled; thank you for your patience."
msgstr "Les importacions es troben temporalment deshabilitades; gràcies per la vostra paciència." msgstr "Les importacions es troben temporalment deshabilitades; gràcies per la vostra paciència."
#: bookwyrm/templates/import/import.html:108 #: bookwyrm/templates/import/import.html:119
msgid "Recent Imports" msgid "Recent Imports"
msgstr "Importacions recents" msgstr "Importacions recents"
#: bookwyrm/templates/import/import.html:113 #: bookwyrm/templates/import/import.html:124
#: bookwyrm/templates/settings/imports/imports.html:89 #: bookwyrm/templates/settings/imports/imports.html:120
msgid "Date Created" msgid "Date Created"
msgstr "Data de creació" msgstr "Data de creació"
#: bookwyrm/templates/import/import.html:116 #: bookwyrm/templates/import/import.html:127
msgid "Last Updated" msgid "Last Updated"
msgstr "Darrera actualització" msgstr "Darrera actualització"
#: bookwyrm/templates/import/import.html:119 #: bookwyrm/templates/import/import.html:130
#: bookwyrm/templates/settings/imports/imports.html:98 #: bookwyrm/templates/settings/imports/imports.html:129
msgid "Items" msgid "Items"
msgstr "Items" msgstr "Items"
#: bookwyrm/templates/import/import.html:128 #: bookwyrm/templates/import/import.html:139
msgid "No recent imports" msgid "No recent imports"
msgstr "No hi ha cap importació recent" msgstr "No hi ha cap importació recent"
@ -2783,6 +2798,7 @@ msgid "Retry Status"
msgstr "Estat del reintent" msgstr "Estat del reintent"
#: bookwyrm/templates/import/import_status.html:22 #: bookwyrm/templates/import/import_status.html:22
#: bookwyrm/templates/settings/celery.html:36
#: bookwyrm/templates/settings/imports/imports.html:6 #: bookwyrm/templates/settings/imports/imports.html:6
#: bookwyrm/templates/settings/imports/imports.html:9 #: bookwyrm/templates/settings/imports/imports.html:9
#: bookwyrm/templates/settings/layout.html:82 #: bookwyrm/templates/settings/layout.html:82
@ -2802,7 +2818,7 @@ msgid "Refresh"
msgstr "Refresca" msgstr "Refresca"
#: bookwyrm/templates/import/import_status.html:72 #: bookwyrm/templates/import/import_status.html:72
#: bookwyrm/templates/settings/imports/imports.html:130 #: bookwyrm/templates/settings/imports/imports.html:161
msgid "Stop import" msgid "Stop import"
msgstr "Atura la importació" msgstr "Atura la importació"
@ -2920,7 +2936,7 @@ msgid "Reject"
msgstr "Rebutja" msgstr "Rebutja"
#: bookwyrm/templates/import/troubleshoot.html:7 #: bookwyrm/templates/import/troubleshoot.html:7
#: bookwyrm/templates/settings/imports/imports.html:107 #: bookwyrm/templates/settings/imports/imports.html:138
msgid "Failed items" msgid "Failed items"
msgstr "Elements fallits" msgstr "Elements fallits"
@ -3171,7 +3187,7 @@ msgid "Delete this list?"
msgstr "Suprimir aquesta llista?" msgstr "Suprimir aquesta llista?"
#: bookwyrm/templates/lists/edit_form.html:5 #: bookwyrm/templates/lists/edit_form.html:5
#: bookwyrm/templates/lists/layout.html:18 #: bookwyrm/templates/lists/layout.html:23
msgid "Edit List" msgid "Edit List"
msgstr "Edita la llista" msgstr "Edita la llista"
@ -4429,48 +4445,48 @@ msgstr "Prioritat mitja"
msgid "High priority" msgid "High priority"
msgstr "Prioritat alta" msgstr "Prioritat alta"
#: bookwyrm/templates/settings/celery.html:40 #: bookwyrm/templates/settings/celery.html:46
msgid "Could not connect to Redis broker" msgid "Could not connect to Redis broker"
msgstr "No s'ha pogut connectar al Redis broker" msgstr "No s'ha pogut connectar al Redis broker"
#: bookwyrm/templates/settings/celery.html:48 #: bookwyrm/templates/settings/celery.html:54
msgid "Active Tasks" msgid "Active Tasks"
msgstr "Tasques actives" msgstr "Tasques actives"
#: bookwyrm/templates/settings/celery.html:53 #: bookwyrm/templates/settings/celery.html:59
#: bookwyrm/templates/settings/imports/imports.html:82 #: bookwyrm/templates/settings/imports/imports.html:113
msgid "ID" msgid "ID"
msgstr "ID" msgstr "ID"
#: bookwyrm/templates/settings/celery.html:54 #: bookwyrm/templates/settings/celery.html:60
msgid "Task name" msgid "Task name"
msgstr "Nom de la tasca" msgstr "Nom de la tasca"
#: bookwyrm/templates/settings/celery.html:55 #: bookwyrm/templates/settings/celery.html:61
msgid "Run time" msgid "Run time"
msgstr "Temps d'execució" msgstr "Temps d'execució"
#: bookwyrm/templates/settings/celery.html:56 #: bookwyrm/templates/settings/celery.html:62
msgid "Priority" msgid "Priority"
msgstr "Prioritat" msgstr "Prioritat"
#: bookwyrm/templates/settings/celery.html:61 #: bookwyrm/templates/settings/celery.html:67
msgid "No active tasks" msgid "No active tasks"
msgstr "Cap tasca activa" msgstr "Cap tasca activa"
#: bookwyrm/templates/settings/celery.html:79 #: bookwyrm/templates/settings/celery.html:85
msgid "Workers" msgid "Workers"
msgstr "Workers" msgstr "Workers"
#: bookwyrm/templates/settings/celery.html:84 #: bookwyrm/templates/settings/celery.html:90
msgid "Uptime:" msgid "Uptime:"
msgstr "Temps de funcionament:" msgstr "Temps de funcionament:"
#: bookwyrm/templates/settings/celery.html:94 #: bookwyrm/templates/settings/celery.html:100
msgid "Could not connect to Celery" msgid "Could not connect to Celery"
msgstr "No s'ha pogut connectar al Celery" msgstr "No s'ha pogut connectar al Celery"
#: bookwyrm/templates/settings/celery.html:101 #: bookwyrm/templates/settings/celery.html:107
msgid "Errors" msgid "Errors"
msgstr "Errors" msgstr "Errors"
@ -4850,27 +4866,55 @@ msgstr "Els usuaris no poden iniciar noves importacions actualment"
msgid "Enable imports" msgid "Enable imports"
msgstr "Habilitar les importacions" msgstr "Habilitar les importacions"
#: bookwyrm/templates/settings/imports/imports.html:71 #: bookwyrm/templates/settings/imports/imports.html:63
msgid "Limit the amount of imports"
msgstr "Limita la quantitat d'importacions"
#: bookwyrm/templates/settings/imports/imports.html:74
msgid "Some users might try to import a large number of books, which you want to limit."
msgstr "Alguns usuaris poden intentar importar una gran quantitat de llibres, cosa que podries voler limitar."
#: bookwyrm/templates/settings/imports/imports.html:75
msgid "Set the value to 0 to not enforce any limit."
msgstr "Estableix el valor a 0 per tal de no especificar cap limitació."
#: bookwyrm/templates/settings/imports/imports.html:78
msgid "Set import limit to"
msgstr "Estableix el límit d'importacions en"
#: bookwyrm/templates/settings/imports/imports.html:80
msgid "books every"
msgstr "llibres cada"
#: bookwyrm/templates/settings/imports/imports.html:82
msgid "days."
msgstr "dies."
#: bookwyrm/templates/settings/imports/imports.html:86
msgid "Set limit"
msgstr "Estableix el límit"
#: bookwyrm/templates/settings/imports/imports.html:102
msgid "Completed" msgid "Completed"
msgstr "Completat" msgstr "Completat"
#: bookwyrm/templates/settings/imports/imports.html:85 #: bookwyrm/templates/settings/imports/imports.html:116
msgid "User" msgid "User"
msgstr "Usuari" msgstr "Usuari"
#: bookwyrm/templates/settings/imports/imports.html:94 #: bookwyrm/templates/settings/imports/imports.html:125
msgid "Date Updated" msgid "Date Updated"
msgstr "Data actualització" msgstr "Data actualització"
#: bookwyrm/templates/settings/imports/imports.html:101 #: bookwyrm/templates/settings/imports/imports.html:132
msgid "Pending items" msgid "Pending items"
msgstr "Elements pendents" msgstr "Elements pendents"
#: bookwyrm/templates/settings/imports/imports.html:104 #: bookwyrm/templates/settings/imports/imports.html:135
msgid "Successful items" msgid "Successful items"
msgstr "Ítems amb èxit" msgstr "Ítems amb èxit"
#: bookwyrm/templates/settings/imports/imports.html:139 #: bookwyrm/templates/settings/imports/imports.html:170
msgid "No matching imports found." msgid "No matching imports found."
msgstr "No s'han trobat importacions coincidents." msgstr "No s'han trobat importacions coincidents."
@ -5131,34 +5175,38 @@ msgstr "No s'ha pogut desar la configuració"
msgid "Allow registration" msgid "Allow registration"
msgstr "Permet el registre" msgstr "Permet el registre"
#: bookwyrm/templates/settings/registration.html:44 #: bookwyrm/templates/settings/registration.html:43
msgid "Default access level:"
msgstr "Nivell d'accés per defecte:"
#: bookwyrm/templates/settings/registration.html:61
msgid "Require users to confirm email address" msgid "Require users to confirm email address"
msgstr "Requereix els usuaris que confirmin les seves adreces de correu" msgstr "Requereix els usuaris que confirmin les seves adreces de correu"
#: bookwyrm/templates/settings/registration.html:46 #: bookwyrm/templates/settings/registration.html:63
msgid "(Recommended if registration is open)" msgid "(Recommended if registration is open)"
msgstr "(Recomanat si el registre està obert)" msgstr "(Recomanat si el registre està obert)"
#: bookwyrm/templates/settings/registration.html:51 #: bookwyrm/templates/settings/registration.html:68
msgid "Allow invite requests" msgid "Allow invite requests"
msgstr "Permet peticions d'invitació" msgstr "Permet peticions d'invitació"
#: bookwyrm/templates/settings/registration.html:55 #: bookwyrm/templates/settings/registration.html:72
#: bookwyrm/templates/settings/registration_limited.html:42 #: bookwyrm/templates/settings/registration_limited.html:42
msgid "Invite request text:" msgid "Invite request text:"
msgstr "Text de sol·licitud d'invitació:" msgstr "Text de sol·licitud d'invitació:"
#: bookwyrm/templates/settings/registration.html:63 #: bookwyrm/templates/settings/registration.html:80
#: bookwyrm/templates/settings/registration_limited.html:50 #: bookwyrm/templates/settings/registration_limited.html:50
msgid "Set a question for invite requests" msgid "Set a question for invite requests"
msgstr "Estableix una pregunta per les sol·licituds d'invitació" msgstr "Estableix una pregunta per les sol·licituds d'invitació"
#: bookwyrm/templates/settings/registration.html:68 #: bookwyrm/templates/settings/registration.html:85
#: bookwyrm/templates/settings/registration_limited.html:55 #: bookwyrm/templates/settings/registration_limited.html:55
msgid "Question:" msgid "Question:"
msgstr "Pregunta:" msgstr "Pregunta:"
#: bookwyrm/templates/settings/registration.html:73 #: bookwyrm/templates/settings/registration.html:90
#: bookwyrm/templates/settings/registration_limited.html:67 #: bookwyrm/templates/settings/registration_limited.html:67
msgid "Registration closed text:" msgid "Registration closed text:"
msgstr "Text de registre tancat:" msgstr "Text de registre tancat:"
@ -5400,7 +5448,7 @@ msgid "Remove theme"
msgstr "Elimina el tema" msgstr "Elimina el tema"
#: bookwyrm/templates/settings/users/delete_user_form.html:5 #: bookwyrm/templates/settings/users/delete_user_form.html:5
#: bookwyrm/templates/settings/users/user_moderation_actions.html:32 #: bookwyrm/templates/settings/users/user_moderation_actions.html:38
msgid "Permanently delete user" msgid "Permanently delete user"
msgstr "Suprimeix l'usuari de manera permanent" msgstr "Suprimeix l'usuari de manera permanent"
@ -5522,14 +5570,18 @@ msgid "User Actions"
msgstr "Accions d'usuari" msgstr "Accions d'usuari"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:21 #: bookwyrm/templates/settings/users/user_moderation_actions.html:21
msgid "Activate user"
msgstr "Activa l'usuari/a"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:27
msgid "Suspend user" msgid "Suspend user"
msgstr "Suspèn usuari" msgstr "Suspèn usuari"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:26 #: bookwyrm/templates/settings/users/user_moderation_actions.html:32
msgid "Un-suspend user" msgid "Un-suspend user"
msgstr "Deixa de suspendre l'usuari" msgstr "Deixa de suspendre l'usuari"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:48 #: bookwyrm/templates/settings/users/user_moderation_actions.html:54
msgid "Access level:" msgid "Access level:"
msgstr "Nivell d'accés:" msgstr "Nivell d'accés:"
@ -6379,33 +6431,53 @@ msgstr "%(username)s no està seguint a ningú"
msgid "No reviews or comments yet!" msgid "No reviews or comments yet!"
msgstr "Sense ressenyes o comentaris actualment!" msgstr "Sense ressenyes o comentaris actualment!"
#: bookwyrm/templates/user/user.html:16 #: bookwyrm/templates/user/user.html:20
msgid "Edit profile" msgid "Edit profile"
msgstr "Edita el perfil" msgstr "Edita el perfil"
#: bookwyrm/templates/user/user.html:38 #: bookwyrm/templates/user/user.html:42
#, python-format #, python-format
msgid "View all %(size)s" msgid "View all %(size)s"
msgstr "Mostra totes les %(size)s" msgstr "Mostra totes les %(size)s"
#: bookwyrm/templates/user/user.html:52 #: bookwyrm/templates/user/user.html:56
msgid "View all books" msgid "View all books"
msgstr "Mostra tots els llibres" msgstr "Mostra tots els llibres"
#: bookwyrm/templates/user/user.html:59 #: bookwyrm/templates/user/user.html:63
#, python-format #, python-format
msgid "%(current_year)s Reading Goal" msgid "%(current_year)s Reading Goal"
msgstr "Objectiu de lectura del %(current_year)s" msgstr "Objectiu de lectura del %(current_year)s"
#: bookwyrm/templates/user/user.html:66 #: bookwyrm/templates/user/user.html:70
msgid "User Activity" msgid "User Activity"
msgstr "Activitat d'usuari" msgstr "Activitat d'usuari"
#: bookwyrm/templates/user/user.html:71 #: bookwyrm/templates/user/user.html:76
msgid "Show RSS Options"
msgstr "Mostra les Opcions RSS"
#: bookwyrm/templates/user/user.html:82
msgid "RSS feed" msgid "RSS feed"
msgstr "Canal RSS" msgstr "Canal RSS"
#: bookwyrm/templates/user/user.html:83 #: bookwyrm/templates/user/user.html:98
msgid "Complete feed"
msgstr "Activitat completa"
#: bookwyrm/templates/user/user.html:103
msgid "Reviews only"
msgstr "Només ressenyes"
#: bookwyrm/templates/user/user.html:108
msgid "Quotes only"
msgstr "Només cites"
#: bookwyrm/templates/user/user.html:113
msgid "Comments only"
msgstr "Només comentaris"
#: bookwyrm/templates/user/user.html:129
msgid "No activities yet!" msgid "No activities yet!"
msgstr "Encara no hi ha activitats." msgstr "Encara no hi ha activitats."
@ -6449,16 +6521,43 @@ msgstr "Desconnecta"
msgid "File exceeds maximum size: 10MB" msgid "File exceeds maximum size: 10MB"
msgstr "El fitxer sobrepassa la mida màxima: 10MB" msgstr "El fitxer sobrepassa la mida màxima: 10MB"
#: bookwyrm/templatetags/list_page_tags.py:14
#, python-format
msgid "Book List: %(name)s"
msgstr "Llista de Llibres: %(name)s"
#: bookwyrm/templatetags/list_page_tags.py:22
#, python-format
msgid "%(num)d book - by %(user)s"
msgid_plural "%(num)d books - by %(user)s"
msgstr[0] "%(num)d llibre - per %(user)s"
msgstr[1] "%(num)d llibres - per %(user)s"
#: bookwyrm/templatetags/utilities.py:39 #: bookwyrm/templatetags/utilities.py:39
#, python-format #, python-format
msgid "%(title)s: %(subtitle)s" msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s"
#: bookwyrm/views/rss_feed.py:34 #: bookwyrm/views/rss_feed.py:35
#, python-brace-format #, python-brace-format
msgid "Status updates from {obj.display_name}" msgid "Status updates from {obj.display_name}"
msgstr "Actualitzacions d'estat de {obj.display_name}" msgstr "Actualitzacions d'estat de {obj.display_name}"
#: bookwyrm/views/rss_feed.py:72
#, python-brace-format
msgid "Reviews from {obj.display_name}"
msgstr "Ressenyes de {obj.display_name}"
#: bookwyrm/views/rss_feed.py:110
#, python-brace-format
msgid "Quotes from {obj.display_name}"
msgstr "Cites de {obj.display_name}"
#: bookwyrm/views/rss_feed.py:148
#, python-brace-format
msgid "Comments from {obj.display_name}"
msgstr "Comentaris de {obj.display_name}"
#: bookwyrm/views/updates.py:45 #: bookwyrm/views/updates.py:45
#, python-format #, python-format
msgid "Load %(count)d unread status" msgid "Load %(count)d unread status"

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: bookwyrm\n" "Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-11 22:46+0000\n" "POT-Creation-Date: 2023-01-30 08:21+0000\n"
"PO-Revision-Date: 2023-01-14 17:13\n" "PO-Revision-Date: 2023-02-25 19:46\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n" "Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: German\n" "Language-Team: German\n"
"Language: de\n" "Language: de\n"
@ -256,14 +256,14 @@ msgstr "Follower*innen"
msgid "Private" msgid "Private"
msgstr "Privat" msgstr "Privat"
#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:157 #: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:168
#: bookwyrm/templates/settings/imports/imports.html:67 #: bookwyrm/templates/settings/imports/imports.html:98
#: bookwyrm/templates/settings/users/user_admin.html:81 #: bookwyrm/templates/settings/users/user_admin.html:81
#: bookwyrm/templates/settings/users/user_info.html:28 #: bookwyrm/templates/settings/users/user_info.html:28
msgid "Active" msgid "Active"
msgstr "Aktiv" msgstr "Aktiv"
#: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:155 #: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:166
msgid "Complete" msgid "Complete"
msgstr "Abgeschlossen" msgstr "Abgeschlossen"
@ -316,19 +316,19 @@ msgstr "Zitate"
msgid "Everything else" msgid "Everything else"
msgstr "Alles andere" msgstr "Alles andere"
#: bookwyrm/settings.py:214 #: bookwyrm/settings.py:217
msgid "Home Timeline" msgid "Home Timeline"
msgstr "Start-Zeitleiste" msgstr "Start-Zeitleiste"
#: bookwyrm/settings.py:214 #: bookwyrm/settings.py:217
msgid "Home" msgid "Home"
msgstr "Startseite" msgstr "Startseite"
#: bookwyrm/settings.py:215 #: bookwyrm/settings.py:218
msgid "Books Timeline" msgid "Books Timeline"
msgstr "Bücher-Timeline" msgstr "Bücher-Timeline"
#: bookwyrm/settings.py:215 #: bookwyrm/settings.py:218
#: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/guided_tour/user_profile.html:101
#: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:22
#: bookwyrm/templates/search/layout.html:43 #: bookwyrm/templates/search/layout.html:43
@ -336,75 +336,75 @@ msgstr "Bücher-Timeline"
msgid "Books" msgid "Books"
msgstr "Bücher" msgstr "Bücher"
#: bookwyrm/settings.py:287 #: bookwyrm/settings.py:290
msgid "English" msgid "English"
msgstr "English (Englisch)" msgstr "English (Englisch)"
#: bookwyrm/settings.py:288 #: bookwyrm/settings.py:291
msgid "Català (Catalan)" msgid "Català (Catalan)"
msgstr "Català (Katalanisch)" msgstr "Català (Katalanisch)"
#: bookwyrm/settings.py:289 #: bookwyrm/settings.py:292
msgid "Deutsch (German)" msgid "Deutsch (German)"
msgstr "Deutsch" msgstr "Deutsch"
#: bookwyrm/settings.py:290 #: bookwyrm/settings.py:293
msgid "Español (Spanish)" msgid "Español (Spanish)"
msgstr "Español (Spanisch)" msgstr "Español (Spanisch)"
#: bookwyrm/settings.py:291 #: bookwyrm/settings.py:294
msgid "Euskara (Basque)" msgid "Euskara (Basque)"
msgstr "Euskara (Baskisch)" msgstr "Euskara (Baskisch)"
#: bookwyrm/settings.py:292 #: bookwyrm/settings.py:295
msgid "Galego (Galician)" msgid "Galego (Galician)"
msgstr "Galego (Galizisch)" msgstr "Galego (Galizisch)"
#: bookwyrm/settings.py:293 #: bookwyrm/settings.py:296
msgid "Italiano (Italian)" msgid "Italiano (Italian)"
msgstr "Italiano (Italienisch)" msgstr "Italiano (Italienisch)"
#: bookwyrm/settings.py:294 #: bookwyrm/settings.py:297
msgid "Suomi (Finnish)" msgid "Suomi (Finnish)"
msgstr "Suomi (Finnisch)" msgstr "Suomi (Finnisch)"
#: bookwyrm/settings.py:295 #: bookwyrm/settings.py:298
msgid "Français (French)" msgid "Français (French)"
msgstr "Français (Französisch)" msgstr "Français (Französisch)"
#: bookwyrm/settings.py:296 #: bookwyrm/settings.py:299
msgid "Lietuvių (Lithuanian)" msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (Litauisch)" msgstr "Lietuvių (Litauisch)"
#: bookwyrm/settings.py:297 #: bookwyrm/settings.py:300
msgid "Norsk (Norwegian)" msgid "Norsk (Norwegian)"
msgstr "Norsk (Norwegisch)" msgstr "Norsk (Norwegisch)"
#: bookwyrm/settings.py:298 #: bookwyrm/settings.py:301
msgid "Polski (Polish)" msgid "Polski (Polish)"
msgstr "Polski (Polnisch)" msgstr "Polski (Polnisch)"
#: bookwyrm/settings.py:299 #: bookwyrm/settings.py:302
msgid "Português do Brasil (Brazilian Portuguese)" msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português do Brasil (brasilianisches Portugiesisch)" msgstr "Português do Brasil (brasilianisches Portugiesisch)"
#: bookwyrm/settings.py:300 #: bookwyrm/settings.py:303
msgid "Português Europeu (European Portuguese)" msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Portugiesisch)" msgstr "Português Europeu (Portugiesisch)"
#: bookwyrm/settings.py:301 #: bookwyrm/settings.py:304
msgid "Română (Romanian)" msgid "Română (Romanian)"
msgstr "Română (Rumänisch)" msgstr "Română (Rumänisch)"
#: bookwyrm/settings.py:302 #: bookwyrm/settings.py:305
msgid "Svenska (Swedish)" msgid "Svenska (Swedish)"
msgstr "Svenska (Schwedisch)" msgstr "Svenska (Schwedisch)"
#: bookwyrm/settings.py:303 #: bookwyrm/settings.py:306
msgid "简体中文 (Simplified Chinese)" msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (vereinfachtes Chinesisch)" msgstr "简体中文 (vereinfachtes Chinesisch)"
#: bookwyrm/settings.py:304 #: bookwyrm/settings.py:307
msgid "繁體中文 (Traditional Chinese)" msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (Chinesisch, traditionell)" msgstr "繁體中文 (Chinesisch, traditionell)"
@ -442,7 +442,7 @@ msgstr "Willkommen auf %(site_name)s!"
#: bookwyrm/templates/about/about.html:25 #: bookwyrm/templates/about/about.html:25
#, python-format #, python-format
msgid "%(site_name)s is part of <em>BookWyrm</em>, a network of independent, self-directed communities for readers. While you can interact seamlessly with users anywhere in the <a href=\"https://joinbookwyrm.com/instances/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">BookWyrm network</a>, this community is unique." msgid "%(site_name)s is part of <em>BookWyrm</em>, a network of independent, self-directed communities for readers. While you can interact seamlessly with users anywhere in the <a href=\"https://joinbookwyrm.com/instances/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">BookWyrm network</a>, this community is unique."
msgstr "%(site_name)s ist Teil von <em>BookWyrm</em>, einem Netzwerk von unabhängigen, selbst verwalteten Communities von Bücherfreunden. Obwohl du nahtlos mit anderen überall im <a href=\"https://joinbookwyrm.com/instances/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">BookWyrm Netzwerk</a> interagieren kannst, ist die Community hier einzigartig." msgstr "%(site_name)s ist Teil von <em>BookWyrm</em>, einem Netzwerk von unabhängigen, selbst verwalteten Communities von Bücherfreund*innen. Obwohl du nahtlos mit anderen überall im <a href=\"https://joinbookwyrm.com/instances/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">BookWyrm-Netzwerk</a> interagieren kannst, ist die Community hier einzigartig."
#: bookwyrm/templates/about/about.html:45 #: bookwyrm/templates/about/about.html:45
#, python-format #, python-format
@ -461,7 +461,7 @@ msgstr "<a href=\"%(book_path)s\"><em>%(title)s</em></a> hat die unterschiedlich
#: bookwyrm/templates/about/about.html:94 #: bookwyrm/templates/about/about.html:94
msgid "Track your reading, talk about books, write reviews, and discover what to read next. Always ad-free, anti-corporate, and community-oriented, BookWyrm is human-scale software, designed to stay small and personal. If you have feature requests, bug reports, or grand dreams, <a href=\"https://joinbookwyrm.com/get-involved\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">reach out</a> and make yourself heard." msgid "Track your reading, talk about books, write reviews, and discover what to read next. Always ad-free, anti-corporate, and community-oriented, BookWyrm is human-scale software, designed to stay small and personal. If you have feature requests, bug reports, or grand dreams, <a href=\"https://joinbookwyrm.com/get-involved\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">reach out</a> and make yourself heard."
msgstr "Tracke dein Leseverhalten, sprich über Bücher, schreibe Rezensionen und entdecke Neues zum Lesen. BookWyrm ist eine Software, die immer übersichtlich, werbefrei und gemeinschaftsorientiert sein wird. Wenn du Feature-Anfragen, Fehlerberichte oder große Träume hast, wende dich an <a href=\"https://joinbookwyrm.com/get-involved\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">an</a>." msgstr "Tracke dein Leseverhalten, sprich über Bücher, schreibe Rezensionen und entdecke Neues zum Lesen. BookWyrm ist eine Software, die immer übersichtlich, werbefrei und gemeinschaftsorientiert sein wird. Wenn du Feature-Anfragen, Fehlerberichte oder große Träume hast, wende dich <a href=\"https://joinbookwyrm.com/get-involved\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">hier hin</a> und verschaffe Dir Gehör."
#: bookwyrm/templates/about/about.html:105 #: bookwyrm/templates/about/about.html:105
msgid "Meet your admins" msgid "Meet your admins"
@ -847,10 +847,10 @@ msgstr "ISNI:"
#: bookwyrm/templates/settings/announcements/edit_announcement.html:120 #: bookwyrm/templates/settings/announcements/edit_announcement.html:120
#: bookwyrm/templates/settings/federation/edit_instance.html:98 #: bookwyrm/templates/settings/federation/edit_instance.html:98
#: bookwyrm/templates/settings/federation/instance.html:105 #: bookwyrm/templates/settings/federation/instance.html:105
#: bookwyrm/templates/settings/registration.html:79 #: bookwyrm/templates/settings/registration.html:96
#: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/registration_limited.html:76
#: bookwyrm/templates/settings/site.html:144 #: bookwyrm/templates/settings/site.html:144
#: bookwyrm/templates/settings/users/user_moderation_actions.html:69 #: bookwyrm/templates/settings/users/user_moderation_actions.html:75
#: bookwyrm/templates/shelf/form.html:25 #: bookwyrm/templates/shelf/form.html:25
#: bookwyrm/templates/snippets/reading_modals/layout.html:18 #: bookwyrm/templates/snippets/reading_modals/layout.html:18
msgid "Save" msgid "Save"
@ -1160,7 +1160,7 @@ msgstr "Dies ist ein neues Werk."
#: bookwyrm/templates/guided_tour/user_profile.html:89 #: bookwyrm/templates/guided_tour/user_profile.html:89
#: bookwyrm/templates/guided_tour/user_profile.html:112 #: bookwyrm/templates/guided_tour/user_profile.html:112
#: bookwyrm/templates/guided_tour/user_profile.html:135 #: bookwyrm/templates/guided_tour/user_profile.html:135
#: bookwyrm/templates/user_menu.html:18 #: bookwyrm/templates/user/user.html:87 bookwyrm/templates/user_menu.html:18
msgid "Back" msgid "Back"
msgstr "Zurück" msgstr "Zurück"
@ -1348,7 +1348,7 @@ msgstr "Links bearbeiten"
#: bookwyrm/templates/book/file_links/edit_links.html:11 #: bookwyrm/templates/book/file_links/edit_links.html:11
#, python-format #, python-format
msgid "Links for \"<em>%(title)s</em>\"" msgid "Links for \"<em>%(title)s</em>\""
msgstr "Links zu \"<em>%(title)s</em>\"" msgstr "Links für \"<em>%(title)s</em>\""
#: bookwyrm/templates/book/file_links/edit_links.html:32 #: bookwyrm/templates/book/file_links/edit_links.html:32
#: bookwyrm/templates/settings/link_domains/link_table.html:6 #: bookwyrm/templates/settings/link_domains/link_table.html:6
@ -1372,7 +1372,7 @@ msgid "Domain"
msgstr "Domain" msgstr "Domain"
#: bookwyrm/templates/book/file_links/edit_links.html:36 #: bookwyrm/templates/book/file_links/edit_links.html:36
#: bookwyrm/templates/import/import.html:122 #: bookwyrm/templates/import/import.html:133
#: bookwyrm/templates/import/import_status.html:134 #: bookwyrm/templates/import/import_status.html:134
#: bookwyrm/templates/settings/announcements/announcements.html:37 #: bookwyrm/templates/settings/announcements/announcements.html:37
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:48 #: bookwyrm/templates/settings/invites/manage_invite_requests.html:48
@ -1385,7 +1385,7 @@ msgstr "Status"
#: bookwyrm/templates/book/file_links/edit_links.html:37 #: bookwyrm/templates/book/file_links/edit_links.html:37
#: bookwyrm/templates/settings/announcements/announcements.html:41 #: bookwyrm/templates/settings/announcements/announcements.html:41
#: bookwyrm/templates/settings/federation/instance.html:112 #: bookwyrm/templates/settings/federation/instance.html:112
#: bookwyrm/templates/settings/imports/imports.html:110 #: bookwyrm/templates/settings/imports/imports.html:141
#: bookwyrm/templates/settings/reports/report_links_table.html:6 #: bookwyrm/templates/settings/reports/report_links_table.html:6
#: bookwyrm/templates/settings/themes.html:99 #: bookwyrm/templates/settings/themes.html:99
msgid "Actions" msgid "Actions"
@ -1394,7 +1394,7 @@ msgstr "Aktionen"
#: bookwyrm/templates/book/file_links/edit_links.html:48 #: bookwyrm/templates/book/file_links/edit_links.html:48
#: bookwyrm/templates/settings/link_domains/link_table.html:21 #: bookwyrm/templates/settings/link_domains/link_table.html:21
msgid "Unknown user" msgid "Unknown user"
msgstr "Unbekannter Account" msgstr "Unbekannte*r Nutzer*in"
#: bookwyrm/templates/book/file_links/edit_links.html:57 #: bookwyrm/templates/book/file_links/edit_links.html:57
#: bookwyrm/templates/book/file_links/verification_modal.html:22 #: bookwyrm/templates/book/file_links/verification_modal.html:22
@ -1468,7 +1468,7 @@ msgstr "Veröffentlicht von %(publisher)s."
#: bookwyrm/templates/book/rating.html:13 #: bookwyrm/templates/book/rating.html:13
msgid "rated it" msgid "rated it"
msgstr "bewertet" msgstr "bewertet es mit"
#: bookwyrm/templates/book/sync_modal.html:15 #: bookwyrm/templates/book/sync_modal.html:15
#, python-format #, python-format
@ -1867,7 +1867,7 @@ msgstr "Hier sind noch keine Bücher! Versuche, nach Büchern zu suchen, um losz
#: bookwyrm/templates/feed/suggested_books.html:13 #: bookwyrm/templates/feed/suggested_books.html:13
msgid "Do you have book data from another service like GoodReads?" msgid "Do you have book data from another service like GoodReads?"
msgstr "Hast du Buchdaten von einem anderen Dienst wie GoodReads?" msgstr "Hast Du Buchdaten von einem anderen Service wie GoodReads?"
#: bookwyrm/templates/feed/suggested_books.html:16 #: bookwyrm/templates/feed/suggested_books.html:16
msgid "Import your reading history" msgid "Import your reading history"
@ -1905,13 +1905,13 @@ msgid "Add to your books"
msgstr "Zu deinen Büchern hinzufügen" msgstr "Zu deinen Büchern hinzufügen"
#: bookwyrm/templates/get_started/book_preview.html:10 #: bookwyrm/templates/get_started/book_preview.html:10
#: bookwyrm/templates/shelf/shelf.html:86 bookwyrm/templates/user/user.html:33 #: bookwyrm/templates/shelf/shelf.html:86 bookwyrm/templates/user/user.html:37
#: bookwyrm/templatetags/shelf_tags.py:48 #: bookwyrm/templatetags/shelf_tags.py:48
msgid "To Read" msgid "To Read"
msgstr "Leseliste" msgstr "Leseliste"
#: bookwyrm/templates/get_started/book_preview.html:11 #: bookwyrm/templates/get_started/book_preview.html:11
#: bookwyrm/templates/shelf/shelf.html:87 bookwyrm/templates/user/user.html:34 #: bookwyrm/templates/shelf/shelf.html:87 bookwyrm/templates/user/user.html:38
#: bookwyrm/templatetags/shelf_tags.py:50 #: bookwyrm/templatetags/shelf_tags.py:50
msgid "Currently Reading" msgid "Currently Reading"
msgstr "Liest gerade" msgstr "Liest gerade"
@ -1921,12 +1921,12 @@ msgstr "Liest gerade"
#: bookwyrm/templates/snippets/shelf_selector.html:46 #: bookwyrm/templates/snippets/shelf_selector.html:46
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24 #: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12 #: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12
#: bookwyrm/templates/user/user.html:35 bookwyrm/templatetags/shelf_tags.py:52 #: bookwyrm/templates/user/user.html:39 bookwyrm/templatetags/shelf_tags.py:52
msgid "Read" msgid "Read"
msgstr "Gelesen" msgstr "Gelesen"
#: bookwyrm/templates/get_started/book_preview.html:13 #: bookwyrm/templates/get_started/book_preview.html:13
#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:36 #: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:40
msgid "Stopped Reading" msgid "Stopped Reading"
msgstr "Aufgehört zu lesen" msgstr "Aufgehört zu lesen"
@ -2235,7 +2235,7 @@ msgstr "Weiter"
#: bookwyrm/templates/guided_tour/book.html:31 #: bookwyrm/templates/guided_tour/book.html:31
msgid "This is where you can set a reading status for this book. You can press the button to move to the next stage, or use the drop down button to select the reading status you want to set." msgid "This is where you can set a reading status for this book. You can press the button to move to the next stage, or use the drop down button to select the reading status you want to set."
msgstr "Hier kannst Du einen Lesestatus für dieses Buch festlegen. Du kannst den Button drücken, um in den nächsten Status zu wechseln oder den Dropdown-Button verwenden, um den Lesestatus auszuwählen, den du setzen möchtest." msgstr "Hier kannst Du einen Lesestatus für dieses Buch festlegen. Du kannst den Button drücken, um in den nächsten Status zu wechseln oder den Dropdown-Button verwenden, um den Lesestatus auszuwählen, den Du setzen möchtest."
#: bookwyrm/templates/guided_tour/book.html:32 #: bookwyrm/templates/guided_tour/book.html:32
msgid "Reading status" msgid "Reading status"
@ -2243,7 +2243,7 @@ msgstr "Lesestatus"
#: bookwyrm/templates/guided_tour/book.html:55 #: bookwyrm/templates/guided_tour/book.html:55
msgid "You can also manually add reading dates here. Unlike changing the reading status using the previous method, adding dates manually will not automatically add them to your <strong>Read</strong> or <strong>Reading</strong> shelves." msgid "You can also manually add reading dates here. Unlike changing the reading status using the previous method, adding dates manually will not automatically add them to your <strong>Read</strong> or <strong>Reading</strong> shelves."
msgstr "Du kannst hier auch manuell Lesedaten hinzufügen. Im Gegensatz zum Ändern des Lesestatus mit der vorherigen Methode wird das manuelle Hinzufügen von Daten diese nicht automatisch zu deinen <strong>Gelesen</strong>- oder <strong>Lesend</strong>-Regalen hinzufügen." msgstr "Du kannst hier auch manuell Lesedaten hinzufügen. Im Gegensatz zum Ändern des Lesestatus mit der vorherigen Methode wird das manuelle Hinzufügen von Daten diese nicht automatisch zu Deinen <strong>Gelesen</strong>- oder <strong>Lesend</strong>-Regalen hinzufügen."
#: bookwyrm/templates/guided_tour/book.html:55 #: bookwyrm/templates/guided_tour/book.html:55
msgid "Got a favourite you re-read every year? We've got you covered - you can add multiple read dates for the same book 😀" msgid "Got a favourite you re-read every year? We've got you covered - you can add multiple read dates for the same book 😀"
@ -2642,7 +2642,7 @@ msgid "This is your user profile. All your latest activities will be listed here
msgstr "Dies ist dein Benutzerprofil. Alle deine neuesten Aktivitäten werden hier aufgelistet. Andere Bookwyrm-Benutzer können auch Teile dieser Seite sehen was sie sehen können, hängt von deinen Privatsphäreeinstellungen ab." msgstr "Dies ist dein Benutzerprofil. Alle deine neuesten Aktivitäten werden hier aufgelistet. Andere Bookwyrm-Benutzer können auch Teile dieser Seite sehen was sie sehen können, hängt von deinen Privatsphäreeinstellungen ab."
#: bookwyrm/templates/guided_tour/user_profile.html:11 #: bookwyrm/templates/guided_tour/user_profile.html:11
#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:10 #: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:14
msgid "User Profile" msgid "User Profile"
msgstr "Profil" msgstr "Profil"
@ -2689,85 +2689,100 @@ msgstr "Bücher importieren"
msgid "Not a valid CSV file" msgid "Not a valid CSV file"
msgstr "Keine gültige CSV-Datei" msgstr "Keine gültige CSV-Datei"
#: bookwyrm/templates/import/import.html:22 #: bookwyrm/templates/import/import.html:20
#, python-format
msgid "Currently you are allowed to import %(import_size_limit)s books every %(import_limit_reset)s days."
msgstr "Aktuell dürfen Sie %(import_size_limit)s Bücher, alle %(import_limit_reset)s Tage importieren."
#: bookwyrm/templates/import/import.html:21
#, python-format
msgid "You have %(allowed_imports)s left."
msgstr "Du hast noch %(allowed_imports)s übrig."
#: bookwyrm/templates/import/import.html:28
#, python-format #, python-format
msgid "On average, recent imports have taken %(hours)s hours." msgid "On average, recent imports have taken %(hours)s hours."
msgstr "Im Durchschnitt haben die letzten Importe %(hours)s Stunden in Anspruch genommen." msgstr "Im Durchschnitt haben die letzten Importe %(hours)s Stunden in Anspruch genommen."
#: bookwyrm/templates/import/import.html:26 #: bookwyrm/templates/import/import.html:32
#, python-format #, python-format
msgid "On average, recent imports have taken %(minutes)s minutes." msgid "On average, recent imports have taken %(minutes)s minutes."
msgstr "Im Durchschnitt haben die letzten Importe %(minutes)s Minuten in Anspruch genommen." msgstr "Im Durchschnitt haben die letzten Importe %(minutes)s Minuten in Anspruch genommen."
#: bookwyrm/templates/import/import.html:41 #: bookwyrm/templates/import/import.html:47
msgid "Data source:" msgid "Data source:"
msgstr "Datenquelle:" msgstr "Datenquelle:"
#: bookwyrm/templates/import/import.html:47 #: bookwyrm/templates/import/import.html:53
msgid "Goodreads (CSV)" msgid "Goodreads (CSV)"
msgstr "Goodreads (CSV)" msgstr "Goodreads (CSV)"
#: bookwyrm/templates/import/import.html:50 #: bookwyrm/templates/import/import.html:56
msgid "Storygraph (CSV)" msgid "Storygraph (CSV)"
msgstr "Storygraph (CSV)" msgstr "Storygraph (CSV)"
#: bookwyrm/templates/import/import.html:53 #: bookwyrm/templates/import/import.html:59
msgid "LibraryThing (TSV)" msgid "LibraryThing (TSV)"
msgstr "LibraryThing (TSV)" msgstr "LibraryThing (TSV)"
#: bookwyrm/templates/import/import.html:56 #: bookwyrm/templates/import/import.html:62
msgid "OpenLibrary (CSV)" msgid "OpenLibrary (CSV)"
msgstr "OpenLibrary (CSV)" msgstr "OpenLibrary (CSV)"
#: bookwyrm/templates/import/import.html:59 #: bookwyrm/templates/import/import.html:65
msgid "Calibre (CSV)" msgid "Calibre (CSV)"
msgstr "Calibre (CSV)" msgstr "Calibre (CSV)"
#: bookwyrm/templates/import/import.html:65 #: bookwyrm/templates/import/import.html:71
msgid "You can download your Goodreads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Import/Export page</a> of your Goodreads account." msgid "You can download your Goodreads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Import/Export page</a> of your Goodreads account."
msgstr "Du kannst deine Goodreads-Daten von der <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Import&nbsp;/&nbsp;Export-Seite</a> deines Goodreads-Kontos downloaden." msgstr "Du kannst deine Goodreads-Daten von der <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Import&nbsp;/&nbsp;Export-Seite</a> deines Goodreads-Kontos downloaden."
#: bookwyrm/templates/import/import.html:74 #: bookwyrm/templates/import/import.html:80
msgid "Data file:" msgid "Data file:"
msgstr "Datei:" msgstr "Datei:"
#: bookwyrm/templates/import/import.html:82 #: bookwyrm/templates/import/import.html:88
msgid "Include reviews" msgid "Include reviews"
msgstr "Besprechungen einschließen" msgstr "Besprechungen einschließen"
#: bookwyrm/templates/import/import.html:87 #: bookwyrm/templates/import/import.html:93
msgid "Privacy setting for imported reviews:" msgid "Privacy setting for imported reviews:"
msgstr "Datenschutzeinstellung für importierte Besprechungen:" msgstr "Datenschutzeinstellung für importierte Besprechungen:"
#: bookwyrm/templates/import/import.html:93 #: bookwyrm/templates/import/import.html:100
#: bookwyrm/templates/import/import.html:102
#: bookwyrm/templates/preferences/layout.html:35 #: bookwyrm/templates/preferences/layout.html:35
#: bookwyrm/templates/settings/federation/instance_blocklist.html:78 #: bookwyrm/templates/settings/federation/instance_blocklist.html:78
msgid "Import" msgid "Import"
msgstr "Importieren" msgstr "Importieren"
#: bookwyrm/templates/import/import.html:101 #: bookwyrm/templates/import/import.html:103
msgid "You've reached the import limit."
msgstr "Sie haben das Importlimit erreicht."
#: bookwyrm/templates/import/import.html:112
msgid "Imports are temporarily disabled; thank you for your patience." msgid "Imports are temporarily disabled; thank you for your patience."
msgstr "Importe sind vorübergehend deaktiviert; vielen Dank für deine Geduld." msgstr "Importe sind vorübergehend deaktiviert; vielen Dank für deine Geduld."
#: bookwyrm/templates/import/import.html:108 #: bookwyrm/templates/import/import.html:119
msgid "Recent Imports" msgid "Recent Imports"
msgstr "Zuletzt importiert" msgstr "Zuletzt importiert"
#: bookwyrm/templates/import/import.html:113 #: bookwyrm/templates/import/import.html:124
#: bookwyrm/templates/settings/imports/imports.html:89 #: bookwyrm/templates/settings/imports/imports.html:120
msgid "Date Created" msgid "Date Created"
msgstr "Erstellungsdatum" msgstr "Erstellungsdatum"
#: bookwyrm/templates/import/import.html:116 #: bookwyrm/templates/import/import.html:127
msgid "Last Updated" msgid "Last Updated"
msgstr "Zuletzt aktualisiert" msgstr "Zuletzt aktualisiert"
#: bookwyrm/templates/import/import.html:119 #: bookwyrm/templates/import/import.html:130
#: bookwyrm/templates/settings/imports/imports.html:98 #: bookwyrm/templates/settings/imports/imports.html:129
msgid "Items" msgid "Items"
msgstr "Einträge" msgstr "Einträge"
#: bookwyrm/templates/import/import.html:128 #: bookwyrm/templates/import/import.html:139
msgid "No recent imports" msgid "No recent imports"
msgstr "Keine aktuellen Importe" msgstr "Keine aktuellen Importe"
@ -2783,6 +2798,7 @@ msgid "Retry Status"
msgstr "Wiederholungsstatus" msgstr "Wiederholungsstatus"
#: bookwyrm/templates/import/import_status.html:22 #: bookwyrm/templates/import/import_status.html:22
#: bookwyrm/templates/settings/celery.html:36
#: bookwyrm/templates/settings/imports/imports.html:6 #: bookwyrm/templates/settings/imports/imports.html:6
#: bookwyrm/templates/settings/imports/imports.html:9 #: bookwyrm/templates/settings/imports/imports.html:9
#: bookwyrm/templates/settings/layout.html:82 #: bookwyrm/templates/settings/layout.html:82
@ -2802,7 +2818,7 @@ msgid "Refresh"
msgstr "Aktualisieren" msgstr "Aktualisieren"
#: bookwyrm/templates/import/import_status.html:72 #: bookwyrm/templates/import/import_status.html:72
#: bookwyrm/templates/settings/imports/imports.html:130 #: bookwyrm/templates/settings/imports/imports.html:161
msgid "Stop import" msgid "Stop import"
msgstr "Import stoppen" msgstr "Import stoppen"
@ -2920,7 +2936,7 @@ msgid "Reject"
msgstr "Ablehnen" msgstr "Ablehnen"
#: bookwyrm/templates/import/troubleshoot.html:7 #: bookwyrm/templates/import/troubleshoot.html:7
#: bookwyrm/templates/settings/imports/imports.html:107 #: bookwyrm/templates/settings/imports/imports.html:138
msgid "Failed items" msgid "Failed items"
msgstr "Fehlgeschlagene Elemente" msgstr "Fehlgeschlagene Elemente"
@ -3171,7 +3187,7 @@ msgid "Delete this list?"
msgstr "Diese Liste löschen?" msgstr "Diese Liste löschen?"
#: bookwyrm/templates/lists/edit_form.html:5 #: bookwyrm/templates/lists/edit_form.html:5
#: bookwyrm/templates/lists/layout.html:18 #: bookwyrm/templates/lists/layout.html:23
msgid "Edit List" msgid "Edit List"
msgstr "Liste bearbeiten" msgstr "Liste bearbeiten"
@ -4429,48 +4445,48 @@ msgstr "Mittlere Priorität"
msgid "High priority" msgid "High priority"
msgstr "Hohe Priorität" msgstr "Hohe Priorität"
#: bookwyrm/templates/settings/celery.html:40 #: bookwyrm/templates/settings/celery.html:46
msgid "Could not connect to Redis broker" msgid "Could not connect to Redis broker"
msgstr "Verbindung zum Redis Broker fehlgeschlagen" msgstr "Verbindung zum Redis Broker fehlgeschlagen"
#: bookwyrm/templates/settings/celery.html:48 #: bookwyrm/templates/settings/celery.html:54
msgid "Active Tasks" msgid "Active Tasks"
msgstr "Aktive Aufgaben" msgstr "Aktive Aufgaben"
#: bookwyrm/templates/settings/celery.html:53 #: bookwyrm/templates/settings/celery.html:59
#: bookwyrm/templates/settings/imports/imports.html:82 #: bookwyrm/templates/settings/imports/imports.html:113
msgid "ID" msgid "ID"
msgstr "ID" msgstr "ID"
#: bookwyrm/templates/settings/celery.html:54 #: bookwyrm/templates/settings/celery.html:60
msgid "Task name" msgid "Task name"
msgstr "Aufgabenname" msgstr "Aufgabenname"
#: bookwyrm/templates/settings/celery.html:55 #: bookwyrm/templates/settings/celery.html:61
msgid "Run time" msgid "Run time"
msgstr "Dauer" msgstr "Dauer"
#: bookwyrm/templates/settings/celery.html:56 #: bookwyrm/templates/settings/celery.html:62
msgid "Priority" msgid "Priority"
msgstr "Priorität" msgstr "Priorität"
#: bookwyrm/templates/settings/celery.html:61 #: bookwyrm/templates/settings/celery.html:67
msgid "No active tasks" msgid "No active tasks"
msgstr "Keine aktiven Aufgaben" msgstr "Keine aktiven Aufgaben"
#: bookwyrm/templates/settings/celery.html:79 #: bookwyrm/templates/settings/celery.html:85
msgid "Workers" msgid "Workers"
msgstr "Workers" msgstr "Workers"
#: bookwyrm/templates/settings/celery.html:84 #: bookwyrm/templates/settings/celery.html:90
msgid "Uptime:" msgid "Uptime:"
msgstr "Betriebszeit:" msgstr "Betriebszeit:"
#: bookwyrm/templates/settings/celery.html:94 #: bookwyrm/templates/settings/celery.html:100
msgid "Could not connect to Celery" msgid "Could not connect to Celery"
msgstr "Verbindung zum Celery fehlgeschlagen." msgstr "Verbindung zum Celery fehlgeschlagen."
#: bookwyrm/templates/settings/celery.html:101 #: bookwyrm/templates/settings/celery.html:107
msgid "Errors" msgid "Errors"
msgstr "Fehler" msgstr "Fehler"
@ -4850,27 +4866,55 @@ msgstr "Benutzer*innen können derzeit keine neuen Importe starten"
msgid "Enable imports" msgid "Enable imports"
msgstr "Importe aktivieren" msgstr "Importe aktivieren"
#: bookwyrm/templates/settings/imports/imports.html:71 #: bookwyrm/templates/settings/imports/imports.html:63
msgid "Limit the amount of imports"
msgstr "Anzahl der Importe begrenzen"
#: bookwyrm/templates/settings/imports/imports.html:74
msgid "Some users might try to import a large number of books, which you want to limit."
msgstr "Einige Nutzer könnten versuchen eine große Anzahl von Büchern zu importieren, was sie eventuell verhindern möchten."
#: bookwyrm/templates/settings/imports/imports.html:75
msgid "Set the value to 0 to not enforce any limit."
msgstr "Setzen Sie den Wert auf 0, falls sie keine Limitierung wünschen."
#: bookwyrm/templates/settings/imports/imports.html:78
msgid "Set import limit to"
msgstr "Setze Importlimit auf"
#: bookwyrm/templates/settings/imports/imports.html:80
msgid "books every"
msgstr "Bücher alle"
#: bookwyrm/templates/settings/imports/imports.html:82
msgid "days."
msgstr "Tage."
#: bookwyrm/templates/settings/imports/imports.html:86
msgid "Set limit"
msgstr "Limit festlegen"
#: bookwyrm/templates/settings/imports/imports.html:102
msgid "Completed" msgid "Completed"
msgstr "Abgeschlossen" msgstr "Abgeschlossen"
#: bookwyrm/templates/settings/imports/imports.html:85 #: bookwyrm/templates/settings/imports/imports.html:116
msgid "User" msgid "User"
msgstr "Benutzer*in" msgstr "Benutzer*in"
#: bookwyrm/templates/settings/imports/imports.html:94 #: bookwyrm/templates/settings/imports/imports.html:125
msgid "Date Updated" msgid "Date Updated"
msgstr "Aktualisierungsdatum" msgstr "Aktualisierungsdatum"
#: bookwyrm/templates/settings/imports/imports.html:101 #: bookwyrm/templates/settings/imports/imports.html:132
msgid "Pending items" msgid "Pending items"
msgstr "Ausstehende Einträge" msgstr "Ausstehende Einträge"
#: bookwyrm/templates/settings/imports/imports.html:104 #: bookwyrm/templates/settings/imports/imports.html:135
msgid "Successful items" msgid "Successful items"
msgstr "Erfolgreiche Objekte" msgstr "Erfolgreiche Objekte"
#: bookwyrm/templates/settings/imports/imports.html:139 #: bookwyrm/templates/settings/imports/imports.html:170
msgid "No matching imports found." msgid "No matching imports found."
msgstr "Keine passenden Importe gefunden." msgstr "Keine passenden Importe gefunden."
@ -5131,34 +5175,38 @@ msgstr "Einstellungen konnten nicht gespeichert werden"
msgid "Allow registration" msgid "Allow registration"
msgstr "Selbstregistrierung zulassen" msgstr "Selbstregistrierung zulassen"
#: bookwyrm/templates/settings/registration.html:44 #: bookwyrm/templates/settings/registration.html:43
msgid "Default access level:"
msgstr "Standard-Zugriffslevel:"
#: bookwyrm/templates/settings/registration.html:61
msgid "Require users to confirm email address" msgid "Require users to confirm email address"
msgstr "Benutzer*innen müssen ihre E-Mail-Adresse bestätigen" msgstr "Benutzer*innen müssen ihre E-Mail-Adresse bestätigen"
#: bookwyrm/templates/settings/registration.html:46 #: bookwyrm/templates/settings/registration.html:63
msgid "(Recommended if registration is open)" msgid "(Recommended if registration is open)"
msgstr "(empfohlen, falls Selbstregistrierung zulässig ist)" msgstr "(empfohlen, falls Selbstregistrierung zulässig ist)"
#: bookwyrm/templates/settings/registration.html:51 #: bookwyrm/templates/settings/registration.html:68
msgid "Allow invite requests" msgid "Allow invite requests"
msgstr "Einladungsanfragen zulassen" msgstr "Einladungsanfragen zulassen"
#: bookwyrm/templates/settings/registration.html:55 #: bookwyrm/templates/settings/registration.html:72
#: bookwyrm/templates/settings/registration_limited.html:42 #: bookwyrm/templates/settings/registration_limited.html:42
msgid "Invite request text:" msgid "Invite request text:"
msgstr "Hinweis für Einladungsanfragen:" msgstr "Hinweis für Einladungsanfragen:"
#: bookwyrm/templates/settings/registration.html:63 #: bookwyrm/templates/settings/registration.html:80
#: bookwyrm/templates/settings/registration_limited.html:50 #: bookwyrm/templates/settings/registration_limited.html:50
msgid "Set a question for invite requests" msgid "Set a question for invite requests"
msgstr "Eine Frage für Einladungsanfragen festlegen" msgstr "Eine Frage für Einladungsanfragen festlegen"
#: bookwyrm/templates/settings/registration.html:68 #: bookwyrm/templates/settings/registration.html:85
#: bookwyrm/templates/settings/registration_limited.html:55 #: bookwyrm/templates/settings/registration_limited.html:55
msgid "Question:" msgid "Question:"
msgstr "Frage:" msgstr "Frage:"
#: bookwyrm/templates/settings/registration.html:73 #: bookwyrm/templates/settings/registration.html:90
#: bookwyrm/templates/settings/registration_limited.html:67 #: bookwyrm/templates/settings/registration_limited.html:67
msgid "Registration closed text:" msgid "Registration closed text:"
msgstr "Hinweis, wenn Selbtregistrierung nicht erlaubt ist:" msgstr "Hinweis, wenn Selbtregistrierung nicht erlaubt ist:"
@ -5400,7 +5448,7 @@ msgid "Remove theme"
msgstr "Design löschen" msgstr "Design löschen"
#: bookwyrm/templates/settings/users/delete_user_form.html:5 #: bookwyrm/templates/settings/users/delete_user_form.html:5
#: bookwyrm/templates/settings/users/user_moderation_actions.html:32 #: bookwyrm/templates/settings/users/user_moderation_actions.html:38
msgid "Permanently delete user" msgid "Permanently delete user"
msgstr "Benutzer*in dauerhaft löschen" msgstr "Benutzer*in dauerhaft löschen"
@ -5425,7 +5473,7 @@ msgstr "Gelöschte Accounts"
#: bookwyrm/templates/settings/users/user_admin.html:44 #: bookwyrm/templates/settings/users/user_admin.html:44
#: bookwyrm/templates/settings/users/username_filter.html:5 #: bookwyrm/templates/settings/users/username_filter.html:5
msgid "Username" msgid "Username"
msgstr "Name" msgstr "Anmeldename"
#: bookwyrm/templates/settings/users/user_admin.html:48 #: bookwyrm/templates/settings/users/user_admin.html:48
msgid "Date Added" msgid "Date Added"
@ -5522,14 +5570,18 @@ msgid "User Actions"
msgstr "Benutzeraktionen" msgstr "Benutzeraktionen"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:21 #: bookwyrm/templates/settings/users/user_moderation_actions.html:21
msgid "Activate user"
msgstr "Benutzer aktivieren"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:27
msgid "Suspend user" msgid "Suspend user"
msgstr "Benutzer*in vorläufig sperren" msgstr "Benutzer*in vorläufig sperren"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:26 #: bookwyrm/templates/settings/users/user_moderation_actions.html:32
msgid "Un-suspend user" msgid "Un-suspend user"
msgstr "Vorläufige Sperre für Benutzer*in aufheben" msgstr "Vorläufige Sperre für Benutzer*in aufheben"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:48 #: bookwyrm/templates/settings/users/user_moderation_actions.html:54
msgid "Access level:" msgid "Access level:"
msgstr "Zugriffsstufe:" msgstr "Zugriffsstufe:"
@ -6379,33 +6431,53 @@ msgstr "%(username)s folgt niemandem"
msgid "No reviews or comments yet!" msgid "No reviews or comments yet!"
msgstr "Noch keine Rezensionen oder Kommentare!" msgstr "Noch keine Rezensionen oder Kommentare!"
#: bookwyrm/templates/user/user.html:16 #: bookwyrm/templates/user/user.html:20
msgid "Edit profile" msgid "Edit profile"
msgstr "Profil bearbeiten" msgstr "Profil bearbeiten"
#: bookwyrm/templates/user/user.html:38 #: bookwyrm/templates/user/user.html:42
#, python-format #, python-format
msgid "View all %(size)s" msgid "View all %(size)s"
msgstr "Alle %(size)s anzeigen" msgstr "Alle %(size)s anzeigen"
#: bookwyrm/templates/user/user.html:52 #: bookwyrm/templates/user/user.html:56
msgid "View all books" msgid "View all books"
msgstr "Alle Bücher anzeigen" msgstr "Alle Bücher anzeigen"
#: bookwyrm/templates/user/user.html:59 #: bookwyrm/templates/user/user.html:63
#, python-format #, python-format
msgid "%(current_year)s Reading Goal" msgid "%(current_year)s Reading Goal"
msgstr "Leseziel %(current_year)s" msgstr "Leseziel %(current_year)s"
#: bookwyrm/templates/user/user.html:66 #: bookwyrm/templates/user/user.html:70
msgid "User Activity" msgid "User Activity"
msgstr "Benutzer*innenaktivität" msgstr "Benutzer*innenaktivität"
#: bookwyrm/templates/user/user.html:71 #: bookwyrm/templates/user/user.html:76
msgid "Show RSS Options"
msgstr "RSS Optionen anzeigen"
#: bookwyrm/templates/user/user.html:82
msgid "RSS feed" msgid "RSS feed"
msgstr "RSS-Feed" msgstr "RSS-Feed"
#: bookwyrm/templates/user/user.html:83 #: bookwyrm/templates/user/user.html:98
msgid "Complete feed"
msgstr "Vollständiger Feed"
#: bookwyrm/templates/user/user.html:103
msgid "Reviews only"
msgstr "Nur Reviews"
#: bookwyrm/templates/user/user.html:108
msgid "Quotes only"
msgstr "Nur Zitate"
#: bookwyrm/templates/user/user.html:113
msgid "Comments only"
msgstr "Nur Kommentare"
#: bookwyrm/templates/user/user.html:129
msgid "No activities yet!" msgid "No activities yet!"
msgstr "Noch keine Aktivitäten!" msgstr "Noch keine Aktivitäten!"
@ -6449,16 +6521,43 @@ msgstr "Abmelden"
msgid "File exceeds maximum size: 10MB" msgid "File exceeds maximum size: 10MB"
msgstr "Datei überschreitet die maximale Größe von 10MB" msgstr "Datei überschreitet die maximale Größe von 10MB"
#: bookwyrm/templatetags/list_page_tags.py:14
#, python-format
msgid "Book List: %(name)s"
msgstr "Bücherliste: %(name)s"
#: bookwyrm/templatetags/list_page_tags.py:22
#, python-format
msgid "%(num)d book - by %(user)s"
msgid_plural "%(num)d books - by %(user)s"
msgstr[0] "%(num)d Bücher - von %(user)s"
msgstr[1] "%(num)d Bücher - von %(user)s"
#: bookwyrm/templatetags/utilities.py:39 #: bookwyrm/templatetags/utilities.py:39
#, python-format #, python-format
msgid "%(title)s: %(subtitle)s" msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s"
#: bookwyrm/views/rss_feed.py:34 #: bookwyrm/views/rss_feed.py:35
#, python-brace-format #, python-brace-format
msgid "Status updates from {obj.display_name}" msgid "Status updates from {obj.display_name}"
msgstr "Status -Updates von {obj.display_name}" msgstr "Status -Updates von {obj.display_name}"
#: bookwyrm/views/rss_feed.py:72
#, python-brace-format
msgid "Reviews from {obj.display_name}"
msgstr "Rezensionen von {obj.display_name}"
#: bookwyrm/views/rss_feed.py:110
#, python-brace-format
msgid "Quotes from {obj.display_name}"
msgstr "Zitate von {obj.display_name}"
#: bookwyrm/views/rss_feed.py:148
#, python-brace-format
msgid "Comments from {obj.display_name}"
msgstr "Kommentare von {obj.display_name}"
#: bookwyrm/views/updates.py:45 #: bookwyrm/views/updates.py:45
#, python-format #, python-format
msgid "Load %(count)d unread status" msgid "Load %(count)d unread status"

View file

@ -8,7 +8,7 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: 0.0.1\n" "Project-Id-Version: 0.0.1\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-30 08:21+0000\n" "POT-Creation-Date: 2023-03-13 14:54+0000\n"
"PO-Revision-Date: 2021-02-28 17:19-0800\n" "PO-Revision-Date: 2021-02-28 17:19-0800\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n" "Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: English <LL@li.org>\n" "Language-Team: English <LL@li.org>\n"
@ -47,7 +47,7 @@ msgstr ""
msgid "Incorrect password" msgid "Incorrect password"
msgstr "" msgstr ""
#: bookwyrm/forms/edit_user.py:95 bookwyrm/forms/landing.py:89 #: bookwyrm/forms/edit_user.py:95 bookwyrm/forms/landing.py:90
msgid "Password does not match" msgid "Password does not match"
msgstr "" msgstr ""
@ -71,19 +71,19 @@ msgstr ""
msgid "Reading finished date cannot be in the future." msgid "Reading finished date cannot be in the future."
msgstr "" msgstr ""
#: bookwyrm/forms/landing.py:37 #: bookwyrm/forms/landing.py:38
msgid "Username or password are incorrect" msgid "Username or password are incorrect"
msgstr "" msgstr ""
#: bookwyrm/forms/landing.py:56 #: bookwyrm/forms/landing.py:57
msgid "User with this username already exists" msgid "User with this username already exists"
msgstr "" msgstr ""
#: bookwyrm/forms/landing.py:65 #: bookwyrm/forms/landing.py:66
msgid "A user with this email already exists." msgid "A user with this email already exists."
msgstr "" msgstr ""
#: bookwyrm/forms/landing.py:123 bookwyrm/forms/landing.py:131 #: bookwyrm/forms/landing.py:124 bookwyrm/forms/landing.py:132
msgid "Incorrect code" msgid "Incorrect code"
msgstr "" msgstr ""
@ -206,26 +206,26 @@ msgstr ""
msgid "Blocked" msgid "Blocked"
msgstr "" msgstr ""
#: bookwyrm/models/fields.py:28 #: bookwyrm/models/fields.py:29
#, python-format #, python-format
msgid "%(value)s is not a valid remote_id" msgid "%(value)s is not a valid remote_id"
msgstr "" msgstr ""
#: bookwyrm/models/fields.py:37 bookwyrm/models/fields.py:46 #: bookwyrm/models/fields.py:38 bookwyrm/models/fields.py:47
#, python-format #, python-format
msgid "%(value)s is not a valid username" msgid "%(value)s is not a valid username"
msgstr "" msgstr ""
#: bookwyrm/models/fields.py:182 bookwyrm/templates/layout.html:131 #: bookwyrm/models/fields.py:192 bookwyrm/templates/layout.html:128
#: bookwyrm/templates/ostatus/error.html:29 #: bookwyrm/templates/ostatus/error.html:29
msgid "username" msgid "username"
msgstr "" msgstr ""
#: bookwyrm/models/fields.py:187 #: bookwyrm/models/fields.py:197
msgid "A user with that username already exists." msgid "A user with that username already exists."
msgstr "" msgstr ""
#: bookwyrm/models/fields.py:206 #: bookwyrm/models/fields.py:216
#: bookwyrm/templates/snippets/privacy-icons.html:3 #: bookwyrm/templates/snippets/privacy-icons.html:3
#: bookwyrm/templates/snippets/privacy-icons.html:4 #: bookwyrm/templates/snippets/privacy-icons.html:4
#: bookwyrm/templates/snippets/privacy_select.html:11 #: bookwyrm/templates/snippets/privacy_select.html:11
@ -233,7 +233,7 @@ msgstr ""
msgid "Public" msgid "Public"
msgstr "" msgstr ""
#: bookwyrm/models/fields.py:207 #: bookwyrm/models/fields.py:217
#: bookwyrm/templates/snippets/privacy-icons.html:7 #: bookwyrm/templates/snippets/privacy-icons.html:7
#: bookwyrm/templates/snippets/privacy-icons.html:8 #: bookwyrm/templates/snippets/privacy-icons.html:8
#: bookwyrm/templates/snippets/privacy_select.html:14 #: bookwyrm/templates/snippets/privacy_select.html:14
@ -241,14 +241,14 @@ msgstr ""
msgid "Unlisted" msgid "Unlisted"
msgstr "" msgstr ""
#: bookwyrm/models/fields.py:208 #: bookwyrm/models/fields.py:218
#: bookwyrm/templates/snippets/privacy_select.html:17 #: bookwyrm/templates/snippets/privacy_select.html:17
#: bookwyrm/templates/user/relationships/followers.html:6 #: bookwyrm/templates/user/relationships/followers.html:6
#: bookwyrm/templates/user/relationships/layout.html:11 #: bookwyrm/templates/user/relationships/layout.html:11
msgid "Followers" msgid "Followers"
msgstr "" msgstr ""
#: bookwyrm/models/fields.py:209 #: bookwyrm/models/fields.py:219
#: bookwyrm/templates/snippets/create_status/post_options_block.html:6 #: bookwyrm/templates/snippets/create_status/post_options_block.html:6
#: bookwyrm/templates/snippets/privacy-icons.html:15 #: bookwyrm/templates/snippets/privacy-icons.html:15
#: bookwyrm/templates/snippets/privacy-icons.html:16 #: bookwyrm/templates/snippets/privacy-icons.html:16
@ -301,7 +301,7 @@ msgstr ""
msgid "Approved" msgid "Approved"
msgstr "" msgstr ""
#: bookwyrm/models/user.py:32 bookwyrm/templates/book/book.html:296 #: bookwyrm/models/user.py:32 bookwyrm/templates/book/book.html:298
msgid "Reviews" msgid "Reviews"
msgstr "" msgstr ""
@ -317,19 +317,19 @@ msgstr ""
msgid "Everything else" msgid "Everything else"
msgstr "" msgstr ""
#: bookwyrm/settings.py:217 #: bookwyrm/settings.py:218
msgid "Home Timeline" msgid "Home Timeline"
msgstr "" msgstr ""
#: bookwyrm/settings.py:217 #: bookwyrm/settings.py:218
msgid "Home" msgid "Home"
msgstr "" msgstr ""
#: bookwyrm/settings.py:218 #: bookwyrm/settings.py:219
msgid "Books Timeline" msgid "Books Timeline"
msgstr "" msgstr ""
#: bookwyrm/settings.py:218 #: bookwyrm/settings.py:219
#: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/guided_tour/user_profile.html:101
#: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:22
#: bookwyrm/templates/search/layout.html:43 #: bookwyrm/templates/search/layout.html:43
@ -337,75 +337,75 @@ msgstr ""
msgid "Books" msgid "Books"
msgstr "" msgstr ""
#: bookwyrm/settings.py:290 #: bookwyrm/settings.py:291
msgid "English" msgid "English"
msgstr "" msgstr ""
#: bookwyrm/settings.py:291 #: bookwyrm/settings.py:292
msgid "Català (Catalan)" msgid "Català (Catalan)"
msgstr "" msgstr ""
#: bookwyrm/settings.py:292 #: bookwyrm/settings.py:293
msgid "Deutsch (German)" msgid "Deutsch (German)"
msgstr "" msgstr ""
#: bookwyrm/settings.py:293 #: bookwyrm/settings.py:294
msgid "Español (Spanish)" msgid "Español (Spanish)"
msgstr "" msgstr ""
#: bookwyrm/settings.py:294 #: bookwyrm/settings.py:295
msgid "Euskara (Basque)" msgid "Euskara (Basque)"
msgstr "" msgstr ""
#: bookwyrm/settings.py:295 #: bookwyrm/settings.py:296
msgid "Galego (Galician)" msgid "Galego (Galician)"
msgstr "" msgstr ""
#: bookwyrm/settings.py:296 #: bookwyrm/settings.py:297
msgid "Italiano (Italian)" msgid "Italiano (Italian)"
msgstr "" msgstr ""
#: bookwyrm/settings.py:297 #: bookwyrm/settings.py:298
msgid "Suomi (Finnish)" msgid "Suomi (Finnish)"
msgstr "" msgstr ""
#: bookwyrm/settings.py:298 #: bookwyrm/settings.py:299
msgid "Français (French)" msgid "Français (French)"
msgstr "" msgstr ""
#: bookwyrm/settings.py:299 #: bookwyrm/settings.py:300
msgid "Lietuvių (Lithuanian)" msgid "Lietuvių (Lithuanian)"
msgstr "" msgstr ""
#: bookwyrm/settings.py:300 #: bookwyrm/settings.py:301
msgid "Norsk (Norwegian)" msgid "Norsk (Norwegian)"
msgstr "" msgstr ""
#: bookwyrm/settings.py:301 #: bookwyrm/settings.py:302
msgid "Polski (Polish)" msgid "Polski (Polish)"
msgstr "" msgstr ""
#: bookwyrm/settings.py:302 #: bookwyrm/settings.py:303
msgid "Português do Brasil (Brazilian Portuguese)" msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "" msgstr ""
#: bookwyrm/settings.py:303 #: bookwyrm/settings.py:304
msgid "Português Europeu (European Portuguese)" msgid "Português Europeu (European Portuguese)"
msgstr "" msgstr ""
#: bookwyrm/settings.py:304 #: bookwyrm/settings.py:305
msgid "Română (Romanian)" msgid "Română (Romanian)"
msgstr "" msgstr ""
#: bookwyrm/settings.py:305 #: bookwyrm/settings.py:306
msgid "Svenska (Swedish)" msgid "Svenska (Swedish)"
msgstr "" msgstr ""
#: bookwyrm/settings.py:306 #: bookwyrm/settings.py:307
msgid "简体中文 (Simplified Chinese)" msgid "简体中文 (Simplified Chinese)"
msgstr "" msgstr ""
#: bookwyrm/settings.py:307 #: bookwyrm/settings.py:308
msgid "繁體中文 (Traditional Chinese)" msgid "繁體中文 (Traditional Chinese)"
msgstr "" msgstr ""
@ -435,7 +435,7 @@ msgid "About"
msgstr "" msgstr ""
#: bookwyrm/templates/about/about.html:21 #: bookwyrm/templates/about/about.html:21
#: bookwyrm/templates/get_started/layout.html:20 #: bookwyrm/templates/get_started/layout.html:22
#, python-format #, python-format
msgid "Welcome to %(site_name)s!" msgid "Welcome to %(site_name)s!"
msgstr "" msgstr ""
@ -709,24 +709,24 @@ msgid "View ISNI record"
msgstr "" msgstr ""
#: bookwyrm/templates/author/author.html:95 #: bookwyrm/templates/author/author.html:95
#: bookwyrm/templates/book/book.html:164 #: bookwyrm/templates/book/book.html:166
msgid "View on ISFDB" msgid "View on ISFDB"
msgstr "" msgstr ""
#: bookwyrm/templates/author/author.html:100 #: bookwyrm/templates/author/author.html:100
#: bookwyrm/templates/author/sync_modal.html:5 #: bookwyrm/templates/author/sync_modal.html:5
#: bookwyrm/templates/book/book.html:131 #: bookwyrm/templates/book/book.html:133
#: bookwyrm/templates/book/sync_modal.html:5 #: bookwyrm/templates/book/sync_modal.html:5
msgid "Load data" msgid "Load data"
msgstr "" msgstr ""
#: bookwyrm/templates/author/author.html:104 #: bookwyrm/templates/author/author.html:104
#: bookwyrm/templates/book/book.html:135 #: bookwyrm/templates/book/book.html:137
msgid "View on OpenLibrary" msgid "View on OpenLibrary"
msgstr "" msgstr ""
#: bookwyrm/templates/author/author.html:119 #: bookwyrm/templates/author/author.html:119
#: bookwyrm/templates/book/book.html:149 #: bookwyrm/templates/book/book.html:151
msgid "View on Inventaire" msgid "View on Inventaire"
msgstr "" msgstr ""
@ -835,8 +835,8 @@ msgid "ISNI:"
msgstr "" msgstr ""
#: bookwyrm/templates/author/edit_author.html:126 #: bookwyrm/templates/author/edit_author.html:126
#: bookwyrm/templates/book/book.html:209 #: bookwyrm/templates/book/book.html:211
#: bookwyrm/templates/book/edit/edit_book.html:142 #: bookwyrm/templates/book/edit/edit_book.html:150
#: bookwyrm/templates/book/file_links/add_link_modal.html:60 #: bookwyrm/templates/book/file_links/add_link_modal.html:60
#: bookwyrm/templates/book/file_links/edit_links.html:86 #: bookwyrm/templates/book/file_links/edit_links.html:86
#: bookwyrm/templates/groups/form.html:32 #: bookwyrm/templates/groups/form.html:32
@ -859,10 +859,10 @@ msgstr ""
#: bookwyrm/templates/author/edit_author.html:127 #: bookwyrm/templates/author/edit_author.html:127
#: bookwyrm/templates/author/sync_modal.html:23 #: bookwyrm/templates/author/sync_modal.html:23
#: bookwyrm/templates/book/book.html:210 #: bookwyrm/templates/book/book.html:212
#: bookwyrm/templates/book/cover_add_modal.html:33 #: bookwyrm/templates/book/cover_add_modal.html:33
#: bookwyrm/templates/book/edit/edit_book.html:144 #: bookwyrm/templates/book/edit/edit_book.html:152
#: bookwyrm/templates/book/edit/edit_book.html:147 #: bookwyrm/templates/book/edit/edit_book.html:155
#: bookwyrm/templates/book/file_links/add_link_modal.html:59 #: bookwyrm/templates/book/file_links/add_link_modal.html:59
#: bookwyrm/templates/book/file_links/verification_modal.html:25 #: bookwyrm/templates/book/file_links/verification_modal.html:25
#: bookwyrm/templates/book/sync_modal.html:23 #: bookwyrm/templates/book/sync_modal.html:23
@ -886,7 +886,7 @@ msgid "Loading data will connect to <strong>%(source_name)s</strong> and check f
msgstr "" msgstr ""
#: bookwyrm/templates/author/sync_modal.html:24 #: bookwyrm/templates/author/sync_modal.html:24
#: bookwyrm/templates/book/edit/edit_book.html:129 #: bookwyrm/templates/book/edit/edit_book.html:137
#: bookwyrm/templates/book/sync_modal.html:24 #: bookwyrm/templates/book/sync_modal.html:24
#: bookwyrm/templates/groups/members.html:29 #: bookwyrm/templates/groups/members.html:29
#: bookwyrm/templates/landing/password_reset.html:52 #: bookwyrm/templates/landing/password_reset.html:52
@ -904,90 +904,90 @@ msgstr ""
msgid "Edit Book" msgid "Edit Book"
msgstr "" msgstr ""
#: bookwyrm/templates/book/book.html:88 bookwyrm/templates/book/book.html:91 #: bookwyrm/templates/book/book.html:90 bookwyrm/templates/book/book.html:93
msgid "Click to add cover" msgid "Click to add cover"
msgstr "" msgstr ""
#: bookwyrm/templates/book/book.html:97 #: bookwyrm/templates/book/book.html:99
msgid "Failed to load cover" msgid "Failed to load cover"
msgstr "" msgstr ""
#: bookwyrm/templates/book/book.html:108 #: bookwyrm/templates/book/book.html:110
msgid "Click to enlarge" msgid "Click to enlarge"
msgstr "" msgstr ""
#: bookwyrm/templates/book/book.html:186 #: bookwyrm/templates/book/book.html:188
#, python-format #, python-format
msgid "(%(review_count)s review)" msgid "(%(review_count)s review)"
msgid_plural "(%(review_count)s reviews)" msgid_plural "(%(review_count)s reviews)"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: bookwyrm/templates/book/book.html:198 #: bookwyrm/templates/book/book.html:200
msgid "Add Description" msgid "Add Description"
msgstr "" msgstr ""
#: bookwyrm/templates/book/book.html:205 #: bookwyrm/templates/book/book.html:207
#: bookwyrm/templates/book/edit/edit_book_form.html:42 #: bookwyrm/templates/book/edit/edit_book_form.html:42
#: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17 #: bookwyrm/templates/lists/form.html:13 bookwyrm/templates/shelf/form.html:17
msgid "Description:" msgid "Description:"
msgstr "" msgstr ""
#: bookwyrm/templates/book/book.html:221 #: bookwyrm/templates/book/book.html:223
#, python-format #, python-format
msgid "%(count)s edition" msgid "%(count)s edition"
msgid_plural "%(count)s editions" msgid_plural "%(count)s editions"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: bookwyrm/templates/book/book.html:235 #: bookwyrm/templates/book/book.html:237
msgid "You have shelved this edition in:" msgid "You have shelved this edition in:"
msgstr "" msgstr ""
#: bookwyrm/templates/book/book.html:250 #: bookwyrm/templates/book/book.html:252
#, python-format #, python-format
msgid "A <a href=\"%(book_path)s\">different edition</a> of this book is on your <a href=\"%(shelf_path)s\">%(shelf_name)s</a> shelf." msgid "A <a href=\"%(book_path)s\">different edition</a> of this book is on your <a href=\"%(shelf_path)s\">%(shelf_name)s</a> shelf."
msgstr "" msgstr ""
#: bookwyrm/templates/book/book.html:261 #: bookwyrm/templates/book/book.html:263
msgid "Your reading activity" msgid "Your reading activity"
msgstr "" msgstr ""
#: bookwyrm/templates/book/book.html:267 #: bookwyrm/templates/book/book.html:269
#: bookwyrm/templates/guided_tour/book.html:56 #: bookwyrm/templates/guided_tour/book.html:56
msgid "Add read dates" msgid "Add read dates"
msgstr "" msgstr ""
#: bookwyrm/templates/book/book.html:275 #: bookwyrm/templates/book/book.html:277
msgid "You don't have any reading activity for this book." msgid "You don't have any reading activity for this book."
msgstr "" msgstr ""
#: bookwyrm/templates/book/book.html:301 #: bookwyrm/templates/book/book.html:303
msgid "Your reviews" msgid "Your reviews"
msgstr "" msgstr ""
#: bookwyrm/templates/book/book.html:307 #: bookwyrm/templates/book/book.html:309
msgid "Your comments" msgid "Your comments"
msgstr "" msgstr ""
#: bookwyrm/templates/book/book.html:313 #: bookwyrm/templates/book/book.html:315
msgid "Your quotes" msgid "Your quotes"
msgstr "" msgstr ""
#: bookwyrm/templates/book/book.html:349 #: bookwyrm/templates/book/book.html:351
msgid "Subjects" msgid "Subjects"
msgstr "" msgstr ""
#: bookwyrm/templates/book/book.html:361 #: bookwyrm/templates/book/book.html:363
msgid "Places" msgid "Places"
msgstr "" msgstr ""
#: bookwyrm/templates/book/book.html:372 #: bookwyrm/templates/book/book.html:374
#: bookwyrm/templates/groups/group.html:19 #: bookwyrm/templates/groups/group.html:19
#: bookwyrm/templates/guided_tour/lists.html:14 #: bookwyrm/templates/guided_tour/lists.html:14
#: bookwyrm/templates/guided_tour/user_books.html:102 #: bookwyrm/templates/guided_tour/user_books.html:102
#: bookwyrm/templates/guided_tour/user_profile.html:78 #: bookwyrm/templates/guided_tour/user_profile.html:78
#: bookwyrm/templates/layout.html:91 bookwyrm/templates/lists/curate.html:8 #: bookwyrm/templates/layout.html:90 bookwyrm/templates/lists/curate.html:8
#: bookwyrm/templates/lists/list.html:12 bookwyrm/templates/lists/lists.html:5 #: bookwyrm/templates/lists/list.html:12 bookwyrm/templates/lists/lists.html:5
#: bookwyrm/templates/lists/lists.html:12 #: bookwyrm/templates/lists/lists.html:12
#: bookwyrm/templates/search/layout.html:26 #: bookwyrm/templates/search/layout.html:26
@ -996,11 +996,11 @@ msgstr ""
msgid "Lists" msgid "Lists"
msgstr "" msgstr ""
#: bookwyrm/templates/book/book.html:384 #: bookwyrm/templates/book/book.html:386
msgid "Add to list" msgid "Add to list"
msgstr "" msgstr ""
#: bookwyrm/templates/book/book.html:394 #: bookwyrm/templates/book/book.html:396
#: bookwyrm/templates/book/cover_add_modal.html:32 #: bookwyrm/templates/book/cover_add_modal.html:32
#: bookwyrm/templates/lists/add_item_modal.html:39 #: bookwyrm/templates/lists/add_item_modal.html:39
#: bookwyrm/templates/lists/list.html:255 #: bookwyrm/templates/lists/list.html:255
@ -1060,8 +1060,8 @@ msgstr ""
#: bookwyrm/templates/components/modal.html:13 #: bookwyrm/templates/components/modal.html:13
#: bookwyrm/templates/components/modal.html:30 #: bookwyrm/templates/components/modal.html:30
#: bookwyrm/templates/feed/suggested_books.html:67 #: bookwyrm/templates/feed/suggested_books.html:67
#: bookwyrm/templates/get_started/layout.html:25 #: bookwyrm/templates/get_started/layout.html:27
#: bookwyrm/templates/get_started/layout.html:58 #: bookwyrm/templates/get_started/layout.html:60
msgid "Close" msgid "Close"
msgstr "" msgstr ""
@ -1076,47 +1076,51 @@ msgstr ""
msgid "Add Book" msgid "Add Book"
msgstr "" msgstr ""
#: bookwyrm/templates/book/edit/edit_book.html:62 #: bookwyrm/templates/book/edit/edit_book.html:43
msgid "Confirm Book Info" msgid "Failed to save book, see errors below for more information."
msgstr "" msgstr ""
#: bookwyrm/templates/book/edit/edit_book.html:70 #: bookwyrm/templates/book/edit/edit_book.html:70
msgid "Confirm Book Info"
msgstr ""
#: bookwyrm/templates/book/edit/edit_book.html:78
#, python-format #, python-format
msgid "Is \"%(name)s\" one of these authors?" msgid "Is \"%(name)s\" one of these authors?"
msgstr "" msgstr ""
#: bookwyrm/templates/book/edit/edit_book.html:81 #: bookwyrm/templates/book/edit/edit_book.html:89
#, python-format #, python-format
msgid "Author of <em>%(book_title)s</em>" msgid "Author of <em>%(book_title)s</em>"
msgstr "" msgstr ""
#: bookwyrm/templates/book/edit/edit_book.html:85 #: bookwyrm/templates/book/edit/edit_book.html:93
#, python-format #, python-format
msgid "Author of <em>%(alt_title)s</em>" msgid "Author of <em>%(alt_title)s</em>"
msgstr "" msgstr ""
#: bookwyrm/templates/book/edit/edit_book.html:87 #: bookwyrm/templates/book/edit/edit_book.html:95
msgid "Find more information at isni.org" msgid "Find more information at isni.org"
msgstr "" msgstr ""
#: bookwyrm/templates/book/edit/edit_book.html:97 #: bookwyrm/templates/book/edit/edit_book.html:105
msgid "This is a new author" msgid "This is a new author"
msgstr "" msgstr ""
#: bookwyrm/templates/book/edit/edit_book.html:107 #: bookwyrm/templates/book/edit/edit_book.html:115
#, python-format #, python-format
msgid "Creating a new author: %(name)s" msgid "Creating a new author: %(name)s"
msgstr "" msgstr ""
#: bookwyrm/templates/book/edit/edit_book.html:114 #: bookwyrm/templates/book/edit/edit_book.html:122
msgid "Is this an edition of an existing work?" msgid "Is this an edition of an existing work?"
msgstr "" msgstr ""
#: bookwyrm/templates/book/edit/edit_book.html:122 #: bookwyrm/templates/book/edit/edit_book.html:130
msgid "This is a new work" msgid "This is a new work"
msgstr "" msgstr ""
#: bookwyrm/templates/book/edit/edit_book.html:131 #: bookwyrm/templates/book/edit/edit_book.html:139
#: bookwyrm/templates/feed/status.html:19 #: bookwyrm/templates/feed/status.html:19
#: bookwyrm/templates/guided_tour/book.html:44 #: bookwyrm/templates/guided_tour/book.html:44
#: bookwyrm/templates/guided_tour/book.html:68 #: bookwyrm/templates/guided_tour/book.html:68
@ -1471,6 +1475,19 @@ msgstr ""
msgid "rated it" msgid "rated it"
msgstr "" msgstr ""
#: bookwyrm/templates/book/series.html:11
msgid "Series by"
msgstr ""
#: bookwyrm/templates/book/series.html:27
#, python-format
msgid "Book %(series_number)s"
msgstr ""
#: bookwyrm/templates/book/series.html:27
msgid "Unsorted Book"
msgstr ""
#: bookwyrm/templates/book/sync_modal.html:15 #: bookwyrm/templates/book/sync_modal.html:15
#, python-format #, python-format
msgid "Loading data will connect to <strong>%(source_name)s</strong> and check for any metadata about this book which aren't present here. Existing metadata will not be overwritten." msgid "Loading data will connect to <strong>%(source_name)s</strong> and check for any metadata about this book which aren't present here. Existing metadata will not be overwritten."
@ -1665,7 +1682,7 @@ msgstr ""
#: bookwyrm/templates/discover/discover.html:4 #: bookwyrm/templates/discover/discover.html:4
#: bookwyrm/templates/discover/discover.html:10 #: bookwyrm/templates/discover/discover.html:10
#: bookwyrm/templates/layout.html:94 #: bookwyrm/templates/layout.html:93
msgid "Discover" msgid "Discover"
msgstr "" msgstr ""
@ -1797,7 +1814,7 @@ msgstr ""
msgid "Test email" msgid "Test email"
msgstr "" msgstr ""
#: bookwyrm/templates/embed-layout.html:20 bookwyrm/templates/layout.html:30 #: bookwyrm/templates/embed-layout.html:20 bookwyrm/templates/layout.html:31
#: bookwyrm/templates/setup/layout.html:15 #: bookwyrm/templates/setup/layout.html:15
#: bookwyrm/templates/two_factor_auth/two_factor_login.html:18 #: bookwyrm/templates/two_factor_auth/two_factor_login.html:18
#: bookwyrm/templates/two_factor_auth/two_factor_prompt.html:18 #: bookwyrm/templates/two_factor_auth/two_factor_prompt.html:18
@ -1936,7 +1953,7 @@ msgid "What are you reading?"
msgstr "" msgstr ""
#: bookwyrm/templates/get_started/books.html:9 #: bookwyrm/templates/get_started/books.html:9
#: bookwyrm/templates/layout.html:38 bookwyrm/templates/lists/list.html:213 #: bookwyrm/templates/layout.html:39 bookwyrm/templates/lists/list.html:213
msgid "Search for a book" msgid "Search for a book"
msgstr "" msgstr ""
@ -1955,8 +1972,8 @@ msgstr ""
#: bookwyrm/templates/get_started/users.html:18 #: bookwyrm/templates/get_started/users.html:18
#: bookwyrm/templates/get_started/users.html:19 #: bookwyrm/templates/get_started/users.html:19
#: bookwyrm/templates/groups/members.html:15 #: bookwyrm/templates/groups/members.html:15
#: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:44 #: bookwyrm/templates/groups/members.html:16 bookwyrm/templates/layout.html:45
#: bookwyrm/templates/layout.html:45 bookwyrm/templates/lists/list.html:217 #: bookwyrm/templates/layout.html:46 bookwyrm/templates/lists/list.html:217
#: bookwyrm/templates/search/layout.html:5 #: bookwyrm/templates/search/layout.html:5
#: bookwyrm/templates/search/layout.html:10 #: bookwyrm/templates/search/layout.html:10
msgid "Search" msgid "Search"
@ -1986,28 +2003,28 @@ msgstr ""
msgid "Welcome" msgid "Welcome"
msgstr "" msgstr ""
#: bookwyrm/templates/get_started/layout.html:22 #: bookwyrm/templates/get_started/layout.html:24
msgid "These are some first steps to get you started." msgid "These are some first steps to get you started."
msgstr "" msgstr ""
#: bookwyrm/templates/get_started/layout.html:36 #: bookwyrm/templates/get_started/layout.html:38
#: bookwyrm/templates/get_started/profile.html:6 #: bookwyrm/templates/get_started/profile.html:6
msgid "Create your profile" msgid "Create your profile"
msgstr "" msgstr ""
#: bookwyrm/templates/get_started/layout.html:40 #: bookwyrm/templates/get_started/layout.html:42
msgid "Add books" msgid "Add books"
msgstr "" msgstr ""
#: bookwyrm/templates/get_started/layout.html:44 #: bookwyrm/templates/get_started/layout.html:46
msgid "Find friends" msgid "Find friends"
msgstr "" msgstr ""
#: bookwyrm/templates/get_started/layout.html:50 #: bookwyrm/templates/get_started/layout.html:52
msgid "Skip this step" msgid "Skip this step"
msgstr "" msgstr ""
#: bookwyrm/templates/get_started/layout.html:54 #: bookwyrm/templates/get_started/layout.html:56
#: bookwyrm/templates/guided_tour/group.html:101 #: bookwyrm/templates/guided_tour/group.html:101
msgid "Finish" msgid "Finish"
msgstr "" msgstr ""
@ -2230,7 +2247,7 @@ msgstr ""
#: bookwyrm/templates/guided_tour/user_profile.html:72 #: bookwyrm/templates/guided_tour/user_profile.html:72
#: bookwyrm/templates/guided_tour/user_profile.html:95 #: bookwyrm/templates/guided_tour/user_profile.html:95
#: bookwyrm/templates/guided_tour/user_profile.html:118 #: bookwyrm/templates/guided_tour/user_profile.html:118
#: bookwyrm/templates/snippets/pagination.html:23 #: bookwyrm/templates/snippets/pagination.html:30
msgid "Next" msgid "Next"
msgstr "" msgstr ""
@ -2434,8 +2451,8 @@ msgid "The bell will light up when you have a new notification. When it does, cl
msgstr "" msgstr ""
#: bookwyrm/templates/guided_tour/home.html:177 #: bookwyrm/templates/guided_tour/home.html:177
#: bookwyrm/templates/layout.html:75 bookwyrm/templates/layout.html:107 #: bookwyrm/templates/layout.html:75 bookwyrm/templates/layout.html:106
#: bookwyrm/templates/layout.html:108 #: bookwyrm/templates/layout.html:107
#: bookwyrm/templates/notifications/notifications_page.html:5 #: bookwyrm/templates/notifications/notifications_page.html:5
#: bookwyrm/templates/notifications/notifications_page.html:10 #: bookwyrm/templates/notifications/notifications_page.html:10
msgid "Notifications" msgid "Notifications"
@ -2680,6 +2697,15 @@ msgstr ""
msgid "Find a book" msgid "Find a book"
msgstr "" msgstr ""
#: bookwyrm/templates/hashtag.html:12
#, python-format
msgid "See tagged statuses in the local %(site_name)s community"
msgstr ""
#: bookwyrm/templates/hashtag.html:25
msgid "No activities for this hashtag yet!"
msgstr ""
#: bookwyrm/templates/import/import.html:5 #: bookwyrm/templates/import/import.html:5
#: bookwyrm/templates/import/import.html:9 #: bookwyrm/templates/import/import.html:9
#: bookwyrm/templates/shelf/shelf.html:64 #: bookwyrm/templates/shelf/shelf.html:64
@ -2799,7 +2825,7 @@ msgid "Retry Status"
msgstr "" msgstr ""
#: bookwyrm/templates/import/import_status.html:22 #: bookwyrm/templates/import/import_status.html:22
#: bookwyrm/templates/settings/celery.html:36 #: bookwyrm/templates/settings/celery.html:44
#: bookwyrm/templates/settings/imports/imports.html:6 #: bookwyrm/templates/settings/imports/imports.html:6
#: bookwyrm/templates/settings/imports/imports.html:9 #: bookwyrm/templates/settings/imports/imports.html:9
#: bookwyrm/templates/settings/layout.html:82 #: bookwyrm/templates/settings/layout.html:82
@ -3023,7 +3049,7 @@ msgid "Login"
msgstr "" msgstr ""
#: bookwyrm/templates/landing/login.html:7 #: bookwyrm/templates/landing/login.html:7
#: bookwyrm/templates/landing/login.html:36 bookwyrm/templates/layout.html:139 #: bookwyrm/templates/landing/login.html:36 bookwyrm/templates/layout.html:136
#: bookwyrm/templates/ostatus/error.html:37 #: bookwyrm/templates/ostatus/error.html:37
msgid "Log in" msgid "Log in"
msgstr "" msgstr ""
@ -3034,7 +3060,7 @@ msgstr ""
#: bookwyrm/templates/landing/login.html:21 #: bookwyrm/templates/landing/login.html:21
#: bookwyrm/templates/landing/reactivate.html:17 #: bookwyrm/templates/landing/reactivate.html:17
#: bookwyrm/templates/layout.html:130 bookwyrm/templates/ostatus/error.html:28 #: bookwyrm/templates/layout.html:127 bookwyrm/templates/ostatus/error.html:28
#: bookwyrm/templates/snippets/register_form.html:4 #: bookwyrm/templates/snippets/register_form.html:4
msgid "Username:" msgid "Username:"
msgstr "" msgstr ""
@ -3042,13 +3068,13 @@ msgstr ""
#: bookwyrm/templates/landing/login.html:27 #: bookwyrm/templates/landing/login.html:27
#: bookwyrm/templates/landing/password_reset.html:26 #: bookwyrm/templates/landing/password_reset.html:26
#: bookwyrm/templates/landing/reactivate.html:23 #: bookwyrm/templates/landing/reactivate.html:23
#: bookwyrm/templates/layout.html:134 bookwyrm/templates/ostatus/error.html:32 #: bookwyrm/templates/layout.html:131 bookwyrm/templates/ostatus/error.html:32
#: bookwyrm/templates/preferences/2fa.html:91 #: bookwyrm/templates/preferences/2fa.html:91
#: bookwyrm/templates/snippets/register_form.html:45 #: bookwyrm/templates/snippets/register_form.html:45
msgid "Password:" msgid "Password:"
msgstr "" msgstr ""
#: bookwyrm/templates/landing/login.html:39 bookwyrm/templates/layout.html:136 #: bookwyrm/templates/landing/login.html:39 bookwyrm/templates/layout.html:133
#: bookwyrm/templates/ostatus/error.html:34 #: bookwyrm/templates/ostatus/error.html:34
msgid "Forgot your password?" msgid "Forgot your password?"
msgstr "" msgstr ""
@ -3091,35 +3117,35 @@ msgstr ""
msgid "%(site_name)s search" msgid "%(site_name)s search"
msgstr "" msgstr ""
#: bookwyrm/templates/layout.html:36 #: bookwyrm/templates/layout.html:37
msgid "Search for a book, user, or list" msgid "Search for a book, user, or list"
msgstr "" msgstr ""
#: bookwyrm/templates/layout.html:51 bookwyrm/templates/layout.html:52 #: bookwyrm/templates/layout.html:52 bookwyrm/templates/layout.html:53
msgid "Scan Barcode" msgid "Scan Barcode"
msgstr "" msgstr ""
#: bookwyrm/templates/layout.html:66 #: bookwyrm/templates/layout.html:67
msgid "Main navigation menu" msgid "Main navigation menu"
msgstr "" msgstr ""
#: bookwyrm/templates/layout.html:88 #: bookwyrm/templates/layout.html:87
msgid "Feed" msgid "Feed"
msgstr "" msgstr ""
#: bookwyrm/templates/layout.html:135 bookwyrm/templates/ostatus/error.html:33 #: bookwyrm/templates/layout.html:132 bookwyrm/templates/ostatus/error.html:33
msgid "password" msgid "password"
msgstr "" msgstr ""
#: bookwyrm/templates/layout.html:147 #: bookwyrm/templates/layout.html:144
msgid "Join" msgid "Join"
msgstr "" msgstr ""
#: bookwyrm/templates/layout.html:181 #: bookwyrm/templates/layout.html:179
msgid "Successfully posted status" msgid "Successfully posted status"
msgstr "" msgstr ""
#: bookwyrm/templates/layout.html:182 #: bookwyrm/templates/layout.html:180
msgid "Error posting status" msgid "Error posting status"
msgstr "" msgstr ""
@ -3598,6 +3624,13 @@ msgstr ""
msgid "<a href=\"%(related_user_link)s\">%(related_user)s</a> and %(other_user_display_count)s others have left your group \"<a href=\"%(group_path)s\">%(group_name)s</a>\"" msgid "<a href=\"%(related_user_link)s\">%(related_user)s</a> and %(other_user_display_count)s others have left your group \"<a href=\"%(group_path)s\">%(group_name)s</a>\""
msgstr "" msgstr ""
#: bookwyrm/templates/notifications/items/link_domain.html:15
#, python-format
msgid "A new <a href=\"%(path)s\">link domain</a> needs review"
msgid_plural "%(display_count)s new <a href=\"%(path)s\">link domains</a> need moderation"
msgstr[0] ""
msgstr[1] ""
#: bookwyrm/templates/notifications/items/mention.html:20 #: bookwyrm/templates/notifications/items/mention.html:20
#, python-format #, python-format
msgid "<a href=\"%(related_user_link)s\">%(related_user)s</a> mentioned you in a <a href=\"%(related_path)s\">review of <em>%(book_title)s</em></a>" msgid "<a href=\"%(related_user_link)s\">%(related_user)s</a> mentioned you in a <a href=\"%(related_path)s\">review of <em>%(book_title)s</em></a>"
@ -4430,63 +4463,71 @@ msgid "Celery Status"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/celery.html:14 #: bookwyrm/templates/settings/celery.html:14
msgid "You can set up monitoring to check if Celery is running by querying:"
msgstr ""
#: bookwyrm/templates/settings/celery.html:22
msgid "Queues" msgid "Queues"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/celery.html:18 #: bookwyrm/templates/settings/celery.html:26
msgid "Low priority" msgid "Low priority"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/celery.html:24 #: bookwyrm/templates/settings/celery.html:32
msgid "Medium priority" msgid "Medium priority"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/celery.html:30 #: bookwyrm/templates/settings/celery.html:38
msgid "High priority" msgid "High priority"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/celery.html:46 #: bookwyrm/templates/settings/celery.html:50
msgid "Broadcasts"
msgstr ""
#: bookwyrm/templates/settings/celery.html:60
msgid "Could not connect to Redis broker" msgid "Could not connect to Redis broker"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/celery.html:54 #: bookwyrm/templates/settings/celery.html:68
msgid "Active Tasks" msgid "Active Tasks"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/celery.html:59 #: bookwyrm/templates/settings/celery.html:73
#: bookwyrm/templates/settings/imports/imports.html:113 #: bookwyrm/templates/settings/imports/imports.html:113
msgid "ID" msgid "ID"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/celery.html:60 #: bookwyrm/templates/settings/celery.html:74
msgid "Task name" msgid "Task name"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/celery.html:61 #: bookwyrm/templates/settings/celery.html:75
msgid "Run time" msgid "Run time"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/celery.html:62 #: bookwyrm/templates/settings/celery.html:76
msgid "Priority" msgid "Priority"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/celery.html:67 #: bookwyrm/templates/settings/celery.html:81
msgid "No active tasks" msgid "No active tasks"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/celery.html:85 #: bookwyrm/templates/settings/celery.html:99
msgid "Workers" msgid "Workers"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/celery.html:90 #: bookwyrm/templates/settings/celery.html:104
msgid "Uptime:" msgid "Uptime:"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/celery.html:100 #: bookwyrm/templates/settings/celery.html:114
msgid "Could not connect to Celery" msgid "Could not connect to Celery"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/celery.html:107 #: bookwyrm/templates/settings/celery.html:121
msgid "Errors" msgid "Errors"
msgstr "" msgstr ""
@ -5685,11 +5726,11 @@ msgstr ""
msgid "Instance Setup" msgid "Instance Setup"
msgstr "" msgstr ""
#: bookwyrm/templates/setup/layout.html:19 #: bookwyrm/templates/setup/layout.html:21
msgid "Installing BookWyrm" msgid "Installing BookWyrm"
msgstr "" msgstr ""
#: bookwyrm/templates/setup/layout.html:22 #: bookwyrm/templates/setup/layout.html:24
msgid "Need help?" msgid "Need help?"
msgstr "" msgstr ""
@ -5781,7 +5822,7 @@ msgid_plural "and %(remainder_count_display)s others"
msgstr[0] "" msgstr[0] ""
msgstr[1] "" msgstr[1] ""
#: bookwyrm/templates/snippets/book_cover.html:61 #: bookwyrm/templates/snippets/book_cover.html:63
msgid "No cover" msgid "No cover"
msgstr "" msgstr ""
@ -5881,6 +5922,10 @@ msgstr ""
msgid "At percent:" msgid "At percent:"
msgstr "" msgstr ""
#: bookwyrm/templates/snippets/create_status/quotation.html:69
msgid "to"
msgstr ""
#: bookwyrm/templates/snippets/create_status/review.html:24 #: bookwyrm/templates/snippets/create_status/review.html:24
#, python-format #, python-format
msgid "Your review of '%(book_title)s'" msgid "Your review of '%(book_title)s'"
@ -6059,10 +6104,18 @@ msgstr ""
msgid "page %(page)s" msgid "page %(page)s"
msgstr "" msgstr ""
#: bookwyrm/templates/snippets/pagination.html:12 #: bookwyrm/templates/snippets/pagination.html:13
msgid "Newer"
msgstr ""
#: bookwyrm/templates/snippets/pagination.html:15
msgid "Previous" msgid "Previous"
msgstr "" msgstr ""
#: bookwyrm/templates/snippets/pagination.html:28
msgid "Older"
msgstr ""
#: bookwyrm/templates/snippets/privacy-icons.html:12 #: bookwyrm/templates/snippets/privacy-icons.html:12
msgid "Followers-only" msgid "Followers-only"
msgstr "" msgstr ""
@ -6191,19 +6244,29 @@ msgstr ""
#: bookwyrm/templates/snippets/status/content_status.html:102 #: bookwyrm/templates/snippets/status/content_status.html:102
#, python-format #, python-format
msgid "(Page %(page)s)" msgid "(Page %(page)s"
msgstr ""
#: bookwyrm/templates/snippets/status/content_status.html:102
#, python-format
msgid "%(endpage)s"
msgstr "" msgstr ""
#: bookwyrm/templates/snippets/status/content_status.html:104 #: bookwyrm/templates/snippets/status/content_status.html:104
#, python-format #, python-format
msgid "(%(percent)s%%)" msgid "(%(percent)s%%"
msgstr ""
#: bookwyrm/templates/snippets/status/content_status.html:104
#, python-format
msgid " - %(endpercent)s%%"
msgstr "" msgstr ""
#: bookwyrm/templates/snippets/status/content_status.html:127 #: bookwyrm/templates/snippets/status/content_status.html:127
msgid "Open image in new window" msgid "Open image in new window"
msgstr "" msgstr ""
#: bookwyrm/templates/snippets/status/content_status.html:146 #: bookwyrm/templates/snippets/status/content_status.html:148
msgid "Hide status" msgid "Hide status"
msgstr "" msgstr ""

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: bookwyrm\n" "Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-11 22:46+0000\n" "POT-Creation-Date: 2023-01-30 08:21+0000\n"
"PO-Revision-Date: 2023-01-15 12:10\n" "PO-Revision-Date: 2023-01-30 17:35\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n" "Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Spanish\n" "Language-Team: Spanish\n"
"Language: es\n" "Language: es\n"
@ -256,14 +256,14 @@ msgstr "Seguidores"
msgid "Private" msgid "Private"
msgstr "Privado" msgstr "Privado"
#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:157 #: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:168
#: bookwyrm/templates/settings/imports/imports.html:67 #: bookwyrm/templates/settings/imports/imports.html:98
#: bookwyrm/templates/settings/users/user_admin.html:81 #: bookwyrm/templates/settings/users/user_admin.html:81
#: bookwyrm/templates/settings/users/user_info.html:28 #: bookwyrm/templates/settings/users/user_info.html:28
msgid "Active" msgid "Active"
msgstr "Activo" msgstr "Activo"
#: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:155 #: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:166
msgid "Complete" msgid "Complete"
msgstr "Completado" msgstr "Completado"
@ -316,19 +316,19 @@ msgstr "Citas"
msgid "Everything else" msgid "Everything else"
msgstr "Todo lo demás" msgstr "Todo lo demás"
#: bookwyrm/settings.py:214 #: bookwyrm/settings.py:217
msgid "Home Timeline" msgid "Home Timeline"
msgstr "Línea de tiempo principal" msgstr "Línea de tiempo principal"
#: bookwyrm/settings.py:214 #: bookwyrm/settings.py:217
msgid "Home" msgid "Home"
msgstr "Inicio" msgstr "Inicio"
#: bookwyrm/settings.py:215 #: bookwyrm/settings.py:218
msgid "Books Timeline" msgid "Books Timeline"
msgstr "Línea temporal de libros" msgstr "Línea temporal de libros"
#: bookwyrm/settings.py:215 #: bookwyrm/settings.py:218
#: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/guided_tour/user_profile.html:101
#: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:22
#: bookwyrm/templates/search/layout.html:43 #: bookwyrm/templates/search/layout.html:43
@ -336,75 +336,75 @@ msgstr "Línea temporal de libros"
msgid "Books" msgid "Books"
msgstr "Libros" msgstr "Libros"
#: bookwyrm/settings.py:287 #: bookwyrm/settings.py:290
msgid "English" msgid "English"
msgstr "English (Inglés)" msgstr "English (Inglés)"
#: bookwyrm/settings.py:288 #: bookwyrm/settings.py:291
msgid "Català (Catalan)" msgid "Català (Catalan)"
msgstr "Català (Catalán)" msgstr "Català (Catalán)"
#: bookwyrm/settings.py:289 #: bookwyrm/settings.py:292
msgid "Deutsch (German)" msgid "Deutsch (German)"
msgstr "Deutsch (Alemán)" msgstr "Deutsch (Alemán)"
#: bookwyrm/settings.py:290 #: bookwyrm/settings.py:293
msgid "Español (Spanish)" msgid "Español (Spanish)"
msgstr "Español" msgstr "Español"
#: bookwyrm/settings.py:291 #: bookwyrm/settings.py:294
msgid "Euskara (Basque)" msgid "Euskara (Basque)"
msgstr "Euskera" msgstr "Euskera"
#: bookwyrm/settings.py:292 #: bookwyrm/settings.py:295
msgid "Galego (Galician)" msgid "Galego (Galician)"
msgstr "Galego (gallego)" msgstr "Galego (gallego)"
#: bookwyrm/settings.py:293 #: bookwyrm/settings.py:296
msgid "Italiano (Italian)" msgid "Italiano (Italian)"
msgstr "Italiano" msgstr "Italiano"
#: bookwyrm/settings.py:294 #: bookwyrm/settings.py:297
msgid "Suomi (Finnish)" msgid "Suomi (Finnish)"
msgstr "Suomi (finés)" msgstr "Suomi (finés)"
#: bookwyrm/settings.py:295 #: bookwyrm/settings.py:298
msgid "Français (French)" msgid "Français (French)"
msgstr "Français (Francés)" msgstr "Français (Francés)"
#: bookwyrm/settings.py:296 #: bookwyrm/settings.py:299
msgid "Lietuvių (Lithuanian)" msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (Lituano)" msgstr "Lietuvių (Lituano)"
#: bookwyrm/settings.py:297 #: bookwyrm/settings.py:300
msgid "Norsk (Norwegian)" msgid "Norsk (Norwegian)"
msgstr "Norsk (noruego)" msgstr "Norsk (noruego)"
#: bookwyrm/settings.py:298 #: bookwyrm/settings.py:301
msgid "Polski (Polish)" msgid "Polski (Polish)"
msgstr "Polski (Polaco)" msgstr "Polski (Polaco)"
#: bookwyrm/settings.py:299 #: bookwyrm/settings.py:302
msgid "Português do Brasil (Brazilian Portuguese)" msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português do Brasil (portugués brasileño)" msgstr "Português do Brasil (portugués brasileño)"
#: bookwyrm/settings.py:300 #: bookwyrm/settings.py:303
msgid "Português Europeu (European Portuguese)" msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Portugués europeo)" msgstr "Português Europeu (Portugués europeo)"
#: bookwyrm/settings.py:301 #: bookwyrm/settings.py:304
msgid "Română (Romanian)" msgid "Română (Romanian)"
msgstr "Română (rumano)" msgstr "Română (rumano)"
#: bookwyrm/settings.py:302 #: bookwyrm/settings.py:305
msgid "Svenska (Swedish)" msgid "Svenska (Swedish)"
msgstr "Svenska (Sueco)" msgstr "Svenska (Sueco)"
#: bookwyrm/settings.py:303 #: bookwyrm/settings.py:306
msgid "简体中文 (Simplified Chinese)" msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (Chino simplificado)" msgstr "简体中文 (Chino simplificado)"
#: bookwyrm/settings.py:304 #: bookwyrm/settings.py:307
msgid "繁體中文 (Traditional Chinese)" msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (Chino tradicional)" msgstr "繁體中文 (Chino tradicional)"
@ -847,10 +847,10 @@ msgstr "ISNI:"
#: bookwyrm/templates/settings/announcements/edit_announcement.html:120 #: bookwyrm/templates/settings/announcements/edit_announcement.html:120
#: bookwyrm/templates/settings/federation/edit_instance.html:98 #: bookwyrm/templates/settings/federation/edit_instance.html:98
#: bookwyrm/templates/settings/federation/instance.html:105 #: bookwyrm/templates/settings/federation/instance.html:105
#: bookwyrm/templates/settings/registration.html:79 #: bookwyrm/templates/settings/registration.html:96
#: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/registration_limited.html:76
#: bookwyrm/templates/settings/site.html:144 #: bookwyrm/templates/settings/site.html:144
#: bookwyrm/templates/settings/users/user_moderation_actions.html:69 #: bookwyrm/templates/settings/users/user_moderation_actions.html:75
#: bookwyrm/templates/shelf/form.html:25 #: bookwyrm/templates/shelf/form.html:25
#: bookwyrm/templates/snippets/reading_modals/layout.html:18 #: bookwyrm/templates/snippets/reading_modals/layout.html:18
msgid "Save" msgid "Save"
@ -1160,7 +1160,7 @@ msgstr "Esta es una obra nueva"
#: bookwyrm/templates/guided_tour/user_profile.html:89 #: bookwyrm/templates/guided_tour/user_profile.html:89
#: bookwyrm/templates/guided_tour/user_profile.html:112 #: bookwyrm/templates/guided_tour/user_profile.html:112
#: bookwyrm/templates/guided_tour/user_profile.html:135 #: bookwyrm/templates/guided_tour/user_profile.html:135
#: bookwyrm/templates/user_menu.html:18 #: bookwyrm/templates/user/user.html:87 bookwyrm/templates/user_menu.html:18
msgid "Back" msgid "Back"
msgstr "Volver" msgstr "Volver"
@ -1372,7 +1372,7 @@ msgid "Domain"
msgstr "Dominio" msgstr "Dominio"
#: bookwyrm/templates/book/file_links/edit_links.html:36 #: bookwyrm/templates/book/file_links/edit_links.html:36
#: bookwyrm/templates/import/import.html:122 #: bookwyrm/templates/import/import.html:133
#: bookwyrm/templates/import/import_status.html:134 #: bookwyrm/templates/import/import_status.html:134
#: bookwyrm/templates/settings/announcements/announcements.html:37 #: bookwyrm/templates/settings/announcements/announcements.html:37
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:48 #: bookwyrm/templates/settings/invites/manage_invite_requests.html:48
@ -1385,7 +1385,7 @@ msgstr "Estado"
#: bookwyrm/templates/book/file_links/edit_links.html:37 #: bookwyrm/templates/book/file_links/edit_links.html:37
#: bookwyrm/templates/settings/announcements/announcements.html:41 #: bookwyrm/templates/settings/announcements/announcements.html:41
#: bookwyrm/templates/settings/federation/instance.html:112 #: bookwyrm/templates/settings/federation/instance.html:112
#: bookwyrm/templates/settings/imports/imports.html:110 #: bookwyrm/templates/settings/imports/imports.html:141
#: bookwyrm/templates/settings/reports/report_links_table.html:6 #: bookwyrm/templates/settings/reports/report_links_table.html:6
#: bookwyrm/templates/settings/themes.html:99 #: bookwyrm/templates/settings/themes.html:99
msgid "Actions" msgid "Actions"
@ -1905,13 +1905,13 @@ msgid "Add to your books"
msgstr "Añadir a tus libros" msgstr "Añadir a tus libros"
#: bookwyrm/templates/get_started/book_preview.html:10 #: bookwyrm/templates/get_started/book_preview.html:10
#: bookwyrm/templates/shelf/shelf.html:86 bookwyrm/templates/user/user.html:33 #: bookwyrm/templates/shelf/shelf.html:86 bookwyrm/templates/user/user.html:37
#: bookwyrm/templatetags/shelf_tags.py:48 #: bookwyrm/templatetags/shelf_tags.py:48
msgid "To Read" msgid "To Read"
msgstr "Para leer" msgstr "Para leer"
#: bookwyrm/templates/get_started/book_preview.html:11 #: bookwyrm/templates/get_started/book_preview.html:11
#: bookwyrm/templates/shelf/shelf.html:87 bookwyrm/templates/user/user.html:34 #: bookwyrm/templates/shelf/shelf.html:87 bookwyrm/templates/user/user.html:38
#: bookwyrm/templatetags/shelf_tags.py:50 #: bookwyrm/templatetags/shelf_tags.py:50
msgid "Currently Reading" msgid "Currently Reading"
msgstr "Leyendo actualmente" msgstr "Leyendo actualmente"
@ -1921,12 +1921,12 @@ msgstr "Leyendo actualmente"
#: bookwyrm/templates/snippets/shelf_selector.html:46 #: bookwyrm/templates/snippets/shelf_selector.html:46
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24 #: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12 #: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12
#: bookwyrm/templates/user/user.html:35 bookwyrm/templatetags/shelf_tags.py:52 #: bookwyrm/templates/user/user.html:39 bookwyrm/templatetags/shelf_tags.py:52
msgid "Read" msgid "Read"
msgstr "Leído" msgstr "Leído"
#: bookwyrm/templates/get_started/book_preview.html:13 #: bookwyrm/templates/get_started/book_preview.html:13
#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:36 #: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:40
msgid "Stopped Reading" msgid "Stopped Reading"
msgstr "Lectura interrumpida" msgstr "Lectura interrumpida"
@ -2642,7 +2642,7 @@ msgid "This is your user profile. All your latest activities will be listed here
msgstr "Este es tu perfil de usuario. Todas tus últimas actividades aparecerán aquí. Otros usuarios de Bookwyrm también pueden ver partes de esta página (lo que ellos pueden ver depende de tu configuración de privacidad)." msgstr "Este es tu perfil de usuario. Todas tus últimas actividades aparecerán aquí. Otros usuarios de Bookwyrm también pueden ver partes de esta página (lo que ellos pueden ver depende de tu configuración de privacidad)."
#: bookwyrm/templates/guided_tour/user_profile.html:11 #: bookwyrm/templates/guided_tour/user_profile.html:11
#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:10 #: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:14
msgid "User Profile" msgid "User Profile"
msgstr "Perfil de usuario" msgstr "Perfil de usuario"
@ -2689,85 +2689,100 @@ msgstr "Importar libros"
msgid "Not a valid CSV file" msgid "Not a valid CSV file"
msgstr "No es un archivo CSV válido" msgstr "No es un archivo CSV válido"
#: bookwyrm/templates/import/import.html:22 #: bookwyrm/templates/import/import.html:20
#, python-format
msgid "Currently you are allowed to import %(import_size_limit)s books every %(import_limit_reset)s days."
msgstr ""
#: bookwyrm/templates/import/import.html:21
#, python-format
msgid "You have %(allowed_imports)s left."
msgstr ""
#: bookwyrm/templates/import/import.html:28
#, python-format #, python-format
msgid "On average, recent imports have taken %(hours)s hours." msgid "On average, recent imports have taken %(hours)s hours."
msgstr "En promedio, las importaciones recientes han tomado %(hours)s horas." msgstr "En promedio, las importaciones recientes han tomado %(hours)s horas."
#: bookwyrm/templates/import/import.html:26 #: bookwyrm/templates/import/import.html:32
#, python-format #, python-format
msgid "On average, recent imports have taken %(minutes)s minutes." msgid "On average, recent imports have taken %(minutes)s minutes."
msgstr "En promedio, las importaciones recientes han tomado %(minutes)s minutos." msgstr "En promedio, las importaciones recientes han tomado %(minutes)s minutos."
#: bookwyrm/templates/import/import.html:41 #: bookwyrm/templates/import/import.html:47
msgid "Data source:" msgid "Data source:"
msgstr "Fuente de datos:" msgstr "Fuente de datos:"
#: bookwyrm/templates/import/import.html:47 #: bookwyrm/templates/import/import.html:53
msgid "Goodreads (CSV)" msgid "Goodreads (CSV)"
msgstr "Goodreads (CSV)" msgstr "Goodreads (CSV)"
#: bookwyrm/templates/import/import.html:50 #: bookwyrm/templates/import/import.html:56
msgid "Storygraph (CSV)" msgid "Storygraph (CSV)"
msgstr "Storygraph (CSV)" msgstr "Storygraph (CSV)"
#: bookwyrm/templates/import/import.html:53 #: bookwyrm/templates/import/import.html:59
msgid "LibraryThing (TSV)" msgid "LibraryThing (TSV)"
msgstr "LibraryThing (TSV)" msgstr "LibraryThing (TSV)"
#: bookwyrm/templates/import/import.html:56 #: bookwyrm/templates/import/import.html:62
msgid "OpenLibrary (CSV)" msgid "OpenLibrary (CSV)"
msgstr "OpenLibrary (CSV)" msgstr "OpenLibrary (CSV)"
#: bookwyrm/templates/import/import.html:59 #: bookwyrm/templates/import/import.html:65
msgid "Calibre (CSV)" msgid "Calibre (CSV)"
msgstr "Calibre (CSV)" msgstr "Calibre (CSV)"
#: bookwyrm/templates/import/import.html:65 #: bookwyrm/templates/import/import.html:71
msgid "You can download your Goodreads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Import/Export page</a> of your Goodreads account." msgid "You can download your Goodreads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Import/Export page</a> of your Goodreads account."
msgstr "Puede descargar tus datos de Goodreads desde la <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">página de Importación/Exportación</a> de tu cuenta de Goodreads." msgstr "Puede descargar tus datos de Goodreads desde la <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">página de Importación/Exportación</a> de tu cuenta de Goodreads."
#: bookwyrm/templates/import/import.html:74 #: bookwyrm/templates/import/import.html:80
msgid "Data file:" msgid "Data file:"
msgstr "Archivo de datos:" msgstr "Archivo de datos:"
#: bookwyrm/templates/import/import.html:82 #: bookwyrm/templates/import/import.html:88
msgid "Include reviews" msgid "Include reviews"
msgstr "Incluir reseñas" msgstr "Incluir reseñas"
#: bookwyrm/templates/import/import.html:87 #: bookwyrm/templates/import/import.html:93
msgid "Privacy setting for imported reviews:" msgid "Privacy setting for imported reviews:"
msgstr "Configuración de privacidad para las reseñas importadas:" msgstr "Configuración de privacidad para las reseñas importadas:"
#: bookwyrm/templates/import/import.html:93 #: bookwyrm/templates/import/import.html:100
#: bookwyrm/templates/import/import.html:102
#: bookwyrm/templates/preferences/layout.html:35 #: bookwyrm/templates/preferences/layout.html:35
#: bookwyrm/templates/settings/federation/instance_blocklist.html:78 #: bookwyrm/templates/settings/federation/instance_blocklist.html:78
msgid "Import" msgid "Import"
msgstr "Importar" msgstr "Importar"
#: bookwyrm/templates/import/import.html:101 #: bookwyrm/templates/import/import.html:103
msgid "You've reached the import limit."
msgstr ""
#: bookwyrm/templates/import/import.html:112
msgid "Imports are temporarily disabled; thank you for your patience." msgid "Imports are temporarily disabled; thank you for your patience."
msgstr "Las importaciones se han deshabilitado temporalmente, gracias por tu paciencia." msgstr "Las importaciones se han deshabilitado temporalmente, gracias por tu paciencia."
#: bookwyrm/templates/import/import.html:108 #: bookwyrm/templates/import/import.html:119
msgid "Recent Imports" msgid "Recent Imports"
msgstr "Importaciones recientes" msgstr "Importaciones recientes"
#: bookwyrm/templates/import/import.html:113 #: bookwyrm/templates/import/import.html:124
#: bookwyrm/templates/settings/imports/imports.html:89 #: bookwyrm/templates/settings/imports/imports.html:120
msgid "Date Created" msgid "Date Created"
msgstr "Fecha de Creación" msgstr "Fecha de Creación"
#: bookwyrm/templates/import/import.html:116 #: bookwyrm/templates/import/import.html:127
msgid "Last Updated" msgid "Last Updated"
msgstr "Última Actualización" msgstr "Última Actualización"
#: bookwyrm/templates/import/import.html:119 #: bookwyrm/templates/import/import.html:130
#: bookwyrm/templates/settings/imports/imports.html:98 #: bookwyrm/templates/settings/imports/imports.html:129
msgid "Items" msgid "Items"
msgstr "Elementos" msgstr "Elementos"
#: bookwyrm/templates/import/import.html:128 #: bookwyrm/templates/import/import.html:139
msgid "No recent imports" msgid "No recent imports"
msgstr "No hay ninguna importación reciente" msgstr "No hay ninguna importación reciente"
@ -2783,6 +2798,7 @@ msgid "Retry Status"
msgstr "Estado del Reintento" msgstr "Estado del Reintento"
#: bookwyrm/templates/import/import_status.html:22 #: bookwyrm/templates/import/import_status.html:22
#: bookwyrm/templates/settings/celery.html:36
#: bookwyrm/templates/settings/imports/imports.html:6 #: bookwyrm/templates/settings/imports/imports.html:6
#: bookwyrm/templates/settings/imports/imports.html:9 #: bookwyrm/templates/settings/imports/imports.html:9
#: bookwyrm/templates/settings/layout.html:82 #: bookwyrm/templates/settings/layout.html:82
@ -2802,7 +2818,7 @@ msgid "Refresh"
msgstr "Refrescar" msgstr "Refrescar"
#: bookwyrm/templates/import/import_status.html:72 #: bookwyrm/templates/import/import_status.html:72
#: bookwyrm/templates/settings/imports/imports.html:130 #: bookwyrm/templates/settings/imports/imports.html:161
msgid "Stop import" msgid "Stop import"
msgstr "Parar la importación" msgstr "Parar la importación"
@ -2920,7 +2936,7 @@ msgid "Reject"
msgstr "Rechazar" msgstr "Rechazar"
#: bookwyrm/templates/import/troubleshoot.html:7 #: bookwyrm/templates/import/troubleshoot.html:7
#: bookwyrm/templates/settings/imports/imports.html:107 #: bookwyrm/templates/settings/imports/imports.html:138
msgid "Failed items" msgid "Failed items"
msgstr "Elementos fallidos" msgstr "Elementos fallidos"
@ -3171,7 +3187,7 @@ msgid "Delete this list?"
msgstr "¿Eliminar esta lista?" msgstr "¿Eliminar esta lista?"
#: bookwyrm/templates/lists/edit_form.html:5 #: bookwyrm/templates/lists/edit_form.html:5
#: bookwyrm/templates/lists/layout.html:18 #: bookwyrm/templates/lists/layout.html:23
msgid "Edit List" msgid "Edit List"
msgstr "Editar lista" msgstr "Editar lista"
@ -4429,48 +4445,48 @@ msgstr "Prioridad media"
msgid "High priority" msgid "High priority"
msgstr "Prioridad alta" msgstr "Prioridad alta"
#: bookwyrm/templates/settings/celery.html:40 #: bookwyrm/templates/settings/celery.html:46
msgid "Could not connect to Redis broker" msgid "Could not connect to Redis broker"
msgstr "No se ha podido conectar al broker de Redis" msgstr "No se ha podido conectar al broker de Redis"
#: bookwyrm/templates/settings/celery.html:48 #: bookwyrm/templates/settings/celery.html:54
msgid "Active Tasks" msgid "Active Tasks"
msgstr "Tareas activas" msgstr "Tareas activas"
#: bookwyrm/templates/settings/celery.html:53 #: bookwyrm/templates/settings/celery.html:59
#: bookwyrm/templates/settings/imports/imports.html:82 #: bookwyrm/templates/settings/imports/imports.html:113
msgid "ID" msgid "ID"
msgstr "ID" msgstr "ID"
#: bookwyrm/templates/settings/celery.html:54 #: bookwyrm/templates/settings/celery.html:60
msgid "Task name" msgid "Task name"
msgstr "Nombre de tarea" msgstr "Nombre de tarea"
#: bookwyrm/templates/settings/celery.html:55 #: bookwyrm/templates/settings/celery.html:61
msgid "Run time" msgid "Run time"
msgstr "Tiempo de ejecución" msgstr "Tiempo de ejecución"
#: bookwyrm/templates/settings/celery.html:56 #: bookwyrm/templates/settings/celery.html:62
msgid "Priority" msgid "Priority"
msgstr "Prioridad" msgstr "Prioridad"
#: bookwyrm/templates/settings/celery.html:61 #: bookwyrm/templates/settings/celery.html:67
msgid "No active tasks" msgid "No active tasks"
msgstr "Sin tareas activas" msgstr "Sin tareas activas"
#: bookwyrm/templates/settings/celery.html:79 #: bookwyrm/templates/settings/celery.html:85
msgid "Workers" msgid "Workers"
msgstr "Trabajadores" msgstr "Trabajadores"
#: bookwyrm/templates/settings/celery.html:84 #: bookwyrm/templates/settings/celery.html:90
msgid "Uptime:" msgid "Uptime:"
msgstr "Tiempo ejecutándose:" msgstr "Tiempo ejecutándose:"
#: bookwyrm/templates/settings/celery.html:94 #: bookwyrm/templates/settings/celery.html:100
msgid "Could not connect to Celery" msgid "Could not connect to Celery"
msgstr "No se puede conectar a Celery" msgstr "No se puede conectar a Celery"
#: bookwyrm/templates/settings/celery.html:101 #: bookwyrm/templates/settings/celery.html:107
msgid "Errors" msgid "Errors"
msgstr "Errores" msgstr "Errores"
@ -4850,27 +4866,55 @@ msgstr "Los usuarios actualmente no pueden iniciar nuevas importaciones"
msgid "Enable imports" msgid "Enable imports"
msgstr "Habilitar importaciones" msgstr "Habilitar importaciones"
#: bookwyrm/templates/settings/imports/imports.html:71 #: bookwyrm/templates/settings/imports/imports.html:63
msgid "Limit the amount of imports"
msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:74
msgid "Some users might try to import a large number of books, which you want to limit."
msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:75
msgid "Set the value to 0 to not enforce any limit."
msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:78
msgid "Set import limit to"
msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:80
msgid "books every"
msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:82
msgid "days."
msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:86
msgid "Set limit"
msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:102
msgid "Completed" msgid "Completed"
msgstr "Completado" msgstr "Completado"
#: bookwyrm/templates/settings/imports/imports.html:85 #: bookwyrm/templates/settings/imports/imports.html:116
msgid "User" msgid "User"
msgstr "Usuario" msgstr "Usuario"
#: bookwyrm/templates/settings/imports/imports.html:94 #: bookwyrm/templates/settings/imports/imports.html:125
msgid "Date Updated" msgid "Date Updated"
msgstr "Fecha Actualizada" msgstr "Fecha Actualizada"
#: bookwyrm/templates/settings/imports/imports.html:101 #: bookwyrm/templates/settings/imports/imports.html:132
msgid "Pending items" msgid "Pending items"
msgstr "Elementos pendientes" msgstr "Elementos pendientes"
#: bookwyrm/templates/settings/imports/imports.html:104 #: bookwyrm/templates/settings/imports/imports.html:135
msgid "Successful items" msgid "Successful items"
msgstr "Importaciones exitosas" msgstr "Importaciones exitosas"
#: bookwyrm/templates/settings/imports/imports.html:139 #: bookwyrm/templates/settings/imports/imports.html:170
msgid "No matching imports found." msgid "No matching imports found."
msgstr "No se han encontrado importaciones coincidentes." msgstr "No se han encontrado importaciones coincidentes."
@ -5131,34 +5175,38 @@ msgstr "No se ha podido guardar la configuración."
msgid "Allow registration" msgid "Allow registration"
msgstr "Permitir registración" msgstr "Permitir registración"
#: bookwyrm/templates/settings/registration.html:44 #: bookwyrm/templates/settings/registration.html:43
msgid "Default access level:"
msgstr ""
#: bookwyrm/templates/settings/registration.html:61
msgid "Require users to confirm email address" msgid "Require users to confirm email address"
msgstr "Requerir a usuarios a confirmar dirección de correo electrónico" msgstr "Requerir a usuarios a confirmar dirección de correo electrónico"
#: bookwyrm/templates/settings/registration.html:46 #: bookwyrm/templates/settings/registration.html:63
msgid "(Recommended if registration is open)" msgid "(Recommended if registration is open)"
msgstr "(Recomendado si la registración es abierta)" msgstr "(Recomendado si la registración es abierta)"
#: bookwyrm/templates/settings/registration.html:51 #: bookwyrm/templates/settings/registration.html:68
msgid "Allow invite requests" msgid "Allow invite requests"
msgstr "Permitir solicitudes de invitación" msgstr "Permitir solicitudes de invitación"
#: bookwyrm/templates/settings/registration.html:55 #: bookwyrm/templates/settings/registration.html:72
#: bookwyrm/templates/settings/registration_limited.html:42 #: bookwyrm/templates/settings/registration_limited.html:42
msgid "Invite request text:" msgid "Invite request text:"
msgstr "Texto de solicitud de invitación:" msgstr "Texto de solicitud de invitación:"
#: bookwyrm/templates/settings/registration.html:63 #: bookwyrm/templates/settings/registration.html:80
#: bookwyrm/templates/settings/registration_limited.html:50 #: bookwyrm/templates/settings/registration_limited.html:50
msgid "Set a question for invite requests" msgid "Set a question for invite requests"
msgstr "Establece una pregunta para las solicitudes de invitación." msgstr "Establece una pregunta para las solicitudes de invitación."
#: bookwyrm/templates/settings/registration.html:68 #: bookwyrm/templates/settings/registration.html:85
#: bookwyrm/templates/settings/registration_limited.html:55 #: bookwyrm/templates/settings/registration_limited.html:55
msgid "Question:" msgid "Question:"
msgstr "Pregunta:" msgstr "Pregunta:"
#: bookwyrm/templates/settings/registration.html:73 #: bookwyrm/templates/settings/registration.html:90
#: bookwyrm/templates/settings/registration_limited.html:67 #: bookwyrm/templates/settings/registration_limited.html:67
msgid "Registration closed text:" msgid "Registration closed text:"
msgstr "Texto de registración cerrada:" msgstr "Texto de registración cerrada:"
@ -5400,7 +5448,7 @@ msgid "Remove theme"
msgstr "Quitar tema" msgstr "Quitar tema"
#: bookwyrm/templates/settings/users/delete_user_form.html:5 #: bookwyrm/templates/settings/users/delete_user_form.html:5
#: bookwyrm/templates/settings/users/user_moderation_actions.html:32 #: bookwyrm/templates/settings/users/user_moderation_actions.html:38
msgid "Permanently delete user" msgid "Permanently delete user"
msgstr "Eliminar usuario permanentemente" msgstr "Eliminar usuario permanentemente"
@ -5522,14 +5570,18 @@ msgid "User Actions"
msgstr "Acciones de usuario" msgstr "Acciones de usuario"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:21 #: bookwyrm/templates/settings/users/user_moderation_actions.html:21
msgid "Activate user"
msgstr ""
#: bookwyrm/templates/settings/users/user_moderation_actions.html:27
msgid "Suspend user" msgid "Suspend user"
msgstr "Suspender usuario" msgstr "Suspender usuario"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:26 #: bookwyrm/templates/settings/users/user_moderation_actions.html:32
msgid "Un-suspend user" msgid "Un-suspend user"
msgstr "Des-suspender usuario" msgstr "Des-suspender usuario"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:48 #: bookwyrm/templates/settings/users/user_moderation_actions.html:54
msgid "Access level:" msgid "Access level:"
msgstr "Nivel de acceso:" msgstr "Nivel de acceso:"
@ -6379,33 +6431,53 @@ msgstr "%(username)s no sigue a nadie"
msgid "No reviews or comments yet!" msgid "No reviews or comments yet!"
msgstr "¡Aún no hay reseñas o comentarios!" msgstr "¡Aún no hay reseñas o comentarios!"
#: bookwyrm/templates/user/user.html:16 #: bookwyrm/templates/user/user.html:20
msgid "Edit profile" msgid "Edit profile"
msgstr "Editar perfil" msgstr "Editar perfil"
#: bookwyrm/templates/user/user.html:38 #: bookwyrm/templates/user/user.html:42
#, python-format #, python-format
msgid "View all %(size)s" msgid "View all %(size)s"
msgstr "Ver los %(size)s" msgstr "Ver los %(size)s"
#: bookwyrm/templates/user/user.html:52 #: bookwyrm/templates/user/user.html:56
msgid "View all books" msgid "View all books"
msgstr "Ver todos los libros" msgstr "Ver todos los libros"
#: bookwyrm/templates/user/user.html:59 #: bookwyrm/templates/user/user.html:63
#, python-format #, python-format
msgid "%(current_year)s Reading Goal" msgid "%(current_year)s Reading Goal"
msgstr "Objetivo de Lectura de %(current_year)s" msgstr "Objetivo de Lectura de %(current_year)s"
#: bookwyrm/templates/user/user.html:66 #: bookwyrm/templates/user/user.html:70
msgid "User Activity" msgid "User Activity"
msgstr "Actividad del usuario" msgstr "Actividad del usuario"
#: bookwyrm/templates/user/user.html:71 #: bookwyrm/templates/user/user.html:76
msgid "Show RSS Options"
msgstr ""
#: bookwyrm/templates/user/user.html:82
msgid "RSS feed" msgid "RSS feed"
msgstr "Feed RSS" msgstr "Feed RSS"
#: bookwyrm/templates/user/user.html:83 #: bookwyrm/templates/user/user.html:98
msgid "Complete feed"
msgstr ""
#: bookwyrm/templates/user/user.html:103
msgid "Reviews only"
msgstr ""
#: bookwyrm/templates/user/user.html:108
msgid "Quotes only"
msgstr ""
#: bookwyrm/templates/user/user.html:113
msgid "Comments only"
msgstr ""
#: bookwyrm/templates/user/user.html:129
msgid "No activities yet!" msgid "No activities yet!"
msgstr "¡Aún no actividades!" msgstr "¡Aún no actividades!"
@ -6449,16 +6521,43 @@ msgstr "Cerrar sesión"
msgid "File exceeds maximum size: 10MB" msgid "File exceeds maximum size: 10MB"
msgstr "Archivo excede el tamaño máximo: 10MB" msgstr "Archivo excede el tamaño máximo: 10MB"
#: bookwyrm/templatetags/list_page_tags.py:14
#, python-format
msgid "Book List: %(name)s"
msgstr ""
#: bookwyrm/templatetags/list_page_tags.py:22
#, python-format
msgid "%(num)d book - by %(user)s"
msgid_plural "%(num)d books - by %(user)s"
msgstr[0] ""
msgstr[1] ""
#: bookwyrm/templatetags/utilities.py:39 #: bookwyrm/templatetags/utilities.py:39
#, python-format #, python-format
msgid "%(title)s: %(subtitle)s" msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s"
#: bookwyrm/views/rss_feed.py:34 #: bookwyrm/views/rss_feed.py:35
#, python-brace-format #, python-brace-format
msgid "Status updates from {obj.display_name}" msgid "Status updates from {obj.display_name}"
msgstr "Actualizaciones de status de {obj.display_name}" msgstr "Actualizaciones de status de {obj.display_name}"
#: bookwyrm/views/rss_feed.py:72
#, python-brace-format
msgid "Reviews from {obj.display_name}"
msgstr ""
#: bookwyrm/views/rss_feed.py:110
#, python-brace-format
msgid "Quotes from {obj.display_name}"
msgstr ""
#: bookwyrm/views/rss_feed.py:148
#, python-brace-format
msgid "Comments from {obj.display_name}"
msgstr ""
#: bookwyrm/views/updates.py:45 #: bookwyrm/views/updates.py:45
#, python-format #, python-format
msgid "Load %(count)d unread status" msgid "Load %(count)d unread status"

Binary file not shown.

File diff suppressed because it is too large Load diff

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: bookwyrm\n" "Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-11 22:46+0000\n" "POT-Creation-Date: 2023-01-30 08:21+0000\n"
"PO-Revision-Date: 2023-01-12 17:09\n" "PO-Revision-Date: 2023-01-30 17:35\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n" "Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Finnish\n" "Language-Team: Finnish\n"
"Language: fi\n" "Language: fi\n"
@ -256,14 +256,14 @@ msgstr "Seuraajat"
msgid "Private" msgid "Private"
msgstr "Yksityinen" msgstr "Yksityinen"
#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:157 #: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:168
#: bookwyrm/templates/settings/imports/imports.html:67 #: bookwyrm/templates/settings/imports/imports.html:98
#: bookwyrm/templates/settings/users/user_admin.html:81 #: bookwyrm/templates/settings/users/user_admin.html:81
#: bookwyrm/templates/settings/users/user_info.html:28 #: bookwyrm/templates/settings/users/user_info.html:28
msgid "Active" msgid "Active"
msgstr "Aktiivinen" msgstr "Aktiivinen"
#: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:155 #: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:166
msgid "Complete" msgid "Complete"
msgstr "Valmis" msgstr "Valmis"
@ -316,19 +316,19 @@ msgstr "Lainaukset"
msgid "Everything else" msgid "Everything else"
msgstr "Muut" msgstr "Muut"
#: bookwyrm/settings.py:214 #: bookwyrm/settings.py:217
msgid "Home Timeline" msgid "Home Timeline"
msgstr "Oma aikajana" msgstr "Oma aikajana"
#: bookwyrm/settings.py:214 #: bookwyrm/settings.py:217
msgid "Home" msgid "Home"
msgstr "Etusivu" msgstr "Etusivu"
#: bookwyrm/settings.py:215 #: bookwyrm/settings.py:218
msgid "Books Timeline" msgid "Books Timeline"
msgstr "Kirjavirta" msgstr "Kirjavirta"
#: bookwyrm/settings.py:215 #: bookwyrm/settings.py:218
#: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/guided_tour/user_profile.html:101
#: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:22
#: bookwyrm/templates/search/layout.html:43 #: bookwyrm/templates/search/layout.html:43
@ -336,75 +336,75 @@ msgstr "Kirjavirta"
msgid "Books" msgid "Books"
msgstr "Kirjat" msgstr "Kirjat"
#: bookwyrm/settings.py:287 #: bookwyrm/settings.py:290
msgid "English" msgid "English"
msgstr "English (englanti)" msgstr "English (englanti)"
#: bookwyrm/settings.py:288 #: bookwyrm/settings.py:291
msgid "Català (Catalan)" msgid "Català (Catalan)"
msgstr "Català (katalaani)" msgstr "Català (katalaani)"
#: bookwyrm/settings.py:289 #: bookwyrm/settings.py:292
msgid "Deutsch (German)" msgid "Deutsch (German)"
msgstr "Deutsch (saksa)" msgstr "Deutsch (saksa)"
#: bookwyrm/settings.py:290 #: bookwyrm/settings.py:293
msgid "Español (Spanish)" msgid "Español (Spanish)"
msgstr "Español (espanja)" msgstr "Español (espanja)"
#: bookwyrm/settings.py:291 #: bookwyrm/settings.py:294
msgid "Euskara (Basque)" msgid "Euskara (Basque)"
msgstr "Euskara (baski)" msgstr "Euskara (baski)"
#: bookwyrm/settings.py:292 #: bookwyrm/settings.py:295
msgid "Galego (Galician)" msgid "Galego (Galician)"
msgstr "Galego (galego)" msgstr "Galego (galego)"
#: bookwyrm/settings.py:293 #: bookwyrm/settings.py:296
msgid "Italiano (Italian)" msgid "Italiano (Italian)"
msgstr "Italiano (italia)" msgstr "Italiano (italia)"
#: bookwyrm/settings.py:294 #: bookwyrm/settings.py:297
msgid "Suomi (Finnish)" msgid "Suomi (Finnish)"
msgstr "suomi" msgstr "suomi"
#: bookwyrm/settings.py:295 #: bookwyrm/settings.py:298
msgid "Français (French)" msgid "Français (French)"
msgstr "Français (ranska)" msgstr "Français (ranska)"
#: bookwyrm/settings.py:296 #: bookwyrm/settings.py:299
msgid "Lietuvių (Lithuanian)" msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (liettua)" msgstr "Lietuvių (liettua)"
#: bookwyrm/settings.py:297 #: bookwyrm/settings.py:300
msgid "Norsk (Norwegian)" msgid "Norsk (Norwegian)"
msgstr "Norsk (norja)" msgstr "Norsk (norja)"
#: bookwyrm/settings.py:298 #: bookwyrm/settings.py:301
msgid "Polski (Polish)" msgid "Polski (Polish)"
msgstr "Polski (puola)" msgstr "Polski (puola)"
#: bookwyrm/settings.py:299 #: bookwyrm/settings.py:302
msgid "Português do Brasil (Brazilian Portuguese)" msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português do Brasil (brasilianportugali)" msgstr "Português do Brasil (brasilianportugali)"
#: bookwyrm/settings.py:300 #: bookwyrm/settings.py:303
msgid "Português Europeu (European Portuguese)" msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (portugali)" msgstr "Português Europeu (portugali)"
#: bookwyrm/settings.py:301 #: bookwyrm/settings.py:304
msgid "Română (Romanian)" msgid "Română (Romanian)"
msgstr "Română (romania)" msgstr "Română (romania)"
#: bookwyrm/settings.py:302 #: bookwyrm/settings.py:305
msgid "Svenska (Swedish)" msgid "Svenska (Swedish)"
msgstr "Svenska (ruotsi)" msgstr "Svenska (ruotsi)"
#: bookwyrm/settings.py:303 #: bookwyrm/settings.py:306
msgid "简体中文 (Simplified Chinese)" msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (yksinkertaistettu kiina)" msgstr "简体中文 (yksinkertaistettu kiina)"
#: bookwyrm/settings.py:304 #: bookwyrm/settings.py:307
msgid "繁體中文 (Traditional Chinese)" msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (perinteinen kiina)" msgstr "繁體中文 (perinteinen kiina)"
@ -847,10 +847,10 @@ msgstr "ISNI:"
#: bookwyrm/templates/settings/announcements/edit_announcement.html:120 #: bookwyrm/templates/settings/announcements/edit_announcement.html:120
#: bookwyrm/templates/settings/federation/edit_instance.html:98 #: bookwyrm/templates/settings/federation/edit_instance.html:98
#: bookwyrm/templates/settings/federation/instance.html:105 #: bookwyrm/templates/settings/federation/instance.html:105
#: bookwyrm/templates/settings/registration.html:79 #: bookwyrm/templates/settings/registration.html:96
#: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/registration_limited.html:76
#: bookwyrm/templates/settings/site.html:144 #: bookwyrm/templates/settings/site.html:144
#: bookwyrm/templates/settings/users/user_moderation_actions.html:69 #: bookwyrm/templates/settings/users/user_moderation_actions.html:75
#: bookwyrm/templates/shelf/form.html:25 #: bookwyrm/templates/shelf/form.html:25
#: bookwyrm/templates/snippets/reading_modals/layout.html:18 #: bookwyrm/templates/snippets/reading_modals/layout.html:18
msgid "Save" msgid "Save"
@ -1160,7 +1160,7 @@ msgstr "Uusi teos"
#: bookwyrm/templates/guided_tour/user_profile.html:89 #: bookwyrm/templates/guided_tour/user_profile.html:89
#: bookwyrm/templates/guided_tour/user_profile.html:112 #: bookwyrm/templates/guided_tour/user_profile.html:112
#: bookwyrm/templates/guided_tour/user_profile.html:135 #: bookwyrm/templates/guided_tour/user_profile.html:135
#: bookwyrm/templates/user_menu.html:18 #: bookwyrm/templates/user/user.html:87 bookwyrm/templates/user_menu.html:18
msgid "Back" msgid "Back"
msgstr "Takaisin" msgstr "Takaisin"
@ -1372,7 +1372,7 @@ msgid "Domain"
msgstr "Verkkotunnus" msgstr "Verkkotunnus"
#: bookwyrm/templates/book/file_links/edit_links.html:36 #: bookwyrm/templates/book/file_links/edit_links.html:36
#: bookwyrm/templates/import/import.html:122 #: bookwyrm/templates/import/import.html:133
#: bookwyrm/templates/import/import_status.html:134 #: bookwyrm/templates/import/import_status.html:134
#: bookwyrm/templates/settings/announcements/announcements.html:37 #: bookwyrm/templates/settings/announcements/announcements.html:37
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:48 #: bookwyrm/templates/settings/invites/manage_invite_requests.html:48
@ -1385,7 +1385,7 @@ msgstr "Tila"
#: bookwyrm/templates/book/file_links/edit_links.html:37 #: bookwyrm/templates/book/file_links/edit_links.html:37
#: bookwyrm/templates/settings/announcements/announcements.html:41 #: bookwyrm/templates/settings/announcements/announcements.html:41
#: bookwyrm/templates/settings/federation/instance.html:112 #: bookwyrm/templates/settings/federation/instance.html:112
#: bookwyrm/templates/settings/imports/imports.html:110 #: bookwyrm/templates/settings/imports/imports.html:141
#: bookwyrm/templates/settings/reports/report_links_table.html:6 #: bookwyrm/templates/settings/reports/report_links_table.html:6
#: bookwyrm/templates/settings/themes.html:99 #: bookwyrm/templates/settings/themes.html:99
msgid "Actions" msgid "Actions"
@ -1905,13 +1905,13 @@ msgid "Add to your books"
msgstr "Lisää omiin kirjoihin" msgstr "Lisää omiin kirjoihin"
#: bookwyrm/templates/get_started/book_preview.html:10 #: bookwyrm/templates/get_started/book_preview.html:10
#: bookwyrm/templates/shelf/shelf.html:86 bookwyrm/templates/user/user.html:33 #: bookwyrm/templates/shelf/shelf.html:86 bookwyrm/templates/user/user.html:37
#: bookwyrm/templatetags/shelf_tags.py:48 #: bookwyrm/templatetags/shelf_tags.py:48
msgid "To Read" msgid "To Read"
msgstr "Lukujono" msgstr "Lukujono"
#: bookwyrm/templates/get_started/book_preview.html:11 #: bookwyrm/templates/get_started/book_preview.html:11
#: bookwyrm/templates/shelf/shelf.html:87 bookwyrm/templates/user/user.html:34 #: bookwyrm/templates/shelf/shelf.html:87 bookwyrm/templates/user/user.html:38
#: bookwyrm/templatetags/shelf_tags.py:50 #: bookwyrm/templatetags/shelf_tags.py:50
msgid "Currently Reading" msgid "Currently Reading"
msgstr "Luettavana" msgstr "Luettavana"
@ -1921,12 +1921,12 @@ msgstr "Luettavana"
#: bookwyrm/templates/snippets/shelf_selector.html:46 #: bookwyrm/templates/snippets/shelf_selector.html:46
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24 #: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12 #: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12
#: bookwyrm/templates/user/user.html:35 bookwyrm/templatetags/shelf_tags.py:52 #: bookwyrm/templates/user/user.html:39 bookwyrm/templatetags/shelf_tags.py:52
msgid "Read" msgid "Read"
msgstr "Luettu" msgstr "Luettu"
#: bookwyrm/templates/get_started/book_preview.html:13 #: bookwyrm/templates/get_started/book_preview.html:13
#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:36 #: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:40
msgid "Stopped Reading" msgid "Stopped Reading"
msgstr "Jäi kesken" msgstr "Jäi kesken"
@ -2642,7 +2642,7 @@ msgid "This is your user profile. All your latest activities will be listed here
msgstr "Tämä on käyttäjäprofiilisi. Tässä näytetään viimeaikainen toimintasi. Muut BookWyrm-käyttäjät voivat myös katsella tätä sivua, mutta näkyvyysasetuksistasi riippuu, mitä heille näytetään." msgstr "Tämä on käyttäjäprofiilisi. Tässä näytetään viimeaikainen toimintasi. Muut BookWyrm-käyttäjät voivat myös katsella tätä sivua, mutta näkyvyysasetuksistasi riippuu, mitä heille näytetään."
#: bookwyrm/templates/guided_tour/user_profile.html:11 #: bookwyrm/templates/guided_tour/user_profile.html:11
#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:10 #: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:14
msgid "User Profile" msgid "User Profile"
msgstr "Käyttäjäprofiili" msgstr "Käyttäjäprofiili"
@ -2689,85 +2689,100 @@ msgstr "Tuo kirjoja"
msgid "Not a valid CSV file" msgid "Not a valid CSV file"
msgstr "Epäkelpo CSV-tiedosto" msgstr "Epäkelpo CSV-tiedosto"
#: bookwyrm/templates/import/import.html:22 #: bookwyrm/templates/import/import.html:20
#, python-format
msgid "Currently you are allowed to import %(import_size_limit)s books every %(import_limit_reset)s days."
msgstr ""
#: bookwyrm/templates/import/import.html:21
#, python-format
msgid "You have %(allowed_imports)s left."
msgstr ""
#: bookwyrm/templates/import/import.html:28
#, python-format #, python-format
msgid "On average, recent imports have taken %(hours)s hours." msgid "On average, recent imports have taken %(hours)s hours."
msgstr "Viime aikoina tuonteihin on kulunut keskimäärin %(hours)s tuntia." msgstr "Viime aikoina tuonteihin on kulunut keskimäärin %(hours)s tuntia."
#: bookwyrm/templates/import/import.html:26 #: bookwyrm/templates/import/import.html:32
#, python-format #, python-format
msgid "On average, recent imports have taken %(minutes)s minutes." msgid "On average, recent imports have taken %(minutes)s minutes."
msgstr "Viime aikoina tuonteihin on kulunut keskimäärin %(minutes)s minuuttia." msgstr "Viime aikoina tuonteihin on kulunut keskimäärin %(minutes)s minuuttia."
#: bookwyrm/templates/import/import.html:41 #: bookwyrm/templates/import/import.html:47
msgid "Data source:" msgid "Data source:"
msgstr "Tietolähde:" msgstr "Tietolähde:"
#: bookwyrm/templates/import/import.html:47 #: bookwyrm/templates/import/import.html:53
msgid "Goodreads (CSV)" msgid "Goodreads (CSV)"
msgstr "Goodreads (CSV)" msgstr "Goodreads (CSV)"
#: bookwyrm/templates/import/import.html:50 #: bookwyrm/templates/import/import.html:56
msgid "Storygraph (CSV)" msgid "Storygraph (CSV)"
msgstr "Storygraph (CSV)" msgstr "Storygraph (CSV)"
#: bookwyrm/templates/import/import.html:53 #: bookwyrm/templates/import/import.html:59
msgid "LibraryThing (TSV)" msgid "LibraryThing (TSV)"
msgstr "LibraryThing (TSV)" msgstr "LibraryThing (TSV)"
#: bookwyrm/templates/import/import.html:56 #: bookwyrm/templates/import/import.html:62
msgid "OpenLibrary (CSV)" msgid "OpenLibrary (CSV)"
msgstr "OpenLibrary (CSV)" msgstr "OpenLibrary (CSV)"
#: bookwyrm/templates/import/import.html:59 #: bookwyrm/templates/import/import.html:65
msgid "Calibre (CSV)" msgid "Calibre (CSV)"
msgstr "Calibre (CSV)" msgstr "Calibre (CSV)"
#: bookwyrm/templates/import/import.html:65 #: bookwyrm/templates/import/import.html:71
msgid "You can download your Goodreads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Import/Export page</a> of your Goodreads account." msgid "You can download your Goodreads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Import/Export page</a> of your Goodreads account."
msgstr "Goodreads-tiedot voi ladata Goodreads-käyttäjätilin <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Import/Export-sivun</a> kautta." msgstr "Goodreads-tiedot voi ladata Goodreads-käyttäjätilin <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Import/Export-sivun</a> kautta."
#: bookwyrm/templates/import/import.html:74 #: bookwyrm/templates/import/import.html:80
msgid "Data file:" msgid "Data file:"
msgstr "Datatiedosto:" msgstr "Datatiedosto:"
#: bookwyrm/templates/import/import.html:82 #: bookwyrm/templates/import/import.html:88
msgid "Include reviews" msgid "Include reviews"
msgstr "Myös arviot" msgstr "Myös arviot"
#: bookwyrm/templates/import/import.html:87 #: bookwyrm/templates/import/import.html:93
msgid "Privacy setting for imported reviews:" msgid "Privacy setting for imported reviews:"
msgstr "Tuotavien arvioiden yksityisyysvalinta:" msgstr "Tuotavien arvioiden yksityisyysvalinta:"
#: bookwyrm/templates/import/import.html:93 #: bookwyrm/templates/import/import.html:100
#: bookwyrm/templates/import/import.html:102
#: bookwyrm/templates/preferences/layout.html:35 #: bookwyrm/templates/preferences/layout.html:35
#: bookwyrm/templates/settings/federation/instance_blocklist.html:78 #: bookwyrm/templates/settings/federation/instance_blocklist.html:78
msgid "Import" msgid "Import"
msgstr "Tuo" msgstr "Tuo"
#: bookwyrm/templates/import/import.html:101 #: bookwyrm/templates/import/import.html:103
msgid "You've reached the import limit."
msgstr ""
#: bookwyrm/templates/import/import.html:112
msgid "Imports are temporarily disabled; thank you for your patience." msgid "Imports are temporarily disabled; thank you for your patience."
msgstr "Tuonti on väliaikaisesti pois käytöstä; palaa asiaan myöhemmin." msgstr "Tuonti on väliaikaisesti pois käytöstä; palaa asiaan myöhemmin."
#: bookwyrm/templates/import/import.html:108 #: bookwyrm/templates/import/import.html:119
msgid "Recent Imports" msgid "Recent Imports"
msgstr "Viimeksi tuotu" msgstr "Viimeksi tuotu"
#: bookwyrm/templates/import/import.html:113 #: bookwyrm/templates/import/import.html:124
#: bookwyrm/templates/settings/imports/imports.html:89 #: bookwyrm/templates/settings/imports/imports.html:120
msgid "Date Created" msgid "Date Created"
msgstr "Luontipäivä" msgstr "Luontipäivä"
#: bookwyrm/templates/import/import.html:116 #: bookwyrm/templates/import/import.html:127
msgid "Last Updated" msgid "Last Updated"
msgstr "Päivitetty viimeksi" msgstr "Päivitetty viimeksi"
#: bookwyrm/templates/import/import.html:119 #: bookwyrm/templates/import/import.html:130
#: bookwyrm/templates/settings/imports/imports.html:98 #: bookwyrm/templates/settings/imports/imports.html:129
msgid "Items" msgid "Items"
msgstr "Nimikkeitä" msgstr "Nimikkeitä"
#: bookwyrm/templates/import/import.html:128 #: bookwyrm/templates/import/import.html:139
msgid "No recent imports" msgid "No recent imports"
msgstr "Ei viimeaikaisia tuonteja" msgstr "Ei viimeaikaisia tuonteja"
@ -2783,6 +2798,7 @@ msgid "Retry Status"
msgstr "Uudelleenyrityksen tila" msgstr "Uudelleenyrityksen tila"
#: bookwyrm/templates/import/import_status.html:22 #: bookwyrm/templates/import/import_status.html:22
#: bookwyrm/templates/settings/celery.html:36
#: bookwyrm/templates/settings/imports/imports.html:6 #: bookwyrm/templates/settings/imports/imports.html:6
#: bookwyrm/templates/settings/imports/imports.html:9 #: bookwyrm/templates/settings/imports/imports.html:9
#: bookwyrm/templates/settings/layout.html:82 #: bookwyrm/templates/settings/layout.html:82
@ -2802,7 +2818,7 @@ msgid "Refresh"
msgstr "Päivitä" msgstr "Päivitä"
#: bookwyrm/templates/import/import_status.html:72 #: bookwyrm/templates/import/import_status.html:72
#: bookwyrm/templates/settings/imports/imports.html:130 #: bookwyrm/templates/settings/imports/imports.html:161
msgid "Stop import" msgid "Stop import"
msgstr "Keskeytä tuonti" msgstr "Keskeytä tuonti"
@ -2920,7 +2936,7 @@ msgid "Reject"
msgstr "Hylkää" msgstr "Hylkää"
#: bookwyrm/templates/import/troubleshoot.html:7 #: bookwyrm/templates/import/troubleshoot.html:7
#: bookwyrm/templates/settings/imports/imports.html:107 #: bookwyrm/templates/settings/imports/imports.html:138
msgid "Failed items" msgid "Failed items"
msgstr "Epäonnistuneita nimikkeitä" msgstr "Epäonnistuneita nimikkeitä"
@ -3171,7 +3187,7 @@ msgid "Delete this list?"
msgstr "Poistetaanko lista?" msgstr "Poistetaanko lista?"
#: bookwyrm/templates/lists/edit_form.html:5 #: bookwyrm/templates/lists/edit_form.html:5
#: bookwyrm/templates/lists/layout.html:18 #: bookwyrm/templates/lists/layout.html:23
msgid "Edit List" msgid "Edit List"
msgstr "Muokkaa listaa" msgstr "Muokkaa listaa"
@ -4429,48 +4445,48 @@ msgstr "Keskitason prioriteetti"
msgid "High priority" msgid "High priority"
msgstr "Korkea prioriteetti" msgstr "Korkea prioriteetti"
#: bookwyrm/templates/settings/celery.html:40 #: bookwyrm/templates/settings/celery.html:46
msgid "Could not connect to Redis broker" msgid "Could not connect to Redis broker"
msgstr "Redis-välityspalveluun ei saada yhteyttä" msgstr "Redis-välityspalveluun ei saada yhteyttä"
#: bookwyrm/templates/settings/celery.html:48 #: bookwyrm/templates/settings/celery.html:54
msgid "Active Tasks" msgid "Active Tasks"
msgstr "Aktiiviset tehtävät" msgstr "Aktiiviset tehtävät"
#: bookwyrm/templates/settings/celery.html:53 #: bookwyrm/templates/settings/celery.html:59
#: bookwyrm/templates/settings/imports/imports.html:82 #: bookwyrm/templates/settings/imports/imports.html:113
msgid "ID" msgid "ID"
msgstr "Tunniste" msgstr "Tunniste"
#: bookwyrm/templates/settings/celery.html:54 #: bookwyrm/templates/settings/celery.html:60
msgid "Task name" msgid "Task name"
msgstr "Tehtävän nimi" msgstr "Tehtävän nimi"
#: bookwyrm/templates/settings/celery.html:55 #: bookwyrm/templates/settings/celery.html:61
msgid "Run time" msgid "Run time"
msgstr "Käyttöaika" msgstr "Käyttöaika"
#: bookwyrm/templates/settings/celery.html:56 #: bookwyrm/templates/settings/celery.html:62
msgid "Priority" msgid "Priority"
msgstr "Prioriteetti" msgstr "Prioriteetti"
#: bookwyrm/templates/settings/celery.html:61 #: bookwyrm/templates/settings/celery.html:67
msgid "No active tasks" msgid "No active tasks"
msgstr "Ei aktiivisia tehtäviä" msgstr "Ei aktiivisia tehtäviä"
#: bookwyrm/templates/settings/celery.html:79 #: bookwyrm/templates/settings/celery.html:85
msgid "Workers" msgid "Workers"
msgstr "Suorittajia" msgstr "Suorittajia"
#: bookwyrm/templates/settings/celery.html:84 #: bookwyrm/templates/settings/celery.html:90
msgid "Uptime:" msgid "Uptime:"
msgstr "Käynnissäoloaika:" msgstr "Käynnissäoloaika:"
#: bookwyrm/templates/settings/celery.html:94 #: bookwyrm/templates/settings/celery.html:100
msgid "Could not connect to Celery" msgid "Could not connect to Celery"
msgstr "Celeryyn ei saada yhteyttä" msgstr "Celeryyn ei saada yhteyttä"
#: bookwyrm/templates/settings/celery.html:101 #: bookwyrm/templates/settings/celery.html:107
msgid "Errors" msgid "Errors"
msgstr "Virheitä" msgstr "Virheitä"
@ -4850,27 +4866,55 @@ msgstr "Käyttäjät eivät voi aloittaa uusia tuonteja"
msgid "Enable imports" msgid "Enable imports"
msgstr "Ota tuonti käyttöön" msgstr "Ota tuonti käyttöön"
#: bookwyrm/templates/settings/imports/imports.html:71 #: bookwyrm/templates/settings/imports/imports.html:63
msgid "Limit the amount of imports"
msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:74
msgid "Some users might try to import a large number of books, which you want to limit."
msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:75
msgid "Set the value to 0 to not enforce any limit."
msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:78
msgid "Set import limit to"
msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:80
msgid "books every"
msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:82
msgid "days."
msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:86
msgid "Set limit"
msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:102
msgid "Completed" msgid "Completed"
msgstr "Valmis" msgstr "Valmis"
#: bookwyrm/templates/settings/imports/imports.html:85 #: bookwyrm/templates/settings/imports/imports.html:116
msgid "User" msgid "User"
msgstr "Käyttäjä" msgstr "Käyttäjä"
#: bookwyrm/templates/settings/imports/imports.html:94 #: bookwyrm/templates/settings/imports/imports.html:125
msgid "Date Updated" msgid "Date Updated"
msgstr "Päivitetty" msgstr "Päivitetty"
#: bookwyrm/templates/settings/imports/imports.html:101 #: bookwyrm/templates/settings/imports/imports.html:132
msgid "Pending items" msgid "Pending items"
msgstr "Odottavia nimikkeitä" msgstr "Odottavia nimikkeitä"
#: bookwyrm/templates/settings/imports/imports.html:104 #: bookwyrm/templates/settings/imports/imports.html:135
msgid "Successful items" msgid "Successful items"
msgstr "Onnistuneita nimikkeitä" msgstr "Onnistuneita nimikkeitä"
#: bookwyrm/templates/settings/imports/imports.html:139 #: bookwyrm/templates/settings/imports/imports.html:170
msgid "No matching imports found." msgid "No matching imports found."
msgstr "Ei ehtoihin sopivia tuonteja." msgstr "Ei ehtoihin sopivia tuonteja."
@ -5131,34 +5175,38 @@ msgstr "Asetuksia ei voi tallentaa"
msgid "Allow registration" msgid "Allow registration"
msgstr "Salli käyttäjätilien avaaminen" msgstr "Salli käyttäjätilien avaaminen"
#: bookwyrm/templates/settings/registration.html:44 #: bookwyrm/templates/settings/registration.html:43
msgid "Default access level:"
msgstr ""
#: bookwyrm/templates/settings/registration.html:61
msgid "Require users to confirm email address" msgid "Require users to confirm email address"
msgstr "Vaadi käyttäjiä vahvistamaan sähköpostiosoitteensa" msgstr "Vaadi käyttäjiä vahvistamaan sähköpostiosoitteensa"
#: bookwyrm/templates/settings/registration.html:46 #: bookwyrm/templates/settings/registration.html:63
msgid "(Recommended if registration is open)" msgid "(Recommended if registration is open)"
msgstr "(Suositellaan, jos käyttäjätilejä voi avata vapaasti)" msgstr "(Suositellaan, jos käyttäjätilejä voi avata vapaasti)"
#: bookwyrm/templates/settings/registration.html:51 #: bookwyrm/templates/settings/registration.html:68
msgid "Allow invite requests" msgid "Allow invite requests"
msgstr "Salli kutsulinkin pyytäminen" msgstr "Salli kutsulinkin pyytäminen"
#: bookwyrm/templates/settings/registration.html:55 #: bookwyrm/templates/settings/registration.html:72
#: bookwyrm/templates/settings/registration_limited.html:42 #: bookwyrm/templates/settings/registration_limited.html:42
msgid "Invite request text:" msgid "Invite request text:"
msgstr "Kutsupyyntökehote ja -ohje:" msgstr "Kutsupyyntökehote ja -ohje:"
#: bookwyrm/templates/settings/registration.html:63 #: bookwyrm/templates/settings/registration.html:80
#: bookwyrm/templates/settings/registration_limited.html:50 #: bookwyrm/templates/settings/registration_limited.html:50
msgid "Set a question for invite requests" msgid "Set a question for invite requests"
msgstr "Kutsupyyntöjen lisätietokysymys" msgstr "Kutsupyyntöjen lisätietokysymys"
#: bookwyrm/templates/settings/registration.html:68 #: bookwyrm/templates/settings/registration.html:85
#: bookwyrm/templates/settings/registration_limited.html:55 #: bookwyrm/templates/settings/registration_limited.html:55
msgid "Question:" msgid "Question:"
msgstr "Kysymys:" msgstr "Kysymys:"
#: bookwyrm/templates/settings/registration.html:73 #: bookwyrm/templates/settings/registration.html:90
#: bookwyrm/templates/settings/registration_limited.html:67 #: bookwyrm/templates/settings/registration_limited.html:67
msgid "Registration closed text:" msgid "Registration closed text:"
msgstr "Teksti, joka näytetään, kun käyttäjätilin avaaminen ei ole mahdollista:" msgstr "Teksti, joka näytetään, kun käyttäjätilin avaaminen ei ole mahdollista:"
@ -5400,7 +5448,7 @@ msgid "Remove theme"
msgstr "Poista teema" msgstr "Poista teema"
#: bookwyrm/templates/settings/users/delete_user_form.html:5 #: bookwyrm/templates/settings/users/delete_user_form.html:5
#: bookwyrm/templates/settings/users/user_moderation_actions.html:32 #: bookwyrm/templates/settings/users/user_moderation_actions.html:38
msgid "Permanently delete user" msgid "Permanently delete user"
msgstr "Poista käyttäjä pysyvästi" msgstr "Poista käyttäjä pysyvästi"
@ -5522,14 +5570,18 @@ msgid "User Actions"
msgstr "Toiminnot" msgstr "Toiminnot"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:21 #: bookwyrm/templates/settings/users/user_moderation_actions.html:21
msgid "Activate user"
msgstr ""
#: bookwyrm/templates/settings/users/user_moderation_actions.html:27
msgid "Suspend user" msgid "Suspend user"
msgstr "Hyllytä käyttäjä" msgstr "Hyllytä käyttäjä"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:26 #: bookwyrm/templates/settings/users/user_moderation_actions.html:32
msgid "Un-suspend user" msgid "Un-suspend user"
msgstr "Peru hyllytys" msgstr "Peru hyllytys"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:48 #: bookwyrm/templates/settings/users/user_moderation_actions.html:54
msgid "Access level:" msgid "Access level:"
msgstr "Käyttöoikeustaso:" msgstr "Käyttöoikeustaso:"
@ -6379,33 +6431,53 @@ msgstr "%(username)s ei seuraa muita käyttäjiä"
msgid "No reviews or comments yet!" msgid "No reviews or comments yet!"
msgstr "Ei arvioita tai kommentteja." msgstr "Ei arvioita tai kommentteja."
#: bookwyrm/templates/user/user.html:16 #: bookwyrm/templates/user/user.html:20
msgid "Edit profile" msgid "Edit profile"
msgstr "Muokkaa profiilia" msgstr "Muokkaa profiilia"
#: bookwyrm/templates/user/user.html:38 #: bookwyrm/templates/user/user.html:42
#, python-format #, python-format
msgid "View all %(size)s" msgid "View all %(size)s"
msgstr "Näytä kaikki %(size)s" msgstr "Näytä kaikki %(size)s"
#: bookwyrm/templates/user/user.html:52 #: bookwyrm/templates/user/user.html:56
msgid "View all books" msgid "View all books"
msgstr "Näytä kaikki kirjat" msgstr "Näytä kaikki kirjat"
#: bookwyrm/templates/user/user.html:59 #: bookwyrm/templates/user/user.html:63
#, python-format #, python-format
msgid "%(current_year)s Reading Goal" msgid "%(current_year)s Reading Goal"
msgstr "Lukutavoite vuodelle %(current_year)s" msgstr "Lukutavoite vuodelle %(current_year)s"
#: bookwyrm/templates/user/user.html:66 #: bookwyrm/templates/user/user.html:70
msgid "User Activity" msgid "User Activity"
msgstr "Käyttäjän toiminta" msgstr "Käyttäjän toiminta"
#: bookwyrm/templates/user/user.html:71 #: bookwyrm/templates/user/user.html:76
msgid "Show RSS Options"
msgstr ""
#: bookwyrm/templates/user/user.html:82
msgid "RSS feed" msgid "RSS feed"
msgstr "RSS-syöte" msgstr "RSS-syöte"
#: bookwyrm/templates/user/user.html:83 #: bookwyrm/templates/user/user.html:98
msgid "Complete feed"
msgstr ""
#: bookwyrm/templates/user/user.html:103
msgid "Reviews only"
msgstr ""
#: bookwyrm/templates/user/user.html:108
msgid "Quotes only"
msgstr ""
#: bookwyrm/templates/user/user.html:113
msgid "Comments only"
msgstr ""
#: bookwyrm/templates/user/user.html:129
msgid "No activities yet!" msgid "No activities yet!"
msgstr "Ei toimintaa!" msgstr "Ei toimintaa!"
@ -6449,16 +6521,43 @@ msgstr "Kirjaudu ulos"
msgid "File exceeds maximum size: 10MB" msgid "File exceeds maximum size: 10MB"
msgstr "Tiedosto on enimmäiskokoa 10 Mt suurempi" msgstr "Tiedosto on enimmäiskokoa 10 Mt suurempi"
#: bookwyrm/templatetags/list_page_tags.py:14
#, python-format
msgid "Book List: %(name)s"
msgstr ""
#: bookwyrm/templatetags/list_page_tags.py:22
#, python-format
msgid "%(num)d book - by %(user)s"
msgid_plural "%(num)d books - by %(user)s"
msgstr[0] ""
msgstr[1] ""
#: bookwyrm/templatetags/utilities.py:39 #: bookwyrm/templatetags/utilities.py:39
#, python-format #, python-format
msgid "%(title)s: %(subtitle)s" msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s"
#: bookwyrm/views/rss_feed.py:34 #: bookwyrm/views/rss_feed.py:35
#, python-brace-format #, python-brace-format
msgid "Status updates from {obj.display_name}" msgid "Status updates from {obj.display_name}"
msgstr "{obj.display_name} — tilapäivitykset" msgstr "{obj.display_name} — tilapäivitykset"
#: bookwyrm/views/rss_feed.py:72
#, python-brace-format
msgid "Reviews from {obj.display_name}"
msgstr ""
#: bookwyrm/views/rss_feed.py:110
#, python-brace-format
msgid "Quotes from {obj.display_name}"
msgstr ""
#: bookwyrm/views/rss_feed.py:148
#, python-brace-format
msgid "Comments from {obj.display_name}"
msgstr ""
#: bookwyrm/views/updates.py:45 #: bookwyrm/views/updates.py:45
#, python-format #, python-format
msgid "Load %(count)d unread status" msgid "Load %(count)d unread status"

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: bookwyrm\n" "Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-11 22:46+0000\n" "POT-Creation-Date: 2023-01-30 08:21+0000\n"
"PO-Revision-Date: 2023-01-13 18:17\n" "PO-Revision-Date: 2023-02-02 14:57\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n" "Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: French\n" "Language-Team: French\n"
"Language: fr\n" "Language: fr\n"
@ -256,14 +256,14 @@ msgstr "Abonné(e)s"
msgid "Private" msgid "Private"
msgstr "Privé" msgstr "Privé"
#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:157 #: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:168
#: bookwyrm/templates/settings/imports/imports.html:67 #: bookwyrm/templates/settings/imports/imports.html:98
#: bookwyrm/templates/settings/users/user_admin.html:81 #: bookwyrm/templates/settings/users/user_admin.html:81
#: bookwyrm/templates/settings/users/user_info.html:28 #: bookwyrm/templates/settings/users/user_info.html:28
msgid "Active" msgid "Active"
msgstr "Actif" msgstr "Actif"
#: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:155 #: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:166
msgid "Complete" msgid "Complete"
msgstr "Terminé" msgstr "Terminé"
@ -316,19 +316,19 @@ msgstr "Citations"
msgid "Everything else" msgid "Everything else"
msgstr "Tout le reste" msgstr "Tout le reste"
#: bookwyrm/settings.py:214 #: bookwyrm/settings.py:217
msgid "Home Timeline" msgid "Home Timeline"
msgstr "Mon fil dactualité" msgstr "Mon fil dactualité"
#: bookwyrm/settings.py:214 #: bookwyrm/settings.py:217
msgid "Home" msgid "Home"
msgstr "Accueil" msgstr "Accueil"
#: bookwyrm/settings.py:215 #: bookwyrm/settings.py:218
msgid "Books Timeline" msgid "Books Timeline"
msgstr "Actualité de mes livres" msgstr "Actualité de mes livres"
#: bookwyrm/settings.py:215 #: bookwyrm/settings.py:218
#: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/guided_tour/user_profile.html:101
#: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:22
#: bookwyrm/templates/search/layout.html:43 #: bookwyrm/templates/search/layout.html:43
@ -336,75 +336,75 @@ msgstr "Actualité de mes livres"
msgid "Books" msgid "Books"
msgstr "Livres" msgstr "Livres"
#: bookwyrm/settings.py:287 #: bookwyrm/settings.py:290
msgid "English" msgid "English"
msgstr "English" msgstr "English"
#: bookwyrm/settings.py:288 #: bookwyrm/settings.py:291
msgid "Català (Catalan)" msgid "Català (Catalan)"
msgstr "Català (Catalan)" msgstr "Català (Catalan)"
#: bookwyrm/settings.py:289 #: bookwyrm/settings.py:292
msgid "Deutsch (German)" msgid "Deutsch (German)"
msgstr "Deutsch" msgstr "Deutsch"
#: bookwyrm/settings.py:290 #: bookwyrm/settings.py:293
msgid "Español (Spanish)" msgid "Español (Spanish)"
msgstr "Español" msgstr "Español"
#: bookwyrm/settings.py:291 #: bookwyrm/settings.py:294
msgid "Euskara (Basque)" msgid "Euskara (Basque)"
msgstr "Euskara (Basque)" msgstr "Euskara (Basque)"
#: bookwyrm/settings.py:292 #: bookwyrm/settings.py:295
msgid "Galego (Galician)" msgid "Galego (Galician)"
msgstr "Galego (Galicien)" msgstr "Galego (Galicien)"
#: bookwyrm/settings.py:293 #: bookwyrm/settings.py:296
msgid "Italiano (Italian)" msgid "Italiano (Italian)"
msgstr "Italiano (Italien)" msgstr "Italiano (Italien)"
#: bookwyrm/settings.py:294 #: bookwyrm/settings.py:297
msgid "Suomi (Finnish)" msgid "Suomi (Finnish)"
msgstr "Suomi (Finnois)" msgstr "Suomi (Finnois)"
#: bookwyrm/settings.py:295 #: bookwyrm/settings.py:298
msgid "Français (French)" msgid "Français (French)"
msgstr "Français" msgstr "Français"
#: bookwyrm/settings.py:296 #: bookwyrm/settings.py:299
msgid "Lietuvių (Lithuanian)" msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (Lituanien)" msgstr "Lietuvių (Lituanien)"
#: bookwyrm/settings.py:297 #: bookwyrm/settings.py:300
msgid "Norsk (Norwegian)" msgid "Norsk (Norwegian)"
msgstr "Norsk (Norvégien)" msgstr "Norsk (Norvégien)"
#: bookwyrm/settings.py:298 #: bookwyrm/settings.py:301
msgid "Polski (Polish)" msgid "Polski (Polish)"
msgstr "Polski (Polonais)" msgstr "Polski (Polonais)"
#: bookwyrm/settings.py:299 #: bookwyrm/settings.py:302
msgid "Português do Brasil (Brazilian Portuguese)" msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português do Brasil (Portugais brésilien)" msgstr "Português do Brasil (Portugais brésilien)"
#: bookwyrm/settings.py:300 #: bookwyrm/settings.py:303
msgid "Português Europeu (European Portuguese)" msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Portugais européen)" msgstr "Português Europeu (Portugais européen)"
#: bookwyrm/settings.py:301 #: bookwyrm/settings.py:304
msgid "Română (Romanian)" msgid "Română (Romanian)"
msgstr "Română (Roumain)" msgstr "Română (Roumain)"
#: bookwyrm/settings.py:302 #: bookwyrm/settings.py:305
msgid "Svenska (Swedish)" msgid "Svenska (Swedish)"
msgstr "Svenska (Suédois)" msgstr "Svenska (Suédois)"
#: bookwyrm/settings.py:303 #: bookwyrm/settings.py:306
msgid "简体中文 (Simplified Chinese)" msgid "简体中文 (Simplified Chinese)"
msgstr "简化字" msgstr "简化字"
#: bookwyrm/settings.py:304 #: bookwyrm/settings.py:307
msgid "繁體中文 (Traditional Chinese)" msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (chinois traditionnel)" msgstr "繁體中文 (chinois traditionnel)"
@ -610,8 +610,8 @@ msgstr "Ce qui fait en moyenne %(pages)s pages par livre."
#, python-format #, python-format
msgid "(No page data was available for %(no_page_number)s book)" msgid "(No page data was available for %(no_page_number)s book)"
msgid_plural "(No page data was available for %(no_page_number)s books)" msgid_plural "(No page data was available for %(no_page_number)s books)"
msgstr[0] "" msgstr[0] "(Le nombre de pages n'était pas renseigné pour %(no_page_number)s livre)"
msgstr[1] "" msgstr[1] "(Le nombre de pages n'était pas renseigné pour %(no_page_number)s livres)"
#: bookwyrm/templates/annual_summary/layout.html:150 #: bookwyrm/templates/annual_summary/layout.html:150
msgid "Their shortest read this year…" msgid "Their shortest read this year…"
@ -847,10 +847,10 @@ msgstr "ISNI :"
#: bookwyrm/templates/settings/announcements/edit_announcement.html:120 #: bookwyrm/templates/settings/announcements/edit_announcement.html:120
#: bookwyrm/templates/settings/federation/edit_instance.html:98 #: bookwyrm/templates/settings/federation/edit_instance.html:98
#: bookwyrm/templates/settings/federation/instance.html:105 #: bookwyrm/templates/settings/federation/instance.html:105
#: bookwyrm/templates/settings/registration.html:79 #: bookwyrm/templates/settings/registration.html:96
#: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/registration_limited.html:76
#: bookwyrm/templates/settings/site.html:144 #: bookwyrm/templates/settings/site.html:144
#: bookwyrm/templates/settings/users/user_moderation_actions.html:69 #: bookwyrm/templates/settings/users/user_moderation_actions.html:75
#: bookwyrm/templates/shelf/form.html:25 #: bookwyrm/templates/shelf/form.html:25
#: bookwyrm/templates/snippets/reading_modals/layout.html:18 #: bookwyrm/templates/snippets/reading_modals/layout.html:18
msgid "Save" msgid "Save"
@ -1160,7 +1160,7 @@ msgstr "Il sagit dun nouvel ouvrage."
#: bookwyrm/templates/guided_tour/user_profile.html:89 #: bookwyrm/templates/guided_tour/user_profile.html:89
#: bookwyrm/templates/guided_tour/user_profile.html:112 #: bookwyrm/templates/guided_tour/user_profile.html:112
#: bookwyrm/templates/guided_tour/user_profile.html:135 #: bookwyrm/templates/guided_tour/user_profile.html:135
#: bookwyrm/templates/user_menu.html:18 #: bookwyrm/templates/user/user.html:87 bookwyrm/templates/user_menu.html:18
msgid "Back" msgid "Back"
msgstr "Retour" msgstr "Retour"
@ -1372,7 +1372,7 @@ msgid "Domain"
msgstr "Domaine" msgstr "Domaine"
#: bookwyrm/templates/book/file_links/edit_links.html:36 #: bookwyrm/templates/book/file_links/edit_links.html:36
#: bookwyrm/templates/import/import.html:122 #: bookwyrm/templates/import/import.html:133
#: bookwyrm/templates/import/import_status.html:134 #: bookwyrm/templates/import/import_status.html:134
#: bookwyrm/templates/settings/announcements/announcements.html:37 #: bookwyrm/templates/settings/announcements/announcements.html:37
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:48 #: bookwyrm/templates/settings/invites/manage_invite_requests.html:48
@ -1385,7 +1385,7 @@ msgstr "Statut"
#: bookwyrm/templates/book/file_links/edit_links.html:37 #: bookwyrm/templates/book/file_links/edit_links.html:37
#: bookwyrm/templates/settings/announcements/announcements.html:41 #: bookwyrm/templates/settings/announcements/announcements.html:41
#: bookwyrm/templates/settings/federation/instance.html:112 #: bookwyrm/templates/settings/federation/instance.html:112
#: bookwyrm/templates/settings/imports/imports.html:110 #: bookwyrm/templates/settings/imports/imports.html:141
#: bookwyrm/templates/settings/reports/report_links_table.html:6 #: bookwyrm/templates/settings/reports/report_links_table.html:6
#: bookwyrm/templates/settings/themes.html:99 #: bookwyrm/templates/settings/themes.html:99
msgid "Actions" msgid "Actions"
@ -1905,13 +1905,13 @@ msgid "Add to your books"
msgstr "Ajouter à vos livres" msgstr "Ajouter à vos livres"
#: bookwyrm/templates/get_started/book_preview.html:10 #: bookwyrm/templates/get_started/book_preview.html:10
#: bookwyrm/templates/shelf/shelf.html:86 bookwyrm/templates/user/user.html:33 #: bookwyrm/templates/shelf/shelf.html:86 bookwyrm/templates/user/user.html:37
#: bookwyrm/templatetags/shelf_tags.py:48 #: bookwyrm/templatetags/shelf_tags.py:48
msgid "To Read" msgid "To Read"
msgstr "À lire" msgstr "À lire"
#: bookwyrm/templates/get_started/book_preview.html:11 #: bookwyrm/templates/get_started/book_preview.html:11
#: bookwyrm/templates/shelf/shelf.html:87 bookwyrm/templates/user/user.html:34 #: bookwyrm/templates/shelf/shelf.html:87 bookwyrm/templates/user/user.html:38
#: bookwyrm/templatetags/shelf_tags.py:50 #: bookwyrm/templatetags/shelf_tags.py:50
msgid "Currently Reading" msgid "Currently Reading"
msgstr "Lectures en cours" msgstr "Lectures en cours"
@ -1921,12 +1921,12 @@ msgstr "Lectures en cours"
#: bookwyrm/templates/snippets/shelf_selector.html:46 #: bookwyrm/templates/snippets/shelf_selector.html:46
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24 #: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12 #: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12
#: bookwyrm/templates/user/user.html:35 bookwyrm/templatetags/shelf_tags.py:52 #: bookwyrm/templates/user/user.html:39 bookwyrm/templatetags/shelf_tags.py:52
msgid "Read" msgid "Read"
msgstr "Lu" msgstr "Lu"
#: bookwyrm/templates/get_started/book_preview.html:13 #: bookwyrm/templates/get_started/book_preview.html:13
#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:36 #: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:40
msgid "Stopped Reading" msgid "Stopped Reading"
msgstr "Lecture interrompue" msgstr "Lecture interrompue"
@ -2642,7 +2642,7 @@ msgid "This is your user profile. All your latest activities will be listed here
msgstr "Voici votre page de profil. Toutes vos dernières activités seront listées ici. D'autres membres de Bookwyrm peuvent également voir des parties de cette page—ce quil leur est possible de voir dépend de vos paramètres de confidentialité." msgstr "Voici votre page de profil. Toutes vos dernières activités seront listées ici. D'autres membres de Bookwyrm peuvent également voir des parties de cette page—ce quil leur est possible de voir dépend de vos paramètres de confidentialité."
#: bookwyrm/templates/guided_tour/user_profile.html:11 #: bookwyrm/templates/guided_tour/user_profile.html:11
#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:10 #: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:14
msgid "User Profile" msgid "User Profile"
msgstr "Profil" msgstr "Profil"
@ -2689,85 +2689,100 @@ msgstr "Importer des livres"
msgid "Not a valid CSV file" msgid "Not a valid CSV file"
msgstr "Fichier CSV non valide" msgstr "Fichier CSV non valide"
#: bookwyrm/templates/import/import.html:22 #: bookwyrm/templates/import/import.html:20
#, python-format
msgid "Currently you are allowed to import %(import_size_limit)s books every %(import_limit_reset)s days."
msgstr "Vous êtes actuellement autorisé à importer %(import_size_limit)s livres tous les %(import_limit_reset)s jours."
#: bookwyrm/templates/import/import.html:21
#, python-format
msgid "You have %(allowed_imports)s left."
msgstr "Il vous en reste %(allowed_imports)s."
#: bookwyrm/templates/import/import.html:28
#, python-format #, python-format
msgid "On average, recent imports have taken %(hours)s hours." msgid "On average, recent imports have taken %(hours)s hours."
msgstr "En moyenne, les dernières importations ont pris %(hours)s heures." msgstr "En moyenne, les dernières importations ont pris %(hours)s heures."
#: bookwyrm/templates/import/import.html:26 #: bookwyrm/templates/import/import.html:32
#, python-format #, python-format
msgid "On average, recent imports have taken %(minutes)s minutes." msgid "On average, recent imports have taken %(minutes)s minutes."
msgstr "En moyenne, les dernières importations ont pris %(minutes)s minutes." msgstr "En moyenne, les dernières importations ont pris %(minutes)s minutes."
#: bookwyrm/templates/import/import.html:41 #: bookwyrm/templates/import/import.html:47
msgid "Data source:" msgid "Data source:"
msgstr "Source de données:" msgstr "Source de données:"
#: bookwyrm/templates/import/import.html:47 #: bookwyrm/templates/import/import.html:53
msgid "Goodreads (CSV)" msgid "Goodreads (CSV)"
msgstr "Goodreads (CSV)" msgstr "Goodreads (CSV)"
#: bookwyrm/templates/import/import.html:50 #: bookwyrm/templates/import/import.html:56
msgid "Storygraph (CSV)" msgid "Storygraph (CSV)"
msgstr "Storygraph (CSV)" msgstr "Storygraph (CSV)"
#: bookwyrm/templates/import/import.html:53 #: bookwyrm/templates/import/import.html:59
msgid "LibraryThing (TSV)" msgid "LibraryThing (TSV)"
msgstr "LibraryThing (TSV)" msgstr "LibraryThing (TSV)"
#: bookwyrm/templates/import/import.html:56 #: bookwyrm/templates/import/import.html:62
msgid "OpenLibrary (CSV)" msgid "OpenLibrary (CSV)"
msgstr "OpenLibrary (CSV)" msgstr "OpenLibrary (CSV)"
#: bookwyrm/templates/import/import.html:59 #: bookwyrm/templates/import/import.html:65
msgid "Calibre (CSV)" msgid "Calibre (CSV)"
msgstr "Calibre (CSV)" msgstr "Calibre (CSV)"
#: bookwyrm/templates/import/import.html:65 #: bookwyrm/templates/import/import.html:71
msgid "You can download your Goodreads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Import/Export page</a> of your Goodreads account." msgid "You can download your Goodreads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Import/Export page</a> of your Goodreads account."
msgstr "Vous pouvez télécharger vos données Goodreads depuis la page <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Import/Export</a> de votre compte Goodreads." msgstr "Vous pouvez télécharger vos données Goodreads depuis la page <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Import/Export</a> de votre compte Goodreads."
#: bookwyrm/templates/import/import.html:74 #: bookwyrm/templates/import/import.html:80
msgid "Data file:" msgid "Data file:"
msgstr "Fichier de données:" msgstr "Fichier de données:"
#: bookwyrm/templates/import/import.html:82 #: bookwyrm/templates/import/import.html:88
msgid "Include reviews" msgid "Include reviews"
msgstr "Importer les critiques" msgstr "Importer les critiques"
#: bookwyrm/templates/import/import.html:87 #: bookwyrm/templates/import/import.html:93
msgid "Privacy setting for imported reviews:" msgid "Privacy setting for imported reviews:"
msgstr "Confidentialité des critiques importées:" msgstr "Confidentialité des critiques importées:"
#: bookwyrm/templates/import/import.html:93 #: bookwyrm/templates/import/import.html:100
#: bookwyrm/templates/import/import.html:102
#: bookwyrm/templates/preferences/layout.html:35 #: bookwyrm/templates/preferences/layout.html:35
#: bookwyrm/templates/settings/federation/instance_blocklist.html:78 #: bookwyrm/templates/settings/federation/instance_blocklist.html:78
msgid "Import" msgid "Import"
msgstr "Importer" msgstr "Importer"
#: bookwyrm/templates/import/import.html:101 #: bookwyrm/templates/import/import.html:103
msgid "You've reached the import limit."
msgstr "Vous avez atteint la limite d'imports."
#: bookwyrm/templates/import/import.html:112
msgid "Imports are temporarily disabled; thank you for your patience." msgid "Imports are temporarily disabled; thank you for your patience."
msgstr "Les importations sont temporairement désactivées, merci pour votre patience." msgstr "Les importations sont temporairement désactivées, merci pour votre patience."
#: bookwyrm/templates/import/import.html:108 #: bookwyrm/templates/import/import.html:119
msgid "Recent Imports" msgid "Recent Imports"
msgstr "Importations récentes" msgstr "Importations récentes"
#: bookwyrm/templates/import/import.html:113 #: bookwyrm/templates/import/import.html:124
#: bookwyrm/templates/settings/imports/imports.html:89 #: bookwyrm/templates/settings/imports/imports.html:120
msgid "Date Created" msgid "Date Created"
msgstr "Date de Création" msgstr "Date de Création"
#: bookwyrm/templates/import/import.html:116 #: bookwyrm/templates/import/import.html:127
msgid "Last Updated" msgid "Last Updated"
msgstr "Dernière Mise à jour" msgstr "Dernière Mise à jour"
#: bookwyrm/templates/import/import.html:119 #: bookwyrm/templates/import/import.html:130
#: bookwyrm/templates/settings/imports/imports.html:98 #: bookwyrm/templates/settings/imports/imports.html:129
msgid "Items" msgid "Items"
msgstr "Éléments" msgstr "Éléments"
#: bookwyrm/templates/import/import.html:128 #: bookwyrm/templates/import/import.html:139
msgid "No recent imports" msgid "No recent imports"
msgstr "Aucune importation récente" msgstr "Aucune importation récente"
@ -2783,6 +2798,7 @@ msgid "Retry Status"
msgstr "Statut de la nouvelle tentative" msgstr "Statut de la nouvelle tentative"
#: bookwyrm/templates/import/import_status.html:22 #: bookwyrm/templates/import/import_status.html:22
#: bookwyrm/templates/settings/celery.html:36
#: bookwyrm/templates/settings/imports/imports.html:6 #: bookwyrm/templates/settings/imports/imports.html:6
#: bookwyrm/templates/settings/imports/imports.html:9 #: bookwyrm/templates/settings/imports/imports.html:9
#: bookwyrm/templates/settings/layout.html:82 #: bookwyrm/templates/settings/layout.html:82
@ -2802,7 +2818,7 @@ msgid "Refresh"
msgstr "Actualiser" msgstr "Actualiser"
#: bookwyrm/templates/import/import_status.html:72 #: bookwyrm/templates/import/import_status.html:72
#: bookwyrm/templates/settings/imports/imports.html:130 #: bookwyrm/templates/settings/imports/imports.html:161
msgid "Stop import" msgid "Stop import"
msgstr "Arrêter l'import" msgstr "Arrêter l'import"
@ -2920,7 +2936,7 @@ msgid "Reject"
msgstr "Rejeter" msgstr "Rejeter"
#: bookwyrm/templates/import/troubleshoot.html:7 #: bookwyrm/templates/import/troubleshoot.html:7
#: bookwyrm/templates/settings/imports/imports.html:107 #: bookwyrm/templates/settings/imports/imports.html:138
msgid "Failed items" msgid "Failed items"
msgstr "Éléments dont l'importation a échoué" msgstr "Éléments dont l'importation a échoué"
@ -3171,7 +3187,7 @@ msgid "Delete this list?"
msgstr "Supprimer cette liste ?" msgstr "Supprimer cette liste ?"
#: bookwyrm/templates/lists/edit_form.html:5 #: bookwyrm/templates/lists/edit_form.html:5
#: bookwyrm/templates/lists/layout.html:18 #: bookwyrm/templates/lists/layout.html:23
msgid "Edit List" msgid "Edit List"
msgstr "Modifier la liste" msgstr "Modifier la liste"
@ -4429,48 +4445,48 @@ msgstr "Priorité moyenne"
msgid "High priority" msgid "High priority"
msgstr "Priorité élevée" msgstr "Priorité élevée"
#: bookwyrm/templates/settings/celery.html:40 #: bookwyrm/templates/settings/celery.html:46
msgid "Could not connect to Redis broker" msgid "Could not connect to Redis broker"
msgstr "Connexion au broker Redis impossible" msgstr "Connexion au broker Redis impossible"
#: bookwyrm/templates/settings/celery.html:48 #: bookwyrm/templates/settings/celery.html:54
msgid "Active Tasks" msgid "Active Tasks"
msgstr "Tâches actives" msgstr "Tâches actives"
#: bookwyrm/templates/settings/celery.html:53 #: bookwyrm/templates/settings/celery.html:59
#: bookwyrm/templates/settings/imports/imports.html:82 #: bookwyrm/templates/settings/imports/imports.html:113
msgid "ID" msgid "ID"
msgstr "ID" msgstr "ID"
#: bookwyrm/templates/settings/celery.html:54 #: bookwyrm/templates/settings/celery.html:60
msgid "Task name" msgid "Task name"
msgstr "Nom de la tâche" msgstr "Nom de la tâche"
#: bookwyrm/templates/settings/celery.html:55 #: bookwyrm/templates/settings/celery.html:61
msgid "Run time" msgid "Run time"
msgstr "Durée" msgstr "Durée"
#: bookwyrm/templates/settings/celery.html:56 #: bookwyrm/templates/settings/celery.html:62
msgid "Priority" msgid "Priority"
msgstr "Priorité" msgstr "Priorité"
#: bookwyrm/templates/settings/celery.html:61 #: bookwyrm/templates/settings/celery.html:67
msgid "No active tasks" msgid "No active tasks"
msgstr "Aucune tâche active" msgstr "Aucune tâche active"
#: bookwyrm/templates/settings/celery.html:79 #: bookwyrm/templates/settings/celery.html:85
msgid "Workers" msgid "Workers"
msgstr "Workers" msgstr "Workers"
#: bookwyrm/templates/settings/celery.html:84 #: bookwyrm/templates/settings/celery.html:90
msgid "Uptime:" msgid "Uptime:"
msgstr "Uptime :" msgstr "Uptime :"
#: bookwyrm/templates/settings/celery.html:94 #: bookwyrm/templates/settings/celery.html:100
msgid "Could not connect to Celery" msgid "Could not connect to Celery"
msgstr "Impossible de se connecter à Celery" msgstr "Impossible de se connecter à Celery"
#: bookwyrm/templates/settings/celery.html:101 #: bookwyrm/templates/settings/celery.html:107
msgid "Errors" msgid "Errors"
msgstr "Erreurs" msgstr "Erreurs"
@ -4850,27 +4866,55 @@ msgstr "Les utilisateurs ne peuvent pas commencer de nouvelles importations"
msgid "Enable imports" msgid "Enable imports"
msgstr "Activer les importations" msgstr "Activer les importations"
#: bookwyrm/templates/settings/imports/imports.html:71 #: bookwyrm/templates/settings/imports/imports.html:63
msgid "Limit the amount of imports"
msgstr "Limiter le nombre d'imports"
#: bookwyrm/templates/settings/imports/imports.html:74
msgid "Some users might try to import a large number of books, which you want to limit."
msgstr "Certains utilisateurs peuvent essayer d'importer un grand nombre de livres, ce que vous souhaitez limiter."
#: bookwyrm/templates/settings/imports/imports.html:75
msgid "Set the value to 0 to not enforce any limit."
msgstr "Mettez la valeur à 0 pour ne pas imposer de limiter."
#: bookwyrm/templates/settings/imports/imports.html:78
msgid "Set import limit to"
msgstr "Définir la limite d'import à"
#: bookwyrm/templates/settings/imports/imports.html:80
msgid "books every"
msgstr "livres tous les"
#: bookwyrm/templates/settings/imports/imports.html:82
msgid "days."
msgstr "jours."
#: bookwyrm/templates/settings/imports/imports.html:86
msgid "Set limit"
msgstr "Définir la limite"
#: bookwyrm/templates/settings/imports/imports.html:102
msgid "Completed" msgid "Completed"
msgstr "Terminé" msgstr "Terminé"
#: bookwyrm/templates/settings/imports/imports.html:85 #: bookwyrm/templates/settings/imports/imports.html:116
msgid "User" msgid "User"
msgstr "Utilisateur" msgstr "Utilisateur"
#: bookwyrm/templates/settings/imports/imports.html:94 #: bookwyrm/templates/settings/imports/imports.html:125
msgid "Date Updated" msgid "Date Updated"
msgstr "Date de Mise à jour" msgstr "Date de Mise à jour"
#: bookwyrm/templates/settings/imports/imports.html:101 #: bookwyrm/templates/settings/imports/imports.html:132
msgid "Pending items" msgid "Pending items"
msgstr "Éléments en attente" msgstr "Éléments en attente"
#: bookwyrm/templates/settings/imports/imports.html:104 #: bookwyrm/templates/settings/imports/imports.html:135
msgid "Successful items" msgid "Successful items"
msgstr "Éléments réussis" msgstr "Éléments réussis"
#: bookwyrm/templates/settings/imports/imports.html:139 #: bookwyrm/templates/settings/imports/imports.html:170
msgid "No matching imports found." msgid "No matching imports found."
msgstr "Aucun import correspondant trouvé." msgstr "Aucun import correspondant trouvé."
@ -5131,34 +5175,38 @@ msgstr "Impossible denregistrer les paramètres"
msgid "Allow registration" msgid "Allow registration"
msgstr "Autoriser les inscriptions" msgstr "Autoriser les inscriptions"
#: bookwyrm/templates/settings/registration.html:44 #: bookwyrm/templates/settings/registration.html:43
msgid "Default access level:"
msgstr "Niveau d'accès par défaut :"
#: bookwyrm/templates/settings/registration.html:61
msgid "Require users to confirm email address" msgid "Require users to confirm email address"
msgstr "Demander aux utilisateurs et utilisatrices de confirmer leur adresse email" msgstr "Demander aux utilisateurs et utilisatrices de confirmer leur adresse email"
#: bookwyrm/templates/settings/registration.html:46 #: bookwyrm/templates/settings/registration.html:63
msgid "(Recommended if registration is open)" msgid "(Recommended if registration is open)"
msgstr "(Recommandé si les inscriptions sont ouvertes)" msgstr "(Recommandé si les inscriptions sont ouvertes)"
#: bookwyrm/templates/settings/registration.html:51 #: bookwyrm/templates/settings/registration.html:68
msgid "Allow invite requests" msgid "Allow invite requests"
msgstr "Autoriser les demandes dinvitation" msgstr "Autoriser les demandes dinvitation"
#: bookwyrm/templates/settings/registration.html:55 #: bookwyrm/templates/settings/registration.html:72
#: bookwyrm/templates/settings/registration_limited.html:42 #: bookwyrm/templates/settings/registration_limited.html:42
msgid "Invite request text:" msgid "Invite request text:"
msgstr "Texte de la demande d'invitation :" msgstr "Texte de la demande d'invitation :"
#: bookwyrm/templates/settings/registration.html:63 #: bookwyrm/templates/settings/registration.html:80
#: bookwyrm/templates/settings/registration_limited.html:50 #: bookwyrm/templates/settings/registration_limited.html:50
msgid "Set a question for invite requests" msgid "Set a question for invite requests"
msgstr "Définir une question pour les demandes dinvitation" msgstr "Définir une question pour les demandes dinvitation"
#: bookwyrm/templates/settings/registration.html:68 #: bookwyrm/templates/settings/registration.html:85
#: bookwyrm/templates/settings/registration_limited.html:55 #: bookwyrm/templates/settings/registration_limited.html:55
msgid "Question:" msgid "Question:"
msgstr "Question :" msgstr "Question :"
#: bookwyrm/templates/settings/registration.html:73 #: bookwyrm/templates/settings/registration.html:90
#: bookwyrm/templates/settings/registration_limited.html:67 #: bookwyrm/templates/settings/registration_limited.html:67
msgid "Registration closed text:" msgid "Registration closed text:"
msgstr "Texte affiché lorsque les inscriptions sont closes:" msgstr "Texte affiché lorsque les inscriptions sont closes:"
@ -5400,7 +5448,7 @@ msgid "Remove theme"
msgstr "Supprimer le thème" msgstr "Supprimer le thème"
#: bookwyrm/templates/settings/users/delete_user_form.html:5 #: bookwyrm/templates/settings/users/delete_user_form.html:5
#: bookwyrm/templates/settings/users/user_moderation_actions.html:32 #: bookwyrm/templates/settings/users/user_moderation_actions.html:38
msgid "Permanently delete user" msgid "Permanently delete user"
msgstr "Supprimer définitivement l'utilisateur" msgstr "Supprimer définitivement l'utilisateur"
@ -5522,14 +5570,18 @@ msgid "User Actions"
msgstr "Actions de l'utilisateur" msgstr "Actions de l'utilisateur"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:21 #: bookwyrm/templates/settings/users/user_moderation_actions.html:21
msgid "Activate user"
msgstr "Activer le compte"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:27
msgid "Suspend user" msgid "Suspend user"
msgstr "Suspendre le compte" msgstr "Suspendre le compte"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:26 #: bookwyrm/templates/settings/users/user_moderation_actions.html:32
msgid "Un-suspend user" msgid "Un-suspend user"
msgstr "Rétablir le compte" msgstr "Rétablir le compte"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:48 #: bookwyrm/templates/settings/users/user_moderation_actions.html:54
msgid "Access level:" msgid "Access level:"
msgstr "Niveau daccès:" msgstr "Niveau daccès:"
@ -6379,33 +6431,53 @@ msgstr "%(username)s ne suit personne"
msgid "No reviews or comments yet!" msgid "No reviews or comments yet!"
msgstr "Aucune critique ou commentaire pour le moment !" msgstr "Aucune critique ou commentaire pour le moment !"
#: bookwyrm/templates/user/user.html:16 #: bookwyrm/templates/user/user.html:20
msgid "Edit profile" msgid "Edit profile"
msgstr "Modifier le profil" msgstr "Modifier le profil"
#: bookwyrm/templates/user/user.html:38 #: bookwyrm/templates/user/user.html:42
#, python-format #, python-format
msgid "View all %(size)s" msgid "View all %(size)s"
msgstr "Voir les %(size)s" msgstr "Voir les %(size)s"
#: bookwyrm/templates/user/user.html:52 #: bookwyrm/templates/user/user.html:56
msgid "View all books" msgid "View all books"
msgstr "Voir tous les livres" msgstr "Voir tous les livres"
#: bookwyrm/templates/user/user.html:59 #: bookwyrm/templates/user/user.html:63
#, python-format #, python-format
msgid "%(current_year)s Reading Goal" msgid "%(current_year)s Reading Goal"
msgstr "Défi lecture pour %(current_year)s" msgstr "Défi lecture pour %(current_year)s"
#: bookwyrm/templates/user/user.html:66 #: bookwyrm/templates/user/user.html:70
msgid "User Activity" msgid "User Activity"
msgstr "Activité du compte" msgstr "Activité du compte"
#: bookwyrm/templates/user/user.html:71 #: bookwyrm/templates/user/user.html:76
msgid "Show RSS Options"
msgstr "Afficher les options de flux RSS"
#: bookwyrm/templates/user/user.html:82
msgid "RSS feed" msgid "RSS feed"
msgstr "Flux RSS" msgstr "Flux RSS"
#: bookwyrm/templates/user/user.html:83 #: bookwyrm/templates/user/user.html:98
msgid "Complete feed"
msgstr "Flux complet"
#: bookwyrm/templates/user/user.html:103
msgid "Reviews only"
msgstr "Seulement les critiques"
#: bookwyrm/templates/user/user.html:108
msgid "Quotes only"
msgstr "Seulement les citations"
#: bookwyrm/templates/user/user.html:113
msgid "Comments only"
msgstr "Seulement les commentaires"
#: bookwyrm/templates/user/user.html:129
msgid "No activities yet!" msgid "No activities yet!"
msgstr "Aucune activité pour linstant!" msgstr "Aucune activité pour linstant!"
@ -6449,16 +6521,43 @@ msgstr "Se déconnecter"
msgid "File exceeds maximum size: 10MB" msgid "File exceeds maximum size: 10MB"
msgstr "Ce fichier dépasse la taille limite: 10Mo" msgstr "Ce fichier dépasse la taille limite: 10Mo"
#: bookwyrm/templatetags/list_page_tags.py:14
#, python-format
msgid "Book List: %(name)s"
msgstr "Liste de livres : %(name)s"
#: bookwyrm/templatetags/list_page_tags.py:22
#, python-format
msgid "%(num)d book - by %(user)s"
msgid_plural "%(num)d books - by %(user)s"
msgstr[0] "%(num)d livre - par %(user)s"
msgstr[1] "%(num)d livres - par %(user)s"
#: bookwyrm/templatetags/utilities.py:39 #: bookwyrm/templatetags/utilities.py:39
#, python-format #, python-format
msgid "%(title)s: %(subtitle)s" msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s (%(subtitle)s)" msgstr "%(title)s (%(subtitle)s)"
#: bookwyrm/views/rss_feed.py:34 #: bookwyrm/views/rss_feed.py:35
#, python-brace-format #, python-brace-format
msgid "Status updates from {obj.display_name}" msgid "Status updates from {obj.display_name}"
msgstr "Mises à jour de statut de {obj.display_name}" msgstr "Mises à jour de statut de {obj.display_name}"
#: bookwyrm/views/rss_feed.py:72
#, python-brace-format
msgid "Reviews from {obj.display_name}"
msgstr "Critiques de {obj.display_name}"
#: bookwyrm/views/rss_feed.py:110
#, python-brace-format
msgid "Quotes from {obj.display_name}"
msgstr "Citations de {obj.display_name}"
#: bookwyrm/views/rss_feed.py:148
#, python-brace-format
msgid "Comments from {obj.display_name}"
msgstr "Commentaires de {obj.display_name}"
#: bookwyrm/views/updates.py:45 #: bookwyrm/views/updates.py:45
#, python-format #, python-format
msgid "Load %(count)d unread status" msgid "Load %(count)d unread status"

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: bookwyrm\n" "Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-11 22:46+0000\n" "POT-Creation-Date: 2023-01-30 08:21+0000\n"
"PO-Revision-Date: 2023-01-12 06:35\n" "PO-Revision-Date: 2023-03-09 14:35\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n" "Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Galician\n" "Language-Team: Galician\n"
"Language: gl\n" "Language: gl\n"
@ -218,11 +218,11 @@ msgstr "%(value)s non é un nome de usuaria válido"
#: bookwyrm/models/fields.py:182 bookwyrm/templates/layout.html:131 #: bookwyrm/models/fields.py:182 bookwyrm/templates/layout.html:131
#: bookwyrm/templates/ostatus/error.html:29 #: bookwyrm/templates/ostatus/error.html:29
msgid "username" msgid "username"
msgstr "nome de usuaria" msgstr "identificador"
#: bookwyrm/models/fields.py:187 #: bookwyrm/models/fields.py:187
msgid "A user with that username already exists." msgid "A user with that username already exists."
msgstr "Xa existe unha usuaria con ese nome." msgstr "Xa existe unha usuaria con ese identificador."
#: bookwyrm/models/fields.py:206 #: bookwyrm/models/fields.py:206
#: bookwyrm/templates/snippets/privacy-icons.html:3 #: bookwyrm/templates/snippets/privacy-icons.html:3
@ -256,14 +256,14 @@ msgstr "Seguidoras"
msgid "Private" msgid "Private"
msgstr "Privado" msgstr "Privado"
#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:157 #: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:168
#: bookwyrm/templates/settings/imports/imports.html:67 #: bookwyrm/templates/settings/imports/imports.html:98
#: bookwyrm/templates/settings/users/user_admin.html:81 #: bookwyrm/templates/settings/users/user_admin.html:81
#: bookwyrm/templates/settings/users/user_info.html:28 #: bookwyrm/templates/settings/users/user_info.html:28
msgid "Active" msgid "Active"
msgstr "Activa" msgstr "Activa"
#: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:155 #: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:166
msgid "Complete" msgid "Complete"
msgstr "Completa" msgstr "Completa"
@ -316,19 +316,19 @@ msgstr "Citas"
msgid "Everything else" msgid "Everything else"
msgstr "As outras cousas" msgstr "As outras cousas"
#: bookwyrm/settings.py:214 #: bookwyrm/settings.py:217
msgid "Home Timeline" msgid "Home Timeline"
msgstr "Cronoloxía de Inicio" msgstr "Cronoloxía de Inicio"
#: bookwyrm/settings.py:214 #: bookwyrm/settings.py:217
msgid "Home" msgid "Home"
msgstr "Inicio" msgstr "Inicio"
#: bookwyrm/settings.py:215 #: bookwyrm/settings.py:218
msgid "Books Timeline" msgid "Books Timeline"
msgstr "Cronoloxía de libros" msgstr "Cronoloxía de libros"
#: bookwyrm/settings.py:215 #: bookwyrm/settings.py:218
#: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/guided_tour/user_profile.html:101
#: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:22
#: bookwyrm/templates/search/layout.html:43 #: bookwyrm/templates/search/layout.html:43
@ -336,75 +336,75 @@ msgstr "Cronoloxía de libros"
msgid "Books" msgid "Books"
msgstr "Libros" msgstr "Libros"
#: bookwyrm/settings.py:287 #: bookwyrm/settings.py:290
msgid "English" msgid "English"
msgstr "English (Inglés)" msgstr "English (Inglés)"
#: bookwyrm/settings.py:288 #: bookwyrm/settings.py:291
msgid "Català (Catalan)" msgid "Català (Catalan)"
msgstr "Català (Catalan)" msgstr "Català (Catalan)"
#: bookwyrm/settings.py:289 #: bookwyrm/settings.py:292
msgid "Deutsch (German)" msgid "Deutsch (German)"
msgstr "Deutsch (Alemán)" msgstr "Deutsch (Alemán)"
#: bookwyrm/settings.py:290 #: bookwyrm/settings.py:293
msgid "Español (Spanish)" msgid "Español (Spanish)"
msgstr "Español (Español)" msgstr "Español (Español)"
#: bookwyrm/settings.py:291 #: bookwyrm/settings.py:294
msgid "Euskara (Basque)" msgid "Euskara (Basque)"
msgstr "Euskara (Éuscaro)" msgstr "Euskara (Éuscaro)"
#: bookwyrm/settings.py:292 #: bookwyrm/settings.py:295
msgid "Galego (Galician)" msgid "Galego (Galician)"
msgstr "Galego (Galego)" msgstr "Galego (Galego)"
#: bookwyrm/settings.py:293 #: bookwyrm/settings.py:296
msgid "Italiano (Italian)" msgid "Italiano (Italian)"
msgstr "Italiano (Italiano)" msgstr "Italiano (Italiano)"
#: bookwyrm/settings.py:294 #: bookwyrm/settings.py:297
msgid "Suomi (Finnish)" msgid "Suomi (Finnish)"
msgstr "Suomi (Finés)" msgstr "Suomi (Finés)"
#: bookwyrm/settings.py:295 #: bookwyrm/settings.py:298
msgid "Français (French)" msgid "Français (French)"
msgstr "Français (Francés)" msgstr "Français (Francés)"
#: bookwyrm/settings.py:296 #: bookwyrm/settings.py:299
msgid "Lietuvių (Lithuanian)" msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (Lituano)" msgstr "Lietuvių (Lituano)"
#: bookwyrm/settings.py:297 #: bookwyrm/settings.py:300
msgid "Norsk (Norwegian)" msgid "Norsk (Norwegian)"
msgstr "Norsk (Noruegués)" msgstr "Norsk (Noruegués)"
#: bookwyrm/settings.py:298 #: bookwyrm/settings.py:301
msgid "Polski (Polish)" msgid "Polski (Polish)"
msgstr "Polski (Polaco)" msgstr "Polski (Polaco)"
#: bookwyrm/settings.py:299 #: bookwyrm/settings.py:302
msgid "Português do Brasil (Brazilian Portuguese)" msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português do Brasil (Portugués brasileiro)" msgstr "Português do Brasil (Portugués brasileiro)"
#: bookwyrm/settings.py:300 #: bookwyrm/settings.py:303
msgid "Português Europeu (European Portuguese)" msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Portugués europeo)" msgstr "Português Europeu (Portugués europeo)"
#: bookwyrm/settings.py:301 #: bookwyrm/settings.py:304
msgid "Română (Romanian)" msgid "Română (Romanian)"
msgstr "Română (Rumanés)" msgstr "Română (Rumanés)"
#: bookwyrm/settings.py:302 #: bookwyrm/settings.py:305
msgid "Svenska (Swedish)" msgid "Svenska (Swedish)"
msgstr "Svenska (Sueco)" msgstr "Svenska (Sueco)"
#: bookwyrm/settings.py:303 #: bookwyrm/settings.py:306
msgid "简体中文 (Simplified Chinese)" msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (Chinés simplificado)" msgstr "简体中文 (Chinés simplificado)"
#: bookwyrm/settings.py:304 #: bookwyrm/settings.py:307
msgid "繁體中文 (Traditional Chinese)" msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (Chinés tradicional)" msgstr "繁體中文 (Chinés tradicional)"
@ -847,10 +847,10 @@ msgstr "ISNI:"
#: bookwyrm/templates/settings/announcements/edit_announcement.html:120 #: bookwyrm/templates/settings/announcements/edit_announcement.html:120
#: bookwyrm/templates/settings/federation/edit_instance.html:98 #: bookwyrm/templates/settings/federation/edit_instance.html:98
#: bookwyrm/templates/settings/federation/instance.html:105 #: bookwyrm/templates/settings/federation/instance.html:105
#: bookwyrm/templates/settings/registration.html:79 #: bookwyrm/templates/settings/registration.html:96
#: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/registration_limited.html:76
#: bookwyrm/templates/settings/site.html:144 #: bookwyrm/templates/settings/site.html:144
#: bookwyrm/templates/settings/users/user_moderation_actions.html:69 #: bookwyrm/templates/settings/users/user_moderation_actions.html:75
#: bookwyrm/templates/shelf/form.html:25 #: bookwyrm/templates/shelf/form.html:25
#: bookwyrm/templates/snippets/reading_modals/layout.html:18 #: bookwyrm/templates/snippets/reading_modals/layout.html:18
msgid "Save" msgid "Save"
@ -1160,7 +1160,7 @@ msgstr "Este é un novo traballo"
#: bookwyrm/templates/guided_tour/user_profile.html:89 #: bookwyrm/templates/guided_tour/user_profile.html:89
#: bookwyrm/templates/guided_tour/user_profile.html:112 #: bookwyrm/templates/guided_tour/user_profile.html:112
#: bookwyrm/templates/guided_tour/user_profile.html:135 #: bookwyrm/templates/guided_tour/user_profile.html:135
#: bookwyrm/templates/user_menu.html:18 #: bookwyrm/templates/user/user.html:87 bookwyrm/templates/user_menu.html:18
msgid "Back" msgid "Back"
msgstr "Atrás" msgstr "Atrás"
@ -1372,7 +1372,7 @@ msgid "Domain"
msgstr "Dominio" msgstr "Dominio"
#: bookwyrm/templates/book/file_links/edit_links.html:36 #: bookwyrm/templates/book/file_links/edit_links.html:36
#: bookwyrm/templates/import/import.html:122 #: bookwyrm/templates/import/import.html:133
#: bookwyrm/templates/import/import_status.html:134 #: bookwyrm/templates/import/import_status.html:134
#: bookwyrm/templates/settings/announcements/announcements.html:37 #: bookwyrm/templates/settings/announcements/announcements.html:37
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:48 #: bookwyrm/templates/settings/invites/manage_invite_requests.html:48
@ -1385,7 +1385,7 @@ msgstr "Estado"
#: bookwyrm/templates/book/file_links/edit_links.html:37 #: bookwyrm/templates/book/file_links/edit_links.html:37
#: bookwyrm/templates/settings/announcements/announcements.html:41 #: bookwyrm/templates/settings/announcements/announcements.html:41
#: bookwyrm/templates/settings/federation/instance.html:112 #: bookwyrm/templates/settings/federation/instance.html:112
#: bookwyrm/templates/settings/imports/imports.html:110 #: bookwyrm/templates/settings/imports/imports.html:141
#: bookwyrm/templates/settings/reports/report_links_table.html:6 #: bookwyrm/templates/settings/reports/report_links_table.html:6
#: bookwyrm/templates/settings/themes.html:99 #: bookwyrm/templates/settings/themes.html:99
msgid "Actions" msgid "Actions"
@ -1905,13 +1905,13 @@ msgid "Add to your books"
msgstr "Engadir aos teus libros" msgstr "Engadir aos teus libros"
#: bookwyrm/templates/get_started/book_preview.html:10 #: bookwyrm/templates/get_started/book_preview.html:10
#: bookwyrm/templates/shelf/shelf.html:86 bookwyrm/templates/user/user.html:33 #: bookwyrm/templates/shelf/shelf.html:86 bookwyrm/templates/user/user.html:37
#: bookwyrm/templatetags/shelf_tags.py:48 #: bookwyrm/templatetags/shelf_tags.py:48
msgid "To Read" msgid "To Read"
msgstr "Pendentes" msgstr "Pendentes"
#: bookwyrm/templates/get_started/book_preview.html:11 #: bookwyrm/templates/get_started/book_preview.html:11
#: bookwyrm/templates/shelf/shelf.html:87 bookwyrm/templates/user/user.html:34 #: bookwyrm/templates/shelf/shelf.html:87 bookwyrm/templates/user/user.html:38
#: bookwyrm/templatetags/shelf_tags.py:50 #: bookwyrm/templatetags/shelf_tags.py:50
msgid "Currently Reading" msgid "Currently Reading"
msgstr "Lectura actual" msgstr "Lectura actual"
@ -1921,12 +1921,12 @@ msgstr "Lectura actual"
#: bookwyrm/templates/snippets/shelf_selector.html:46 #: bookwyrm/templates/snippets/shelf_selector.html:46
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24 #: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12 #: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12
#: bookwyrm/templates/user/user.html:35 bookwyrm/templatetags/shelf_tags.py:52 #: bookwyrm/templates/user/user.html:39 bookwyrm/templatetags/shelf_tags.py:52
msgid "Read" msgid "Read"
msgstr "Lidos" msgstr "Lidos"
#: bookwyrm/templates/get_started/book_preview.html:13 #: bookwyrm/templates/get_started/book_preview.html:13
#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:36 #: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:40
msgid "Stopped Reading" msgid "Stopped Reading"
msgstr "Abandonados" msgstr "Abandonados"
@ -2642,7 +2642,7 @@ msgid "This is your user profile. All your latest activities will be listed here
msgstr "Este é o teu perfil de usuaria. A túas últimas actividades aparecerán aquí. Outras usuarias de Bookwyrm poden ver certas partes desta páxina - o que vexan depende dos teus axustes de privacidade." msgstr "Este é o teu perfil de usuaria. A túas últimas actividades aparecerán aquí. Outras usuarias de Bookwyrm poden ver certas partes desta páxina - o que vexan depende dos teus axustes de privacidade."
#: bookwyrm/templates/guided_tour/user_profile.html:11 #: bookwyrm/templates/guided_tour/user_profile.html:11
#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:10 #: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:14
msgid "User Profile" msgid "User Profile"
msgstr "Perfil da usuaria" msgstr "Perfil da usuaria"
@ -2689,85 +2689,100 @@ msgstr "Importar libros"
msgid "Not a valid CSV file" msgid "Not a valid CSV file"
msgstr "Non é un ficheiro CSV válido" msgstr "Non é un ficheiro CSV válido"
#: bookwyrm/templates/import/import.html:22 #: bookwyrm/templates/import/import.html:20
#, python-format
msgid "Currently you are allowed to import %(import_size_limit)s books every %(import_limit_reset)s days."
msgstr "Actualmente tes permiso para importar %(import_size_limit)s libros cada %(import_limit_reset)s días."
#: bookwyrm/templates/import/import.html:21
#, python-format
msgid "You have %(allowed_imports)s left."
msgstr "Aínda podes importar %(allowed_imports)s libros."
#: bookwyrm/templates/import/import.html:28
#, python-format #, python-format
msgid "On average, recent imports have taken %(hours)s hours." msgid "On average, recent imports have taken %(hours)s hours."
msgstr "De media, ás importacións recentes levoulles %(hours)s horas." msgstr "De media, ás importacións recentes levoulles %(hours)s horas."
#: bookwyrm/templates/import/import.html:26 #: bookwyrm/templates/import/import.html:32
#, python-format #, python-format
msgid "On average, recent imports have taken %(minutes)s minutes." msgid "On average, recent imports have taken %(minutes)s minutes."
msgstr "De media, ás importacións recentes levoulles %(minutes)s minutos." msgstr "De media, ás importacións recentes levoulles %(minutes)s minutos."
#: bookwyrm/templates/import/import.html:41 #: bookwyrm/templates/import/import.html:47
msgid "Data source:" msgid "Data source:"
msgstr "Fonte de datos:" msgstr "Fonte de datos:"
#: bookwyrm/templates/import/import.html:47 #: bookwyrm/templates/import/import.html:53
msgid "Goodreads (CSV)" msgid "Goodreads (CSV)"
msgstr "Goodreads (CSV)" msgstr "Goodreads (CSV)"
#: bookwyrm/templates/import/import.html:50 #: bookwyrm/templates/import/import.html:56
msgid "Storygraph (CSV)" msgid "Storygraph (CSV)"
msgstr "Storygraph (CSV)" msgstr "Storygraph (CSV)"
#: bookwyrm/templates/import/import.html:53 #: bookwyrm/templates/import/import.html:59
msgid "LibraryThing (TSV)" msgid "LibraryThing (TSV)"
msgstr "LibraryThing (TSV)" msgstr "LibraryThing (TSV)"
#: bookwyrm/templates/import/import.html:56 #: bookwyrm/templates/import/import.html:62
msgid "OpenLibrary (CSV)" msgid "OpenLibrary (CSV)"
msgstr "OpenLibrary (CSV)" msgstr "OpenLibrary (CSV)"
#: bookwyrm/templates/import/import.html:59 #: bookwyrm/templates/import/import.html:65
msgid "Calibre (CSV)" msgid "Calibre (CSV)"
msgstr "Calibre (CSV)" msgstr "Calibre (CSV)"
#: bookwyrm/templates/import/import.html:65 #: bookwyrm/templates/import/import.html:71
msgid "You can download your Goodreads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Import/Export page</a> of your Goodreads account." msgid "You can download your Goodreads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Import/Export page</a> of your Goodreads account."
msgstr "Podes descargar os teus datos de Goodreads desde a <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">páxina de Exportación/Importación</a> da túa conta Goodreads." msgstr "Podes descargar os teus datos de Goodreads desde a <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">páxina de Exportación/Importación</a> da túa conta Goodreads."
#: bookwyrm/templates/import/import.html:74 #: bookwyrm/templates/import/import.html:80
msgid "Data file:" msgid "Data file:"
msgstr "Ficheiro de datos:" msgstr "Ficheiro de datos:"
#: bookwyrm/templates/import/import.html:82 #: bookwyrm/templates/import/import.html:88
msgid "Include reviews" msgid "Include reviews"
msgstr "Incluír recensións" msgstr "Incluír recensións"
#: bookwyrm/templates/import/import.html:87 #: bookwyrm/templates/import/import.html:93
msgid "Privacy setting for imported reviews:" msgid "Privacy setting for imported reviews:"
msgstr "Axuste de privacidade para recensións importadas:" msgstr "Axuste de privacidade para recensións importadas:"
#: bookwyrm/templates/import/import.html:93 #: bookwyrm/templates/import/import.html:100
#: bookwyrm/templates/import/import.html:102
#: bookwyrm/templates/preferences/layout.html:35 #: bookwyrm/templates/preferences/layout.html:35
#: bookwyrm/templates/settings/federation/instance_blocklist.html:78 #: bookwyrm/templates/settings/federation/instance_blocklist.html:78
msgid "Import" msgid "Import"
msgstr "Importar" msgstr "Importar"
#: bookwyrm/templates/import/import.html:101 #: bookwyrm/templates/import/import.html:103
msgid "You've reached the import limit."
msgstr "Acadaches o límite de importacións."
#: bookwyrm/templates/import/import.html:112
msgid "Imports are temporarily disabled; thank you for your patience." msgid "Imports are temporarily disabled; thank you for your patience."
msgstr "As importacións están temporalmente desactivadas; grazas pola paciencia." msgstr "As importacións están temporalmente desactivadas; grazas pola paciencia."
#: bookwyrm/templates/import/import.html:108 #: bookwyrm/templates/import/import.html:119
msgid "Recent Imports" msgid "Recent Imports"
msgstr "Importacións recentes" msgstr "Importacións recentes"
#: bookwyrm/templates/import/import.html:113 #: bookwyrm/templates/import/import.html:124
#: bookwyrm/templates/settings/imports/imports.html:89 #: bookwyrm/templates/settings/imports/imports.html:120
msgid "Date Created" msgid "Date Created"
msgstr "Data de creación" msgstr "Data de creación"
#: bookwyrm/templates/import/import.html:116 #: bookwyrm/templates/import/import.html:127
msgid "Last Updated" msgid "Last Updated"
msgstr "Última actualización" msgstr "Última actualización"
#: bookwyrm/templates/import/import.html:119 #: bookwyrm/templates/import/import.html:130
#: bookwyrm/templates/settings/imports/imports.html:98 #: bookwyrm/templates/settings/imports/imports.html:129
msgid "Items" msgid "Items"
msgstr "Elementos" msgstr "Elementos"
#: bookwyrm/templates/import/import.html:128 #: bookwyrm/templates/import/import.html:139
msgid "No recent imports" msgid "No recent imports"
msgstr "Sen importacións recentes" msgstr "Sen importacións recentes"
@ -2783,6 +2798,7 @@ msgid "Retry Status"
msgstr "Intenta outra vez" msgstr "Intenta outra vez"
#: bookwyrm/templates/import/import_status.html:22 #: bookwyrm/templates/import/import_status.html:22
#: bookwyrm/templates/settings/celery.html:36
#: bookwyrm/templates/settings/imports/imports.html:6 #: bookwyrm/templates/settings/imports/imports.html:6
#: bookwyrm/templates/settings/imports/imports.html:9 #: bookwyrm/templates/settings/imports/imports.html:9
#: bookwyrm/templates/settings/layout.html:82 #: bookwyrm/templates/settings/layout.html:82
@ -2802,7 +2818,7 @@ msgid "Refresh"
msgstr "Actualizar" msgstr "Actualizar"
#: bookwyrm/templates/import/import_status.html:72 #: bookwyrm/templates/import/import_status.html:72
#: bookwyrm/templates/settings/imports/imports.html:130 #: bookwyrm/templates/settings/imports/imports.html:161
msgid "Stop import" msgid "Stop import"
msgstr "Deter a importación" msgstr "Deter a importación"
@ -2920,7 +2936,7 @@ msgid "Reject"
msgstr "Rexeitar" msgstr "Rexeitar"
#: bookwyrm/templates/import/troubleshoot.html:7 #: bookwyrm/templates/import/troubleshoot.html:7
#: bookwyrm/templates/settings/imports/imports.html:107 #: bookwyrm/templates/settings/imports/imports.html:138
msgid "Failed items" msgid "Failed items"
msgstr "Elementos fallidos" msgstr "Elementos fallidos"
@ -3020,7 +3036,7 @@ msgstr "Correcto! Enderezo de email confirmado."
#: bookwyrm/templates/layout.html:130 bookwyrm/templates/ostatus/error.html:28 #: bookwyrm/templates/layout.html:130 bookwyrm/templates/ostatus/error.html:28
#: bookwyrm/templates/snippets/register_form.html:4 #: bookwyrm/templates/snippets/register_form.html:4
msgid "Username:" msgid "Username:"
msgstr "Nome de usuaria:" msgstr "Identificador:"
#: bookwyrm/templates/landing/login.html:27 #: bookwyrm/templates/landing/login.html:27
#: bookwyrm/templates/landing/password_reset.html:26 #: bookwyrm/templates/landing/password_reset.html:26
@ -3171,7 +3187,7 @@ msgid "Delete this list?"
msgstr "Eliminar esta lista?" msgstr "Eliminar esta lista?"
#: bookwyrm/templates/lists/edit_form.html:5 #: bookwyrm/templates/lists/edit_form.html:5
#: bookwyrm/templates/lists/layout.html:18 #: bookwyrm/templates/lists/layout.html:23
msgid "Edit List" msgid "Edit List"
msgstr "Editar lista" msgstr "Editar lista"
@ -3677,7 +3693,7 @@ msgstr "Estás ao día!"
#: bookwyrm/templates/ostatus/error.html:7 #: bookwyrm/templates/ostatus/error.html:7
#, python-format #, python-format
msgid "<strong>%(account)s</strong> is not a valid username" msgid "<strong>%(account)s</strong> is not a valid username"
msgstr "<strong>%(account)s</strong> non é un nome de usuaria válido" msgstr "<strong>%(account)s</strong> non é un identificador válido"
#: bookwyrm/templates/ostatus/error.html:8 #: bookwyrm/templates/ostatus/error.html:8
#: bookwyrm/templates/ostatus/error.html:13 #: bookwyrm/templates/ostatus/error.html:13
@ -3706,7 +3722,7 @@ msgstr "Algo fallou ao intentar seguir a <strong>%(account)s</strong>"
#: bookwyrm/templates/ostatus/error.html:47 #: bookwyrm/templates/ostatus/error.html:47
msgid "Check you have the correct username before trying again." msgid "Check you have the correct username before trying again."
msgstr "Comproba se escribiches o nome de usuaria correcto e inténtao outra vez." msgstr "Comproba se escribiches o identificador correcto e inténtao outra vez."
#: bookwyrm/templates/ostatus/error.html:51 #: bookwyrm/templates/ostatus/error.html:51
#, python-format #, python-format
@ -3736,7 +3752,7 @@ msgstr "Seguir a %(username)s no fediverso"
#: bookwyrm/templates/ostatus/remote_follow.html:33 #: bookwyrm/templates/ostatus/remote_follow.html:33
#, python-format #, python-format
msgid "Follow %(username)s from another Fediverse account like BookWyrm, Mastodon, or Pleroma." msgid "Follow %(username)s from another Fediverse account like BookWyrm, Mastodon, or Pleroma."
msgstr "Sigue a %(username)s desde outra conta no Fediverso como BookWyrm, Mastodon ou Pleroma." msgstr "Segue a %(username)s desde outra conta no Fediverso como BookWyrm, Mastodon ou Pleroma."
#: bookwyrm/templates/ostatus/remote_follow.html:40 #: bookwyrm/templates/ostatus/remote_follow.html:40
msgid "User handle to follow from:" msgid "User handle to follow from:"
@ -3912,7 +3928,7 @@ msgstr "Eliminar a conta de xeito definitivo"
#: bookwyrm/templates/preferences/delete_user.html:29 #: bookwyrm/templates/preferences/delete_user.html:29
msgid "Deleting your account cannot be undone. The username will not be available to register in the future." msgid "Deleting your account cannot be undone. The username will not be available to register in the future."
msgstr "Se eliminas a conta non haberá volta atrás. O nome de usuaria non estará dispoñible para rexistro no futuro." msgstr "Se eliminas a conta non haberá volta atrás. O identificador non estará dispoñible para rexistro no futuro."
#: bookwyrm/templates/preferences/disable-2fa.html:12 #: bookwyrm/templates/preferences/disable-2fa.html:12
msgid "Disable Two Factor Authentication" msgid "Disable Two Factor Authentication"
@ -4429,48 +4445,48 @@ msgstr "Prioridade media"
msgid "High priority" msgid "High priority"
msgstr "Alta prioridade" msgstr "Alta prioridade"
#: bookwyrm/templates/settings/celery.html:40 #: bookwyrm/templates/settings/celery.html:46
msgid "Could not connect to Redis broker" msgid "Could not connect to Redis broker"
msgstr "Non puido conectar con Redis broker" msgstr "Non puido conectar con Redis broker"
#: bookwyrm/templates/settings/celery.html:48 #: bookwyrm/templates/settings/celery.html:54
msgid "Active Tasks" msgid "Active Tasks"
msgstr "Tarefas activas" msgstr "Tarefas activas"
#: bookwyrm/templates/settings/celery.html:53 #: bookwyrm/templates/settings/celery.html:59
#: bookwyrm/templates/settings/imports/imports.html:82 #: bookwyrm/templates/settings/imports/imports.html:113
msgid "ID" msgid "ID"
msgstr "ID" msgstr "ID"
#: bookwyrm/templates/settings/celery.html:54 #: bookwyrm/templates/settings/celery.html:60
msgid "Task name" msgid "Task name"
msgstr "Nome da tarefa" msgstr "Nome da tarefa"
#: bookwyrm/templates/settings/celery.html:55 #: bookwyrm/templates/settings/celery.html:61
msgid "Run time" msgid "Run time"
msgstr "Tempo de execución" msgstr "Tempo de execución"
#: bookwyrm/templates/settings/celery.html:56 #: bookwyrm/templates/settings/celery.html:62
msgid "Priority" msgid "Priority"
msgstr "Prioridade" msgstr "Prioridade"
#: bookwyrm/templates/settings/celery.html:61 #: bookwyrm/templates/settings/celery.html:67
msgid "No active tasks" msgid "No active tasks"
msgstr "Nai tarefas activas" msgstr "Nai tarefas activas"
#: bookwyrm/templates/settings/celery.html:79 #: bookwyrm/templates/settings/celery.html:85
msgid "Workers" msgid "Workers"
msgstr "Procesos" msgstr "Procesos"
#: bookwyrm/templates/settings/celery.html:84 #: bookwyrm/templates/settings/celery.html:90
msgid "Uptime:" msgid "Uptime:"
msgstr "Uptime:" msgstr "Uptime:"
#: bookwyrm/templates/settings/celery.html:94 #: bookwyrm/templates/settings/celery.html:100
msgid "Could not connect to Celery" msgid "Could not connect to Celery"
msgstr "Non hai conexión con Celery" msgstr "Non hai conexión con Celery"
#: bookwyrm/templates/settings/celery.html:101 #: bookwyrm/templates/settings/celery.html:107
msgid "Errors" msgid "Errors"
msgstr "Erros" msgstr "Erros"
@ -4850,27 +4866,55 @@ msgstr "As usuarias actualmente non poden realizar importacións"
msgid "Enable imports" msgid "Enable imports"
msgstr "Activar importacións" msgstr "Activar importacións"
#: bookwyrm/templates/settings/imports/imports.html:71 #: bookwyrm/templates/settings/imports/imports.html:63
msgid "Limit the amount of imports"
msgstr "Limitar o número de importacións"
#: bookwyrm/templates/settings/imports/imports.html:74
msgid "Some users might try to import a large number of books, which you want to limit."
msgstr "Algunhas usuarias poderían querer importar un número enorme de libros, podes poñerlle límite."
#: bookwyrm/templates/settings/imports/imports.html:75
msgid "Set the value to 0 to not enforce any limit."
msgstr "Establece un valor de 0 para non poñer un límite."
#: bookwyrm/templates/settings/imports/imports.html:78
msgid "Set import limit to"
msgstr "Establece un límite de"
#: bookwyrm/templates/settings/imports/imports.html:80
msgid "books every"
msgstr "libros cada"
#: bookwyrm/templates/settings/imports/imports.html:82
msgid "days."
msgstr "días."
#: bookwyrm/templates/settings/imports/imports.html:86
msgid "Set limit"
msgstr "Establecer"
#: bookwyrm/templates/settings/imports/imports.html:102
msgid "Completed" msgid "Completed"
msgstr "Completada" msgstr "Completada"
#: bookwyrm/templates/settings/imports/imports.html:85 #: bookwyrm/templates/settings/imports/imports.html:116
msgid "User" msgid "User"
msgstr "Usuaria" msgstr "Usuaria"
#: bookwyrm/templates/settings/imports/imports.html:94 #: bookwyrm/templates/settings/imports/imports.html:125
msgid "Date Updated" msgid "Date Updated"
msgstr "Data de actualización" msgstr "Data de actualización"
#: bookwyrm/templates/settings/imports/imports.html:101 #: bookwyrm/templates/settings/imports/imports.html:132
msgid "Pending items" msgid "Pending items"
msgstr "Elementos pendentes" msgstr "Elementos pendentes"
#: bookwyrm/templates/settings/imports/imports.html:104 #: bookwyrm/templates/settings/imports/imports.html:135
msgid "Successful items" msgid "Successful items"
msgstr "Elementos correctos" msgstr "Elementos correctos"
#: bookwyrm/templates/settings/imports/imports.html:139 #: bookwyrm/templates/settings/imports/imports.html:170
msgid "No matching imports found." msgid "No matching imports found."
msgstr "Non se atopan importacións que concorden." msgstr "Non se atopan importacións que concorden."
@ -5131,34 +5175,38 @@ msgstr "Non se gardaron os axustes"
msgid "Allow registration" msgid "Allow registration"
msgstr "Abrir rexistro" msgstr "Abrir rexistro"
#: bookwyrm/templates/settings/registration.html:44 #: bookwyrm/templates/settings/registration.html:43
msgid "Default access level:"
msgstr "Nivel de acceso por defecto:"
#: bookwyrm/templates/settings/registration.html:61
msgid "Require users to confirm email address" msgid "Require users to confirm email address"
msgstr "Requerir que a usuaria confirme o enderezo de email" msgstr "Requerir que a usuaria confirme o enderezo de email"
#: bookwyrm/templates/settings/registration.html:46 #: bookwyrm/templates/settings/registration.html:63
msgid "(Recommended if registration is open)" msgid "(Recommended if registration is open)"
msgstr "(Recomendable se o rexistro está aberto)" msgstr "(Recomendable se o rexistro está aberto)"
#: bookwyrm/templates/settings/registration.html:51 #: bookwyrm/templates/settings/registration.html:68
msgid "Allow invite requests" msgid "Allow invite requests"
msgstr "Permitir solicitudes de convite" msgstr "Permitir solicitudes de convite"
#: bookwyrm/templates/settings/registration.html:55 #: bookwyrm/templates/settings/registration.html:72
#: bookwyrm/templates/settings/registration_limited.html:42 #: bookwyrm/templates/settings/registration_limited.html:42
msgid "Invite request text:" msgid "Invite request text:"
msgstr "Texto para a solicitude do convite:" msgstr "Texto para a solicitude do convite:"
#: bookwyrm/templates/settings/registration.html:63 #: bookwyrm/templates/settings/registration.html:80
#: bookwyrm/templates/settings/registration_limited.html:50 #: bookwyrm/templates/settings/registration_limited.html:50
msgid "Set a question for invite requests" msgid "Set a question for invite requests"
msgstr "Escribe a pregunta para as solicitudes de convite" msgstr "Escribe a pregunta para as solicitudes de convite"
#: bookwyrm/templates/settings/registration.html:68 #: bookwyrm/templates/settings/registration.html:85
#: bookwyrm/templates/settings/registration_limited.html:55 #: bookwyrm/templates/settings/registration_limited.html:55
msgid "Question:" msgid "Question:"
msgstr "Pregunta:" msgstr "Pregunta:"
#: bookwyrm/templates/settings/registration.html:73 #: bookwyrm/templates/settings/registration.html:90
#: bookwyrm/templates/settings/registration_limited.html:67 #: bookwyrm/templates/settings/registration_limited.html:67
msgid "Registration closed text:" msgid "Registration closed text:"
msgstr "Texto se o rexistro está pechado:" msgstr "Texto se o rexistro está pechado:"
@ -5400,7 +5448,7 @@ msgid "Remove theme"
msgstr "Eliminar decorado" msgstr "Eliminar decorado"
#: bookwyrm/templates/settings/users/delete_user_form.html:5 #: bookwyrm/templates/settings/users/delete_user_form.html:5
#: bookwyrm/templates/settings/users/user_moderation_actions.html:32 #: bookwyrm/templates/settings/users/user_moderation_actions.html:38
msgid "Permanently delete user" msgid "Permanently delete user"
msgstr "Eliminar definitivamente a usuaria" msgstr "Eliminar definitivamente a usuaria"
@ -5425,7 +5473,7 @@ msgstr "Usuarias eliminadas"
#: bookwyrm/templates/settings/users/user_admin.html:44 #: bookwyrm/templates/settings/users/user_admin.html:44
#: bookwyrm/templates/settings/users/username_filter.html:5 #: bookwyrm/templates/settings/users/username_filter.html:5
msgid "Username" msgid "Username"
msgstr "Nome de usuaria" msgstr "Identificador"
#: bookwyrm/templates/settings/users/user_admin.html:48 #: bookwyrm/templates/settings/users/user_admin.html:48
msgid "Date Added" msgid "Date Added"
@ -5522,14 +5570,18 @@ msgid "User Actions"
msgstr "Accións da usuaria" msgstr "Accións da usuaria"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:21 #: bookwyrm/templates/settings/users/user_moderation_actions.html:21
msgid "Activate user"
msgstr "Activar usuaria"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:27
msgid "Suspend user" msgid "Suspend user"
msgstr "Usuaria suspendida" msgstr "Usuaria suspendida"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:26 #: bookwyrm/templates/settings/users/user_moderation_actions.html:32
msgid "Un-suspend user" msgid "Un-suspend user"
msgstr "Usuaria reactivada" msgstr "Usuaria reactivada"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:48 #: bookwyrm/templates/settings/users/user_moderation_actions.html:54
msgid "Access level:" msgid "Access level:"
msgstr "Nivel de acceso:" msgstr "Nivel de acceso:"
@ -6379,33 +6431,53 @@ msgstr "%(username)s non segue a ninguén"
msgid "No reviews or comments yet!" msgid "No reviews or comments yet!"
msgstr "Aínda non hai recensións ou comentarios!" msgstr "Aínda non hai recensións ou comentarios!"
#: bookwyrm/templates/user/user.html:16 #: bookwyrm/templates/user/user.html:20
msgid "Edit profile" msgid "Edit profile"
msgstr "Editar perfil" msgstr "Editar perfil"
#: bookwyrm/templates/user/user.html:38 #: bookwyrm/templates/user/user.html:42
#, python-format #, python-format
msgid "View all %(size)s" msgid "View all %(size)s"
msgstr "Ver os %(size)s" msgstr "Ver os %(size)s"
#: bookwyrm/templates/user/user.html:52 #: bookwyrm/templates/user/user.html:56
msgid "View all books" msgid "View all books"
msgstr "Ver tódolos libros" msgstr "Ver tódolos libros"
#: bookwyrm/templates/user/user.html:59 #: bookwyrm/templates/user/user.html:63
#, python-format #, python-format
msgid "%(current_year)s Reading Goal" msgid "%(current_year)s Reading Goal"
msgstr "Obxectivo de Lectura para %(current_year)s" msgstr "Obxectivo de Lectura para %(current_year)s"
#: bookwyrm/templates/user/user.html:66 #: bookwyrm/templates/user/user.html:70
msgid "User Activity" msgid "User Activity"
msgstr "Actividade da usuaria" msgstr "Actividade da usuaria"
#: bookwyrm/templates/user/user.html:71 #: bookwyrm/templates/user/user.html:76
msgid "Show RSS Options"
msgstr "Mostrar Opcións RSS"
#: bookwyrm/templates/user/user.html:82
msgid "RSS feed" msgid "RSS feed"
msgstr "Fonte RSS" msgstr "Fonte RSS"
#: bookwyrm/templates/user/user.html:83 #: bookwyrm/templates/user/user.html:98
msgid "Complete feed"
msgstr "Fonte completa"
#: bookwyrm/templates/user/user.html:103
msgid "Reviews only"
msgstr "Só recensións"
#: bookwyrm/templates/user/user.html:108
msgid "Quotes only"
msgstr "Só citas"
#: bookwyrm/templates/user/user.html:113
msgid "Comments only"
msgstr "Só comentarios"
#: bookwyrm/templates/user/user.html:129
msgid "No activities yet!" msgid "No activities yet!"
msgstr "Sen actividade!" msgstr "Sen actividade!"
@ -6449,16 +6521,43 @@ msgstr "Desconectar"
msgid "File exceeds maximum size: 10MB" msgid "File exceeds maximum size: 10MB"
msgstr "O ficheiro supera o tamaño máximo: 10MB" msgstr "O ficheiro supera o tamaño máximo: 10MB"
#: bookwyrm/templatetags/list_page_tags.py:14
#, python-format
msgid "Book List: %(name)s"
msgstr "Lista de Libros: %(name)s"
#: bookwyrm/templatetags/list_page_tags.py:22
#, python-format
msgid "%(num)d book - by %(user)s"
msgid_plural "%(num)d books - by %(user)s"
msgstr[0] "%(num)d libro - por %(user)s"
msgstr[1] "%(num)d libros - por %(user)s"
#: bookwyrm/templatetags/utilities.py:39 #: bookwyrm/templatetags/utilities.py:39
#, python-format #, python-format
msgid "%(title)s: %(subtitle)s" msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s"
#: bookwyrm/views/rss_feed.py:34 #: bookwyrm/views/rss_feed.py:35
#, python-brace-format #, python-brace-format
msgid "Status updates from {obj.display_name}" msgid "Status updates from {obj.display_name}"
msgstr "Actualizacións de estados desde {obj.display_name}" msgstr "Actualizacións de estados desde {obj.display_name}"
#: bookwyrm/views/rss_feed.py:72
#, python-brace-format
msgid "Reviews from {obj.display_name}"
msgstr "Recensións de {obj.display_name}"
#: bookwyrm/views/rss_feed.py:110
#, python-brace-format
msgid "Quotes from {obj.display_name}"
msgstr "Citas de {obj.display_name}"
#: bookwyrm/views/rss_feed.py:148
#, python-brace-format
msgid "Comments from {obj.display_name}"
msgstr "Comentarios sobre {obj.display_name}"
#: bookwyrm/views/updates.py:45 #: bookwyrm/views/updates.py:45
#, python-format #, python-format
msgid "Load %(count)d unread status" msgid "Load %(count)d unread status"

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: bookwyrm\n" "Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-11 22:46+0000\n" "POT-Creation-Date: 2023-01-30 08:21+0000\n"
"PO-Revision-Date: 2023-01-20 13:11\n" "PO-Revision-Date: 2023-03-07 12:09\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n" "Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Italian\n" "Language-Team: Italian\n"
"Language: it\n" "Language: it\n"
@ -64,7 +64,7 @@ msgstr "La data di fine lettura non può essere precedente alla data di inizio."
#: bookwyrm/forms/forms.py:67 #: bookwyrm/forms/forms.py:67
msgid "Reading stopped date cannot be in the future." msgid "Reading stopped date cannot be in the future."
msgstr "La data d'interruzione della lettura non può essere precedente alla data d'inizio." msgstr "La data d'interruzione della lettura non può essere nel futuro."
#: bookwyrm/forms/forms.py:74 #: bookwyrm/forms/forms.py:74
msgid "Reading finished date cannot be in the future." msgid "Reading finished date cannot be in the future."
@ -256,14 +256,14 @@ msgstr "Followers"
msgid "Private" msgid "Private"
msgstr "Privata" msgstr "Privata"
#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:157 #: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:168
#: bookwyrm/templates/settings/imports/imports.html:67 #: bookwyrm/templates/settings/imports/imports.html:98
#: bookwyrm/templates/settings/users/user_admin.html:81 #: bookwyrm/templates/settings/users/user_admin.html:81
#: bookwyrm/templates/settings/users/user_info.html:28 #: bookwyrm/templates/settings/users/user_info.html:28
msgid "Active" msgid "Active"
msgstr "Attivo" msgstr "Attivo"
#: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:155 #: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:166
msgid "Complete" msgid "Complete"
msgstr "Completato" msgstr "Completato"
@ -316,19 +316,19 @@ msgstr "Citazioni"
msgid "Everything else" msgid "Everything else"
msgstr "Tutto il resto" msgstr "Tutto il resto"
#: bookwyrm/settings.py:214 #: bookwyrm/settings.py:217
msgid "Home Timeline" msgid "Home Timeline"
msgstr "La tua timeline" msgstr "La tua timeline"
#: bookwyrm/settings.py:214 #: bookwyrm/settings.py:217
msgid "Home" msgid "Home"
msgstr "Home" msgstr "Home"
#: bookwyrm/settings.py:215 #: bookwyrm/settings.py:218
msgid "Books Timeline" msgid "Books Timeline"
msgstr "Timeline dei libri" msgstr "Timeline dei libri"
#: bookwyrm/settings.py:215 #: bookwyrm/settings.py:218
#: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/guided_tour/user_profile.html:101
#: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:22
#: bookwyrm/templates/search/layout.html:43 #: bookwyrm/templates/search/layout.html:43
@ -336,75 +336,75 @@ msgstr "Timeline dei libri"
msgid "Books" msgid "Books"
msgstr "Libri" msgstr "Libri"
#: bookwyrm/settings.py:287 #: bookwyrm/settings.py:290
msgid "English" msgid "English"
msgstr "English (Inglese)" msgstr "English (Inglese)"
#: bookwyrm/settings.py:288 #: bookwyrm/settings.py:291
msgid "Català (Catalan)" msgid "Català (Catalan)"
msgstr "Català (catalano)" msgstr "Català (catalano)"
#: bookwyrm/settings.py:289 #: bookwyrm/settings.py:292
msgid "Deutsch (German)" msgid "Deutsch (German)"
msgstr "Deutsch (Tedesco)" msgstr "Deutsch (Tedesco)"
#: bookwyrm/settings.py:290 #: bookwyrm/settings.py:293
msgid "Español (Spanish)" msgid "Español (Spanish)"
msgstr "Español (Spagnolo)" msgstr "Español (Spagnolo)"
#: bookwyrm/settings.py:291 #: bookwyrm/settings.py:294
msgid "Euskara (Basque)" msgid "Euskara (Basque)"
msgstr "Euskara (Basque)" msgstr "Euskara (Basque)"
#: bookwyrm/settings.py:292 #: bookwyrm/settings.py:295
msgid "Galego (Galician)" msgid "Galego (Galician)"
msgstr "Galego (Galiziano)" msgstr "Galego (Galiziano)"
#: bookwyrm/settings.py:293 #: bookwyrm/settings.py:296
msgid "Italiano (Italian)" msgid "Italiano (Italian)"
msgstr "Italiano (Italiano)" msgstr "Italiano (Italiano)"
#: bookwyrm/settings.py:294 #: bookwyrm/settings.py:297
msgid "Suomi (Finnish)" msgid "Suomi (Finnish)"
msgstr "Suomi (Finlandese)" msgstr "Suomi (Finlandese)"
#: bookwyrm/settings.py:295 #: bookwyrm/settings.py:298
msgid "Français (French)" msgid "Français (French)"
msgstr "Français (Francese)" msgstr "Français (Francese)"
#: bookwyrm/settings.py:296 #: bookwyrm/settings.py:299
msgid "Lietuvių (Lithuanian)" msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (Lituano)" msgstr "Lietuvių (Lituano)"
#: bookwyrm/settings.py:297 #: bookwyrm/settings.py:300
msgid "Norsk (Norwegian)" msgid "Norsk (Norwegian)"
msgstr "Norsk (Norvegese)" msgstr "Norsk (Norvegese)"
#: bookwyrm/settings.py:298 #: bookwyrm/settings.py:301
msgid "Polski (Polish)" msgid "Polski (Polish)"
msgstr "Polski (Polacco)" msgstr "Polski (Polacco)"
#: bookwyrm/settings.py:299 #: bookwyrm/settings.py:302
msgid "Português do Brasil (Brazilian Portuguese)" msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português do Brasil (Portoghese Brasiliano)" msgstr "Português do Brasil (Portoghese Brasiliano)"
#: bookwyrm/settings.py:300 #: bookwyrm/settings.py:303
msgid "Português Europeu (European Portuguese)" msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Portoghese europeo)" msgstr "Português Europeu (Portoghese europeo)"
#: bookwyrm/settings.py:301 #: bookwyrm/settings.py:304
msgid "Română (Romanian)" msgid "Română (Romanian)"
msgstr "Rumeno (Romanian)" msgstr "Rumeno (Romanian)"
#: bookwyrm/settings.py:302 #: bookwyrm/settings.py:305
msgid "Svenska (Swedish)" msgid "Svenska (Swedish)"
msgstr "Svenska (Svedese)" msgstr "Svenska (Svedese)"
#: bookwyrm/settings.py:303 #: bookwyrm/settings.py:306
msgid "简体中文 (Simplified Chinese)" msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (Cinese Semplificato)" msgstr "简体中文 (Cinese Semplificato)"
#: bookwyrm/settings.py:304 #: bookwyrm/settings.py:307
msgid "繁體中文 (Traditional Chinese)" msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (Cinese Tradizionale)" msgstr "繁體中文 (Cinese Tradizionale)"
@ -847,10 +847,10 @@ msgstr "ISNI:"
#: bookwyrm/templates/settings/announcements/edit_announcement.html:120 #: bookwyrm/templates/settings/announcements/edit_announcement.html:120
#: bookwyrm/templates/settings/federation/edit_instance.html:98 #: bookwyrm/templates/settings/federation/edit_instance.html:98
#: bookwyrm/templates/settings/federation/instance.html:105 #: bookwyrm/templates/settings/federation/instance.html:105
#: bookwyrm/templates/settings/registration.html:79 #: bookwyrm/templates/settings/registration.html:96
#: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/registration_limited.html:76
#: bookwyrm/templates/settings/site.html:144 #: bookwyrm/templates/settings/site.html:144
#: bookwyrm/templates/settings/users/user_moderation_actions.html:69 #: bookwyrm/templates/settings/users/user_moderation_actions.html:75
#: bookwyrm/templates/shelf/form.html:25 #: bookwyrm/templates/shelf/form.html:25
#: bookwyrm/templates/snippets/reading_modals/layout.html:18 #: bookwyrm/templates/snippets/reading_modals/layout.html:18
msgid "Save" msgid "Save"
@ -1160,7 +1160,7 @@ msgstr "Si tratta di un nuovo lavoro"
#: bookwyrm/templates/guided_tour/user_profile.html:89 #: bookwyrm/templates/guided_tour/user_profile.html:89
#: bookwyrm/templates/guided_tour/user_profile.html:112 #: bookwyrm/templates/guided_tour/user_profile.html:112
#: bookwyrm/templates/guided_tour/user_profile.html:135 #: bookwyrm/templates/guided_tour/user_profile.html:135
#: bookwyrm/templates/user_menu.html:18 #: bookwyrm/templates/user/user.html:87 bookwyrm/templates/user_menu.html:18
msgid "Back" msgid "Back"
msgstr "Indietro" msgstr "Indietro"
@ -1372,7 +1372,7 @@ msgid "Domain"
msgstr "Dominio" msgstr "Dominio"
#: bookwyrm/templates/book/file_links/edit_links.html:36 #: bookwyrm/templates/book/file_links/edit_links.html:36
#: bookwyrm/templates/import/import.html:122 #: bookwyrm/templates/import/import.html:133
#: bookwyrm/templates/import/import_status.html:134 #: bookwyrm/templates/import/import_status.html:134
#: bookwyrm/templates/settings/announcements/announcements.html:37 #: bookwyrm/templates/settings/announcements/announcements.html:37
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:48 #: bookwyrm/templates/settings/invites/manage_invite_requests.html:48
@ -1385,7 +1385,7 @@ msgstr "Stato"
#: bookwyrm/templates/book/file_links/edit_links.html:37 #: bookwyrm/templates/book/file_links/edit_links.html:37
#: bookwyrm/templates/settings/announcements/announcements.html:41 #: bookwyrm/templates/settings/announcements/announcements.html:41
#: bookwyrm/templates/settings/federation/instance.html:112 #: bookwyrm/templates/settings/federation/instance.html:112
#: bookwyrm/templates/settings/imports/imports.html:110 #: bookwyrm/templates/settings/imports/imports.html:141
#: bookwyrm/templates/settings/reports/report_links_table.html:6 #: bookwyrm/templates/settings/reports/report_links_table.html:6
#: bookwyrm/templates/settings/themes.html:99 #: bookwyrm/templates/settings/themes.html:99
msgid "Actions" msgid "Actions"
@ -1821,7 +1821,7 @@ msgstr "Messaggi diretti con <a href=\"%(path)s\">%(username)s</a>"
#: bookwyrm/templates/feed/direct_messages.html:10 #: bookwyrm/templates/feed/direct_messages.html:10
#: bookwyrm/templates/user_menu.html:44 #: bookwyrm/templates/user_menu.html:44
msgid "Direct Messages" msgid "Direct Messages"
msgstr "Messaggi Diretti" msgstr "Messaggi diretti"
#: bookwyrm/templates/feed/direct_messages.html:13 #: bookwyrm/templates/feed/direct_messages.html:13
msgid "All messages" msgid "All messages"
@ -1859,7 +1859,7 @@ msgstr "Aggiornamenti"
#: bookwyrm/templates/guided_tour/home.html:127 #: bookwyrm/templates/guided_tour/home.html:127
#: bookwyrm/templates/user_menu.html:39 #: bookwyrm/templates/user_menu.html:39
msgid "Your Books" msgid "Your Books"
msgstr "I Tuoi Libri" msgstr "I tuoi libri"
#: bookwyrm/templates/feed/suggested_books.html:10 #: bookwyrm/templates/feed/suggested_books.html:10
msgid "There are no books here right now! Try searching for a book to get started" msgid "There are no books here right now! Try searching for a book to get started"
@ -1905,13 +1905,13 @@ msgid "Add to your books"
msgstr "Aggiungi ai tuoi libri" msgstr "Aggiungi ai tuoi libri"
#: bookwyrm/templates/get_started/book_preview.html:10 #: bookwyrm/templates/get_started/book_preview.html:10
#: bookwyrm/templates/shelf/shelf.html:86 bookwyrm/templates/user/user.html:33 #: bookwyrm/templates/shelf/shelf.html:86 bookwyrm/templates/user/user.html:37
#: bookwyrm/templatetags/shelf_tags.py:48 #: bookwyrm/templatetags/shelf_tags.py:48
msgid "To Read" msgid "To Read"
msgstr "Da leggere" msgstr "Da leggere"
#: bookwyrm/templates/get_started/book_preview.html:11 #: bookwyrm/templates/get_started/book_preview.html:11
#: bookwyrm/templates/shelf/shelf.html:87 bookwyrm/templates/user/user.html:34 #: bookwyrm/templates/shelf/shelf.html:87 bookwyrm/templates/user/user.html:38
#: bookwyrm/templatetags/shelf_tags.py:50 #: bookwyrm/templatetags/shelf_tags.py:50
msgid "Currently Reading" msgid "Currently Reading"
msgstr "Letture correnti" msgstr "Letture correnti"
@ -1921,12 +1921,12 @@ msgstr "Letture correnti"
#: bookwyrm/templates/snippets/shelf_selector.html:46 #: bookwyrm/templates/snippets/shelf_selector.html:46
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24 #: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12 #: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12
#: bookwyrm/templates/user/user.html:35 bookwyrm/templatetags/shelf_tags.py:52 #: bookwyrm/templates/user/user.html:39 bookwyrm/templatetags/shelf_tags.py:52
msgid "Read" msgid "Read"
msgstr "Letti" msgstr "Letti"
#: bookwyrm/templates/get_started/book_preview.html:13 #: bookwyrm/templates/get_started/book_preview.html:13
#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:36 #: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:40
msgid "Stopped Reading" msgid "Stopped Reading"
msgstr "Lettura in pausa" msgstr "Lettura in pausa"
@ -2642,7 +2642,7 @@ msgid "This is your user profile. All your latest activities will be listed here
msgstr "Questo è il tuo profilo utente. Tutte le tue ultime attività saranno elencate qui. Anche altri utenti di Bookwyrm possono vedere parti di questa pagina - ciò che possono vedere dipende dalle impostazioni sulla privacy." msgstr "Questo è il tuo profilo utente. Tutte le tue ultime attività saranno elencate qui. Anche altri utenti di Bookwyrm possono vedere parti di questa pagina - ciò che possono vedere dipende dalle impostazioni sulla privacy."
#: bookwyrm/templates/guided_tour/user_profile.html:11 #: bookwyrm/templates/guided_tour/user_profile.html:11
#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:10 #: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:14
msgid "User Profile" msgid "User Profile"
msgstr "Profilo utente" msgstr "Profilo utente"
@ -2689,85 +2689,100 @@ msgstr "Importa libri"
msgid "Not a valid CSV file" msgid "Not a valid CSV file"
msgstr "Non è un file di csv valido" msgstr "Non è un file di csv valido"
#: bookwyrm/templates/import/import.html:22 #: bookwyrm/templates/import/import.html:20
#, python-format
msgid "Currently you are allowed to import %(import_size_limit)s books every %(import_limit_reset)s days."
msgstr "Al momento hai il permesso per importare %(import_size_limit)s libri ogni %(import_limit_reset)s giorni."
#: bookwyrm/templates/import/import.html:21
#, python-format
msgid "You have %(allowed_imports)s left."
msgstr "Ti restano %(allowed_imports)s."
#: bookwyrm/templates/import/import.html:28
#, python-format #, python-format
msgid "On average, recent imports have taken %(hours)s hours." msgid "On average, recent imports have taken %(hours)s hours."
msgstr "In media, le importazioni recenti hanno richiesto %(hours)s ore." msgstr "In media, le importazioni recenti hanno richiesto %(hours)s ore."
#: bookwyrm/templates/import/import.html:26 #: bookwyrm/templates/import/import.html:32
#, python-format #, python-format
msgid "On average, recent imports have taken %(minutes)s minutes." msgid "On average, recent imports have taken %(minutes)s minutes."
msgstr "In media, le importazioni recenti hanno richiesto %(minutes)s ore." msgstr "In media, le importazioni recenti hanno richiesto %(minutes)s ore."
#: bookwyrm/templates/import/import.html:41 #: bookwyrm/templates/import/import.html:47
msgid "Data source:" msgid "Data source:"
msgstr "Sorgenti dati:" msgstr "Sorgenti dati:"
#: bookwyrm/templates/import/import.html:47 #: bookwyrm/templates/import/import.html:53
msgid "Goodreads (CSV)" msgid "Goodreads (CSV)"
msgstr "Goodreads (CSV)" msgstr "Goodreads (CSV)"
#: bookwyrm/templates/import/import.html:50 #: bookwyrm/templates/import/import.html:56
msgid "Storygraph (CSV)" msgid "Storygraph (CSV)"
msgstr "Storygraph (CSV)" msgstr "Storygraph (CSV)"
#: bookwyrm/templates/import/import.html:53 #: bookwyrm/templates/import/import.html:59
msgid "LibraryThing (TSV)" msgid "LibraryThing (TSV)"
msgstr "LibraryThing (TSV)" msgstr "LibraryThing (TSV)"
#: bookwyrm/templates/import/import.html:56 #: bookwyrm/templates/import/import.html:62
msgid "OpenLibrary (CSV)" msgid "OpenLibrary (CSV)"
msgstr "OpenLibrary (CSV)" msgstr "OpenLibrary (CSV)"
#: bookwyrm/templates/import/import.html:59 #: bookwyrm/templates/import/import.html:65
msgid "Calibre (CSV)" msgid "Calibre (CSV)"
msgstr "Calibre (CSV)" msgstr "Calibre (CSV)"
#: bookwyrm/templates/import/import.html:65 #: bookwyrm/templates/import/import.html:71
msgid "You can download your Goodreads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Import/Export page</a> of your Goodreads account." msgid "You can download your Goodreads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Import/Export page</a> of your Goodreads account."
msgstr "Puoi scaricare i tuoi dati Goodreads dalla pagina <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\"Importa/Esporta\"</a> del tuo account Goodreads." msgstr "Puoi scaricare i tuoi dati Goodreads dalla pagina <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\"Importa/Esporta\"</a> del tuo account Goodreads."
#: bookwyrm/templates/import/import.html:74 #: bookwyrm/templates/import/import.html:80
msgid "Data file:" msgid "Data file:"
msgstr "Dati file:" msgstr "Dati file:"
#: bookwyrm/templates/import/import.html:82 #: bookwyrm/templates/import/import.html:88
msgid "Include reviews" msgid "Include reviews"
msgstr "Includi recensioni" msgstr "Includi recensioni"
#: bookwyrm/templates/import/import.html:87 #: bookwyrm/templates/import/import.html:93
msgid "Privacy setting for imported reviews:" msgid "Privacy setting for imported reviews:"
msgstr "Impostazione della privacy per le recensioni importate:" msgstr "Impostazione della privacy per le recensioni importate:"
#: bookwyrm/templates/import/import.html:93 #: bookwyrm/templates/import/import.html:100
#: bookwyrm/templates/import/import.html:102
#: bookwyrm/templates/preferences/layout.html:35 #: bookwyrm/templates/preferences/layout.html:35
#: bookwyrm/templates/settings/federation/instance_blocklist.html:78 #: bookwyrm/templates/settings/federation/instance_blocklist.html:78
msgid "Import" msgid "Import"
msgstr "Importa" msgstr "Importa"
#: bookwyrm/templates/import/import.html:101 #: bookwyrm/templates/import/import.html:103
msgid "You've reached the import limit."
msgstr "Hai raggiunto il limite per le importazioni."
#: bookwyrm/templates/import/import.html:112
msgid "Imports are temporarily disabled; thank you for your patience." msgid "Imports are temporarily disabled; thank you for your patience."
msgstr "Le importazioni sono temporaneamente disabilitate; grazie per la pazienza." msgstr "Le importazioni sono temporaneamente disabilitate; grazie per la pazienza."
#: bookwyrm/templates/import/import.html:108 #: bookwyrm/templates/import/import.html:119
msgid "Recent Imports" msgid "Recent Imports"
msgstr "Importazioni recenti" msgstr "Importazioni recenti"
#: bookwyrm/templates/import/import.html:113 #: bookwyrm/templates/import/import.html:124
#: bookwyrm/templates/settings/imports/imports.html:89 #: bookwyrm/templates/settings/imports/imports.html:120
msgid "Date Created" msgid "Date Created"
msgstr "Data Creazione" msgstr "Data Creazione"
#: bookwyrm/templates/import/import.html:116 #: bookwyrm/templates/import/import.html:127
msgid "Last Updated" msgid "Last Updated"
msgstr "Ultimo Aggiornamento" msgstr "Ultimo Aggiornamento"
#: bookwyrm/templates/import/import.html:119 #: bookwyrm/templates/import/import.html:130
#: bookwyrm/templates/settings/imports/imports.html:98 #: bookwyrm/templates/settings/imports/imports.html:129
msgid "Items" msgid "Items"
msgstr "Elementi" msgstr "Elementi"
#: bookwyrm/templates/import/import.html:128 #: bookwyrm/templates/import/import.html:139
msgid "No recent imports" msgid "No recent imports"
msgstr "Nessuna importazione recente" msgstr "Nessuna importazione recente"
@ -2783,6 +2798,7 @@ msgid "Retry Status"
msgstr "Riprova stato" msgstr "Riprova stato"
#: bookwyrm/templates/import/import_status.html:22 #: bookwyrm/templates/import/import_status.html:22
#: bookwyrm/templates/settings/celery.html:36
#: bookwyrm/templates/settings/imports/imports.html:6 #: bookwyrm/templates/settings/imports/imports.html:6
#: bookwyrm/templates/settings/imports/imports.html:9 #: bookwyrm/templates/settings/imports/imports.html:9
#: bookwyrm/templates/settings/layout.html:82 #: bookwyrm/templates/settings/layout.html:82
@ -2802,7 +2818,7 @@ msgid "Refresh"
msgstr "Aggiorna" msgstr "Aggiorna"
#: bookwyrm/templates/import/import_status.html:72 #: bookwyrm/templates/import/import_status.html:72
#: bookwyrm/templates/settings/imports/imports.html:130 #: bookwyrm/templates/settings/imports/imports.html:161
msgid "Stop import" msgid "Stop import"
msgstr "Interrompi importazione" msgstr "Interrompi importazione"
@ -2920,7 +2936,7 @@ msgid "Reject"
msgstr "Rifiutato" msgstr "Rifiutato"
#: bookwyrm/templates/import/troubleshoot.html:7 #: bookwyrm/templates/import/troubleshoot.html:7
#: bookwyrm/templates/settings/imports/imports.html:107 #: bookwyrm/templates/settings/imports/imports.html:138
msgid "Failed items" msgid "Failed items"
msgstr "Elementi non riusciti" msgstr "Elementi non riusciti"
@ -3171,7 +3187,7 @@ msgid "Delete this list?"
msgstr "Vuoi eliminare la lista selezionata?" msgstr "Vuoi eliminare la lista selezionata?"
#: bookwyrm/templates/lists/edit_form.html:5 #: bookwyrm/templates/lists/edit_form.html:5
#: bookwyrm/templates/lists/layout.html:18 #: bookwyrm/templates/lists/layout.html:23
msgid "Edit List" msgid "Edit List"
msgstr "Modifica lista" msgstr "Modifica lista"
@ -3355,7 +3371,7 @@ msgstr "Tutte le liste"
#: bookwyrm/templates/lists/lists.html:40 #: bookwyrm/templates/lists/lists.html:40
msgid "Saved Lists" msgid "Saved Lists"
msgstr "Liste Salvate" msgstr "Liste salvate"
#: bookwyrm/templates/notifications/items/accept.html:18 #: bookwyrm/templates/notifications/items/accept.html:18
#, python-format #, python-format
@ -4429,48 +4445,48 @@ msgstr "Priorità media"
msgid "High priority" msgid "High priority"
msgstr "Priorità alta" msgstr "Priorità alta"
#: bookwyrm/templates/settings/celery.html:40 #: bookwyrm/templates/settings/celery.html:46
msgid "Could not connect to Redis broker" msgid "Could not connect to Redis broker"
msgstr "Impossibile connettersi al broker Redis" msgstr "Impossibile connettersi al broker Redis"
#: bookwyrm/templates/settings/celery.html:48 #: bookwyrm/templates/settings/celery.html:54
msgid "Active Tasks" msgid "Active Tasks"
msgstr "Processi attivi" msgstr "Processi attivi"
#: bookwyrm/templates/settings/celery.html:53 #: bookwyrm/templates/settings/celery.html:59
#: bookwyrm/templates/settings/imports/imports.html:82 #: bookwyrm/templates/settings/imports/imports.html:113
msgid "ID" msgid "ID"
msgstr "ID" msgstr "ID"
#: bookwyrm/templates/settings/celery.html:54 #: bookwyrm/templates/settings/celery.html:60
msgid "Task name" msgid "Task name"
msgstr "Nome attività" msgstr "Nome attività"
#: bookwyrm/templates/settings/celery.html:55 #: bookwyrm/templates/settings/celery.html:61
msgid "Run time" msgid "Run time"
msgstr "Tempo di esecuzione" msgstr "Tempo di esecuzione"
#: bookwyrm/templates/settings/celery.html:56 #: bookwyrm/templates/settings/celery.html:62
msgid "Priority" msgid "Priority"
msgstr "Priorità" msgstr "Priorità"
#: bookwyrm/templates/settings/celery.html:61 #: bookwyrm/templates/settings/celery.html:67
msgid "No active tasks" msgid "No active tasks"
msgstr "Nessun processo attivo" msgstr "Nessun processo attivo"
#: bookwyrm/templates/settings/celery.html:79 #: bookwyrm/templates/settings/celery.html:85
msgid "Workers" msgid "Workers"
msgstr "Workers" msgstr "Workers"
#: bookwyrm/templates/settings/celery.html:84 #: bookwyrm/templates/settings/celery.html:90
msgid "Uptime:" msgid "Uptime:"
msgstr "Tempo di attività:" msgstr "Tempo di attività:"
#: bookwyrm/templates/settings/celery.html:94 #: bookwyrm/templates/settings/celery.html:100
msgid "Could not connect to Celery" msgid "Could not connect to Celery"
msgstr "Impossibile connettersi a Celery" msgstr "Impossibile connettersi a Celery"
#: bookwyrm/templates/settings/celery.html:101 #: bookwyrm/templates/settings/celery.html:107
msgid "Errors" msgid "Errors"
msgstr "Errori" msgstr "Errori"
@ -4850,27 +4866,55 @@ msgstr "Al momento gli utenti non sono in grado di avviare nuove importazioni"
msgid "Enable imports" msgid "Enable imports"
msgstr "Abilita importazioni" msgstr "Abilita importazioni"
#: bookwyrm/templates/settings/imports/imports.html:71 #: bookwyrm/templates/settings/imports/imports.html:63
msgid "Limit the amount of imports"
msgstr "Limita la quantità delle importazioni"
#: bookwyrm/templates/settings/imports/imports.html:74
msgid "Some users might try to import a large number of books, which you want to limit."
msgstr "Alcuni utenti potrebbero provare a importare un gran numero di libri, che si desidera limitare."
#: bookwyrm/templates/settings/imports/imports.html:75
msgid "Set the value to 0 to not enforce any limit."
msgstr "Imposta il valore a 0 per non imporre alcun limite."
#: bookwyrm/templates/settings/imports/imports.html:78
msgid "Set import limit to"
msgstr "Imposta limite di importazione a"
#: bookwyrm/templates/settings/imports/imports.html:80
msgid "books every"
msgstr "libri ogni"
#: bookwyrm/templates/settings/imports/imports.html:82
msgid "days."
msgstr "giorni."
#: bookwyrm/templates/settings/imports/imports.html:86
msgid "Set limit"
msgstr "Imposta limite"
#: bookwyrm/templates/settings/imports/imports.html:102
msgid "Completed" msgid "Completed"
msgstr "Completati" msgstr "Completati"
#: bookwyrm/templates/settings/imports/imports.html:85 #: bookwyrm/templates/settings/imports/imports.html:116
msgid "User" msgid "User"
msgstr "Utente" msgstr "Utente"
#: bookwyrm/templates/settings/imports/imports.html:94 #: bookwyrm/templates/settings/imports/imports.html:125
msgid "Date Updated" msgid "Date Updated"
msgstr "Data Aggiornamento" msgstr "Data Aggiornamento"
#: bookwyrm/templates/settings/imports/imports.html:101 #: bookwyrm/templates/settings/imports/imports.html:132
msgid "Pending items" msgid "Pending items"
msgstr "Oggetti in sospeso" msgstr "Oggetti in sospeso"
#: bookwyrm/templates/settings/imports/imports.html:104 #: bookwyrm/templates/settings/imports/imports.html:135
msgid "Successful items" msgid "Successful items"
msgstr "Oggetti riusciti" msgstr "Oggetti riusciti"
#: bookwyrm/templates/settings/imports/imports.html:139 #: bookwyrm/templates/settings/imports/imports.html:170
msgid "No matching imports found." msgid "No matching imports found."
msgstr "Nessuna importazione corrispondente." msgstr "Nessuna importazione corrispondente."
@ -5131,34 +5175,38 @@ msgstr "Impossibile salvare le impostazioni"
msgid "Allow registration" msgid "Allow registration"
msgstr "Consenti registrazioni" msgstr "Consenti registrazioni"
#: bookwyrm/templates/settings/registration.html:44 #: bookwyrm/templates/settings/registration.html:43
msgid "Default access level:"
msgstr "Livello di accesso predefinito:"
#: bookwyrm/templates/settings/registration.html:61
msgid "Require users to confirm email address" msgid "Require users to confirm email address"
msgstr "Richiedi agli utenti per confermare l'indirizzo email" msgstr "Richiedi agli utenti per confermare l'indirizzo email"
#: bookwyrm/templates/settings/registration.html:46 #: bookwyrm/templates/settings/registration.html:63
msgid "(Recommended if registration is open)" msgid "(Recommended if registration is open)"
msgstr "(Raccomandato se la registrazione è aperta)" msgstr "(Raccomandato se la registrazione è aperta)"
#: bookwyrm/templates/settings/registration.html:51 #: bookwyrm/templates/settings/registration.html:68
msgid "Allow invite requests" msgid "Allow invite requests"
msgstr "Consenti richieste di invito" msgstr "Consenti richieste di invito"
#: bookwyrm/templates/settings/registration.html:55 #: bookwyrm/templates/settings/registration.html:72
#: bookwyrm/templates/settings/registration_limited.html:42 #: bookwyrm/templates/settings/registration_limited.html:42
msgid "Invite request text:" msgid "Invite request text:"
msgstr "Testo della richiesta di invito:" msgstr "Testo della richiesta di invito:"
#: bookwyrm/templates/settings/registration.html:63 #: bookwyrm/templates/settings/registration.html:80
#: bookwyrm/templates/settings/registration_limited.html:50 #: bookwyrm/templates/settings/registration_limited.html:50
msgid "Set a question for invite requests" msgid "Set a question for invite requests"
msgstr "Imposta una domanda per le richieste di invito" msgstr "Imposta una domanda per le richieste di invito"
#: bookwyrm/templates/settings/registration.html:68 #: bookwyrm/templates/settings/registration.html:85
#: bookwyrm/templates/settings/registration_limited.html:55 #: bookwyrm/templates/settings/registration_limited.html:55
msgid "Question:" msgid "Question:"
msgstr "Domanda:" msgstr "Domanda:"
#: bookwyrm/templates/settings/registration.html:73 #: bookwyrm/templates/settings/registration.html:90
#: bookwyrm/templates/settings/registration_limited.html:67 #: bookwyrm/templates/settings/registration_limited.html:67
msgid "Registration closed text:" msgid "Registration closed text:"
msgstr "Registrazioni chiuse:" msgstr "Registrazioni chiuse:"
@ -5400,7 +5448,7 @@ msgid "Remove theme"
msgstr "Rimuovi tema" msgstr "Rimuovi tema"
#: bookwyrm/templates/settings/users/delete_user_form.html:5 #: bookwyrm/templates/settings/users/delete_user_form.html:5
#: bookwyrm/templates/settings/users/user_moderation_actions.html:32 #: bookwyrm/templates/settings/users/user_moderation_actions.html:38
msgid "Permanently delete user" msgid "Permanently delete user"
msgstr "Elimina definitivamente utente" msgstr "Elimina definitivamente utente"
@ -5522,14 +5570,18 @@ msgid "User Actions"
msgstr "Azioni dell'utente" msgstr "Azioni dell'utente"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:21 #: bookwyrm/templates/settings/users/user_moderation_actions.html:21
msgid "Activate user"
msgstr "Attiva utente"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:27
msgid "Suspend user" msgid "Suspend user"
msgstr "Sospendere utente" msgstr "Sospendere utente"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:26 #: bookwyrm/templates/settings/users/user_moderation_actions.html:32
msgid "Un-suspend user" msgid "Un-suspend user"
msgstr "Annulla sospensione utente" msgstr "Annulla sospensione utente"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:48 #: bookwyrm/templates/settings/users/user_moderation_actions.html:54
msgid "Access level:" msgid "Access level:"
msgstr "Livello di accesso:" msgstr "Livello di accesso:"
@ -6379,33 +6431,53 @@ msgstr "%(username)s non sta seguendo nessun utente"
msgid "No reviews or comments yet!" msgid "No reviews or comments yet!"
msgstr "Ancora nessuna recensione o commento!" msgstr "Ancora nessuna recensione o commento!"
#: bookwyrm/templates/user/user.html:16 #: bookwyrm/templates/user/user.html:20
msgid "Edit profile" msgid "Edit profile"
msgstr "Modifica profilo" msgstr "Modifica profilo"
#: bookwyrm/templates/user/user.html:38 #: bookwyrm/templates/user/user.html:42
#, python-format #, python-format
msgid "View all %(size)s" msgid "View all %(size)s"
msgstr "Visualizza tutti i %(size)s" msgstr "Visualizza tutti i %(size)s"
#: bookwyrm/templates/user/user.html:52 #: bookwyrm/templates/user/user.html:56
msgid "View all books" msgid "View all books"
msgstr "Visualizza tutti i libri" msgstr "Visualizza tutti i libri"
#: bookwyrm/templates/user/user.html:59 #: bookwyrm/templates/user/user.html:63
#, python-format #, python-format
msgid "%(current_year)s Reading Goal" msgid "%(current_year)s Reading Goal"
msgstr "Obiettivo di lettura %(current_year)s" msgstr "Obiettivo di lettura %(current_year)s"
#: bookwyrm/templates/user/user.html:66 #: bookwyrm/templates/user/user.html:70
msgid "User Activity" msgid "User Activity"
msgstr "Attività dellutente" msgstr "Attività dellutente"
#: bookwyrm/templates/user/user.html:71 #: bookwyrm/templates/user/user.html:76
msgid "Show RSS Options"
msgstr "Mostra opzioni RSS"
#: bookwyrm/templates/user/user.html:82
msgid "RSS feed" msgid "RSS feed"
msgstr "Feed RSS" msgstr "Feed RSS"
#: bookwyrm/templates/user/user.html:83 #: bookwyrm/templates/user/user.html:98
msgid "Complete feed"
msgstr "Feed completo"
#: bookwyrm/templates/user/user.html:103
msgid "Reviews only"
msgstr "Solo recensioni"
#: bookwyrm/templates/user/user.html:108
msgid "Quotes only"
msgstr "Solo citazioni"
#: bookwyrm/templates/user/user.html:113
msgid "Comments only"
msgstr "Solo commenti"
#: bookwyrm/templates/user/user.html:129
msgid "No activities yet!" msgid "No activities yet!"
msgstr "Ancora nessuna attività!" msgstr "Ancora nessuna attività!"
@ -6449,16 +6521,43 @@ msgstr "Esci"
msgid "File exceeds maximum size: 10MB" msgid "File exceeds maximum size: 10MB"
msgstr "Il file supera la dimensione massima: 10MB" msgstr "Il file supera la dimensione massima: 10MB"
#: bookwyrm/templatetags/list_page_tags.py:14
#, python-format
msgid "Book List: %(name)s"
msgstr "Lista libri: %(name)s"
#: bookwyrm/templatetags/list_page_tags.py:22
#, python-format
msgid "%(num)d book - by %(user)s"
msgid_plural "%(num)d books - by %(user)s"
msgstr[0] ""
msgstr[1] "%(num)d libri - di %(user)s"
#: bookwyrm/templatetags/utilities.py:39 #: bookwyrm/templatetags/utilities.py:39
#, python-format #, python-format
msgid "%(title)s: %(subtitle)s" msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s"
#: bookwyrm/views/rss_feed.py:34 #: bookwyrm/views/rss_feed.py:35
#, python-brace-format #, python-brace-format
msgid "Status updates from {obj.display_name}" msgid "Status updates from {obj.display_name}"
msgstr "Aggiornamenti di stato da {obj.display_name}" msgstr "Aggiornamenti di stato da {obj.display_name}"
#: bookwyrm/views/rss_feed.py:72
#, python-brace-format
msgid "Reviews from {obj.display_name}"
msgstr "Recensioni da {obj.display_name}"
#: bookwyrm/views/rss_feed.py:110
#, python-brace-format
msgid "Quotes from {obj.display_name}"
msgstr "Citazioni da {obj.display_name}"
#: bookwyrm/views/rss_feed.py:148
#, python-brace-format
msgid "Comments from {obj.display_name}"
msgstr "Commenti di {obj.display_name}"
#: bookwyrm/views/updates.py:45 #: bookwyrm/views/updates.py:45
#, python-format #, python-format
msgid "Load %(count)d unread status" msgid "Load %(count)d unread status"

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: bookwyrm\n" "Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-11 22:46+0000\n" "POT-Creation-Date: 2023-01-30 08:21+0000\n"
"PO-Revision-Date: 2023-01-12 00:08\n" "PO-Revision-Date: 2023-03-02 21:34\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n" "Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Lithuanian\n" "Language-Team: Lithuanian\n"
"Language: lt\n" "Language: lt\n"
@ -256,14 +256,14 @@ msgstr "Sekėjai"
msgid "Private" msgid "Private"
msgstr "Privatu" msgstr "Privatu"
#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:157 #: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:168
#: bookwyrm/templates/settings/imports/imports.html:67 #: bookwyrm/templates/settings/imports/imports.html:98
#: bookwyrm/templates/settings/users/user_admin.html:81 #: bookwyrm/templates/settings/users/user_admin.html:81
#: bookwyrm/templates/settings/users/user_info.html:28 #: bookwyrm/templates/settings/users/user_info.html:28
msgid "Active" msgid "Active"
msgstr "Aktyvus" msgstr "Aktyvus"
#: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:155 #: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:166
msgid "Complete" msgid "Complete"
msgstr "Užbaigti" msgstr "Užbaigti"
@ -316,19 +316,19 @@ msgstr "Citatos"
msgid "Everything else" msgid "Everything else"
msgstr "Visa kita" msgstr "Visa kita"
#: bookwyrm/settings.py:214 #: bookwyrm/settings.py:217
msgid "Home Timeline" msgid "Home Timeline"
msgstr "Pagrindinė siena" msgstr "Pagrindinė siena"
#: bookwyrm/settings.py:214 #: bookwyrm/settings.py:217
msgid "Home" msgid "Home"
msgstr "Pagrindinis" msgstr "Pagrindinis"
#: bookwyrm/settings.py:215 #: bookwyrm/settings.py:218
msgid "Books Timeline" msgid "Books Timeline"
msgstr "Knygų siena" msgstr "Knygų siena"
#: bookwyrm/settings.py:215 #: bookwyrm/settings.py:218
#: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/guided_tour/user_profile.html:101
#: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:22
#: bookwyrm/templates/search/layout.html:43 #: bookwyrm/templates/search/layout.html:43
@ -336,75 +336,75 @@ msgstr "Knygų siena"
msgid "Books" msgid "Books"
msgstr "Knygos" msgstr "Knygos"
#: bookwyrm/settings.py:287 #: bookwyrm/settings.py:290
msgid "English" msgid "English"
msgstr "English (Anglų)" msgstr "English (Anglų)"
#: bookwyrm/settings.py:288 #: bookwyrm/settings.py:291
msgid "Català (Catalan)" msgid "Català (Catalan)"
msgstr "Català (kataloniečių)" msgstr "Català (kataloniečių)"
#: bookwyrm/settings.py:289 #: bookwyrm/settings.py:292
msgid "Deutsch (German)" msgid "Deutsch (German)"
msgstr "Deutsch (Vokiečių)" msgstr "Deutsch (Vokiečių)"
#: bookwyrm/settings.py:290 #: bookwyrm/settings.py:293
msgid "Español (Spanish)" msgid "Español (Spanish)"
msgstr "Español (Ispanų)" msgstr "Español (Ispanų)"
#: bookwyrm/settings.py:291 #: bookwyrm/settings.py:294
msgid "Euskara (Basque)" msgid "Euskara (Basque)"
msgstr "" msgstr ""
#: bookwyrm/settings.py:292 #: bookwyrm/settings.py:295
msgid "Galego (Galician)" msgid "Galego (Galician)"
msgstr "Galego (galisų)" msgstr "Galego (galisų)"
#: bookwyrm/settings.py:293 #: bookwyrm/settings.py:296
msgid "Italiano (Italian)" msgid "Italiano (Italian)"
msgstr "Italų (Italian)" msgstr "Italų (Italian)"
#: bookwyrm/settings.py:294 #: bookwyrm/settings.py:297
msgid "Suomi (Finnish)" msgid "Suomi (Finnish)"
msgstr "Suomi (suomių)" msgstr "Suomi (suomių)"
#: bookwyrm/settings.py:295 #: bookwyrm/settings.py:298
msgid "Français (French)" msgid "Français (French)"
msgstr "Français (Prancūzų)" msgstr "Français (Prancūzų)"
#: bookwyrm/settings.py:296 #: bookwyrm/settings.py:299
msgid "Lietuvių (Lithuanian)" msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių" msgstr "Lietuvių"
#: bookwyrm/settings.py:297 #: bookwyrm/settings.py:300
msgid "Norsk (Norwegian)" msgid "Norsk (Norwegian)"
msgstr "Norvegų (Norwegian)" msgstr "Norvegų (Norwegian)"
#: bookwyrm/settings.py:298 #: bookwyrm/settings.py:301
msgid "Polski (Polish)" msgid "Polski (Polish)"
msgstr "Polski (lenkų)" msgstr "Polski (lenkų)"
#: bookwyrm/settings.py:299 #: bookwyrm/settings.py:302
msgid "Português do Brasil (Brazilian Portuguese)" msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português brasileiro (Brazilijos portugalų)" msgstr "Português brasileiro (Brazilijos portugalų)"
#: bookwyrm/settings.py:300 #: bookwyrm/settings.py:303
msgid "Português Europeu (European Portuguese)" msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Europos portugalų)" msgstr "Português Europeu (Europos portugalų)"
#: bookwyrm/settings.py:301 #: bookwyrm/settings.py:304
msgid "Română (Romanian)" msgid "Română (Romanian)"
msgstr "Română (rumunų)" msgstr "Română (rumunų)"
#: bookwyrm/settings.py:302 #: bookwyrm/settings.py:305
msgid "Svenska (Swedish)" msgid "Svenska (Swedish)"
msgstr "Svenska (Švedų)" msgstr "Svenska (Švedų)"
#: bookwyrm/settings.py:303 #: bookwyrm/settings.py:306
msgid "简体中文 (Simplified Chinese)" msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (Supaprastinta kinų)" msgstr "简体中文 (Supaprastinta kinų)"
#: bookwyrm/settings.py:304 #: bookwyrm/settings.py:307
msgid "繁體中文 (Traditional Chinese)" msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (Tradicinė kinų)" msgstr "繁體中文 (Tradicinė kinų)"
@ -855,10 +855,10 @@ msgstr "ISNI:"
#: bookwyrm/templates/settings/announcements/edit_announcement.html:120 #: bookwyrm/templates/settings/announcements/edit_announcement.html:120
#: bookwyrm/templates/settings/federation/edit_instance.html:98 #: bookwyrm/templates/settings/federation/edit_instance.html:98
#: bookwyrm/templates/settings/federation/instance.html:105 #: bookwyrm/templates/settings/federation/instance.html:105
#: bookwyrm/templates/settings/registration.html:79 #: bookwyrm/templates/settings/registration.html:96
#: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/registration_limited.html:76
#: bookwyrm/templates/settings/site.html:144 #: bookwyrm/templates/settings/site.html:144
#: bookwyrm/templates/settings/users/user_moderation_actions.html:69 #: bookwyrm/templates/settings/users/user_moderation_actions.html:75
#: bookwyrm/templates/shelf/form.html:25 #: bookwyrm/templates/shelf/form.html:25
#: bookwyrm/templates/snippets/reading_modals/layout.html:18 #: bookwyrm/templates/snippets/reading_modals/layout.html:18
msgid "Save" msgid "Save"
@ -1172,7 +1172,7 @@ msgstr "Tai naujas darbas"
#: bookwyrm/templates/guided_tour/user_profile.html:89 #: bookwyrm/templates/guided_tour/user_profile.html:89
#: bookwyrm/templates/guided_tour/user_profile.html:112 #: bookwyrm/templates/guided_tour/user_profile.html:112
#: bookwyrm/templates/guided_tour/user_profile.html:135 #: bookwyrm/templates/guided_tour/user_profile.html:135
#: bookwyrm/templates/user_menu.html:18 #: bookwyrm/templates/user/user.html:87 bookwyrm/templates/user_menu.html:18
msgid "Back" msgid "Back"
msgstr "Atgal" msgstr "Atgal"
@ -1384,7 +1384,7 @@ msgid "Domain"
msgstr "Domenas" msgstr "Domenas"
#: bookwyrm/templates/book/file_links/edit_links.html:36 #: bookwyrm/templates/book/file_links/edit_links.html:36
#: bookwyrm/templates/import/import.html:122 #: bookwyrm/templates/import/import.html:133
#: bookwyrm/templates/import/import_status.html:134 #: bookwyrm/templates/import/import_status.html:134
#: bookwyrm/templates/settings/announcements/announcements.html:37 #: bookwyrm/templates/settings/announcements/announcements.html:37
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:48 #: bookwyrm/templates/settings/invites/manage_invite_requests.html:48
@ -1397,7 +1397,7 @@ msgstr "Būsena"
#: bookwyrm/templates/book/file_links/edit_links.html:37 #: bookwyrm/templates/book/file_links/edit_links.html:37
#: bookwyrm/templates/settings/announcements/announcements.html:41 #: bookwyrm/templates/settings/announcements/announcements.html:41
#: bookwyrm/templates/settings/federation/instance.html:112 #: bookwyrm/templates/settings/federation/instance.html:112
#: bookwyrm/templates/settings/imports/imports.html:110 #: bookwyrm/templates/settings/imports/imports.html:141
#: bookwyrm/templates/settings/reports/report_links_table.html:6 #: bookwyrm/templates/settings/reports/report_links_table.html:6
#: bookwyrm/templates/settings/themes.html:99 #: bookwyrm/templates/settings/themes.html:99
msgid "Actions" msgid "Actions"
@ -1921,13 +1921,13 @@ msgid "Add to your books"
msgstr "Pridėti prie savo knygų" msgstr "Pridėti prie savo knygų"
#: bookwyrm/templates/get_started/book_preview.html:10 #: bookwyrm/templates/get_started/book_preview.html:10
#: bookwyrm/templates/shelf/shelf.html:86 bookwyrm/templates/user/user.html:33 #: bookwyrm/templates/shelf/shelf.html:86 bookwyrm/templates/user/user.html:37
#: bookwyrm/templatetags/shelf_tags.py:48 #: bookwyrm/templatetags/shelf_tags.py:48
msgid "To Read" msgid "To Read"
msgstr "Norimos perskaityti" msgstr "Norimos perskaityti"
#: bookwyrm/templates/get_started/book_preview.html:11 #: bookwyrm/templates/get_started/book_preview.html:11
#: bookwyrm/templates/shelf/shelf.html:87 bookwyrm/templates/user/user.html:34 #: bookwyrm/templates/shelf/shelf.html:87 bookwyrm/templates/user/user.html:38
#: bookwyrm/templatetags/shelf_tags.py:50 #: bookwyrm/templatetags/shelf_tags.py:50
msgid "Currently Reading" msgid "Currently Reading"
msgstr "Šiuo metu skaitomos" msgstr "Šiuo metu skaitomos"
@ -1937,12 +1937,12 @@ msgstr "Šiuo metu skaitomos"
#: bookwyrm/templates/snippets/shelf_selector.html:46 #: bookwyrm/templates/snippets/shelf_selector.html:46
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24 #: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12 #: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12
#: bookwyrm/templates/user/user.html:35 bookwyrm/templatetags/shelf_tags.py:52 #: bookwyrm/templates/user/user.html:39 bookwyrm/templatetags/shelf_tags.py:52
msgid "Read" msgid "Read"
msgstr "Perskaitytos" msgstr "Perskaitytos"
#: bookwyrm/templates/get_started/book_preview.html:13 #: bookwyrm/templates/get_started/book_preview.html:13
#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:36 #: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:40
msgid "Stopped Reading" msgid "Stopped Reading"
msgstr "Nustota skaityti" msgstr "Nustota skaityti"
@ -2030,7 +2030,7 @@ msgstr "Baigti"
#: bookwyrm/templates/get_started/profile.html:15 #: bookwyrm/templates/get_started/profile.html:15
#: bookwyrm/templates/preferences/edit_user.html:41 #: bookwyrm/templates/preferences/edit_user.html:41
msgid "Display name:" msgid "Display name:"
msgstr "Rodomas vardą:" msgstr "Rodomas vardas:"
#: bookwyrm/templates/get_started/profile.html:29 #: bookwyrm/templates/get_started/profile.html:29
#: bookwyrm/templates/preferences/edit_user.html:47 #: bookwyrm/templates/preferences/edit_user.html:47
@ -2662,7 +2662,7 @@ msgid "This is your user profile. All your latest activities will be listed here
msgstr "Tai jūsų profilis. Čia bus matomos jūsų naujausios veiklos. Kiti „Bookwyrm“ naudotojai taip pat gali matyti šio puslapio dalis, tačiau tai, ką jie gali matyti, priklauso nuo privatumo nustatymų." msgstr "Tai jūsų profilis. Čia bus matomos jūsų naujausios veiklos. Kiti „Bookwyrm“ naudotojai taip pat gali matyti šio puslapio dalis, tačiau tai, ką jie gali matyti, priklauso nuo privatumo nustatymų."
#: bookwyrm/templates/guided_tour/user_profile.html:11 #: bookwyrm/templates/guided_tour/user_profile.html:11
#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:10 #: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:14
msgid "User Profile" msgid "User Profile"
msgstr "Nario paskyra" msgstr "Nario paskyra"
@ -2709,85 +2709,100 @@ msgstr "Importuoti knygas"
msgid "Not a valid CSV file" msgid "Not a valid CSV file"
msgstr "Netinkamas CSV failas" msgstr "Netinkamas CSV failas"
#: bookwyrm/templates/import/import.html:22 #: bookwyrm/templates/import/import.html:20
#, python-format
msgid "Currently you are allowed to import %(import_size_limit)s books every %(import_limit_reset)s days."
msgstr ""
#: bookwyrm/templates/import/import.html:21
#, python-format
msgid "You have %(allowed_imports)s left."
msgstr ""
#: bookwyrm/templates/import/import.html:28
#, python-format #, python-format
msgid "On average, recent imports have taken %(hours)s hours." msgid "On average, recent imports have taken %(hours)s hours."
msgstr "Vidutiniškai importavimas užima %(hours)s val." msgstr "Vidutiniškai importavimas užima %(hours)s val."
#: bookwyrm/templates/import/import.html:26 #: bookwyrm/templates/import/import.html:32
#, python-format #, python-format
msgid "On average, recent imports have taken %(minutes)s minutes." msgid "On average, recent imports have taken %(minutes)s minutes."
msgstr "Vidutiniškai importavimas užima %(minutes)s min." msgstr "Vidutiniškai importavimas užima %(minutes)s min."
#: bookwyrm/templates/import/import.html:41 #: bookwyrm/templates/import/import.html:47
msgid "Data source:" msgid "Data source:"
msgstr "Duomenų šaltinis:" msgstr "Duomenų šaltinis:"
#: bookwyrm/templates/import/import.html:47 #: bookwyrm/templates/import/import.html:53
msgid "Goodreads (CSV)" msgid "Goodreads (CSV)"
msgstr "Goodreads (CSV)" msgstr "Goodreads (CSV)"
#: bookwyrm/templates/import/import.html:50 #: bookwyrm/templates/import/import.html:56
msgid "Storygraph (CSV)" msgid "Storygraph (CSV)"
msgstr "Storygraph (CSV)" msgstr "Storygraph (CSV)"
#: bookwyrm/templates/import/import.html:53 #: bookwyrm/templates/import/import.html:59
msgid "LibraryThing (TSV)" msgid "LibraryThing (TSV)"
msgstr "LibraryThing (TSV)" msgstr "LibraryThing (TSV)"
#: bookwyrm/templates/import/import.html:56 #: bookwyrm/templates/import/import.html:62
msgid "OpenLibrary (CSV)" msgid "OpenLibrary (CSV)"
msgstr "OpenLibrary (CSV)" msgstr "OpenLibrary (CSV)"
#: bookwyrm/templates/import/import.html:59 #: bookwyrm/templates/import/import.html:65
msgid "Calibre (CSV)" msgid "Calibre (CSV)"
msgstr "Calibre (CSV)" msgstr "Calibre (CSV)"
#: bookwyrm/templates/import/import.html:65 #: bookwyrm/templates/import/import.html:71
msgid "You can download your Goodreads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Import/Export page</a> of your Goodreads account." msgid "You can download your Goodreads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Import/Export page</a> of your Goodreads account."
msgstr "Galite atsisiųsti savo „Goodreads“ duomenis iš <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Importavimo ir eksportavimo puslapio</a>, esančio jūsų „Goodreads“ paskyroje." msgstr "Galite atsisiųsti savo „Goodreads“ duomenis iš <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Importavimo ir eksportavimo puslapio</a>, esančio jūsų „Goodreads“ paskyroje."
#: bookwyrm/templates/import/import.html:74 #: bookwyrm/templates/import/import.html:80
msgid "Data file:" msgid "Data file:"
msgstr "Duomenų failas:" msgstr "Duomenų failas:"
#: bookwyrm/templates/import/import.html:82 #: bookwyrm/templates/import/import.html:88
msgid "Include reviews" msgid "Include reviews"
msgstr "Įtraukti atsiliepimus" msgstr "Įtraukti atsiliepimus"
#: bookwyrm/templates/import/import.html:87 #: bookwyrm/templates/import/import.html:93
msgid "Privacy setting for imported reviews:" msgid "Privacy setting for imported reviews:"
msgstr "Privatumo nustatymai svarbiems atsiliepimams:" msgstr "Privatumo nustatymai svarbiems atsiliepimams:"
#: bookwyrm/templates/import/import.html:93 #: bookwyrm/templates/import/import.html:100
#: bookwyrm/templates/import/import.html:102
#: bookwyrm/templates/preferences/layout.html:35 #: bookwyrm/templates/preferences/layout.html:35
#: bookwyrm/templates/settings/federation/instance_blocklist.html:78 #: bookwyrm/templates/settings/federation/instance_blocklist.html:78
msgid "Import" msgid "Import"
msgstr "Importuoti" msgstr "Importuoti"
#: bookwyrm/templates/import/import.html:101 #: bookwyrm/templates/import/import.html:103
msgid "You've reached the import limit."
msgstr ""
#: bookwyrm/templates/import/import.html:112
msgid "Imports are temporarily disabled; thank you for your patience." msgid "Imports are temporarily disabled; thank you for your patience."
msgstr "Importavimo galimybė laikinai išjungta. Dėkojame už kantrybę." msgstr "Importavimo galimybė laikinai išjungta. Dėkojame už kantrybę."
#: bookwyrm/templates/import/import.html:108 #: bookwyrm/templates/import/import.html:119
msgid "Recent Imports" msgid "Recent Imports"
msgstr "Pastaruoju metu importuota" msgstr "Pastaruoju metu importuota"
#: bookwyrm/templates/import/import.html:113 #: bookwyrm/templates/import/import.html:124
#: bookwyrm/templates/settings/imports/imports.html:89 #: bookwyrm/templates/settings/imports/imports.html:120
msgid "Date Created" msgid "Date Created"
msgstr "Sukūrimo data" msgstr "Sukūrimo data"
#: bookwyrm/templates/import/import.html:116 #: bookwyrm/templates/import/import.html:127
msgid "Last Updated" msgid "Last Updated"
msgstr "Paskutinį kartą atnaujinta" msgstr "Paskutinį kartą atnaujinta"
#: bookwyrm/templates/import/import.html:119 #: bookwyrm/templates/import/import.html:130
#: bookwyrm/templates/settings/imports/imports.html:98 #: bookwyrm/templates/settings/imports/imports.html:129
msgid "Items" msgid "Items"
msgstr "Elementai" msgstr "Elementai"
#: bookwyrm/templates/import/import.html:128 #: bookwyrm/templates/import/import.html:139
msgid "No recent imports" msgid "No recent imports"
msgstr "Pastaruoju metu neimportuota" msgstr "Pastaruoju metu neimportuota"
@ -2803,6 +2818,7 @@ msgid "Retry Status"
msgstr "Pakartojimo būsena" msgstr "Pakartojimo būsena"
#: bookwyrm/templates/import/import_status.html:22 #: bookwyrm/templates/import/import_status.html:22
#: bookwyrm/templates/settings/celery.html:36
#: bookwyrm/templates/settings/imports/imports.html:6 #: bookwyrm/templates/settings/imports/imports.html:6
#: bookwyrm/templates/settings/imports/imports.html:9 #: bookwyrm/templates/settings/imports/imports.html:9
#: bookwyrm/templates/settings/layout.html:82 #: bookwyrm/templates/settings/layout.html:82
@ -2822,7 +2838,7 @@ msgid "Refresh"
msgstr "Atnaujinti" msgstr "Atnaujinti"
#: bookwyrm/templates/import/import_status.html:72 #: bookwyrm/templates/import/import_status.html:72
#: bookwyrm/templates/settings/imports/imports.html:130 #: bookwyrm/templates/settings/imports/imports.html:161
msgid "Stop import" msgid "Stop import"
msgstr "Sustabdyti importavimą" msgstr "Sustabdyti importavimą"
@ -2944,7 +2960,7 @@ msgid "Reject"
msgstr "Atmesti" msgstr "Atmesti"
#: bookwyrm/templates/import/troubleshoot.html:7 #: bookwyrm/templates/import/troubleshoot.html:7
#: bookwyrm/templates/settings/imports/imports.html:107 #: bookwyrm/templates/settings/imports/imports.html:138
msgid "Failed items" msgid "Failed items"
msgstr "Nepavykę elementai" msgstr "Nepavykę elementai"
@ -3195,7 +3211,7 @@ msgid "Delete this list?"
msgstr "Ištrinti šį sąrašą?" msgstr "Ištrinti šį sąrašą?"
#: bookwyrm/templates/lists/edit_form.html:5 #: bookwyrm/templates/lists/edit_form.html:5
#: bookwyrm/templates/lists/layout.html:18 #: bookwyrm/templates/lists/layout.html:23
msgid "Edit List" msgid "Edit List"
msgstr "Redaguoti sąrašą" msgstr "Redaguoti sąrašą"
@ -4463,48 +4479,48 @@ msgstr ""
msgid "High priority" msgid "High priority"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/celery.html:40 #: bookwyrm/templates/settings/celery.html:46
msgid "Could not connect to Redis broker" msgid "Could not connect to Redis broker"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/celery.html:48 #: bookwyrm/templates/settings/celery.html:54
msgid "Active Tasks" msgid "Active Tasks"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/celery.html:53 #: bookwyrm/templates/settings/celery.html:59
#: bookwyrm/templates/settings/imports/imports.html:82 #: bookwyrm/templates/settings/imports/imports.html:113
msgid "ID" msgid "ID"
msgstr "ID" msgstr "ID"
#: bookwyrm/templates/settings/celery.html:54 #: bookwyrm/templates/settings/celery.html:60
msgid "Task name" msgid "Task name"
msgstr "Užduoties pavadinimas" msgstr "Užduoties pavadinimas"
#: bookwyrm/templates/settings/celery.html:55 #: bookwyrm/templates/settings/celery.html:61
msgid "Run time" msgid "Run time"
msgstr "Rodymo laikas" msgstr "Rodymo laikas"
#: bookwyrm/templates/settings/celery.html:56 #: bookwyrm/templates/settings/celery.html:62
msgid "Priority" msgid "Priority"
msgstr "Prioritetas" msgstr "Prioritetas"
#: bookwyrm/templates/settings/celery.html:61 #: bookwyrm/templates/settings/celery.html:67
msgid "No active tasks" msgid "No active tasks"
msgstr "Nėra aktyvių užduočių" msgstr "Nėra aktyvių užduočių"
#: bookwyrm/templates/settings/celery.html:79 #: bookwyrm/templates/settings/celery.html:85
msgid "Workers" msgid "Workers"
msgstr "Darbuotojai" msgstr "Darbuotojai"
#: bookwyrm/templates/settings/celery.html:84 #: bookwyrm/templates/settings/celery.html:90
msgid "Uptime:" msgid "Uptime:"
msgstr "Veikimo laikas:" msgstr "Veikimo laikas:"
#: bookwyrm/templates/settings/celery.html:94 #: bookwyrm/templates/settings/celery.html:100
msgid "Could not connect to Celery" msgid "Could not connect to Celery"
msgstr "Nepavyko prisijungti prie „Celery“" msgstr "Nepavyko prisijungti prie „Celery“"
#: bookwyrm/templates/settings/celery.html:101 #: bookwyrm/templates/settings/celery.html:107
msgid "Errors" msgid "Errors"
msgstr "Klaidos" msgstr "Klaidos"
@ -4892,27 +4908,55 @@ msgstr "Naudotojai nebegali pradėti importuoti"
msgid "Enable imports" msgid "Enable imports"
msgstr "Įjungti importavimus" msgstr "Įjungti importavimus"
#: bookwyrm/templates/settings/imports/imports.html:71 #: bookwyrm/templates/settings/imports/imports.html:63
msgid "Limit the amount of imports"
msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:74
msgid "Some users might try to import a large number of books, which you want to limit."
msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:75
msgid "Set the value to 0 to not enforce any limit."
msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:78
msgid "Set import limit to"
msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:80
msgid "books every"
msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:82
msgid "days."
msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:86
msgid "Set limit"
msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:102
msgid "Completed" msgid "Completed"
msgstr "Užbaigta" msgstr "Užbaigta"
#: bookwyrm/templates/settings/imports/imports.html:85 #: bookwyrm/templates/settings/imports/imports.html:116
msgid "User" msgid "User"
msgstr "Vartotojas" msgstr "Vartotojas"
#: bookwyrm/templates/settings/imports/imports.html:94 #: bookwyrm/templates/settings/imports/imports.html:125
msgid "Date Updated" msgid "Date Updated"
msgstr "Atnaujinimo data" msgstr "Atnaujinimo data"
#: bookwyrm/templates/settings/imports/imports.html:101 #: bookwyrm/templates/settings/imports/imports.html:132
msgid "Pending items" msgid "Pending items"
msgstr "Laukiami elementai" msgstr "Laukiami elementai"
#: bookwyrm/templates/settings/imports/imports.html:104 #: bookwyrm/templates/settings/imports/imports.html:135
msgid "Successful items" msgid "Successful items"
msgstr "Sėkmingi elementai" msgstr "Sėkmingi elementai"
#: bookwyrm/templates/settings/imports/imports.html:139 #: bookwyrm/templates/settings/imports/imports.html:170
msgid "No matching imports found." msgid "No matching imports found."
msgstr "Nerasta atitinkančių importų." msgstr "Nerasta atitinkančių importų."
@ -5173,34 +5217,38 @@ msgstr "Nepavyko išsaugoti nustatymų"
msgid "Allow registration" msgid "Allow registration"
msgstr "Leisti registruotis" msgstr "Leisti registruotis"
#: bookwyrm/templates/settings/registration.html:44 #: bookwyrm/templates/settings/registration.html:43
msgid "Default access level:"
msgstr ""
#: bookwyrm/templates/settings/registration.html:61
msgid "Require users to confirm email address" msgid "Require users to confirm email address"
msgstr "Reikalauti el. pašto patvirtinimo" msgstr "Reikalauti el. pašto patvirtinimo"
#: bookwyrm/templates/settings/registration.html:46 #: bookwyrm/templates/settings/registration.html:63
msgid "(Recommended if registration is open)" msgid "(Recommended if registration is open)"
msgstr "(Rekomenduojama, jei leidžiama registruotis)" msgstr "(Rekomenduojama, jei leidžiama registruotis)"
#: bookwyrm/templates/settings/registration.html:51 #: bookwyrm/templates/settings/registration.html:68
msgid "Allow invite requests" msgid "Allow invite requests"
msgstr "Leisti prašyti kvietimų" msgstr "Leisti prašyti kvietimų"
#: bookwyrm/templates/settings/registration.html:55 #: bookwyrm/templates/settings/registration.html:72
#: bookwyrm/templates/settings/registration_limited.html:42 #: bookwyrm/templates/settings/registration_limited.html:42
msgid "Invite request text:" msgid "Invite request text:"
msgstr "Kvietimo prašymo tekstas:" msgstr "Kvietimo prašymo tekstas:"
#: bookwyrm/templates/settings/registration.html:63 #: bookwyrm/templates/settings/registration.html:80
#: bookwyrm/templates/settings/registration_limited.html:50 #: bookwyrm/templates/settings/registration_limited.html:50
msgid "Set a question for invite requests" msgid "Set a question for invite requests"
msgstr "Kvietimo užklausoms parinkite klausimą" msgstr "Kvietimo užklausoms parinkite klausimą"
#: bookwyrm/templates/settings/registration.html:68 #: bookwyrm/templates/settings/registration.html:85
#: bookwyrm/templates/settings/registration_limited.html:55 #: bookwyrm/templates/settings/registration_limited.html:55
msgid "Question:" msgid "Question:"
msgstr "Klausimas:" msgstr "Klausimas:"
#: bookwyrm/templates/settings/registration.html:73 #: bookwyrm/templates/settings/registration.html:90
#: bookwyrm/templates/settings/registration_limited.html:67 #: bookwyrm/templates/settings/registration_limited.html:67
msgid "Registration closed text:" msgid "Registration closed text:"
msgstr "Užrakintos registracijos tekstas:" msgstr "Užrakintos registracijos tekstas:"
@ -5442,7 +5490,7 @@ msgid "Remove theme"
msgstr "Pašalinti temą" msgstr "Pašalinti temą"
#: bookwyrm/templates/settings/users/delete_user_form.html:5 #: bookwyrm/templates/settings/users/delete_user_form.html:5
#: bookwyrm/templates/settings/users/user_moderation_actions.html:32 #: bookwyrm/templates/settings/users/user_moderation_actions.html:38
msgid "Permanently delete user" msgid "Permanently delete user"
msgstr "Visam laikui ištrinti vartotoją" msgstr "Visam laikui ištrinti vartotoją"
@ -5564,14 +5612,18 @@ msgid "User Actions"
msgstr "Nario veiksmai" msgstr "Nario veiksmai"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:21 #: bookwyrm/templates/settings/users/user_moderation_actions.html:21
msgid "Activate user"
msgstr ""
#: bookwyrm/templates/settings/users/user_moderation_actions.html:27
msgid "Suspend user" msgid "Suspend user"
msgstr "Laikinai išjungti vartotoją" msgstr "Laikinai išjungti vartotoją"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:26 #: bookwyrm/templates/settings/users/user_moderation_actions.html:32
msgid "Un-suspend user" msgid "Un-suspend user"
msgstr "Atblokuoti narį" msgstr "Atblokuoti narį"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:48 #: bookwyrm/templates/settings/users/user_moderation_actions.html:54
msgid "Access level:" msgid "Access level:"
msgstr "Priėjimo lygis:" msgstr "Priėjimo lygis:"
@ -6435,33 +6487,53 @@ msgstr "%(username)s nieko neseka"
msgid "No reviews or comments yet!" msgid "No reviews or comments yet!"
msgstr "" msgstr ""
#: bookwyrm/templates/user/user.html:16 #: bookwyrm/templates/user/user.html:20
msgid "Edit profile" msgid "Edit profile"
msgstr "Redaguoti paskyrą" msgstr "Redaguoti paskyrą"
#: bookwyrm/templates/user/user.html:38 #: bookwyrm/templates/user/user.html:42
#, python-format #, python-format
msgid "View all %(size)s" msgid "View all %(size)s"
msgstr "Žiūrėti visas %(size)s" msgstr "Žiūrėti visas %(size)s"
#: bookwyrm/templates/user/user.html:52 #: bookwyrm/templates/user/user.html:56
msgid "View all books" msgid "View all books"
msgstr "Žiūrėti visas knygas" msgstr "Žiūrėti visas knygas"
#: bookwyrm/templates/user/user.html:59 #: bookwyrm/templates/user/user.html:63
#, python-format #, python-format
msgid "%(current_year)s Reading Goal" msgid "%(current_year)s Reading Goal"
msgstr "%(current_year)s skaitymo tikslas" msgstr "%(current_year)s skaitymo tikslas"
#: bookwyrm/templates/user/user.html:66 #: bookwyrm/templates/user/user.html:70
msgid "User Activity" msgid "User Activity"
msgstr "Naudotojo aktyvumas" msgstr "Naudotojo aktyvumas"
#: bookwyrm/templates/user/user.html:71 #: bookwyrm/templates/user/user.html:76
msgid "Show RSS Options"
msgstr ""
#: bookwyrm/templates/user/user.html:82
msgid "RSS feed" msgid "RSS feed"
msgstr "RSS srautas" msgstr "RSS srautas"
#: bookwyrm/templates/user/user.html:83 #: bookwyrm/templates/user/user.html:98
msgid "Complete feed"
msgstr ""
#: bookwyrm/templates/user/user.html:103
msgid "Reviews only"
msgstr ""
#: bookwyrm/templates/user/user.html:108
msgid "Quotes only"
msgstr ""
#: bookwyrm/templates/user/user.html:113
msgid "Comments only"
msgstr ""
#: bookwyrm/templates/user/user.html:129
msgid "No activities yet!" msgid "No activities yet!"
msgstr "Įrašų dar nėra" msgstr "Įrašų dar nėra"
@ -6509,16 +6581,45 @@ msgstr "Atsijungti"
msgid "File exceeds maximum size: 10MB" msgid "File exceeds maximum size: 10MB"
msgstr "Failas viršijo maksimalų dydį: 10 MB" msgstr "Failas viršijo maksimalų dydį: 10 MB"
#: bookwyrm/templatetags/list_page_tags.py:14
#, python-format
msgid "Book List: %(name)s"
msgstr ""
#: bookwyrm/templatetags/list_page_tags.py:22
#, python-format
msgid "%(num)d book - by %(user)s"
msgid_plural "%(num)d books - by %(user)s"
msgstr[0] ""
msgstr[1] ""
msgstr[2] ""
msgstr[3] ""
#: bookwyrm/templatetags/utilities.py:39 #: bookwyrm/templatetags/utilities.py:39
#, python-format #, python-format
msgid "%(title)s: %(subtitle)s" msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s"
#: bookwyrm/views/rss_feed.py:34 #: bookwyrm/views/rss_feed.py:35
#, python-brace-format #, python-brace-format
msgid "Status updates from {obj.display_name}" msgid "Status updates from {obj.display_name}"
msgstr "Būsenos atnaujinimai iš {obj.display_name}" msgstr "Būsenos atnaujinimai iš {obj.display_name}"
#: bookwyrm/views/rss_feed.py:72
#, python-brace-format
msgid "Reviews from {obj.display_name}"
msgstr ""
#: bookwyrm/views/rss_feed.py:110
#, python-brace-format
msgid "Quotes from {obj.display_name}"
msgstr ""
#: bookwyrm/views/rss_feed.py:148
#, python-brace-format
msgid "Comments from {obj.display_name}"
msgstr ""
#: bookwyrm/views/updates.py:45 #: bookwyrm/views/updates.py:45
#, python-format #, python-format
msgid "Load %(count)d unread status" msgid "Load %(count)d unread status"

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: bookwyrm\n" "Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-11 22:46+0000\n" "POT-Creation-Date: 2023-01-30 08:21+0000\n"
"PO-Revision-Date: 2023-01-12 00:08\n" "PO-Revision-Date: 2023-01-30 17:36\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n" "Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Norwegian\n" "Language-Team: Norwegian\n"
"Language: no\n" "Language: no\n"
@ -256,14 +256,14 @@ msgstr "Følgere"
msgid "Private" msgid "Private"
msgstr "Privat" msgstr "Privat"
#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:157 #: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:168
#: bookwyrm/templates/settings/imports/imports.html:67 #: bookwyrm/templates/settings/imports/imports.html:98
#: bookwyrm/templates/settings/users/user_admin.html:81 #: bookwyrm/templates/settings/users/user_admin.html:81
#: bookwyrm/templates/settings/users/user_info.html:28 #: bookwyrm/templates/settings/users/user_info.html:28
msgid "Active" msgid "Active"
msgstr "Aktiv" msgstr "Aktiv"
#: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:155 #: bookwyrm/models/import_job.py:49 bookwyrm/templates/import/import.html:166
msgid "Complete" msgid "Complete"
msgstr "" msgstr ""
@ -316,19 +316,19 @@ msgstr "Sitater"
msgid "Everything else" msgid "Everything else"
msgstr "Andre ting" msgstr "Andre ting"
#: bookwyrm/settings.py:214 #: bookwyrm/settings.py:217
msgid "Home Timeline" msgid "Home Timeline"
msgstr "Lokal tidslinje" msgstr "Lokal tidslinje"
#: bookwyrm/settings.py:214 #: bookwyrm/settings.py:217
msgid "Home" msgid "Home"
msgstr "Hjem" msgstr "Hjem"
#: bookwyrm/settings.py:215 #: bookwyrm/settings.py:218
msgid "Books Timeline" msgid "Books Timeline"
msgstr "Boktidslinja" msgstr "Boktidslinja"
#: bookwyrm/settings.py:215 #: bookwyrm/settings.py:218
#: bookwyrm/templates/guided_tour/user_profile.html:101 #: bookwyrm/templates/guided_tour/user_profile.html:101
#: bookwyrm/templates/search/layout.html:22 #: bookwyrm/templates/search/layout.html:22
#: bookwyrm/templates/search/layout.html:43 #: bookwyrm/templates/search/layout.html:43
@ -336,75 +336,75 @@ msgstr "Boktidslinja"
msgid "Books" msgid "Books"
msgstr "Bøker" msgstr "Bøker"
#: bookwyrm/settings.py:287 #: bookwyrm/settings.py:290
msgid "English" msgid "English"
msgstr "English (Engelsk)" msgstr "English (Engelsk)"
#: bookwyrm/settings.py:288 #: bookwyrm/settings.py:291
msgid "Català (Catalan)" msgid "Català (Catalan)"
msgstr "Català (katalansk)" msgstr "Català (katalansk)"
#: bookwyrm/settings.py:289 #: bookwyrm/settings.py:292
msgid "Deutsch (German)" msgid "Deutsch (German)"
msgstr "Deutsch (Tysk)" msgstr "Deutsch (Tysk)"
#: bookwyrm/settings.py:290 #: bookwyrm/settings.py:293
msgid "Español (Spanish)" msgid "Español (Spanish)"
msgstr "Español (Spansk)" msgstr "Español (Spansk)"
#: bookwyrm/settings.py:291 #: bookwyrm/settings.py:294
msgid "Euskara (Basque)" msgid "Euskara (Basque)"
msgstr "" msgstr ""
#: bookwyrm/settings.py:292 #: bookwyrm/settings.py:295
msgid "Galego (Galician)" msgid "Galego (Galician)"
msgstr "Galego (Gallisk)" msgstr "Galego (Gallisk)"
#: bookwyrm/settings.py:293 #: bookwyrm/settings.py:296
msgid "Italiano (Italian)" msgid "Italiano (Italian)"
msgstr "Italiano (Italiensk)" msgstr "Italiano (Italiensk)"
#: bookwyrm/settings.py:294 #: bookwyrm/settings.py:297
msgid "Suomi (Finnish)" msgid "Suomi (Finnish)"
msgstr "Suomi (finsk)" msgstr "Suomi (finsk)"
#: bookwyrm/settings.py:295 #: bookwyrm/settings.py:298
msgid "Français (French)" msgid "Français (French)"
msgstr "Français (Fransk)" msgstr "Français (Fransk)"
#: bookwyrm/settings.py:296 #: bookwyrm/settings.py:299
msgid "Lietuvių (Lithuanian)" msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (Litauisk)" msgstr "Lietuvių (Litauisk)"
#: bookwyrm/settings.py:297 #: bookwyrm/settings.py:300
msgid "Norsk (Norwegian)" msgid "Norsk (Norwegian)"
msgstr "Norsk (Norsk)" msgstr "Norsk (Norsk)"
#: bookwyrm/settings.py:298 #: bookwyrm/settings.py:301
msgid "Polski (Polish)" msgid "Polski (Polish)"
msgstr "Polski (Polsk)" msgstr "Polski (Polsk)"
#: bookwyrm/settings.py:299 #: bookwyrm/settings.py:302
msgid "Português do Brasil (Brazilian Portuguese)" msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português - Brasil (Brasiliansk portugisisk)" msgstr "Português - Brasil (Brasiliansk portugisisk)"
#: bookwyrm/settings.py:300 #: bookwyrm/settings.py:303
msgid "Português Europeu (European Portuguese)" msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Europeisk Portugisisk)" msgstr "Português Europeu (Europeisk Portugisisk)"
#: bookwyrm/settings.py:301 #: bookwyrm/settings.py:304
msgid "Română (Romanian)" msgid "Română (Romanian)"
msgstr "Română (romansk)" msgstr "Română (romansk)"
#: bookwyrm/settings.py:302 #: bookwyrm/settings.py:305
msgid "Svenska (Swedish)" msgid "Svenska (Swedish)"
msgstr "Svenska (Svensk)" msgstr "Svenska (Svensk)"
#: bookwyrm/settings.py:303 #: bookwyrm/settings.py:306
msgid "简体中文 (Simplified Chinese)" msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (Forenklet kinesisk)" msgstr "简体中文 (Forenklet kinesisk)"
#: bookwyrm/settings.py:304 #: bookwyrm/settings.py:307
msgid "繁體中文 (Traditional Chinese)" msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (Tradisjonelt kinesisk)" msgstr "繁體中文 (Tradisjonelt kinesisk)"
@ -847,10 +847,10 @@ msgstr "ISNI:"
#: bookwyrm/templates/settings/announcements/edit_announcement.html:120 #: bookwyrm/templates/settings/announcements/edit_announcement.html:120
#: bookwyrm/templates/settings/federation/edit_instance.html:98 #: bookwyrm/templates/settings/federation/edit_instance.html:98
#: bookwyrm/templates/settings/federation/instance.html:105 #: bookwyrm/templates/settings/federation/instance.html:105
#: bookwyrm/templates/settings/registration.html:79 #: bookwyrm/templates/settings/registration.html:96
#: bookwyrm/templates/settings/registration_limited.html:76 #: bookwyrm/templates/settings/registration_limited.html:76
#: bookwyrm/templates/settings/site.html:144 #: bookwyrm/templates/settings/site.html:144
#: bookwyrm/templates/settings/users/user_moderation_actions.html:69 #: bookwyrm/templates/settings/users/user_moderation_actions.html:75
#: bookwyrm/templates/shelf/form.html:25 #: bookwyrm/templates/shelf/form.html:25
#: bookwyrm/templates/snippets/reading_modals/layout.html:18 #: bookwyrm/templates/snippets/reading_modals/layout.html:18
msgid "Save" msgid "Save"
@ -1160,7 +1160,7 @@ msgstr "Dette er et nytt verk"
#: bookwyrm/templates/guided_tour/user_profile.html:89 #: bookwyrm/templates/guided_tour/user_profile.html:89
#: bookwyrm/templates/guided_tour/user_profile.html:112 #: bookwyrm/templates/guided_tour/user_profile.html:112
#: bookwyrm/templates/guided_tour/user_profile.html:135 #: bookwyrm/templates/guided_tour/user_profile.html:135
#: bookwyrm/templates/user_menu.html:18 #: bookwyrm/templates/user/user.html:87 bookwyrm/templates/user_menu.html:18
msgid "Back" msgid "Back"
msgstr "Tilbake" msgstr "Tilbake"
@ -1372,7 +1372,7 @@ msgid "Domain"
msgstr "Domene" msgstr "Domene"
#: bookwyrm/templates/book/file_links/edit_links.html:36 #: bookwyrm/templates/book/file_links/edit_links.html:36
#: bookwyrm/templates/import/import.html:122 #: bookwyrm/templates/import/import.html:133
#: bookwyrm/templates/import/import_status.html:134 #: bookwyrm/templates/import/import_status.html:134
#: bookwyrm/templates/settings/announcements/announcements.html:37 #: bookwyrm/templates/settings/announcements/announcements.html:37
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:48 #: bookwyrm/templates/settings/invites/manage_invite_requests.html:48
@ -1385,7 +1385,7 @@ msgstr "Status"
#: bookwyrm/templates/book/file_links/edit_links.html:37 #: bookwyrm/templates/book/file_links/edit_links.html:37
#: bookwyrm/templates/settings/announcements/announcements.html:41 #: bookwyrm/templates/settings/announcements/announcements.html:41
#: bookwyrm/templates/settings/federation/instance.html:112 #: bookwyrm/templates/settings/federation/instance.html:112
#: bookwyrm/templates/settings/imports/imports.html:110 #: bookwyrm/templates/settings/imports/imports.html:141
#: bookwyrm/templates/settings/reports/report_links_table.html:6 #: bookwyrm/templates/settings/reports/report_links_table.html:6
#: bookwyrm/templates/settings/themes.html:99 #: bookwyrm/templates/settings/themes.html:99
msgid "Actions" msgid "Actions"
@ -1905,13 +1905,13 @@ msgid "Add to your books"
msgstr "Legg til i bøkene dine" msgstr "Legg til i bøkene dine"
#: bookwyrm/templates/get_started/book_preview.html:10 #: bookwyrm/templates/get_started/book_preview.html:10
#: bookwyrm/templates/shelf/shelf.html:86 bookwyrm/templates/user/user.html:33 #: bookwyrm/templates/shelf/shelf.html:86 bookwyrm/templates/user/user.html:37
#: bookwyrm/templatetags/shelf_tags.py:48 #: bookwyrm/templatetags/shelf_tags.py:48
msgid "To Read" msgid "To Read"
msgstr "Å lese" msgstr "Å lese"
#: bookwyrm/templates/get_started/book_preview.html:11 #: bookwyrm/templates/get_started/book_preview.html:11
#: bookwyrm/templates/shelf/shelf.html:87 bookwyrm/templates/user/user.html:34 #: bookwyrm/templates/shelf/shelf.html:87 bookwyrm/templates/user/user.html:38
#: bookwyrm/templatetags/shelf_tags.py:50 #: bookwyrm/templatetags/shelf_tags.py:50
msgid "Currently Reading" msgid "Currently Reading"
msgstr "Leser nå" msgstr "Leser nå"
@ -1921,12 +1921,12 @@ msgstr "Leser nå"
#: bookwyrm/templates/snippets/shelf_selector.html:46 #: bookwyrm/templates/snippets/shelf_selector.html:46
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24 #: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12 #: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12
#: bookwyrm/templates/user/user.html:35 bookwyrm/templatetags/shelf_tags.py:52 #: bookwyrm/templates/user/user.html:39 bookwyrm/templatetags/shelf_tags.py:52
msgid "Read" msgid "Read"
msgstr "Lest" msgstr "Lest"
#: bookwyrm/templates/get_started/book_preview.html:13 #: bookwyrm/templates/get_started/book_preview.html:13
#: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:36 #: bookwyrm/templates/shelf/shelf.html:89 bookwyrm/templates/user/user.html:40
msgid "Stopped Reading" msgid "Stopped Reading"
msgstr "Stoppet lesing" msgstr "Stoppet lesing"
@ -2642,7 +2642,7 @@ msgid "This is your user profile. All your latest activities will be listed here
msgstr "" msgstr ""
#: bookwyrm/templates/guided_tour/user_profile.html:11 #: bookwyrm/templates/guided_tour/user_profile.html:11
#: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:10 #: bookwyrm/templates/user/layout.html:19 bookwyrm/templates/user/user.html:14
msgid "User Profile" msgid "User Profile"
msgstr "Brukerprofil" msgstr "Brukerprofil"
@ -2689,85 +2689,100 @@ msgstr "Importer bøker"
msgid "Not a valid CSV file" msgid "Not a valid CSV file"
msgstr "" msgstr ""
#: bookwyrm/templates/import/import.html:22 #: bookwyrm/templates/import/import.html:20
#, python-format
msgid "Currently you are allowed to import %(import_size_limit)s books every %(import_limit_reset)s days."
msgstr ""
#: bookwyrm/templates/import/import.html:21
#, python-format
msgid "You have %(allowed_imports)s left."
msgstr ""
#: bookwyrm/templates/import/import.html:28
#, python-format #, python-format
msgid "On average, recent imports have taken %(hours)s hours." msgid "On average, recent imports have taken %(hours)s hours."
msgstr "" msgstr ""
#: bookwyrm/templates/import/import.html:26 #: bookwyrm/templates/import/import.html:32
#, python-format #, python-format
msgid "On average, recent imports have taken %(minutes)s minutes." msgid "On average, recent imports have taken %(minutes)s minutes."
msgstr "" msgstr ""
#: bookwyrm/templates/import/import.html:41 #: bookwyrm/templates/import/import.html:47
msgid "Data source:" msgid "Data source:"
msgstr "Datakilde:" msgstr "Datakilde:"
#: bookwyrm/templates/import/import.html:47 #: bookwyrm/templates/import/import.html:53
msgid "Goodreads (CSV)" msgid "Goodreads (CSV)"
msgstr "" msgstr ""
#: bookwyrm/templates/import/import.html:50 #: bookwyrm/templates/import/import.html:56
msgid "Storygraph (CSV)" msgid "Storygraph (CSV)"
msgstr "" msgstr ""
#: bookwyrm/templates/import/import.html:53 #: bookwyrm/templates/import/import.html:59
msgid "LibraryThing (TSV)" msgid "LibraryThing (TSV)"
msgstr "" msgstr ""
#: bookwyrm/templates/import/import.html:56 #: bookwyrm/templates/import/import.html:62
msgid "OpenLibrary (CSV)" msgid "OpenLibrary (CSV)"
msgstr "" msgstr ""
#: bookwyrm/templates/import/import.html:59 #: bookwyrm/templates/import/import.html:65
msgid "Calibre (CSV)" msgid "Calibre (CSV)"
msgstr "" msgstr ""
#: bookwyrm/templates/import/import.html:65 #: bookwyrm/templates/import/import.html:71
msgid "You can download your Goodreads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Import/Export page</a> of your Goodreads account." msgid "You can download your Goodreads data from the <a href=\"https://www.goodreads.com/review/import\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">Import/Export page</a> of your Goodreads account."
msgstr "" msgstr ""
#: bookwyrm/templates/import/import.html:74 #: bookwyrm/templates/import/import.html:80
msgid "Data file:" msgid "Data file:"
msgstr "Datafil:" msgstr "Datafil:"
#: bookwyrm/templates/import/import.html:82 #: bookwyrm/templates/import/import.html:88
msgid "Include reviews" msgid "Include reviews"
msgstr "Inkluder anmeldelser" msgstr "Inkluder anmeldelser"
#: bookwyrm/templates/import/import.html:87 #: bookwyrm/templates/import/import.html:93
msgid "Privacy setting for imported reviews:" msgid "Privacy setting for imported reviews:"
msgstr "Personverninnstilling for importerte anmeldelser:" msgstr "Personverninnstilling for importerte anmeldelser:"
#: bookwyrm/templates/import/import.html:93 #: bookwyrm/templates/import/import.html:100
#: bookwyrm/templates/import/import.html:102
#: bookwyrm/templates/preferences/layout.html:35 #: bookwyrm/templates/preferences/layout.html:35
#: bookwyrm/templates/settings/federation/instance_blocklist.html:78 #: bookwyrm/templates/settings/federation/instance_blocklist.html:78
msgid "Import" msgid "Import"
msgstr "Importér" msgstr "Importér"
#: bookwyrm/templates/import/import.html:101 #: bookwyrm/templates/import/import.html:103
msgid "You've reached the import limit."
msgstr ""
#: bookwyrm/templates/import/import.html:112
msgid "Imports are temporarily disabled; thank you for your patience." msgid "Imports are temporarily disabled; thank you for your patience."
msgstr "" msgstr ""
#: bookwyrm/templates/import/import.html:108 #: bookwyrm/templates/import/import.html:119
msgid "Recent Imports" msgid "Recent Imports"
msgstr "Nylig importer" msgstr "Nylig importer"
#: bookwyrm/templates/import/import.html:113 #: bookwyrm/templates/import/import.html:124
#: bookwyrm/templates/settings/imports/imports.html:89 #: bookwyrm/templates/settings/imports/imports.html:120
msgid "Date Created" msgid "Date Created"
msgstr "" msgstr ""
#: bookwyrm/templates/import/import.html:116 #: bookwyrm/templates/import/import.html:127
msgid "Last Updated" msgid "Last Updated"
msgstr "" msgstr ""
#: bookwyrm/templates/import/import.html:119 #: bookwyrm/templates/import/import.html:130
#: bookwyrm/templates/settings/imports/imports.html:98 #: bookwyrm/templates/settings/imports/imports.html:129
msgid "Items" msgid "Items"
msgstr "" msgstr ""
#: bookwyrm/templates/import/import.html:128 #: bookwyrm/templates/import/import.html:139
msgid "No recent imports" msgid "No recent imports"
msgstr "Ingen nylige importer" msgstr "Ingen nylige importer"
@ -2783,6 +2798,7 @@ msgid "Retry Status"
msgstr "Status for nytt forsøk" msgstr "Status for nytt forsøk"
#: bookwyrm/templates/import/import_status.html:22 #: bookwyrm/templates/import/import_status.html:22
#: bookwyrm/templates/settings/celery.html:36
#: bookwyrm/templates/settings/imports/imports.html:6 #: bookwyrm/templates/settings/imports/imports.html:6
#: bookwyrm/templates/settings/imports/imports.html:9 #: bookwyrm/templates/settings/imports/imports.html:9
#: bookwyrm/templates/settings/layout.html:82 #: bookwyrm/templates/settings/layout.html:82
@ -2802,7 +2818,7 @@ msgid "Refresh"
msgstr "Oppdater" msgstr "Oppdater"
#: bookwyrm/templates/import/import_status.html:72 #: bookwyrm/templates/import/import_status.html:72
#: bookwyrm/templates/settings/imports/imports.html:130 #: bookwyrm/templates/settings/imports/imports.html:161
msgid "Stop import" msgid "Stop import"
msgstr "" msgstr ""
@ -2920,7 +2936,7 @@ msgid "Reject"
msgstr "Avslå" msgstr "Avslå"
#: bookwyrm/templates/import/troubleshoot.html:7 #: bookwyrm/templates/import/troubleshoot.html:7
#: bookwyrm/templates/settings/imports/imports.html:107 #: bookwyrm/templates/settings/imports/imports.html:138
msgid "Failed items" msgid "Failed items"
msgstr "Mislykkede ting" msgstr "Mislykkede ting"
@ -3171,7 +3187,7 @@ msgid "Delete this list?"
msgstr "Slett denne lista?" msgstr "Slett denne lista?"
#: bookwyrm/templates/lists/edit_form.html:5 #: bookwyrm/templates/lists/edit_form.html:5
#: bookwyrm/templates/lists/layout.html:18 #: bookwyrm/templates/lists/layout.html:23
msgid "Edit List" msgid "Edit List"
msgstr "Redigér lista" msgstr "Redigér lista"
@ -4427,48 +4443,48 @@ msgstr ""
msgid "High priority" msgid "High priority"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/celery.html:40 #: bookwyrm/templates/settings/celery.html:46
msgid "Could not connect to Redis broker" msgid "Could not connect to Redis broker"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/celery.html:48 #: bookwyrm/templates/settings/celery.html:54
msgid "Active Tasks" msgid "Active Tasks"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/celery.html:53 #: bookwyrm/templates/settings/celery.html:59
#: bookwyrm/templates/settings/imports/imports.html:82 #: bookwyrm/templates/settings/imports/imports.html:113
msgid "ID" msgid "ID"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/celery.html:54 #: bookwyrm/templates/settings/celery.html:60
msgid "Task name" msgid "Task name"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/celery.html:55 #: bookwyrm/templates/settings/celery.html:61
msgid "Run time" msgid "Run time"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/celery.html:56 #: bookwyrm/templates/settings/celery.html:62
msgid "Priority" msgid "Priority"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/celery.html:61 #: bookwyrm/templates/settings/celery.html:67
msgid "No active tasks" msgid "No active tasks"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/celery.html:79 #: bookwyrm/templates/settings/celery.html:85
msgid "Workers" msgid "Workers"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/celery.html:84 #: bookwyrm/templates/settings/celery.html:90
msgid "Uptime:" msgid "Uptime:"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/celery.html:94 #: bookwyrm/templates/settings/celery.html:100
msgid "Could not connect to Celery" msgid "Could not connect to Celery"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/celery.html:101 #: bookwyrm/templates/settings/celery.html:107
msgid "Errors" msgid "Errors"
msgstr "" msgstr ""
@ -4848,27 +4864,55 @@ msgstr ""
msgid "Enable imports" msgid "Enable imports"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:71 #: bookwyrm/templates/settings/imports/imports.html:63
msgid "Limit the amount of imports"
msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:74
msgid "Some users might try to import a large number of books, which you want to limit."
msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:75
msgid "Set the value to 0 to not enforce any limit."
msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:78
msgid "Set import limit to"
msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:80
msgid "books every"
msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:82
msgid "days."
msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:86
msgid "Set limit"
msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:102
msgid "Completed" msgid "Completed"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:85 #: bookwyrm/templates/settings/imports/imports.html:116
msgid "User" msgid "User"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:94 #: bookwyrm/templates/settings/imports/imports.html:125
msgid "Date Updated" msgid "Date Updated"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:101 #: bookwyrm/templates/settings/imports/imports.html:132
msgid "Pending items" msgid "Pending items"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:104 #: bookwyrm/templates/settings/imports/imports.html:135
msgid "Successful items" msgid "Successful items"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:139 #: bookwyrm/templates/settings/imports/imports.html:170
msgid "No matching imports found." msgid "No matching imports found."
msgstr "" msgstr ""
@ -5129,34 +5173,38 @@ msgstr ""
msgid "Allow registration" msgid "Allow registration"
msgstr "Tillat registrering" msgstr "Tillat registrering"
#: bookwyrm/templates/settings/registration.html:44 #: bookwyrm/templates/settings/registration.html:43
msgid "Default access level:"
msgstr ""
#: bookwyrm/templates/settings/registration.html:61
msgid "Require users to confirm email address" msgid "Require users to confirm email address"
msgstr "Medlemmer må bekrefte e-postadresse" msgstr "Medlemmer må bekrefte e-postadresse"
#: bookwyrm/templates/settings/registration.html:46 #: bookwyrm/templates/settings/registration.html:63
msgid "(Recommended if registration is open)" msgid "(Recommended if registration is open)"
msgstr "(anbefales for åpen registrering)" msgstr "(anbefales for åpen registrering)"
#: bookwyrm/templates/settings/registration.html:51 #: bookwyrm/templates/settings/registration.html:68
msgid "Allow invite requests" msgid "Allow invite requests"
msgstr "Tillat invitasjonsforespørsler" msgstr "Tillat invitasjonsforespørsler"
#: bookwyrm/templates/settings/registration.html:55 #: bookwyrm/templates/settings/registration.html:72
#: bookwyrm/templates/settings/registration_limited.html:42 #: bookwyrm/templates/settings/registration_limited.html:42
msgid "Invite request text:" msgid "Invite request text:"
msgstr "Invitasjonsforespørsel tekst:" msgstr "Invitasjonsforespørsel tekst:"
#: bookwyrm/templates/settings/registration.html:63 #: bookwyrm/templates/settings/registration.html:80
#: bookwyrm/templates/settings/registration_limited.html:50 #: bookwyrm/templates/settings/registration_limited.html:50
msgid "Set a question for invite requests" msgid "Set a question for invite requests"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/registration.html:68 #: bookwyrm/templates/settings/registration.html:85
#: bookwyrm/templates/settings/registration_limited.html:55 #: bookwyrm/templates/settings/registration_limited.html:55
msgid "Question:" msgid "Question:"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/registration.html:73 #: bookwyrm/templates/settings/registration.html:90
#: bookwyrm/templates/settings/registration_limited.html:67 #: bookwyrm/templates/settings/registration_limited.html:67
msgid "Registration closed text:" msgid "Registration closed text:"
msgstr "Registrering lukket tekst:" msgstr "Registrering lukket tekst:"
@ -5398,7 +5446,7 @@ msgid "Remove theme"
msgstr "" msgstr ""
#: bookwyrm/templates/settings/users/delete_user_form.html:5 #: bookwyrm/templates/settings/users/delete_user_form.html:5
#: bookwyrm/templates/settings/users/user_moderation_actions.html:32 #: bookwyrm/templates/settings/users/user_moderation_actions.html:38
msgid "Permanently delete user" msgid "Permanently delete user"
msgstr "Slett medlem for godt" msgstr "Slett medlem for godt"
@ -5520,14 +5568,18 @@ msgid "User Actions"
msgstr "Brukerhandlinger" msgstr "Brukerhandlinger"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:21 #: bookwyrm/templates/settings/users/user_moderation_actions.html:21
msgid "Activate user"
msgstr ""
#: bookwyrm/templates/settings/users/user_moderation_actions.html:27
msgid "Suspend user" msgid "Suspend user"
msgstr "Deaktiver bruker" msgstr "Deaktiver bruker"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:26 #: bookwyrm/templates/settings/users/user_moderation_actions.html:32
msgid "Un-suspend user" msgid "Un-suspend user"
msgstr "Reaktivér bruker" msgstr "Reaktivér bruker"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:48 #: bookwyrm/templates/settings/users/user_moderation_actions.html:54
msgid "Access level:" msgid "Access level:"
msgstr "Tilgangsnivå:" msgstr "Tilgangsnivå:"
@ -6377,33 +6429,53 @@ msgstr "%(username)s følger ingen andre medlemmer"
msgid "No reviews or comments yet!" msgid "No reviews or comments yet!"
msgstr "" msgstr ""
#: bookwyrm/templates/user/user.html:16 #: bookwyrm/templates/user/user.html:20
msgid "Edit profile" msgid "Edit profile"
msgstr "Rediger profil" msgstr "Rediger profil"
#: bookwyrm/templates/user/user.html:38 #: bookwyrm/templates/user/user.html:42
#, python-format #, python-format
msgid "View all %(size)s" msgid "View all %(size)s"
msgstr "Vis alle %(size)s" msgstr "Vis alle %(size)s"
#: bookwyrm/templates/user/user.html:52 #: bookwyrm/templates/user/user.html:56
msgid "View all books" msgid "View all books"
msgstr "Se alle bøker" msgstr "Se alle bøker"
#: bookwyrm/templates/user/user.html:59 #: bookwyrm/templates/user/user.html:63
#, python-format #, python-format
msgid "%(current_year)s Reading Goal" msgid "%(current_year)s Reading Goal"
msgstr "%(current_year)s lesemål" msgstr "%(current_year)s lesemål"
#: bookwyrm/templates/user/user.html:66 #: bookwyrm/templates/user/user.html:70
msgid "User Activity" msgid "User Activity"
msgstr "Brukeraktivitet" msgstr "Brukeraktivitet"
#: bookwyrm/templates/user/user.html:71 #: bookwyrm/templates/user/user.html:76
msgid "Show RSS Options"
msgstr ""
#: bookwyrm/templates/user/user.html:82
msgid "RSS feed" msgid "RSS feed"
msgstr "RSS strøm" msgstr "RSS strøm"
#: bookwyrm/templates/user/user.html:83 #: bookwyrm/templates/user/user.html:98
msgid "Complete feed"
msgstr ""
#: bookwyrm/templates/user/user.html:103
msgid "Reviews only"
msgstr ""
#: bookwyrm/templates/user/user.html:108
msgid "Quotes only"
msgstr ""
#: bookwyrm/templates/user/user.html:113
msgid "Comments only"
msgstr ""
#: bookwyrm/templates/user/user.html:129
msgid "No activities yet!" msgid "No activities yet!"
msgstr "Ingen aktivitet enda!" msgstr "Ingen aktivitet enda!"
@ -6447,16 +6519,43 @@ msgstr "Logg ut"
msgid "File exceeds maximum size: 10MB" msgid "File exceeds maximum size: 10MB"
msgstr "Filen overskrider maksimal størrelse: 10MB" msgstr "Filen overskrider maksimal størrelse: 10MB"
#: bookwyrm/templatetags/list_page_tags.py:14
#, python-format
msgid "Book List: %(name)s"
msgstr ""
#: bookwyrm/templatetags/list_page_tags.py:22
#, python-format
msgid "%(num)d book - by %(user)s"
msgid_plural "%(num)d books - by %(user)s"
msgstr[0] ""
msgstr[1] ""
#: bookwyrm/templatetags/utilities.py:39 #: bookwyrm/templatetags/utilities.py:39
#, python-format #, python-format
msgid "%(title)s: %(subtitle)s" msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s: %(subtitle)s" msgstr "%(title)s: %(subtitle)s"
#: bookwyrm/views/rss_feed.py:34 #: bookwyrm/views/rss_feed.py:35
#, python-brace-format #, python-brace-format
msgid "Status updates from {obj.display_name}" msgid "Status updates from {obj.display_name}"
msgstr "Statusoppdateringer fra {obj.display_name}" msgstr "Statusoppdateringer fra {obj.display_name}"
#: bookwyrm/views/rss_feed.py:72
#, python-brace-format
msgid "Reviews from {obj.display_name}"
msgstr ""
#: bookwyrm/views/rss_feed.py:110
#, python-brace-format
msgid "Quotes from {obj.display_name}"
msgstr ""
#: bookwyrm/views/rss_feed.py:148
#, python-brace-format
msgid "Comments from {obj.display_name}"
msgstr ""
#: bookwyrm/views/updates.py:45 #: bookwyrm/views/updates.py:45
#, python-format #, python-format
msgid "Load %(count)d unread status" msgid "Load %(count)d unread status"

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show more