Merge branch 'main' into main

This commit is contained in:
Jascha Ezra Urbach 2023-03-21 05:49:52 +01:00 committed by GitHub
commit bbed08e182
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
114 changed files with 5114 additions and 2390 deletions

View file

@ -5,3 +5,4 @@ __pycache__
.git
.github
.pytest*
.env

View file

@ -82,6 +82,12 @@ AWS_SECRET_ACCESS_KEY=
# AWS_S3_REGION_NAME=None # "fr-par"
# AWS_S3_ENDPOINT_URL=None # "https://s3.fr-par.scw.cloud"
# Commented are example values if you use Azure Blob Storage
# USE_AZURE=true
# AZURE_ACCOUNT_NAME= # "example-account-name"
# AZURE_ACCOUNT_KEY= # "base64-encoded-access-key"
# AZURE_CONTAINER= # "example-blob-container-name"
# AZURE_CUSTOM_DOMAIN= # "example-account-name.blob.core.windows.net"
# Preview image generation can be computing and storage intensive
ENABLE_PREVIEW_IMAGES=False

View file

@ -3,7 +3,7 @@ import inspect
import sys
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 .image import Document, Image
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
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)
# only reject statuses if we're potentially creating them
@ -127,7 +145,10 @@ class ActivityObject:
for field in instance.simple_fields:
try:
changed = field.set_field_from_activity(
instance, self, overwrite=overwrite
instance,
self,
overwrite=overwrite,
allow_external_connections=allow_external_connections,
)
if changed:
update_fields.append(field.name)
@ -138,7 +159,11 @@ class ActivityObject:
# too early and jank up users
for field in instance.image_fields:
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:
update_fields.append(field.name)
@ -161,8 +186,12 @@ class ActivityObject:
# add many to many fields, which have to be set post-save
for field in instance.many_to_many_fields:
# mention books/users, for example
field.set_field_from_activity(instance, self)
# mention books/users/hashtags, for example
field.set_field_from_activity(
instance,
self,
allow_external_connections=allow_external_connections,
)
# reversed relationships in the models
for (
@ -212,7 +241,7 @@ class ActivityObject:
return data
@app.task(queue=MEDIUM)
@app.task(queue=MEDIUM, ignore_result=True)
@transaction.atomic
def set_related_field(
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]
# pylint: disable=too-many-arguments
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 isinstance(model, str):
model = apps.get_model(f"bookwyrm.{model}", require_ready=True)
@ -277,6 +318,13 @@ def resolve_remote_id(
if result and not refresh:
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
try:
data = get_data(remote_id)
@ -378,3 +426,10 @@ class Mention(Link):
"""a subtype of Link for mentioning an actor"""
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 """
from dataclasses import dataclass, field
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
@ -38,6 +41,47 @@ class Note(ActivityObject):
updated: str = None
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)
class Article(Note):

View file

@ -14,12 +14,12 @@ class Verb(ActivityObject):
actor: str
object: ActivityObject
def action(self):
def action(self, allow_external_connections=True):
"""usually we just want to update and save"""
# self.object may return None if the object is invalid in an expected way
# ie, Question type
if self.object:
self.object.to_model()
self.object.to_model(allow_external_connections=allow_external_connections)
# pylint: disable=invalid-name
@ -42,7 +42,7 @@ class Delete(Verb):
cc: List[str] = field(default_factory=lambda: [])
type: str = "Delete"
def action(self):
def action(self, allow_external_connections=True):
"""find and delete the activity object"""
if not self.object:
return
@ -52,7 +52,11 @@ class Delete(Verb):
model = apps.get_model("bookwyrm.User")
obj = model.find_existing_by_remote_id(self.object)
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:
obj.delete()
@ -67,11 +71,13 @@ class Update(Verb):
to: List[str]
type: str = "Update"
def action(self):
def action(self, allow_external_connections=True):
"""update a model instance from the dataclass"""
if not self.object:
return
self.object.to_model(allow_create=False)
self.object.to_model(
allow_create=False, allow_external_connections=allow_external_connections
)
@dataclass(init=False)
@ -80,7 +86,7 @@ class Undo(Verb):
type: str = "Undo"
def action(self):
def action(self, allow_external_connections=True):
"""find and remove the activity object"""
if isinstance(self.object, str):
# it may be that something should be done with these, but idk what
@ -92,13 +98,28 @@ class Undo(Verb):
model = None
if self.object.type == "Follow":
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:
# this could be a follow request not a follow proper
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:
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 we don't have the object, we can't undo it. happens a lot with boosts
return
@ -112,9 +133,9 @@ class Follow(Verb):
object: str
type: str = "Follow"
def action(self):
def action(self, allow_external_connections=True):
"""relationship save"""
self.to_model()
self.to_model(allow_external_connections=allow_external_connections)
@dataclass(init=False)
@ -124,9 +145,9 @@ class Block(Verb):
object: str
type: str = "Block"
def action(self):
def action(self, allow_external_connections=True):
"""relationship save"""
self.to_model()
self.to_model(allow_external_connections=allow_external_connections)
@dataclass(init=False)
@ -136,7 +157,7 @@ class Accept(Verb):
object: Follow
type: str = "Accept"
def action(self):
def action(self, allow_external_connections=True):
"""accept a request"""
obj = self.object.to_model(save=False, allow_create=True)
obj.accept()
@ -149,7 +170,7 @@ class Reject(Verb):
object: Follow
type: str = "Reject"
def action(self):
def action(self, allow_external_connections=True):
"""reject a follow request"""
obj = self.object.to_model(save=False, allow_create=False)
obj.reject()
@ -163,7 +184,7 @@ class Add(Verb):
object: CollectionItem
type: str = "Add"
def action(self):
def action(self, allow_external_connections=True):
"""figure out the target to assign the item to a collection"""
target = resolve_remote_id(self.target)
item = self.object.to_model(save=False)
@ -177,7 +198,7 @@ class Remove(Add):
type: str = "Remove"
def action(self):
def action(self, allow_external_connections=True):
"""find and remove the activity object"""
obj = self.object.to_model(save=False, allow_create=False)
if obj:
@ -191,9 +212,9 @@ class Like(Verb):
object: str
type: str = "Like"
def action(self):
def action(self, allow_external_connections=True):
"""like"""
self.to_model()
self.to_model(allow_external_connections=allow_external_connections)
# pylint: disable=invalid-name
@ -207,6 +228,6 @@ class Announce(Verb):
object: str
type: str = "Announce"
def action(self):
def action(self, allow_external_connections=True):
"""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):
"""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"""
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"""
stream_id = self.stream_id(user)
stream_id = self.stream_id(user_id)
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"""
stream_id = self.stream_id(user)
stream_id = self.stream_id(user_id)
return f"{stream_id}-unread-by-type"
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)
if increment_unread:
for user in self.get_audience(status):
for user_id in self.get_audience(status):
# 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
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!
@ -52,21 +52,21 @@ class ActivityStream(RedisStore):
"""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)
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):
"""remove a user's status from another user's feed"""
# remove all so that followers only statuses are removed
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):
"""load the statuses to be displayed"""
# clear unreads for this feed
r.set(self.unread_id(user), 0)
r.delete(self.unread_by_status_type_id(user))
r.set(self.unread_id(user.id), 0)
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 (
models.Status.objects.select_subclasses()
.filter(id__in=statuses)
@ -83,11 +83,11 @@ class ActivityStream(RedisStore):
def get_unread_count(self, user):
"""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):
"""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 {
str(key.decode("utf-8")): int(value) or 0
for key, value in status_types.items()
@ -95,9 +95,9 @@ class ActivityStream(RedisStore):
def populate_streams(self, user):
"""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"""
# direct messages don't appeard in feeds, direct comments/reviews/etc do
if status.privacy == "direct" and status.status_type == "Note":
@ -136,8 +136,12 @@ class ActivityStream(RedisStore):
)
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):
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
"""given a user, what statuses should they see on this stream"""
@ -157,13 +161,14 @@ class HomeStream(ActivityStream):
key = "home"
def get_audience(self, status):
audience = super().get_audience(status)
audience = super()._get_audience(status)
if not audience:
return []
return audience.filter(
Q(id=status.user.id) # if the user is the post's author
| Q(following=status.user) # if the user is following the author
).distinct()
# if the user is the post's author
ids_self = [user.id for user in audience.filter(Q(id=status.user.id))]
# if the user is following the author
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):
return models.Status.privacy_filter(
@ -183,11 +188,11 @@ class LocalStream(ActivityStream):
key = "local"
def get_audience(self, status):
def _get_audience(self, status):
# this stream wants no part in non-public statuses
if status.privacy != "public" or not status.user.local:
return []
return super().get_audience(status)
return super()._get_audience(status)
def get_statuses_for_user(self, user):
# all public statuses by a local user
@ -202,7 +207,7 @@ class BooksStream(ActivityStream):
key = "books"
def get_audience(self, status):
def _get_audience(self, status):
"""anyone with the mentioned book on their shelves"""
# only show public statuses on the books feed,
# and only statuses that mention books
@ -217,7 +222,7 @@ class BooksStream(ActivityStream):
else status.mention_books.first().parent_work
)
audience = super().get_audience(status)
audience = super()._get_audience(status)
if not audience:
return []
return audience.filter(shelfbook__book__parent_work=work).distinct()
@ -244,38 +249,38 @@ class BooksStream(ActivityStream):
def add_book_statuses(self, user, book):
"""add statuses about a book to a user's feed"""
work = book.parent_work
statuses = (
models.Status.privacy_filter(
user,
privacy_levels=["public"],
)
.filter(
Q(comment__book__parent_work=work)
| Q(quotation__book__parent_work=work)
| Q(review__book__parent_work=work)
| Q(mention_books__parent_work=work)
)
.distinct()
statuses = models.Status.privacy_filter(
user,
privacy_levels=["public"],
)
self.bulk_add_objects_to_store(statuses, self.stream_id(user))
book_comments = statuses.filter(Q(comment__book__parent_work=work))
book_quotations = statuses.filter(Q(quotation__book__parent_work=work))
book_reviews = statuses.filter(Q(review__book__parent_work=work))
book_mentions = statuses.filter(Q(mention_books__parent_work=work))
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(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):
"""add statuses about a book to a user's feed"""
work = book.parent_work
statuses = (
models.Status.privacy_filter(
user,
privacy_levels=["public"],
)
.filter(
Q(comment__book__parent_work=work)
| Q(quotation__book__parent_work=work)
| Q(review__book__parent_work=work)
| Q(mention_books__parent_work=work)
)
.distinct()
statuses = models.Status.privacy_filter(
user,
privacy_levels=["public"],
)
self.bulk_remove_objects_from_store(statuses, self.stream_id(user))
book_comments = statuses.filter(Q(comment__book__parent_work=work))
book_quotations = statuses.filter(Q(quotation__book__parent_work=work))
book_reviews = statuses.filter(Q(review__book__parent_work=work))
book_mentions = statuses.filter(Q(mention_books__parent_work=work))
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(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
@ -466,7 +471,7 @@ def remove_statuses_on_unshelve(sender, instance, *args, **kwargs):
# ---- TASKS
@app.task(queue=LOW)
@app.task(queue=LOW, ignore_result=True)
def add_book_statuses_task(user_id, book_id):
"""add statuses related to a book on shelve"""
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)
@app.task(queue=LOW)
@app.task(queue=LOW, ignore_result=True)
def remove_book_statuses_task(user_id, book_id):
"""remove statuses about a book from a user's books feed"""
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)
@app.task(queue=MEDIUM)
@app.task(queue=MEDIUM, ignore_result=True)
def populate_stream_task(stream, user_id):
"""background task for populating an empty activitystream"""
user = models.User.objects.get(id=user_id)
@ -490,7 +495,7 @@ def populate_stream_task(stream, user_id):
stream.populate_streams(user)
@app.task(queue=MEDIUM)
@app.task(queue=MEDIUM, ignore_result=True)
def remove_status_task(status_ids):
"""remove a status from any stream it might be in"""
# 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)
@app.task(queue=HIGH)
@app.task(queue=HIGH, ignore_result=True)
def add_status_task(status_id, increment_unread=False):
"""add a status to any stream it should be in"""
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)
@app.task(queue=MEDIUM)
@app.task(queue=MEDIUM, ignore_result=True)
def remove_user_statuses_task(viewer_id, user_id, stream_list=None):
"""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()
@ -525,7 +530,7 @@ def remove_user_statuses_task(viewer_id, user_id, stream_list=None):
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):
"""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()
@ -535,7 +540,7 @@ def add_user_statuses_task(viewer_id, user_id, stream_list=None):
stream.add_user_statuses(viewer, user)
@app.task(queue=MEDIUM)
@app.task(queue=MEDIUM, ignore_result=True)
def handle_boost_task(boost_id):
"""remove the original post and other, earlier boosts"""
instance = models.Status.objects.get(id=boost_id)

View file

@ -35,7 +35,7 @@ class BookwyrmConfig(AppConfig):
# pylint: disable=no-self-use
def ready(self):
"""set up OTLP and preview image files, if desired"""
if settings.OTEL_EXPORTER_OTLP_ENDPOINT:
if settings.OTEL_EXPORTER_OTLP_ENDPOINT or settings.OTEL_EXPORTER_CONSOLE:
# pylint: disable=import-outside-toplevel
from bookwyrm.telemetry import open_telemetry

View file

@ -143,7 +143,7 @@ def get_or_create_connector(remote_id):
return load_connector(connector_info)
@app.task(queue=LOW)
@app.task(queue=LOW, ignore_result=True)
def load_more_data(connector_id, book_id):
"""background the work of getting all 10,000 editions of LoTR"""
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)
@app.task(queue=LOW)
@app.task(queue=LOW, ignore_result=True)
def create_edition_task(connector_id, work_id, data):
"""separate task for each of the 10,000 editions of LoTR"""
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)
@app.task(queue=HIGH)
@app.task(queue=HIGH, ignore_result=True)
def send_email(recipient, subject, html_content, text_content):
"""use a task to send the email"""
email = EmailMultiAlternatives(

View file

@ -217,14 +217,14 @@ def add_list_on_account_create_command(user_id):
# ---- TASKS
@app.task(queue=MEDIUM)
@app.task(queue=MEDIUM, ignore_result=True)
def populate_lists_task(user_id):
"""background task for populating an empty list stream"""
user = models.User.objects.get(id=user_id)
ListsStream().populate_lists(user)
@app.task(queue=MEDIUM)
@app.task(queue=MEDIUM, ignore_result=True)
def remove_list_task(list_id, re_add=False):
"""remove a list from any stream it might be in"""
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)
@app.task(queue=HIGH)
@app.task(queue=HIGH, ignore_result=True)
def add_list_task(list_id):
"""add a list to any stream it should be in"""
book_list = models.List.objects.get(id=list_id)
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):
"""remove all lists by a user from a viewer's stream"""
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)
@app.task(queue=MEDIUM)
@app.task(queue=MEDIUM, ignore_result=True)
def add_user_lists_task(viewer_id, user_id):
"""add all lists by a user to a viewer's stream"""
viewer = models.User.objects.get(id=viewer_id)

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 .hashtag import Hashtag
cls_members = inspect.getmembers(sys.modules[__name__], inspect.isclass)
activity_models = {
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
@app.task(queue=BROADCAST)
@app.task(queue=BROADCAST, ignore_result=True)
def broadcast_task(sender_id: int, activity: str, recipients: List[str]):
"""the celery task for broadcast"""
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)
@app.task(queue=LOW)
@app.task(queue=LOW, ignore_result=True)
def automod_task():
"""Create reports"""
if not AutoMod.objects.exists():

View file

@ -7,6 +7,7 @@ from urllib.parse import urljoin
import dateutil.parser
from dateutil.parser import ParserError
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.db import models
from django.forms import ClearableFileInput, ImageField as DjangoImageField
@ -67,7 +68,9 @@ class ActivitypubFieldMixin:
self.activitypub_field = activitypub_field
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"""
try:
value = getattr(data, self.get_activitypub_field())
@ -76,7 +79,9 @@ class ActivitypubFieldMixin:
if self.get_activitypub_field() != "attributedTo":
raise
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 == {}:
return False
@ -116,7 +121,8 @@ class ActivitypubFieldMixin:
return {self.activitypub_wrapper: 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"""
if value and hasattr(self, "activitypub_wrapper"):
value = value.get(self.activitypub_wrapper)
@ -138,7 +144,7 @@ class ActivitypubRelatedFieldMixin(ActivitypubFieldMixin):
self.load_remote = load_remote
super().__init__(*args, **kwargs)
def field_from_activity(self, value):
def field_from_activity(self, value, allow_external_connections=True):
if not value:
return None
@ -159,7 +165,11 @@ class ActivitypubRelatedFieldMixin(ActivitypubFieldMixin):
if not self.load_remote:
# only look in the local database
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):
@ -219,7 +229,9 @@ class PrivacyField(ActivitypubFieldMixin, models.CharField):
super().__init__(*args, max_length=255, choices=PrivacyLevels, default="public")
# 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:
return False
@ -234,7 +246,11 @@ class PrivacyField(ActivitypubFieldMixin, models.CharField):
break
if not user_field:
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]:
setattr(instance, self.name, "public")
@ -295,13 +311,17 @@ class ManyToManyField(ActivitypubFieldMixin, models.ManyToManyField):
self.link_only = link_only
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"""
if not overwrite and getattr(instance, self.name).exists():
return False
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:
return False
getattr(instance, self.name).set(formatted)
@ -313,7 +333,7 @@ class ManyToManyField(ActivitypubFieldMixin, models.ManyToManyField):
return f"{value.instance.remote_id}/{self.name}"
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:
return None
if not isinstance(value, list):
@ -326,7 +346,11 @@ class ManyToManyField(ActivitypubFieldMixin, models.ManyToManyField):
except ValidationError:
continue
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
@ -353,7 +377,7 @@ class TagField(ManyToManyField):
)
return tags
def field_from_activity(self, value):
def field_from_activity(self, value, allow_external_connections=True):
if not isinstance(value, list):
return None
items = []
@ -365,9 +389,22 @@ class TagField(ManyToManyField):
if tag_type != self.related_model.activity_serializer.type:
# tags can contain multiple types
continue
items.append(
activitypub.resolve_remote_id(link.href, model=self.related_model)
)
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(
activitypub.resolve_remote_id(
link.href,
model=self.related_model,
allow_external_connections=allow_external_connections,
)
)
return items
@ -390,11 +427,15 @@ class ImageField(ActivitypubFieldMixin, models.ImageField):
self.alt_field = alt_field
super().__init__(*args, **kwargs)
# pylint: disable=arguments-differ,arguments-renamed
def set_field_from_activity(self, instance, data, save=True, overwrite=True):
# pylint: disable=arguments-differ,arguments-renamed,too-many-arguments
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"""
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:
return False
@ -426,7 +467,7 @@ class ImageField(ActivitypubFieldMixin, models.ImageField):
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
# 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
@ -481,7 +522,7 @@ class DateTimeField(ActivitypubFieldMixin, models.DateTimeField):
return None
return value.isoformat()
def field_from_activity(self, value):
def field_from_activity(self, value, allow_external_connections=True):
try:
date_value = dateutil.parser.parse(value)
try:
@ -495,7 +536,7 @@ class DateTimeField(ActivitypubFieldMixin, models.DateTimeField):
class HtmlField(ActivitypubFieldMixin, models.TextField):
"""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:
return None
return clean(value)
@ -515,6 +556,10 @@ class CharField(ActivitypubFieldMixin, models.CharField):
"""activitypub-aware char field"""
class CICharField(ActivitypubFieldMixin, DjangoCICharField):
"""activitypub-aware cichar field"""
class URLField(ActivitypubFieldMixin, models.URLField):
"""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):
"""trigger the child tasks for each row"""
job = ImportJob.objects.get(id=job_id)
@ -346,7 +346,7 @@ def start_import_task(job_id):
job.save()
@app.task(queue=IMPORTS)
@app.task(queue=IMPORTS, ignore_result=True)
def import_item_task(item_id):
"""resolve a row into a book"""
item = ImportItem.objects.get(id=item_id)

View file

@ -2,8 +2,8 @@
from django.db import models, transaction
from django.dispatch import receiver
from .base_model import BookWyrmModel
from . import Boost, Favorite, GroupMemberInvitation, ImportJob, ListItem, Report
from . import Status, User, UserFollowRequest
from . import Boost, Favorite, GroupMemberInvitation, ImportJob, LinkDomain
from . import ListItem, Report, Status, User, UserFollowRequest
class Notification(BookWyrmModel):
@ -28,6 +28,7 @@ class Notification(BookWyrmModel):
# Admin
REPORT = "REPORT"
LINK_DOMAIN = "LINK_DOMAIN"
# Groups
INVITE = "INVITE"
@ -43,7 +44,7 @@ class Notification(BookWyrmModel):
NotificationType = models.TextChoices(
# there has got be a better way to do this
"NotificationType",
f"{FAVORITE} {REPLY} {MENTION} {TAG} {FOLLOW} {FOLLOW_REQUEST} {BOOST} {IMPORT} {ADD} {REPORT} {INVITE} {ACCEPT} {JOIN} {LEAVE} {REMOVE} {GROUP_PRIVACY} {GROUP_NAME} {GROUP_DESCRIPTION}",
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)
@ -64,6 +65,7 @@ class Notification(BookWyrmModel):
"ListItem", symmetrical=False, related_name="notifications"
)
related_reports = models.ManyToManyField("Report", symmetrical=False)
related_link_domains = models.ManyToManyField("LinkDomain", symmetrical=False)
@classmethod
@transaction.atomic
@ -241,6 +243,26 @@ def notify_admins_on_report(sender, instance, created, *args, **kwargs):
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)
# pylint: disable=unused-argument
def notify_user_on_group_invite(sender, instance, *args, **kwargs):

View file

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

View file

@ -34,6 +34,7 @@ class Status(OrderedCollectionPageMixin, BookWyrmModel):
raw_content = models.TextField(blank=True, null=True)
mention_users = fields.TagField("User", related_name="mention_user")
mention_books = fields.TagField("Edition", related_name="mention_book")
mention_hashtags = fields.TagField("Hashtag", related_name="mention_hashtag")
local = models.BooleanField(default=True)
content_warning = fields.CharField(
max_length=500, blank=True, null=True, activitypub_field="summary"

View file

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

View file

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

View file

@ -4,6 +4,7 @@ from environs import Env
import requests
from django.utils.translation import gettext_lazy as _
from django.core.exceptions import ImproperlyConfigured
# pylint: disable=line-too-long
@ -11,22 +12,22 @@ from django.utils.translation import gettext_lazy as _
env = Env()
env.read_env()
DOMAIN = env("DOMAIN")
VERSION = "0.5.5"
VERSION = "0.6.0"
RELEASE_API = env(
"RELEASE_API",
"https://api.github.com/repos/bookwyrm-social/bookwyrm/releases/latest",
)
PAGE_LENGTH = env("PAGE_LENGTH", 15)
PAGE_LENGTH = env.int("PAGE_LENGTH", 15)
DEFAULT_LANGUAGE = env("DEFAULT_LANGUAGE", "English")
JS_CACHE = "cd848b9a"
JS_CACHE = "a7d4e720"
# email
EMAIL_BACKEND = env("EMAIL_BACKEND", "django.core.mail.backends.smtp.EmailBackend")
EMAIL_HOST = env("EMAIL_HOST")
EMAIL_PORT = env("EMAIL_PORT", 587)
EMAIL_PORT = env.int("EMAIL_PORT", 587)
EMAIL_HOST_USER = env("EMAIL_HOST_USER")
EMAIL_HOST_PASSWORD = env("EMAIL_HOST_PASSWORD")
EMAIL_USE_TLS = env.bool("EMAIL_USE_TLS", True)
@ -68,13 +69,15 @@ FONT_DIR = os.path.join(STATIC_ROOT, "fonts")
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/3.2/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = env("SECRET_KEY")
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = env.bool("DEBUG", True)
USE_HTTPS = env.bool("USE_HTTPS", not DEBUG)
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = env("SECRET_KEY")
if not DEBUG and SECRET_KEY == "7(2w1sedok=aznpq)ta1mc4i%4h=xx@hxwx*o57ctsuml0x%fr":
raise ImproperlyConfigured("You must change the SECRET_KEY env variable")
ALLOWED_HOSTS = env.list("ALLOWED_HOSTS", ["*"])
# Application definition
@ -205,14 +208,14 @@ WSGI_APPLICATION = "bookwyrm.wsgi.application"
# redis/activity streams settings
REDIS_ACTIVITY_HOST = env("REDIS_ACTIVITY_HOST", "localhost")
REDIS_ACTIVITY_PORT = env("REDIS_ACTIVITY_PORT", 6379)
REDIS_ACTIVITY_PORT = env.int("REDIS_ACTIVITY_PORT", 6379)
REDIS_ACTIVITY_PASSWORD = requests.utils.quote(env("REDIS_ACTIVITY_PASSWORD", ""))
REDIS_ACTIVITY_DB_INDEX = env("REDIS_ACTIVITY_DB_INDEX", 0)
REDIS_ACTIVITY_DB_INDEX = env.int("REDIS_ACTIVITY_DB_INDEX", 0)
REDIS_ACTIVITY_URL = env(
"REDIS_ACTIVITY_URL",
f"redis://:{REDIS_ACTIVITY_PASSWORD}@{REDIS_ACTIVITY_HOST}:{REDIS_ACTIVITY_PORT}/{REDIS_ACTIVITY_DB_INDEX}",
)
MAX_STREAM_LENGTH = int(env("MAX_STREAM_LENGTH", 200))
MAX_STREAM_LENGTH = env.int("MAX_STREAM_LENGTH", 200)
STREAMS = [
{"key": "home", "name": _("Home Timeline"), "shortname": _("Home")},
@ -221,12 +224,12 @@ STREAMS = [
# Search configuration
# total time in seconds that the instance will spend searching connectors
SEARCH_TIMEOUT = int(env("SEARCH_TIMEOUT", 8))
SEARCH_TIMEOUT = env.int("SEARCH_TIMEOUT", 8)
# timeout for a query to an individual connector
QUERY_TIMEOUT = int(env("QUERY_TIMEOUT", 5))
QUERY_TIMEOUT = env.int("QUERY_TIMEOUT", 5)
# Redis cache backend
if env("USE_DUMMY_CACHE", False):
if env.bool("USE_DUMMY_CACHE", False):
CACHES = {
"default": {
"BACKEND": "django.core.cache.backends.dummy.DummyCache",
@ -256,7 +259,7 @@ DATABASES = {
"USER": env("POSTGRES_USER", "bookwyrm"),
"PASSWORD": env("POSTGRES_PASSWORD", "bookwyrm"),
"HOST": env("POSTGRES_HOST", ""),
"PORT": env("PGPORT", 5432),
"PORT": env.int("PGPORT", 5432),
},
}
@ -341,6 +344,7 @@ if USE_HTTPS:
CSRF_COOKIE_SECURE = True
USE_S3 = env.bool("USE_S3", False)
USE_AZURE = env.bool("USE_AZURE", False)
if USE_S3:
# AWS settings
@ -364,6 +368,27 @@ if USE_S3:
DEFAULT_FILE_STORAGE = "bookwyrm.storage_backends.ImagesStorage"
CSP_DEFAULT_SRC = ["'self'", AWS_S3_CUSTOM_DOMAIN] + CSP_ADDITIONAL_HOSTS
CSP_SCRIPT_SRC = ["'self'", AWS_S3_CUSTOM_DOMAIN] + CSP_ADDITIONAL_HOSTS
elif USE_AZURE:
AZURE_ACCOUNT_NAME = env("AZURE_ACCOUNT_NAME")
AZURE_ACCOUNT_KEY = env("AZURE_ACCOUNT_KEY")
AZURE_CONTAINER = env("AZURE_CONTAINER")
AZURE_CUSTOM_DOMAIN = env("AZURE_CUSTOM_DOMAIN")
# Azure Static settings
STATIC_LOCATION = "static"
STATIC_URL = (
f"{PROTOCOL}://{AZURE_CUSTOM_DOMAIN}/{AZURE_CONTAINER}/{STATIC_LOCATION}/"
)
STATICFILES_STORAGE = "bookwyrm.storage_backends.AzureStaticStorage"
# Azure Media settings
MEDIA_LOCATION = "images"
MEDIA_URL = (
f"{PROTOCOL}://{AZURE_CUSTOM_DOMAIN}/{AZURE_CONTAINER}/{MEDIA_LOCATION}/"
)
MEDIA_FULL_URL = MEDIA_URL
STATIC_FULL_URL = STATIC_URL
DEFAULT_FILE_STORAGE = "bookwyrm.storage_backends.AzureImagesStorage"
CSP_DEFAULT_SRC = ["'self'", AZURE_CUSTOM_DOMAIN] + CSP_ADDITIONAL_HOSTS
CSP_SCRIPT_SRC = ["'self'", AZURE_CUSTOM_DOMAIN] + CSP_ADDITIONAL_HOSTS
else:
STATIC_URL = "/static/"
MEDIA_URL = "/images/"
@ -377,6 +402,7 @@ CSP_INCLUDE_NONCE_IN = ["script-src"]
OTEL_EXPORTER_OTLP_ENDPOINT = env("OTEL_EXPORTER_OTLP_ENDPOINT", None)
OTEL_EXPORTER_OTLP_HEADERS = env("OTEL_EXPORTER_OTLP_HEADERS", None)
OTEL_SERVICE_NAME = env("OTEL_SERVICE_NAME", None)
OTEL_EXPORTER_CONSOLE = env.bool("OTEL_EXPORTER_CONSOLE", False)
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)

View file

@ -95,7 +95,6 @@ let BookWyrm = new (class {
/**
* 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 {int} delay - frequency for polling in ms
@ -104,16 +103,19 @@ let BookWyrm = new (class {
polling(counter, delay) {
const bookwyrm = this;
delay = delay || 10000;
delay += Math.random() * 1000;
delay = delay || 5 * 60 * 1000 + (Math.random() - 0.5) * 30 * 1000;
setTimeout(
function () {
fetch("/api/updates/" + counter.dataset.poll)
.then((response) => response.json())
.then((data) => bookwyrm.updateCountElement(counter, data));
bookwyrm.polling(counter, delay * 1.25);
.then((data) => {
bookwyrm.updateCountElement(counter, data);
bookwyrm.polling(counter);
})
.catch(() => {
bookwyrm.polling(counter, delay * 1.1);
});
},
delay,
counter

View file

@ -2,6 +2,7 @@
import os
from tempfile import SpooledTemporaryFile
from storages.backends.s3boto3 import S3Boto3Storage
from storages.backends.azure_storage import AzureStorage
class StaticStorage(S3Boto3Storage): # pylint: disable=abstract-method
@ -47,3 +48,16 @@ class ImagesStorage(S3Boto3Storage): # pylint: disable=abstract-method
# Upload the object which will auto close the
# content_autoclose instance
return super()._save(name, content_autoclose)
class AzureStaticStorage(AzureStorage): # pylint: disable=abstract-method
"""Storage class for Static contents"""
location = "static"
class AzureImagesStorage(AzureStorage): # pylint: disable=abstract-method
"""Storage class for Image files"""
location = "images"
overwrite_files = False

View file

@ -237,41 +237,41 @@ def domain_level_update(sender, instance, created, update_fields=None, **kwargs)
# ------------------- TASKS
@app.task(queue=LOW)
@app.task(queue=LOW, ignore_result=True)
def rerank_suggestions_task(user_id):
"""do the hard work in celery"""
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):
"""do the hard work in celery"""
user = models.User.objects.get(id=user_id)
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):
"""do the hard work in celery"""
user = models.User.objects.get(id=user_id)
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):
"""remove a specific user from a specific user's suggestions"""
suggested_user = models.User.objects.get(id=suggested_user_id)
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):
"""remove a bunch of users from recs"""
for user in models.User.objects.filter(federated_server__id=instance_id):
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):
"""remove a bunch of users from recs"""
for user in models.User.objects.filter(federated_server__id=instance_id):

View file

@ -1,10 +1,19 @@
from opentelemetry import trace
from opentelemetry.exporter.otlp.proto.grpc.trace_exporter import OTLPSpanExporter
from opentelemetry.sdk.trace import TracerProvider
from opentelemetry.sdk.trace.export import BatchSpanProcessor
from opentelemetry.sdk.trace.export import BatchSpanProcessor, ConsoleSpanExporter
from bookwyrm import settings
trace.set_tracer_provider(TracerProvider())
trace.get_tracer_provider().add_span_processor(BatchSpanProcessor(OTLPSpanExporter()))
if settings.OTEL_EXPORTER_CONSOLE:
trace.get_tracer_provider().add_span_processor(
BatchSpanProcessor(ConsoleSpanExporter())
)
else:
trace.get_tracer_provider().add_span_processor(
BatchSpanProcessor(OTLPSpanExporter())
)
def instrumentDjango():

View file

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

View file

@ -5,7 +5,7 @@
<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="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>
<button type="button" data-modal-close class="modal-close is-large" aria-label="{% trans 'Close' %}"></button>

View file

@ -37,6 +37,14 @@
{% endif %}
</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
class="block"
{% 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="padding: 1rem; overflow: auto;">
<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>
<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">
<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>
</a>
</header>

View file

@ -23,7 +23,7 @@
{% block panel %}{% endblock %}
{% 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 %}
</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 %}"
aria-hidden="true"
alt="{{ site.name }}"
loading="lazy"
decoding="async"
>
<h1 class="modal-card-title" id="get_started_header">
{% 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 %}
<div class="navbar-brand">
<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>
<form class="navbar-item column is-align-items-start pt-5" action="{% url 'search' %}">
<div class="field has-addons">

View file

@ -17,6 +17,8 @@
{% include 'notifications/items/add.html' %}
{% elif notification.notification_type == 'REPORT' %}
{% include 'notifications/items/report.html' %}
{% elif notification.notification_type == 'LINK_DOMAIN' %}
{% include 'notifications/items/link_domain.html' %}
{% elif notification.notification_type == 'INVITE' %}
{% include 'notifications/items/invite.html' %}
{% 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">
<div class="container">
<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>
</div>
</div>

View file

@ -13,6 +13,8 @@
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"
>
</span>
<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="column is-narrow is-hidden-mobile">
<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>
</div>
<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 %}"
{% if ariaHide %}aria-hidden="true"{% endif %}
alt="{{ user.alt_text }}"
loading="lazy"
decoding="async"
>

View file

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

View file

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

View file

@ -133,6 +133,8 @@
alt="{{ attachment.caption }}"
title="{{ attachment.caption }}"
{% endif %}
loading="lazy"
decoding="async"
>
</a>
</figure>

View file

@ -15,7 +15,7 @@
<div class="container">
<div class="navbar-brand">
<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>
</div>
</div>

View file

@ -15,7 +15,7 @@
<div class="container">
<div class="navbar-brand">
<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>
</div>
</div>

View file

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

View file

@ -87,7 +87,7 @@
{% trans "Back" %}
</span>
</summary>
<div class="dropdown-menu">
<ul
class="dropdown-content"
@ -130,7 +130,7 @@
</div>
{% 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>
{% endblock %}

View file

@ -183,12 +183,21 @@ class BaseActivity(TestCase):
"name": "gerald j. books",
"href": "http://book.com/book",
},
{
"type": "Hashtag",
"name": "#BookClub",
"href": "http://example.com/tags/BookClub",
},
],
)
update_data.to_model(model=models.Status, instance=status)
self.assertEqual(status.mention_users.first(), self.user)
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
def test_to_model_one_to_many(self, *_):
"""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, *_):
"""the abstract base class for stream objects"""
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",
)
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",
)
def test_unread_by_status_type_id(self, *_):
"""stream for status type"""
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",
)
@ -118,9 +118,9 @@ class Activitystreams(TestCase):
)
users = self.test_stream.get_audience(status)
# remote users don't have feeds
self.assertFalse(self.remote_user in users)
self.assertTrue(self.local_user in users)
self.assertTrue(self.another_user in users)
self.assertFalse(self.remote_user.id in users)
self.assertTrue(self.local_user.id in users)
self.assertTrue(self.another_user.id in users)
def test_abstractstream_get_audience_direct(self, *_):
"""get a list of users that should see a status"""
@ -141,9 +141,9 @@ class Activitystreams(TestCase):
)
status.mention_users.add(self.local_user)
users = self.test_stream.get_audience(status)
self.assertTrue(self.local_user in users)
self.assertFalse(self.another_user in users)
self.assertFalse(self.remote_user in users)
self.assertTrue(self.local_user.id in users)
self.assertFalse(self.another_user.id in users)
self.assertFalse(self.remote_user.id in users)
def test_abstractstream_get_audience_followers_remote_user(self, *_):
"""get a list of users that should see a status"""
@ -153,7 +153,7 @@ class Activitystreams(TestCase):
privacy="followers",
)
users = self.test_stream.get_audience(status)
self.assertFalse(users.exists())
self.assertEqual(users, [])
def test_abstractstream_get_audience_followers_self(self, *_):
"""get a list of users that should see a status"""
@ -164,9 +164,9 @@ class Activitystreams(TestCase):
book=self.book,
)
users = self.test_stream.get_audience(status)
self.assertTrue(self.local_user in users)
self.assertFalse(self.another_user in users)
self.assertFalse(self.remote_user in users)
self.assertTrue(self.local_user.id in users)
self.assertFalse(self.another_user.id in users)
self.assertFalse(self.remote_user.id in users)
def test_abstractstream_get_audience_followers_with_mention(self, *_):
"""get a list of users that should see a status"""
@ -179,9 +179,9 @@ class Activitystreams(TestCase):
status.mention_users.add(self.local_user)
users = self.test_stream.get_audience(status)
self.assertTrue(self.local_user in users)
self.assertFalse(self.another_user in users)
self.assertFalse(self.remote_user in users)
self.assertTrue(self.local_user.id in users)
self.assertFalse(self.another_user.id in users)
self.assertFalse(self.remote_user.id in users)
def test_abstractstream_get_audience_followers_with_relationship(self, *_):
"""get a list of users that should see a status"""
@ -193,6 +193,6 @@ class Activitystreams(TestCase):
book=self.book,
)
users = self.test_stream.get_audience(status)
self.assertFalse(self.local_user in users)
self.assertFalse(self.another_user in users)
self.assertFalse(self.remote_user in users)
self.assertFalse(self.local_user.id in users)
self.assertFalse(self.another_user.id in users)
self.assertFalse(self.remote_user.id in users)

View file

@ -1,4 +1,6 @@
""" testing activitystreams """
import itertools
from unittest.mock import patch
from django.test import TestCase
from bookwyrm import activitystreams, models
@ -69,12 +71,29 @@ class Activitystreams(TestCase):
shelf=self.local_user.shelf_set.first(),
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(
"bookwyrm.activitystreams.BooksStream.bulk_add_objects_to_store"
) 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)
args = redis_mock.call_args[0]
queryset = args[0]
self.assertEqual(queryset.count(), 1)
self.assertTrue(status in queryset)
self.assertEqual(args[1], f"{self.local_user.id}-books")
self.assertEqual(sum(map(lambda x: x[0].count(), redis_mock_counter.calls)), 1)
self.assertTrue(
status
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"
)
users = activitystreams.HomeStream().get_audience(status)
self.assertFalse(users.exists())
self.assertEqual(users, [])
def test_homestream_get_audience_with_mentions(self, *_):
"""get a list of users that should see a status"""
@ -53,8 +53,8 @@ class Activitystreams(TestCase):
)
status.mention_users.add(self.local_user)
users = activitystreams.HomeStream().get_audience(status)
self.assertFalse(self.local_user in users)
self.assertFalse(self.another_user in users)
self.assertFalse(self.local_user.id in users)
self.assertFalse(self.another_user.id in users)
def test_homestream_get_audience_with_relationship(self, *_):
"""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"
)
users = activitystreams.HomeStream().get_audience(status)
self.assertTrue(self.local_user in users)
self.assertFalse(self.another_user in users)
self.assertTrue(self.local_user.id 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"
)
users = activitystreams.LocalStream().get_audience(status)
self.assertTrue(self.local_user in users)
self.assertTrue(self.another_user in users)
self.assertTrue(self.local_user.id in users)
self.assertTrue(self.another_user.id in users)
def test_localstream_get_audience_unlisted(self, *_):
"""get a list of users that should see a status"""
@ -88,7 +88,7 @@ class Activitystreams(TestCase):
)
# yes book, yes audience
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, *_):
"""get a list of users that should see a status"""
@ -102,7 +102,7 @@ class Activitystreams(TestCase):
)
# yes book, yes audience
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, *_):
"""get a list of users that should see a status"""
@ -119,7 +119,7 @@ class Activitystreams(TestCase):
)
# yes book, yes audience
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, *_):
"""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.assertTrue(
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"],
)
)

View file

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

View file

@ -1,7 +1,7 @@
""" test for app action functionality """
from unittest.mock import patch
from django.http import StreamingHttpResponse
from django.http import HttpResponse
from django.test import TestCase
from django.test.client import RequestFactory
@ -57,13 +57,12 @@ class ExportViews(TestCase):
request = self.factory.post("")
request.user = self.local_user
export = views.Export.as_view()(request)
self.assertIsInstance(export, StreamingHttpResponse)
self.assertIsInstance(export, HttpResponse)
self.assertEqual(export.status_code, 200)
result = list(export.streaming_content)
# pylint: disable=line-too-long
self.assertEqual(
result[0],
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",
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\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

@ -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 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.tests.validate_html import validate_html
@ -95,6 +95,7 @@ class StatusViews(TestCase):
local=True,
localname="nutria",
)
self.existing_hashtag = models.Hashtag.objects.create(name="#existing")
with patch("bookwyrm.models.user.set_remote_server"):
self.remote_user = models.User.objects.create_user(
"rat",
@ -333,6 +334,71 @@ class StatusViews(TestCase):
result = find_mentions(self.local_user, "@beep@beep.com")
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, *_):
"""find and format urls into a tags"""
url = "http://www.fish.com/"

View file

@ -356,6 +356,15 @@ urlpatterns = [
name="notifications",
),
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
re_path(
r"^get-started/profile/?$",
@ -764,3 +773,6 @@ urlpatterns = [
),
path("guided-tour/<tour>", views.toggle_guided_tour),
] + 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)"
FULL_USERNAME = rf"{LOCALNAME}@{DOMAIN}\b"
SLUG = r"/s/(?P<slug>[-_a-z0-9]*)"
HASHTAG = r"(#[^!@#$%^&*(),.?\":{}|<>\s]+)"
# should match (BookWyrm/1.0.0; or (BookWyrm/99.1.2;
BOOKWYRM_USER_AGENT = r"\(BookWyrm/[0-9]+\.[0-9]+\.[0-9]+;"

View file

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

View file

@ -130,6 +130,7 @@ from .group import (
accept_membership,
reject_membership,
)
from .hashtag import Hashtag
from .inbox import Inbox
from .interaction import Favorite, Unfavorite, Boost, Unboost
from .isbn import Isbn
@ -164,3 +165,4 @@ from .annual_summary import (
summary_add_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.connectors.abstract_connector import get_data
from bookwyrm.connectors.connector_manager import ConnectorException
from bookwyrm.utils import regex
@ -61,6 +60,7 @@ class Dashboard(View):
)
# check version
try:
release = get_data(settings.RELEASE_API, timeout=3)
available_version = release.get("tag_name", None)
@ -69,7 +69,7 @@ class Dashboard(View):
):
data["current_version"] = settings.VERSION
data["available_version"] = available_version
except ConnectorException:
except: # pylint: disable= bare-except
pass
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"]
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()
@ -102,7 +102,20 @@ def raise_is_blocked_activity(activity_json):
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):
"""do something with this json we think is legit"""
# lets see if the activitypub module can make sense of this json

View file

@ -1,9 +1,10 @@
""" Let users export their book data """
import csv
import io
from django.contrib.auth.decorators import login_required
from django.db.models import Q
from django.http import StreamingHttpResponse
from django.http import HttpResponse
from django.template.response import TemplateResponse
from django.views import View
from django.utils.decorators import method_decorator
@ -20,76 +21,66 @@ class Export(View):
return TemplateResponse(request, "preferences/export.html")
def post(self, request):
"""Streaming the csv file of a user's book data"""
data = (
models.Edition.viewer_aware_objects(request.user)
.filter(
Q(shelves__user=request.user)
| Q(readthrough__user=request.user)
| Q(review__user=request.user)
| Q(comment__user=request.user)
| Q(quotation__user=request.user)
)
.distinct()
"""Download the csv file of a user's book data"""
books = models.Edition.viewer_aware_objects(request.user)
books_shelves = books.filter(Q(shelves__user=request.user)).distinct()
books_readthrough = books.filter(Q(readthrough__user=request.user)).distinct()
books_review = books.filter(Q(review__user=request.user)).distinct()
books_comment = books.filter(Q(comment__user=request.user)).distinct()
books_quotation = books.filter(Q(quotation__user=request.user)).distinct()
books = set(
list(books_shelves)
+ list(books_readthrough)
+ list(books_review)
+ list(books_comment)
+ list(books_quotation)
)
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),
deduplication_fields = [
f.name
for f in models.Edition._meta.get_fields() # pylint: disable=protected-access
if getattr(f, "deduplication_field", False)
]
fields = (
["title", "author_text"]
+ deduplication_fields
+ ["rating", "review_name", "review_cw", "review_content"]
)
writer.writerow(fields)
for book in books:
# I think this is more efficient than doing a subquery in the view? but idk
review_rating = (
models.Review.objects.filter(
user=request.user, book=book, rating__isnull=False
)
.order_by("-published_date")
.first()
)
book.rating = review_rating.rating if review_rating else None
review = (
models.Review.objects.filter(
user=request.user, book=book, content__isnull=False
)
.order_by("-published_date")
.first()
)
if review:
book.review_name = review.name
book.review_cw = review.content_warning
book.review_content = review.raw_content
writer.writerow([getattr(book, field, "") or "" for field in fields])
return HttpResponse(
csv_string.getvalue(),
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 = [
f.name
for f in models.Edition._meta.get_fields() # pylint: disable=protected-access
if getattr(f, "deduplication_field", False)
]
fields = (
["title", "author_text"]
+ deduplication_fields
+ ["rating", "review_name", "review_cw", "review_content"]
)
yield fields
for book in books:
# I think this is more efficient than doing a subquery in the view? but idk
review_rating = (
models.Review.objects.filter(user=user, book=book, rating__isnull=False)
.order_by("-published_date")
.first()
)
book.rating = review_rating.rating if review_rating else None
review = (
models.Review.objects.filter(user=user, book=book, content__isnull=False)
.order_by("-published_date")
.first()
)
if review:
book.review_name = review.name
book.review_cw = review.content_warning
book.review_content = review.raw_content
yield [getattr(book, field, "") or "" for field in fields]
class Echo:
"""An object that implements just the write method of the file-like
interface. (https://docs.djangoproject.com/en/3.2/howto/outputting-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:
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
status.mention_users.set(set(status.mention_users.all()))
@ -237,6 +250,38 @@ def find_mentions(user, content):
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):
"""detect and format links"""
validator = URLValidator()

8
bw-dev
View file

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

View file

@ -7,7 +7,7 @@ class CelerywyrmConfig(AppConfig):
verbose_name = "BookWyrm Celery"
def ready(self):
if settings.OTEL_EXPORTER_OTLP_ENDPOINT:
if settings.OTEL_EXPORTER_OTLP_ENDPOINT or settings.OTEL_EXPORTER_CONSOLE:
from bookwyrm.telemetry import open_telemetry
open_telemetry.instrumentCelery()

View file

@ -6,8 +6,8 @@ from bookwyrm.settings import *
# pylint: disable=line-too-long
REDIS_BROKER_PASSWORD = requests.utils.quote(env("REDIS_BROKER_PASSWORD", ""))
REDIS_BROKER_HOST = env("REDIS_BROKER_HOST", "redis_broker")
REDIS_BROKER_PORT = env("REDIS_BROKER_PORT", 6379)
REDIS_BROKER_DB_INDEX = env("REDIS_BROKER_DB_INDEX", 0)
REDIS_BROKER_PORT = env.int("REDIS_BROKER_PORT", 6379)
REDIS_BROKER_DB_INDEX = env.int("REDIS_BROKER_DB_INDEX", 0)
REDIS_BROKER_URL = env(
"REDIS_BROKER_URL",
f"redis://:{REDIS_BROKER_PASSWORD}@{REDIS_BROKER_HOST}:{REDIS_BROKER_PORT}/{REDIS_BROKER_DB_INDEX}",
@ -26,7 +26,10 @@ CELERY_RESULT_SERIALIZER = "json"
CELERY_BEAT_SCHEDULER = "django_celery_beat.schedulers:DatabaseScheduler"
CELERY_TIMEZONE = env("TIME_ZONE", "UTC")
FLOWER_PORT = env("FLOWER_PORT")
CELERY_WORKER_CONCURRENCY = env("CELERY_WORKER_CONCURRENCY", None)
CELERY_TASK_SOFT_TIME_LIMIT = env("CELERY_TASK_SOFT_TIME_LIMIT", None)
FLOWER_PORT = env.int("FLOWER_PORT", 8888)
INSTALLED_APPS = INSTALLED_APPS + [
"celerywyrm",

View file

@ -6,7 +6,7 @@ After=network.target postgresql.service redis.service
User=bookwyrm
Group=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
StandardError=inherit

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-11 22:46+0000\n"
"PO-Revision-Date: 2023-01-13 10:51\n"
"POT-Creation-Date: 2023-01-30 08:21+0000\n"
"PO-Revision-Date: 2023-01-30 19:36\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Catalan\n"
"Language: ca\n"
@ -256,14 +256,14 @@ msgstr "Seguidors"
msgid "Private"
msgstr "Privat"
#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:157
#: bookwyrm/templates/settings/imports/imports.html:67
#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:168
#: bookwyrm/templates/settings/imports/imports.html:98
#: bookwyrm/templates/settings/users/user_admin.html:81
#: bookwyrm/templates/settings/users/user_info.html:28
msgid "Active"
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"
msgstr "Complet"
@ -316,19 +316,19 @@ msgstr "Citacions"
msgid "Everything else"
msgstr "Tota la resta"
#: bookwyrm/settings.py:214
#: bookwyrm/settings.py:217
msgid "Home Timeline"
msgstr "Línia de temps Inici"
#: bookwyrm/settings.py:214
#: bookwyrm/settings.py:217
msgid "Home"
msgstr "Inici"
#: bookwyrm/settings.py:215
#: bookwyrm/settings.py:218
msgid "Books Timeline"
msgstr "Cronologia dels llibres"
#: bookwyrm/settings.py:215
#: bookwyrm/settings.py:218
#: bookwyrm/templates/guided_tour/user_profile.html:101
#: bookwyrm/templates/search/layout.html:22
#: bookwyrm/templates/search/layout.html:43
@ -336,75 +336,75 @@ msgstr "Cronologia dels llibres"
msgid "Books"
msgstr "Llibres"
#: bookwyrm/settings.py:287
#: bookwyrm/settings.py:290
msgid "English"
msgstr "English (Anglès)"
#: bookwyrm/settings.py:288
#: bookwyrm/settings.py:291
msgid "Català (Catalan)"
msgstr "Català"
#: bookwyrm/settings.py:289
#: bookwyrm/settings.py:292
msgid "Deutsch (German)"
msgstr "Deutsch (Alemany)"
#: bookwyrm/settings.py:290
#: bookwyrm/settings.py:293
msgid "Español (Spanish)"
msgstr "Español (espanyol)"
#: bookwyrm/settings.py:291
#: bookwyrm/settings.py:294
msgid "Euskara (Basque)"
msgstr "Euskera (Basc)"
#: bookwyrm/settings.py:292
#: bookwyrm/settings.py:295
msgid "Galego (Galician)"
msgstr "Galego (gallec)"
#: bookwyrm/settings.py:293
#: bookwyrm/settings.py:296
msgid "Italiano (Italian)"
msgstr "Italiano (italià)"
#: bookwyrm/settings.py:294
#: bookwyrm/settings.py:297
msgid "Suomi (Finnish)"
msgstr "Suomi (finès)"
#: bookwyrm/settings.py:295
#: bookwyrm/settings.py:298
msgid "Français (French)"
msgstr "Français (francès)"
#: bookwyrm/settings.py:296
#: bookwyrm/settings.py:299
msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (Lituà)"
#: bookwyrm/settings.py:297
#: bookwyrm/settings.py:300
msgid "Norsk (Norwegian)"
msgstr "Norsk (noruec)"
#: bookwyrm/settings.py:298
#: bookwyrm/settings.py:301
msgid "Polski (Polish)"
msgstr "Polski (polonès)"
#: bookwyrm/settings.py:299
#: bookwyrm/settings.py:302
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português do Brasil (portuguès del Brasil)"
#: bookwyrm/settings.py:300
#: bookwyrm/settings.py:303
msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Portuguès europeu)"
#: bookwyrm/settings.py:301
#: bookwyrm/settings.py:304
msgid "Română (Romanian)"
msgstr "Română (romanès)"
#: bookwyrm/settings.py:302
#: bookwyrm/settings.py:305
msgid "Svenska (Swedish)"
msgstr "Svenska (suec)"
#: bookwyrm/settings.py:303
#: bookwyrm/settings.py:306
msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (xinès simplificat)"
#: bookwyrm/settings.py:304
#: bookwyrm/settings.py:307
msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (xinès tradicional)"
@ -847,10 +847,10 @@ msgstr "ISNI:"
#: bookwyrm/templates/settings/announcements/edit_announcement.html:120
#: bookwyrm/templates/settings/federation/edit_instance.html:98
#: bookwyrm/templates/settings/federation/instance.html:105
#: bookwyrm/templates/settings/registration.html:79
#: bookwyrm/templates/settings/registration.html:96
#: bookwyrm/templates/settings/registration_limited.html:76
#: bookwyrm/templates/settings/site.html:144
#: bookwyrm/templates/settings/users/user_moderation_actions.html:69
#: bookwyrm/templates/settings/users/user_moderation_actions.html:75
#: bookwyrm/templates/shelf/form.html:25
#: bookwyrm/templates/snippets/reading_modals/layout.html:18
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:112
#: 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"
msgstr "Enrere"
@ -1372,7 +1372,7 @@ msgid "Domain"
msgstr "Domini"
#: 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/settings/announcements/announcements.html:37
#: 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/settings/announcements/announcements.html:41
#: 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/themes.html:99
msgid "Actions"
@ -1905,13 +1905,13 @@ msgid "Add to your books"
msgstr "Afegir als vostres llibres"
#: 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
msgid "To Read"
msgstr "Pendent de llegir"
#: 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
msgid "Currently Reading"
msgstr "Lectures actuals"
@ -1921,12 +1921,12 @@ msgstr "Lectures actuals"
#: bookwyrm/templates/snippets/shelf_selector.html:46
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12
#: bookwyrm/templates/user/user.html:35 bookwyrm/templatetags/shelf_tags.py:52
#: bookwyrm/templates/user/user.html:39 bookwyrm/templatetags/shelf_tags.py:52
msgid "Read"
msgstr "Llegits"
#: 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"
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."
#: 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"
msgstr "Perfil de l'usuari"
@ -2689,85 +2689,100 @@ msgstr "Importa Llibres"
msgid "Not a valid CSV file"
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
msgid "On average, recent imports have taken %(hours)s hours."
msgstr "Les importacions recents han durat %(hours)s de mitjana."
#: bookwyrm/templates/import/import.html:26
#: bookwyrm/templates/import/import.html:32
#, python-format
msgid "On average, recent imports have taken %(minutes)s minutes."
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:"
msgstr "Font de la informació:"
#: bookwyrm/templates/import/import.html:47
#: bookwyrm/templates/import/import.html:53
msgid "Goodreads (CSV)"
msgstr "Goodreads (CSV)"
#: bookwyrm/templates/import/import.html:50
#: bookwyrm/templates/import/import.html:56
msgid "Storygraph (CSV)"
msgstr "Storygraph (CSV)"
#: bookwyrm/templates/import/import.html:53
#: bookwyrm/templates/import/import.html:59
msgid "LibraryThing (TSV)"
msgstr "LibraryThing (TSV)"
#: bookwyrm/templates/import/import.html:56
#: bookwyrm/templates/import/import.html:62
msgid "OpenLibrary (CSV)"
msgstr "OpenLibrary (CSV)"
#: bookwyrm/templates/import/import.html:59
#: bookwyrm/templates/import/import.html:65
msgid "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."
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:"
msgstr "Arxiu de dades:"
#: bookwyrm/templates/import/import.html:82
#: bookwyrm/templates/import/import.html:88
msgid "Include reviews"
msgstr "Inclou ressenyes"
#: bookwyrm/templates/import/import.html:87
#: bookwyrm/templates/import/import.html:93
msgid "Privacy setting for imported reviews:"
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/settings/federation/instance_blocklist.html:78
msgid "Import"
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."
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"
msgstr "Importacions recents"
#: bookwyrm/templates/import/import.html:113
#: bookwyrm/templates/settings/imports/imports.html:89
#: bookwyrm/templates/import/import.html:124
#: bookwyrm/templates/settings/imports/imports.html:120
msgid "Date Created"
msgstr "Data de creació"
#: bookwyrm/templates/import/import.html:116
#: bookwyrm/templates/import/import.html:127
msgid "Last Updated"
msgstr "Darrera actualització"
#: bookwyrm/templates/import/import.html:119
#: bookwyrm/templates/settings/imports/imports.html:98
#: bookwyrm/templates/import/import.html:130
#: bookwyrm/templates/settings/imports/imports.html:129
msgid "Items"
msgstr "Items"
#: bookwyrm/templates/import/import.html:128
#: bookwyrm/templates/import/import.html:139
msgid "No recent imports"
msgstr "No hi ha cap importació recent"
@ -2783,6 +2798,7 @@ msgid "Retry Status"
msgstr "Estat del reintent"
#: 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:9
#: bookwyrm/templates/settings/layout.html:82
@ -2802,7 +2818,7 @@ msgid "Refresh"
msgstr "Refresca"
#: bookwyrm/templates/import/import_status.html:72
#: bookwyrm/templates/settings/imports/imports.html:130
#: bookwyrm/templates/settings/imports/imports.html:161
msgid "Stop import"
msgstr "Atura la importació"
@ -2920,7 +2936,7 @@ msgid "Reject"
msgstr "Rebutja"
#: bookwyrm/templates/import/troubleshoot.html:7
#: bookwyrm/templates/settings/imports/imports.html:107
#: bookwyrm/templates/settings/imports/imports.html:138
msgid "Failed items"
msgstr "Elements fallits"
@ -3171,7 +3187,7 @@ msgid "Delete this list?"
msgstr "Suprimir aquesta llista?"
#: bookwyrm/templates/lists/edit_form.html:5
#: bookwyrm/templates/lists/layout.html:18
#: bookwyrm/templates/lists/layout.html:23
msgid "Edit List"
msgstr "Edita la llista"
@ -4429,48 +4445,48 @@ msgstr "Prioritat mitja"
msgid "High priority"
msgstr "Prioritat alta"
#: bookwyrm/templates/settings/celery.html:40
#: bookwyrm/templates/settings/celery.html:46
msgid "Could not connect to 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"
msgstr "Tasques actives"
#: bookwyrm/templates/settings/celery.html:53
#: bookwyrm/templates/settings/imports/imports.html:82
#: bookwyrm/templates/settings/celery.html:59
#: bookwyrm/templates/settings/imports/imports.html:113
msgid "ID"
msgstr "ID"
#: bookwyrm/templates/settings/celery.html:54
#: bookwyrm/templates/settings/celery.html:60
msgid "Task name"
msgstr "Nom de la tasca"
#: bookwyrm/templates/settings/celery.html:55
#: bookwyrm/templates/settings/celery.html:61
msgid "Run time"
msgstr "Temps d'execució"
#: bookwyrm/templates/settings/celery.html:56
#: bookwyrm/templates/settings/celery.html:62
msgid "Priority"
msgstr "Prioritat"
#: bookwyrm/templates/settings/celery.html:61
#: bookwyrm/templates/settings/celery.html:67
msgid "No active tasks"
msgstr "Cap tasca activa"
#: bookwyrm/templates/settings/celery.html:79
#: bookwyrm/templates/settings/celery.html:85
msgid "Workers"
msgstr "Workers"
#: bookwyrm/templates/settings/celery.html:84
#: bookwyrm/templates/settings/celery.html:90
msgid "Uptime:"
msgstr "Temps de funcionament:"
#: bookwyrm/templates/settings/celery.html:94
#: bookwyrm/templates/settings/celery.html:100
msgid "Could not connect to Celery"
msgstr "No s'ha pogut connectar al Celery"
#: bookwyrm/templates/settings/celery.html:101
#: bookwyrm/templates/settings/celery.html:107
msgid "Errors"
msgstr "Errors"
@ -4850,27 +4866,55 @@ msgstr "Els usuaris no poden iniciar noves importacions actualment"
msgid "Enable imports"
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"
msgstr "Completat"
#: bookwyrm/templates/settings/imports/imports.html:85
#: bookwyrm/templates/settings/imports/imports.html:116
msgid "User"
msgstr "Usuari"
#: bookwyrm/templates/settings/imports/imports.html:94
#: bookwyrm/templates/settings/imports/imports.html:125
msgid "Date Updated"
msgstr "Data actualització"
#: bookwyrm/templates/settings/imports/imports.html:101
#: bookwyrm/templates/settings/imports/imports.html:132
msgid "Pending items"
msgstr "Elements pendents"
#: bookwyrm/templates/settings/imports/imports.html:104
#: bookwyrm/templates/settings/imports/imports.html:135
msgid "Successful items"
msgstr "Ítems amb èxit"
#: bookwyrm/templates/settings/imports/imports.html:139
#: bookwyrm/templates/settings/imports/imports.html:170
msgid "No matching imports found."
msgstr "No s'han trobat importacions coincidents."
@ -5131,34 +5175,38 @@ msgstr "No s'ha pogut desar la configuració"
msgid "Allow registration"
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"
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)"
msgstr "(Recomanat si el registre està obert)"
#: bookwyrm/templates/settings/registration.html:51
#: bookwyrm/templates/settings/registration.html:68
msgid "Allow invite requests"
msgstr "Permet peticions d'invitació"
#: bookwyrm/templates/settings/registration.html:55
#: bookwyrm/templates/settings/registration.html:72
#: bookwyrm/templates/settings/registration_limited.html:42
msgid "Invite request text:"
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
msgid "Set a question for invite requests"
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
msgid "Question:"
msgstr "Pregunta:"
#: bookwyrm/templates/settings/registration.html:73
#: bookwyrm/templates/settings/registration.html:90
#: bookwyrm/templates/settings/registration_limited.html:67
msgid "Registration closed text:"
msgstr "Text de registre tancat:"
@ -5400,7 +5448,7 @@ msgid "Remove theme"
msgstr "Elimina el tema"
#: 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"
msgstr "Suprimeix l'usuari de manera permanent"
@ -5522,14 +5570,18 @@ msgid "User Actions"
msgstr "Accions d'usuari"
#: 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"
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"
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:"
msgstr "Nivell d'accés:"
@ -6379,33 +6431,53 @@ msgstr "%(username)s no està seguint a ningú"
msgid "No reviews or comments yet!"
msgstr "Sense ressenyes o comentaris actualment!"
#: bookwyrm/templates/user/user.html:16
#: bookwyrm/templates/user/user.html:20
msgid "Edit profile"
msgstr "Edita el perfil"
#: bookwyrm/templates/user/user.html:38
#: bookwyrm/templates/user/user.html:42
#, python-format
msgid "View all %(size)s"
msgstr "Mostra totes les %(size)s"
#: bookwyrm/templates/user/user.html:52
#: bookwyrm/templates/user/user.html:56
msgid "View all books"
msgstr "Mostra tots els llibres"
#: bookwyrm/templates/user/user.html:59
#: bookwyrm/templates/user/user.html:63
#, python-format
msgid "%(current_year)s Reading Goal"
msgstr "Objectiu de lectura del %(current_year)s"
#: bookwyrm/templates/user/user.html:66
#: bookwyrm/templates/user/user.html:70
msgid "User Activity"
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"
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!"
msgstr "Encara no hi ha activitats."
@ -6449,16 +6521,43 @@ msgstr "Desconnecta"
msgid "File exceeds maximum size: 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
#, python-format
msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s: %(subtitle)s"
#: bookwyrm/views/rss_feed.py:34
#: bookwyrm/views/rss_feed.py:35
#, python-brace-format
msgid "Status updates from {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
#, python-format
msgid "Load %(count)d unread status"

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-11 22:46+0000\n"
"PO-Revision-Date: 2023-01-14 17:13\n"
"POT-Creation-Date: 2023-01-30 08:21+0000\n"
"PO-Revision-Date: 2023-02-25 19:46\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: German\n"
"Language: de\n"
@ -256,14 +256,14 @@ msgstr "Follower*innen"
msgid "Private"
msgstr "Privat"
#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:157
#: bookwyrm/templates/settings/imports/imports.html:67
#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:168
#: bookwyrm/templates/settings/imports/imports.html:98
#: bookwyrm/templates/settings/users/user_admin.html:81
#: bookwyrm/templates/settings/users/user_info.html:28
msgid "Active"
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"
msgstr "Abgeschlossen"
@ -316,19 +316,19 @@ msgstr "Zitate"
msgid "Everything else"
msgstr "Alles andere"
#: bookwyrm/settings.py:214
#: bookwyrm/settings.py:217
msgid "Home Timeline"
msgstr "Start-Zeitleiste"
#: bookwyrm/settings.py:214
#: bookwyrm/settings.py:217
msgid "Home"
msgstr "Startseite"
#: bookwyrm/settings.py:215
#: bookwyrm/settings.py:218
msgid "Books Timeline"
msgstr "Bücher-Timeline"
#: bookwyrm/settings.py:215
#: bookwyrm/settings.py:218
#: bookwyrm/templates/guided_tour/user_profile.html:101
#: bookwyrm/templates/search/layout.html:22
#: bookwyrm/templates/search/layout.html:43
@ -336,75 +336,75 @@ msgstr "Bücher-Timeline"
msgid "Books"
msgstr "Bücher"
#: bookwyrm/settings.py:287
#: bookwyrm/settings.py:290
msgid "English"
msgstr "English (Englisch)"
#: bookwyrm/settings.py:288
#: bookwyrm/settings.py:291
msgid "Català (Catalan)"
msgstr "Català (Katalanisch)"
#: bookwyrm/settings.py:289
#: bookwyrm/settings.py:292
msgid "Deutsch (German)"
msgstr "Deutsch"
#: bookwyrm/settings.py:290
#: bookwyrm/settings.py:293
msgid "Español (Spanish)"
msgstr "Español (Spanisch)"
#: bookwyrm/settings.py:291
#: bookwyrm/settings.py:294
msgid "Euskara (Basque)"
msgstr "Euskara (Baskisch)"
#: bookwyrm/settings.py:292
#: bookwyrm/settings.py:295
msgid "Galego (Galician)"
msgstr "Galego (Galizisch)"
#: bookwyrm/settings.py:293
#: bookwyrm/settings.py:296
msgid "Italiano (Italian)"
msgstr "Italiano (Italienisch)"
#: bookwyrm/settings.py:294
#: bookwyrm/settings.py:297
msgid "Suomi (Finnish)"
msgstr "Suomi (Finnisch)"
#: bookwyrm/settings.py:295
#: bookwyrm/settings.py:298
msgid "Français (French)"
msgstr "Français (Französisch)"
#: bookwyrm/settings.py:296
#: bookwyrm/settings.py:299
msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (Litauisch)"
#: bookwyrm/settings.py:297
#: bookwyrm/settings.py:300
msgid "Norsk (Norwegian)"
msgstr "Norsk (Norwegisch)"
#: bookwyrm/settings.py:298
#: bookwyrm/settings.py:301
msgid "Polski (Polish)"
msgstr "Polski (Polnisch)"
#: bookwyrm/settings.py:299
#: bookwyrm/settings.py:302
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português do Brasil (brasilianisches Portugiesisch)"
#: bookwyrm/settings.py:300
#: bookwyrm/settings.py:303
msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Portugiesisch)"
#: bookwyrm/settings.py:301
#: bookwyrm/settings.py:304
msgid "Română (Romanian)"
msgstr "Română (Rumänisch)"
#: bookwyrm/settings.py:302
#: bookwyrm/settings.py:305
msgid "Svenska (Swedish)"
msgstr "Svenska (Schwedisch)"
#: bookwyrm/settings.py:303
#: bookwyrm/settings.py:306
msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (vereinfachtes Chinesisch)"
#: bookwyrm/settings.py:304
#: bookwyrm/settings.py:307
msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (Chinesisch, traditionell)"
@ -442,7 +442,7 @@ msgstr "Willkommen auf %(site_name)s!"
#: bookwyrm/templates/about/about.html:25
#, 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."
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
#, 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
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
msgid "Meet your admins"
@ -847,10 +847,10 @@ msgstr "ISNI:"
#: bookwyrm/templates/settings/announcements/edit_announcement.html:120
#: bookwyrm/templates/settings/federation/edit_instance.html:98
#: bookwyrm/templates/settings/federation/instance.html:105
#: bookwyrm/templates/settings/registration.html:79
#: bookwyrm/templates/settings/registration.html:96
#: bookwyrm/templates/settings/registration_limited.html:76
#: bookwyrm/templates/settings/site.html:144
#: bookwyrm/templates/settings/users/user_moderation_actions.html:69
#: bookwyrm/templates/settings/users/user_moderation_actions.html:75
#: bookwyrm/templates/shelf/form.html:25
#: bookwyrm/templates/snippets/reading_modals/layout.html:18
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:112
#: 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"
msgstr "Zurück"
@ -1348,7 +1348,7 @@ msgstr "Links bearbeiten"
#: bookwyrm/templates/book/file_links/edit_links.html:11
#, python-format
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/settings/link_domains/link_table.html:6
@ -1372,7 +1372,7 @@ msgid "Domain"
msgstr "Domain"
#: 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/settings/announcements/announcements.html:37
#: 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/settings/announcements/announcements.html:41
#: 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/themes.html:99
msgid "Actions"
@ -1394,7 +1394,7 @@ msgstr "Aktionen"
#: bookwyrm/templates/book/file_links/edit_links.html:48
#: bookwyrm/templates/settings/link_domains/link_table.html:21
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/verification_modal.html:22
@ -1468,7 +1468,7 @@ msgstr "Veröffentlicht von %(publisher)s."
#: bookwyrm/templates/book/rating.html:13
msgid "rated it"
msgstr "bewertet"
msgstr "bewertet es mit"
#: bookwyrm/templates/book/sync_modal.html:15
#, 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
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
msgid "Import your reading history"
@ -1905,13 +1905,13 @@ msgid "Add to your books"
msgstr "Zu deinen Büchern hinzufügen"
#: 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
msgid "To Read"
msgstr "Leseliste"
#: 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
msgid "Currently Reading"
msgstr "Liest gerade"
@ -1921,12 +1921,12 @@ msgstr "Liest gerade"
#: bookwyrm/templates/snippets/shelf_selector.html:46
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12
#: bookwyrm/templates/user/user.html:35 bookwyrm/templatetags/shelf_tags.py:52
#: bookwyrm/templates/user/user.html:39 bookwyrm/templatetags/shelf_tags.py:52
msgid "Read"
msgstr "Gelesen"
#: 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"
msgstr "Aufgehört zu lesen"
@ -2235,7 +2235,7 @@ msgstr "Weiter"
#: bookwyrm/templates/guided_tour/book.html:31
msgid "This is where you can set a reading status for this book. You can press the button to move to the next stage, or use the drop down button to select the reading status you want to set."
msgstr "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
msgid "Reading status"
@ -2243,7 +2243,7 @@ msgstr "Lesestatus"
#: 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."
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
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."
#: 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"
msgstr "Profil"
@ -2689,85 +2689,100 @@ msgstr "Bücher importieren"
msgid "Not a valid CSV file"
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
msgid "On average, recent imports have taken %(hours)s hours."
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
msgid "On average, recent imports have taken %(minutes)s minutes."
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:"
msgstr "Datenquelle:"
#: bookwyrm/templates/import/import.html:47
#: bookwyrm/templates/import/import.html:53
msgid "Goodreads (CSV)"
msgstr "Goodreads (CSV)"
#: bookwyrm/templates/import/import.html:50
#: bookwyrm/templates/import/import.html:56
msgid "Storygraph (CSV)"
msgstr "Storygraph (CSV)"
#: bookwyrm/templates/import/import.html:53
#: bookwyrm/templates/import/import.html:59
msgid "LibraryThing (TSV)"
msgstr "LibraryThing (TSV)"
#: bookwyrm/templates/import/import.html:56
#: bookwyrm/templates/import/import.html:62
msgid "OpenLibrary (CSV)"
msgstr "OpenLibrary (CSV)"
#: bookwyrm/templates/import/import.html:59
#: bookwyrm/templates/import/import.html:65
msgid "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."
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:"
msgstr "Datei:"
#: bookwyrm/templates/import/import.html:82
#: bookwyrm/templates/import/import.html:88
msgid "Include reviews"
msgstr "Besprechungen einschließen"
#: bookwyrm/templates/import/import.html:87
#: bookwyrm/templates/import/import.html:93
msgid "Privacy setting for imported reviews:"
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/settings/federation/instance_blocklist.html:78
msgid "Import"
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."
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"
msgstr "Zuletzt importiert"
#: bookwyrm/templates/import/import.html:113
#: bookwyrm/templates/settings/imports/imports.html:89
#: bookwyrm/templates/import/import.html:124
#: bookwyrm/templates/settings/imports/imports.html:120
msgid "Date Created"
msgstr "Erstellungsdatum"
#: bookwyrm/templates/import/import.html:116
#: bookwyrm/templates/import/import.html:127
msgid "Last Updated"
msgstr "Zuletzt aktualisiert"
#: bookwyrm/templates/import/import.html:119
#: bookwyrm/templates/settings/imports/imports.html:98
#: bookwyrm/templates/import/import.html:130
#: bookwyrm/templates/settings/imports/imports.html:129
msgid "Items"
msgstr "Einträge"
#: bookwyrm/templates/import/import.html:128
#: bookwyrm/templates/import/import.html:139
msgid "No recent imports"
msgstr "Keine aktuellen Importe"
@ -2783,6 +2798,7 @@ msgid "Retry Status"
msgstr "Wiederholungsstatus"
#: 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:9
#: bookwyrm/templates/settings/layout.html:82
@ -2802,7 +2818,7 @@ msgid "Refresh"
msgstr "Aktualisieren"
#: bookwyrm/templates/import/import_status.html:72
#: bookwyrm/templates/settings/imports/imports.html:130
#: bookwyrm/templates/settings/imports/imports.html:161
msgid "Stop import"
msgstr "Import stoppen"
@ -2920,7 +2936,7 @@ msgid "Reject"
msgstr "Ablehnen"
#: bookwyrm/templates/import/troubleshoot.html:7
#: bookwyrm/templates/settings/imports/imports.html:107
#: bookwyrm/templates/settings/imports/imports.html:138
msgid "Failed items"
msgstr "Fehlgeschlagene Elemente"
@ -3171,7 +3187,7 @@ msgid "Delete this list?"
msgstr "Diese Liste löschen?"
#: bookwyrm/templates/lists/edit_form.html:5
#: bookwyrm/templates/lists/layout.html:18
#: bookwyrm/templates/lists/layout.html:23
msgid "Edit List"
msgstr "Liste bearbeiten"
@ -4429,48 +4445,48 @@ msgstr "Mittlere Priorität"
msgid "High priority"
msgstr "Hohe Priorität"
#: bookwyrm/templates/settings/celery.html:40
#: bookwyrm/templates/settings/celery.html:46
msgid "Could not connect to Redis broker"
msgstr "Verbindung zum Redis Broker fehlgeschlagen"
#: bookwyrm/templates/settings/celery.html:48
#: bookwyrm/templates/settings/celery.html:54
msgid "Active Tasks"
msgstr "Aktive Aufgaben"
#: bookwyrm/templates/settings/celery.html:53
#: bookwyrm/templates/settings/imports/imports.html:82
#: bookwyrm/templates/settings/celery.html:59
#: bookwyrm/templates/settings/imports/imports.html:113
msgid "ID"
msgstr "ID"
#: bookwyrm/templates/settings/celery.html:54
#: bookwyrm/templates/settings/celery.html:60
msgid "Task name"
msgstr "Aufgabenname"
#: bookwyrm/templates/settings/celery.html:55
#: bookwyrm/templates/settings/celery.html:61
msgid "Run time"
msgstr "Dauer"
#: bookwyrm/templates/settings/celery.html:56
#: bookwyrm/templates/settings/celery.html:62
msgid "Priority"
msgstr "Priorität"
#: bookwyrm/templates/settings/celery.html:61
#: bookwyrm/templates/settings/celery.html:67
msgid "No active tasks"
msgstr "Keine aktiven Aufgaben"
#: bookwyrm/templates/settings/celery.html:79
#: bookwyrm/templates/settings/celery.html:85
msgid "Workers"
msgstr "Workers"
#: bookwyrm/templates/settings/celery.html:84
#: bookwyrm/templates/settings/celery.html:90
msgid "Uptime:"
msgstr "Betriebszeit:"
#: bookwyrm/templates/settings/celery.html:94
#: bookwyrm/templates/settings/celery.html:100
msgid "Could not connect to Celery"
msgstr "Verbindung zum Celery fehlgeschlagen."
#: bookwyrm/templates/settings/celery.html:101
#: bookwyrm/templates/settings/celery.html:107
msgid "Errors"
msgstr "Fehler"
@ -4850,27 +4866,55 @@ msgstr "Benutzer*innen können derzeit keine neuen Importe starten"
msgid "Enable imports"
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"
msgstr "Abgeschlossen"
#: bookwyrm/templates/settings/imports/imports.html:85
#: bookwyrm/templates/settings/imports/imports.html:116
msgid "User"
msgstr "Benutzer*in"
#: bookwyrm/templates/settings/imports/imports.html:94
#: bookwyrm/templates/settings/imports/imports.html:125
msgid "Date Updated"
msgstr "Aktualisierungsdatum"
#: bookwyrm/templates/settings/imports/imports.html:101
#: bookwyrm/templates/settings/imports/imports.html:132
msgid "Pending items"
msgstr "Ausstehende Einträge"
#: bookwyrm/templates/settings/imports/imports.html:104
#: bookwyrm/templates/settings/imports/imports.html:135
msgid "Successful items"
msgstr "Erfolgreiche Objekte"
#: bookwyrm/templates/settings/imports/imports.html:139
#: bookwyrm/templates/settings/imports/imports.html:170
msgid "No matching imports found."
msgstr "Keine passenden Importe gefunden."
@ -5131,34 +5175,38 @@ msgstr "Einstellungen konnten nicht gespeichert werden"
msgid "Allow registration"
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"
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)"
msgstr "(empfohlen, falls Selbstregistrierung zulässig ist)"
#: bookwyrm/templates/settings/registration.html:51
#: bookwyrm/templates/settings/registration.html:68
msgid "Allow invite requests"
msgstr "Einladungsanfragen zulassen"
#: bookwyrm/templates/settings/registration.html:55
#: bookwyrm/templates/settings/registration.html:72
#: bookwyrm/templates/settings/registration_limited.html:42
msgid "Invite request text:"
msgstr "Hinweis für Einladungsanfragen:"
#: bookwyrm/templates/settings/registration.html:63
#: bookwyrm/templates/settings/registration.html:80
#: bookwyrm/templates/settings/registration_limited.html:50
msgid "Set a question for invite requests"
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
msgid "Question:"
msgstr "Frage:"
#: bookwyrm/templates/settings/registration.html:73
#: bookwyrm/templates/settings/registration.html:90
#: bookwyrm/templates/settings/registration_limited.html:67
msgid "Registration closed text:"
msgstr "Hinweis, wenn Selbtregistrierung nicht erlaubt ist:"
@ -5400,7 +5448,7 @@ msgid "Remove theme"
msgstr "Design löschen"
#: 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"
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/username_filter.html:5
msgid "Username"
msgstr "Name"
msgstr "Anmeldename"
#: bookwyrm/templates/settings/users/user_admin.html:48
msgid "Date Added"
@ -5522,14 +5570,18 @@ msgid "User Actions"
msgstr "Benutzeraktionen"
#: 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"
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"
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:"
msgstr "Zugriffsstufe:"
@ -6379,33 +6431,53 @@ msgstr "%(username)s folgt niemandem"
msgid "No reviews or comments yet!"
msgstr "Noch keine Rezensionen oder Kommentare!"
#: bookwyrm/templates/user/user.html:16
#: bookwyrm/templates/user/user.html:20
msgid "Edit profile"
msgstr "Profil bearbeiten"
#: bookwyrm/templates/user/user.html:38
#: bookwyrm/templates/user/user.html:42
#, python-format
msgid "View all %(size)s"
msgstr "Alle %(size)s anzeigen"
#: bookwyrm/templates/user/user.html:52
#: bookwyrm/templates/user/user.html:56
msgid "View all books"
msgstr "Alle Bücher anzeigen"
#: bookwyrm/templates/user/user.html:59
#: bookwyrm/templates/user/user.html:63
#, python-format
msgid "%(current_year)s Reading Goal"
msgstr "Leseziel %(current_year)s"
#: bookwyrm/templates/user/user.html:66
#: bookwyrm/templates/user/user.html:70
msgid "User Activity"
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"
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!"
msgstr "Noch keine Aktivitäten!"
@ -6449,16 +6521,43 @@ msgstr "Abmelden"
msgid "File exceeds maximum size: 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
#, python-format
msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s: %(subtitle)s"
#: bookwyrm/views/rss_feed.py:34
#: bookwyrm/views/rss_feed.py:35
#, python-brace-format
msgid "Status updates from {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
#, python-format
msgid "Load %(count)d unread status"

View file

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

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-11 22:46+0000\n"
"PO-Revision-Date: 2023-01-15 12:10\n"
"POT-Creation-Date: 2023-01-30 08:21+0000\n"
"PO-Revision-Date: 2023-01-30 17:35\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Spanish\n"
"Language: es\n"
@ -256,14 +256,14 @@ msgstr "Seguidores"
msgid "Private"
msgstr "Privado"
#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:157
#: bookwyrm/templates/settings/imports/imports.html:67
#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:168
#: bookwyrm/templates/settings/imports/imports.html:98
#: bookwyrm/templates/settings/users/user_admin.html:81
#: bookwyrm/templates/settings/users/user_info.html:28
msgid "Active"
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"
msgstr "Completado"
@ -316,19 +316,19 @@ msgstr "Citas"
msgid "Everything else"
msgstr "Todo lo demás"
#: bookwyrm/settings.py:214
#: bookwyrm/settings.py:217
msgid "Home Timeline"
msgstr "Línea de tiempo principal"
#: bookwyrm/settings.py:214
#: bookwyrm/settings.py:217
msgid "Home"
msgstr "Inicio"
#: bookwyrm/settings.py:215
#: bookwyrm/settings.py:218
msgid "Books Timeline"
msgstr "Línea temporal de libros"
#: bookwyrm/settings.py:215
#: bookwyrm/settings.py:218
#: bookwyrm/templates/guided_tour/user_profile.html:101
#: bookwyrm/templates/search/layout.html:22
#: bookwyrm/templates/search/layout.html:43
@ -336,75 +336,75 @@ msgstr "Línea temporal de libros"
msgid "Books"
msgstr "Libros"
#: bookwyrm/settings.py:287
#: bookwyrm/settings.py:290
msgid "English"
msgstr "English (Inglés)"
#: bookwyrm/settings.py:288
#: bookwyrm/settings.py:291
msgid "Català (Catalan)"
msgstr "Català (Catalán)"
#: bookwyrm/settings.py:289
#: bookwyrm/settings.py:292
msgid "Deutsch (German)"
msgstr "Deutsch (Alemán)"
#: bookwyrm/settings.py:290
#: bookwyrm/settings.py:293
msgid "Español (Spanish)"
msgstr "Español"
#: bookwyrm/settings.py:291
#: bookwyrm/settings.py:294
msgid "Euskara (Basque)"
msgstr "Euskera"
#: bookwyrm/settings.py:292
#: bookwyrm/settings.py:295
msgid "Galego (Galician)"
msgstr "Galego (gallego)"
#: bookwyrm/settings.py:293
#: bookwyrm/settings.py:296
msgid "Italiano (Italian)"
msgstr "Italiano"
#: bookwyrm/settings.py:294
#: bookwyrm/settings.py:297
msgid "Suomi (Finnish)"
msgstr "Suomi (finés)"
#: bookwyrm/settings.py:295
#: bookwyrm/settings.py:298
msgid "Français (French)"
msgstr "Français (Francés)"
#: bookwyrm/settings.py:296
#: bookwyrm/settings.py:299
msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (Lituano)"
#: bookwyrm/settings.py:297
#: bookwyrm/settings.py:300
msgid "Norsk (Norwegian)"
msgstr "Norsk (noruego)"
#: bookwyrm/settings.py:298
#: bookwyrm/settings.py:301
msgid "Polski (Polish)"
msgstr "Polski (Polaco)"
#: bookwyrm/settings.py:299
#: bookwyrm/settings.py:302
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português do Brasil (portugués brasileño)"
#: bookwyrm/settings.py:300
#: bookwyrm/settings.py:303
msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Portugués europeo)"
#: bookwyrm/settings.py:301
#: bookwyrm/settings.py:304
msgid "Română (Romanian)"
msgstr "Română (rumano)"
#: bookwyrm/settings.py:302
#: bookwyrm/settings.py:305
msgid "Svenska (Swedish)"
msgstr "Svenska (Sueco)"
#: bookwyrm/settings.py:303
#: bookwyrm/settings.py:306
msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (Chino simplificado)"
#: bookwyrm/settings.py:304
#: bookwyrm/settings.py:307
msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (Chino tradicional)"
@ -847,10 +847,10 @@ msgstr "ISNI:"
#: bookwyrm/templates/settings/announcements/edit_announcement.html:120
#: bookwyrm/templates/settings/federation/edit_instance.html:98
#: bookwyrm/templates/settings/federation/instance.html:105
#: bookwyrm/templates/settings/registration.html:79
#: bookwyrm/templates/settings/registration.html:96
#: bookwyrm/templates/settings/registration_limited.html:76
#: bookwyrm/templates/settings/site.html:144
#: bookwyrm/templates/settings/users/user_moderation_actions.html:69
#: bookwyrm/templates/settings/users/user_moderation_actions.html:75
#: bookwyrm/templates/shelf/form.html:25
#: bookwyrm/templates/snippets/reading_modals/layout.html:18
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:112
#: 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"
msgstr "Volver"
@ -1372,7 +1372,7 @@ msgid "Domain"
msgstr "Dominio"
#: 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/settings/announcements/announcements.html:37
#: 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/settings/announcements/announcements.html:41
#: 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/themes.html:99
msgid "Actions"
@ -1905,13 +1905,13 @@ msgid "Add to your books"
msgstr "Añadir a tus libros"
#: 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
msgid "To Read"
msgstr "Para leer"
#: 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
msgid "Currently Reading"
msgstr "Leyendo actualmente"
@ -1921,12 +1921,12 @@ msgstr "Leyendo actualmente"
#: bookwyrm/templates/snippets/shelf_selector.html:46
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12
#: bookwyrm/templates/user/user.html:35 bookwyrm/templatetags/shelf_tags.py:52
#: bookwyrm/templates/user/user.html:39 bookwyrm/templatetags/shelf_tags.py:52
msgid "Read"
msgstr "Leído"
#: 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"
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)."
#: 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"
msgstr "Perfil de usuario"
@ -2689,85 +2689,100 @@ msgstr "Importar libros"
msgid "Not a valid CSV file"
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
msgid "On average, recent imports have taken %(hours)s hours."
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
msgid "On average, recent imports have taken %(minutes)s minutes."
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:"
msgstr "Fuente de datos:"
#: bookwyrm/templates/import/import.html:47
#: bookwyrm/templates/import/import.html:53
msgid "Goodreads (CSV)"
msgstr "Goodreads (CSV)"
#: bookwyrm/templates/import/import.html:50
#: bookwyrm/templates/import/import.html:56
msgid "Storygraph (CSV)"
msgstr "Storygraph (CSV)"
#: bookwyrm/templates/import/import.html:53
#: bookwyrm/templates/import/import.html:59
msgid "LibraryThing (TSV)"
msgstr "LibraryThing (TSV)"
#: bookwyrm/templates/import/import.html:56
#: bookwyrm/templates/import/import.html:62
msgid "OpenLibrary (CSV)"
msgstr "OpenLibrary (CSV)"
#: bookwyrm/templates/import/import.html:59
#: bookwyrm/templates/import/import.html:65
msgid "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."
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:"
msgstr "Archivo de datos:"
#: bookwyrm/templates/import/import.html:82
#: bookwyrm/templates/import/import.html:88
msgid "Include reviews"
msgstr "Incluir reseñas"
#: bookwyrm/templates/import/import.html:87
#: bookwyrm/templates/import/import.html:93
msgid "Privacy setting for imported reviews:"
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/settings/federation/instance_blocklist.html:78
msgid "Import"
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."
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"
msgstr "Importaciones recientes"
#: bookwyrm/templates/import/import.html:113
#: bookwyrm/templates/settings/imports/imports.html:89
#: bookwyrm/templates/import/import.html:124
#: bookwyrm/templates/settings/imports/imports.html:120
msgid "Date Created"
msgstr "Fecha de Creación"
#: bookwyrm/templates/import/import.html:116
#: bookwyrm/templates/import/import.html:127
msgid "Last Updated"
msgstr "Última Actualización"
#: bookwyrm/templates/import/import.html:119
#: bookwyrm/templates/settings/imports/imports.html:98
#: bookwyrm/templates/import/import.html:130
#: bookwyrm/templates/settings/imports/imports.html:129
msgid "Items"
msgstr "Elementos"
#: bookwyrm/templates/import/import.html:128
#: bookwyrm/templates/import/import.html:139
msgid "No recent imports"
msgstr "No hay ninguna importación reciente"
@ -2783,6 +2798,7 @@ msgid "Retry Status"
msgstr "Estado del Reintento"
#: 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:9
#: bookwyrm/templates/settings/layout.html:82
@ -2802,7 +2818,7 @@ msgid "Refresh"
msgstr "Refrescar"
#: bookwyrm/templates/import/import_status.html:72
#: bookwyrm/templates/settings/imports/imports.html:130
#: bookwyrm/templates/settings/imports/imports.html:161
msgid "Stop import"
msgstr "Parar la importación"
@ -2920,7 +2936,7 @@ msgid "Reject"
msgstr "Rechazar"
#: bookwyrm/templates/import/troubleshoot.html:7
#: bookwyrm/templates/settings/imports/imports.html:107
#: bookwyrm/templates/settings/imports/imports.html:138
msgid "Failed items"
msgstr "Elementos fallidos"
@ -3171,7 +3187,7 @@ msgid "Delete this list?"
msgstr "¿Eliminar esta lista?"
#: bookwyrm/templates/lists/edit_form.html:5
#: bookwyrm/templates/lists/layout.html:18
#: bookwyrm/templates/lists/layout.html:23
msgid "Edit List"
msgstr "Editar lista"
@ -4429,48 +4445,48 @@ msgstr "Prioridad media"
msgid "High priority"
msgstr "Prioridad alta"
#: bookwyrm/templates/settings/celery.html:40
#: bookwyrm/templates/settings/celery.html:46
msgid "Could not connect to Redis broker"
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"
msgstr "Tareas activas"
#: bookwyrm/templates/settings/celery.html:53
#: bookwyrm/templates/settings/imports/imports.html:82
#: bookwyrm/templates/settings/celery.html:59
#: bookwyrm/templates/settings/imports/imports.html:113
msgid "ID"
msgstr "ID"
#: bookwyrm/templates/settings/celery.html:54
#: bookwyrm/templates/settings/celery.html:60
msgid "Task name"
msgstr "Nombre de tarea"
#: bookwyrm/templates/settings/celery.html:55
#: bookwyrm/templates/settings/celery.html:61
msgid "Run time"
msgstr "Tiempo de ejecución"
#: bookwyrm/templates/settings/celery.html:56
#: bookwyrm/templates/settings/celery.html:62
msgid "Priority"
msgstr "Prioridad"
#: bookwyrm/templates/settings/celery.html:61
#: bookwyrm/templates/settings/celery.html:67
msgid "No active tasks"
msgstr "Sin tareas activas"
#: bookwyrm/templates/settings/celery.html:79
#: bookwyrm/templates/settings/celery.html:85
msgid "Workers"
msgstr "Trabajadores"
#: bookwyrm/templates/settings/celery.html:84
#: bookwyrm/templates/settings/celery.html:90
msgid "Uptime:"
msgstr "Tiempo ejecutándose:"
#: bookwyrm/templates/settings/celery.html:94
#: bookwyrm/templates/settings/celery.html:100
msgid "Could not connect to Celery"
msgstr "No se puede conectar a Celery"
#: bookwyrm/templates/settings/celery.html:101
#: bookwyrm/templates/settings/celery.html:107
msgid "Errors"
msgstr "Errores"
@ -4850,27 +4866,55 @@ msgstr "Los usuarios actualmente no pueden iniciar nuevas importaciones"
msgid "Enable imports"
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"
msgstr "Completado"
#: bookwyrm/templates/settings/imports/imports.html:85
#: bookwyrm/templates/settings/imports/imports.html:116
msgid "User"
msgstr "Usuario"
#: bookwyrm/templates/settings/imports/imports.html:94
#: bookwyrm/templates/settings/imports/imports.html:125
msgid "Date Updated"
msgstr "Fecha Actualizada"
#: bookwyrm/templates/settings/imports/imports.html:101
#: bookwyrm/templates/settings/imports/imports.html:132
msgid "Pending items"
msgstr "Elementos pendientes"
#: bookwyrm/templates/settings/imports/imports.html:104
#: bookwyrm/templates/settings/imports/imports.html:135
msgid "Successful items"
msgstr "Importaciones exitosas"
#: bookwyrm/templates/settings/imports/imports.html:139
#: bookwyrm/templates/settings/imports/imports.html:170
msgid "No matching imports found."
msgstr "No se han encontrado importaciones coincidentes."
@ -5131,34 +5175,38 @@ msgstr "No se ha podido guardar la configuración."
msgid "Allow registration"
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"
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)"
msgstr "(Recomendado si la registración es abierta)"
#: bookwyrm/templates/settings/registration.html:51
#: bookwyrm/templates/settings/registration.html:68
msgid "Allow invite requests"
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
msgid "Invite request text:"
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
msgid "Set a question for invite requests"
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
msgid "Question:"
msgstr "Pregunta:"
#: bookwyrm/templates/settings/registration.html:73
#: bookwyrm/templates/settings/registration.html:90
#: bookwyrm/templates/settings/registration_limited.html:67
msgid "Registration closed text:"
msgstr "Texto de registración cerrada:"
@ -5400,7 +5448,7 @@ msgid "Remove theme"
msgstr "Quitar tema"
#: 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"
msgstr "Eliminar usuario permanentemente"
@ -5522,14 +5570,18 @@ msgid "User Actions"
msgstr "Acciones de usuario"
#: 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"
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"
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:"
msgstr "Nivel de acceso:"
@ -6379,33 +6431,53 @@ msgstr "%(username)s no sigue a nadie"
msgid "No reviews or comments yet!"
msgstr "¡Aún no hay reseñas o comentarios!"
#: bookwyrm/templates/user/user.html:16
#: bookwyrm/templates/user/user.html:20
msgid "Edit profile"
msgstr "Editar perfil"
#: bookwyrm/templates/user/user.html:38
#: bookwyrm/templates/user/user.html:42
#, python-format
msgid "View all %(size)s"
msgstr "Ver los %(size)s"
#: bookwyrm/templates/user/user.html:52
#: bookwyrm/templates/user/user.html:56
msgid "View all books"
msgstr "Ver todos los libros"
#: bookwyrm/templates/user/user.html:59
#: bookwyrm/templates/user/user.html:63
#, python-format
msgid "%(current_year)s Reading Goal"
msgstr "Objetivo de Lectura de %(current_year)s"
#: bookwyrm/templates/user/user.html:66
#: bookwyrm/templates/user/user.html:70
msgid "User Activity"
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"
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!"
msgstr "¡Aún no actividades!"
@ -6449,16 +6521,43 @@ msgstr "Cerrar sesión"
msgid "File exceeds maximum size: 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
#, python-format
msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s: %(subtitle)s"
#: bookwyrm/views/rss_feed.py:34
#: bookwyrm/views/rss_feed.py:35
#, python-brace-format
msgid "Status updates from {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
#, python-format
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 ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-11 22:46+0000\n"
"PO-Revision-Date: 2023-01-12 17:09\n"
"POT-Creation-Date: 2023-01-30 08:21+0000\n"
"PO-Revision-Date: 2023-01-30 17:35\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Finnish\n"
"Language: fi\n"
@ -256,14 +256,14 @@ msgstr "Seuraajat"
msgid "Private"
msgstr "Yksityinen"
#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:157
#: bookwyrm/templates/settings/imports/imports.html:67
#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:168
#: bookwyrm/templates/settings/imports/imports.html:98
#: bookwyrm/templates/settings/users/user_admin.html:81
#: bookwyrm/templates/settings/users/user_info.html:28
msgid "Active"
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"
msgstr "Valmis"
@ -316,19 +316,19 @@ msgstr "Lainaukset"
msgid "Everything else"
msgstr "Muut"
#: bookwyrm/settings.py:214
#: bookwyrm/settings.py:217
msgid "Home Timeline"
msgstr "Oma aikajana"
#: bookwyrm/settings.py:214
#: bookwyrm/settings.py:217
msgid "Home"
msgstr "Etusivu"
#: bookwyrm/settings.py:215
#: bookwyrm/settings.py:218
msgid "Books Timeline"
msgstr "Kirjavirta"
#: bookwyrm/settings.py:215
#: bookwyrm/settings.py:218
#: bookwyrm/templates/guided_tour/user_profile.html:101
#: bookwyrm/templates/search/layout.html:22
#: bookwyrm/templates/search/layout.html:43
@ -336,75 +336,75 @@ msgstr "Kirjavirta"
msgid "Books"
msgstr "Kirjat"
#: bookwyrm/settings.py:287
#: bookwyrm/settings.py:290
msgid "English"
msgstr "English (englanti)"
#: bookwyrm/settings.py:288
#: bookwyrm/settings.py:291
msgid "Català (Catalan)"
msgstr "Català (katalaani)"
#: bookwyrm/settings.py:289
#: bookwyrm/settings.py:292
msgid "Deutsch (German)"
msgstr "Deutsch (saksa)"
#: bookwyrm/settings.py:290
#: bookwyrm/settings.py:293
msgid "Español (Spanish)"
msgstr "Español (espanja)"
#: bookwyrm/settings.py:291
#: bookwyrm/settings.py:294
msgid "Euskara (Basque)"
msgstr "Euskara (baski)"
#: bookwyrm/settings.py:292
#: bookwyrm/settings.py:295
msgid "Galego (Galician)"
msgstr "Galego (galego)"
#: bookwyrm/settings.py:293
#: bookwyrm/settings.py:296
msgid "Italiano (Italian)"
msgstr "Italiano (italia)"
#: bookwyrm/settings.py:294
#: bookwyrm/settings.py:297
msgid "Suomi (Finnish)"
msgstr "suomi"
#: bookwyrm/settings.py:295
#: bookwyrm/settings.py:298
msgid "Français (French)"
msgstr "Français (ranska)"
#: bookwyrm/settings.py:296
#: bookwyrm/settings.py:299
msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (liettua)"
#: bookwyrm/settings.py:297
#: bookwyrm/settings.py:300
msgid "Norsk (Norwegian)"
msgstr "Norsk (norja)"
#: bookwyrm/settings.py:298
#: bookwyrm/settings.py:301
msgid "Polski (Polish)"
msgstr "Polski (puola)"
#: bookwyrm/settings.py:299
#: bookwyrm/settings.py:302
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português do Brasil (brasilianportugali)"
#: bookwyrm/settings.py:300
#: bookwyrm/settings.py:303
msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (portugali)"
#: bookwyrm/settings.py:301
#: bookwyrm/settings.py:304
msgid "Română (Romanian)"
msgstr "Română (romania)"
#: bookwyrm/settings.py:302
#: bookwyrm/settings.py:305
msgid "Svenska (Swedish)"
msgstr "Svenska (ruotsi)"
#: bookwyrm/settings.py:303
#: bookwyrm/settings.py:306
msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (yksinkertaistettu kiina)"
#: bookwyrm/settings.py:304
#: bookwyrm/settings.py:307
msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (perinteinen kiina)"
@ -847,10 +847,10 @@ msgstr "ISNI:"
#: bookwyrm/templates/settings/announcements/edit_announcement.html:120
#: bookwyrm/templates/settings/federation/edit_instance.html:98
#: bookwyrm/templates/settings/federation/instance.html:105
#: bookwyrm/templates/settings/registration.html:79
#: bookwyrm/templates/settings/registration.html:96
#: bookwyrm/templates/settings/registration_limited.html:76
#: bookwyrm/templates/settings/site.html:144
#: bookwyrm/templates/settings/users/user_moderation_actions.html:69
#: bookwyrm/templates/settings/users/user_moderation_actions.html:75
#: bookwyrm/templates/shelf/form.html:25
#: bookwyrm/templates/snippets/reading_modals/layout.html:18
msgid "Save"
@ -1160,7 +1160,7 @@ msgstr "Uusi teos"
#: bookwyrm/templates/guided_tour/user_profile.html:89
#: bookwyrm/templates/guided_tour/user_profile.html:112
#: bookwyrm/templates/guided_tour/user_profile.html:135
#: bookwyrm/templates/user_menu.html:18
#: bookwyrm/templates/user/user.html:87 bookwyrm/templates/user_menu.html:18
msgid "Back"
msgstr "Takaisin"
@ -1372,7 +1372,7 @@ msgid "Domain"
msgstr "Verkkotunnus"
#: 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/settings/announcements/announcements.html:37
#: 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/settings/announcements/announcements.html:41
#: 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/themes.html:99
msgid "Actions"
@ -1905,13 +1905,13 @@ msgid "Add to your books"
msgstr "Lisää omiin kirjoihin"
#: 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
msgid "To Read"
msgstr "Lukujono"
#: 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
msgid "Currently Reading"
msgstr "Luettavana"
@ -1921,12 +1921,12 @@ msgstr "Luettavana"
#: bookwyrm/templates/snippets/shelf_selector.html:46
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12
#: bookwyrm/templates/user/user.html:35 bookwyrm/templatetags/shelf_tags.py:52
#: bookwyrm/templates/user/user.html:39 bookwyrm/templatetags/shelf_tags.py:52
msgid "Read"
msgstr "Luettu"
#: 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"
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."
#: 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"
msgstr "Käyttäjäprofiili"
@ -2689,85 +2689,100 @@ msgstr "Tuo kirjoja"
msgid "Not a valid CSV file"
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
msgid "On average, recent imports have taken %(hours)s hours."
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
msgid "On average, recent imports have taken %(minutes)s minutes."
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:"
msgstr "Tietolähde:"
#: bookwyrm/templates/import/import.html:47
#: bookwyrm/templates/import/import.html:53
msgid "Goodreads (CSV)"
msgstr "Goodreads (CSV)"
#: bookwyrm/templates/import/import.html:50
#: bookwyrm/templates/import/import.html:56
msgid "Storygraph (CSV)"
msgstr "Storygraph (CSV)"
#: bookwyrm/templates/import/import.html:53
#: bookwyrm/templates/import/import.html:59
msgid "LibraryThing (TSV)"
msgstr "LibraryThing (TSV)"
#: bookwyrm/templates/import/import.html:56
#: bookwyrm/templates/import/import.html:62
msgid "OpenLibrary (CSV)"
msgstr "OpenLibrary (CSV)"
#: bookwyrm/templates/import/import.html:59
#: bookwyrm/templates/import/import.html:65
msgid "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."
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:"
msgstr "Datatiedosto:"
#: bookwyrm/templates/import/import.html:82
#: bookwyrm/templates/import/import.html:88
msgid "Include reviews"
msgstr "Myös arviot"
#: bookwyrm/templates/import/import.html:87
#: bookwyrm/templates/import/import.html:93
msgid "Privacy setting for imported reviews:"
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/settings/federation/instance_blocklist.html:78
msgid "Import"
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."
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"
msgstr "Viimeksi tuotu"
#: bookwyrm/templates/import/import.html:113
#: bookwyrm/templates/settings/imports/imports.html:89
#: bookwyrm/templates/import/import.html:124
#: bookwyrm/templates/settings/imports/imports.html:120
msgid "Date Created"
msgstr "Luontipäivä"
#: bookwyrm/templates/import/import.html:116
#: bookwyrm/templates/import/import.html:127
msgid "Last Updated"
msgstr "Päivitetty viimeksi"
#: bookwyrm/templates/import/import.html:119
#: bookwyrm/templates/settings/imports/imports.html:98
#: bookwyrm/templates/import/import.html:130
#: bookwyrm/templates/settings/imports/imports.html:129
msgid "Items"
msgstr "Nimikkeitä"
#: bookwyrm/templates/import/import.html:128
#: bookwyrm/templates/import/import.html:139
msgid "No recent imports"
msgstr "Ei viimeaikaisia tuonteja"
@ -2783,6 +2798,7 @@ msgid "Retry Status"
msgstr "Uudelleenyrityksen tila"
#: 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:9
#: bookwyrm/templates/settings/layout.html:82
@ -2802,7 +2818,7 @@ msgid "Refresh"
msgstr "Päivitä"
#: bookwyrm/templates/import/import_status.html:72
#: bookwyrm/templates/settings/imports/imports.html:130
#: bookwyrm/templates/settings/imports/imports.html:161
msgid "Stop import"
msgstr "Keskeytä tuonti"
@ -2920,7 +2936,7 @@ msgid "Reject"
msgstr "Hylkää"
#: bookwyrm/templates/import/troubleshoot.html:7
#: bookwyrm/templates/settings/imports/imports.html:107
#: bookwyrm/templates/settings/imports/imports.html:138
msgid "Failed items"
msgstr "Epäonnistuneita nimikkeitä"
@ -3171,7 +3187,7 @@ msgid "Delete this list?"
msgstr "Poistetaanko lista?"
#: bookwyrm/templates/lists/edit_form.html:5
#: bookwyrm/templates/lists/layout.html:18
#: bookwyrm/templates/lists/layout.html:23
msgid "Edit List"
msgstr "Muokkaa listaa"
@ -4429,48 +4445,48 @@ msgstr "Keskitason prioriteetti"
msgid "High priority"
msgstr "Korkea prioriteetti"
#: bookwyrm/templates/settings/celery.html:40
#: bookwyrm/templates/settings/celery.html:46
msgid "Could not connect to Redis broker"
msgstr "Redis-välityspalveluun ei saada yhteyttä"
#: bookwyrm/templates/settings/celery.html:48
#: bookwyrm/templates/settings/celery.html:54
msgid "Active Tasks"
msgstr "Aktiiviset tehtävät"
#: bookwyrm/templates/settings/celery.html:53
#: bookwyrm/templates/settings/imports/imports.html:82
#: bookwyrm/templates/settings/celery.html:59
#: bookwyrm/templates/settings/imports/imports.html:113
msgid "ID"
msgstr "Tunniste"
#: bookwyrm/templates/settings/celery.html:54
#: bookwyrm/templates/settings/celery.html:60
msgid "Task name"
msgstr "Tehtävän nimi"
#: bookwyrm/templates/settings/celery.html:55
#: bookwyrm/templates/settings/celery.html:61
msgid "Run time"
msgstr "Käyttöaika"
#: bookwyrm/templates/settings/celery.html:56
#: bookwyrm/templates/settings/celery.html:62
msgid "Priority"
msgstr "Prioriteetti"
#: bookwyrm/templates/settings/celery.html:61
#: bookwyrm/templates/settings/celery.html:67
msgid "No active tasks"
msgstr "Ei aktiivisia tehtäviä"
#: bookwyrm/templates/settings/celery.html:79
#: bookwyrm/templates/settings/celery.html:85
msgid "Workers"
msgstr "Suorittajia"
#: bookwyrm/templates/settings/celery.html:84
#: bookwyrm/templates/settings/celery.html:90
msgid "Uptime:"
msgstr "Käynnissäoloaika:"
#: bookwyrm/templates/settings/celery.html:94
#: bookwyrm/templates/settings/celery.html:100
msgid "Could not connect to Celery"
msgstr "Celeryyn ei saada yhteyttä"
#: bookwyrm/templates/settings/celery.html:101
#: bookwyrm/templates/settings/celery.html:107
msgid "Errors"
msgstr "Virheitä"
@ -4850,27 +4866,55 @@ msgstr "Käyttäjät eivät voi aloittaa uusia tuonteja"
msgid "Enable imports"
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"
msgstr "Valmis"
#: bookwyrm/templates/settings/imports/imports.html:85
#: bookwyrm/templates/settings/imports/imports.html:116
msgid "User"
msgstr "Käyttäjä"
#: bookwyrm/templates/settings/imports/imports.html:94
#: bookwyrm/templates/settings/imports/imports.html:125
msgid "Date Updated"
msgstr "Päivitetty"
#: bookwyrm/templates/settings/imports/imports.html:101
#: bookwyrm/templates/settings/imports/imports.html:132
msgid "Pending items"
msgstr "Odottavia nimikkeitä"
#: bookwyrm/templates/settings/imports/imports.html:104
#: bookwyrm/templates/settings/imports/imports.html:135
msgid "Successful items"
msgstr "Onnistuneita nimikkeitä"
#: bookwyrm/templates/settings/imports/imports.html:139
#: bookwyrm/templates/settings/imports/imports.html:170
msgid "No matching imports found."
msgstr "Ei ehtoihin sopivia tuonteja."
@ -5131,34 +5175,38 @@ msgstr "Asetuksia ei voi tallentaa"
msgid "Allow registration"
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"
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)"
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"
msgstr "Salli kutsulinkin pyytäminen"
#: bookwyrm/templates/settings/registration.html:55
#: bookwyrm/templates/settings/registration.html:72
#: bookwyrm/templates/settings/registration_limited.html:42
msgid "Invite request text:"
msgstr "Kutsupyyntökehote ja -ohje:"
#: bookwyrm/templates/settings/registration.html:63
#: bookwyrm/templates/settings/registration.html:80
#: bookwyrm/templates/settings/registration_limited.html:50
msgid "Set a question for invite requests"
msgstr "Kutsupyyntöjen lisätietokysymys"
#: bookwyrm/templates/settings/registration.html:68
#: bookwyrm/templates/settings/registration.html:85
#: bookwyrm/templates/settings/registration_limited.html:55
msgid "Question:"
msgstr "Kysymys:"
#: bookwyrm/templates/settings/registration.html:73
#: bookwyrm/templates/settings/registration.html:90
#: bookwyrm/templates/settings/registration_limited.html:67
msgid "Registration closed text:"
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"
#: 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"
msgstr "Poista käyttäjä pysyvästi"
@ -5522,14 +5570,18 @@ msgid "User Actions"
msgstr "Toiminnot"
#: 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"
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"
msgstr "Peru hyllytys"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:48
#: bookwyrm/templates/settings/users/user_moderation_actions.html:54
msgid "Access level:"
msgstr "Käyttöoikeustaso:"
@ -6379,33 +6431,53 @@ msgstr "%(username)s ei seuraa muita käyttäjiä"
msgid "No reviews or comments yet!"
msgstr "Ei arvioita tai kommentteja."
#: bookwyrm/templates/user/user.html:16
#: bookwyrm/templates/user/user.html:20
msgid "Edit profile"
msgstr "Muokkaa profiilia"
#: bookwyrm/templates/user/user.html:38
#: bookwyrm/templates/user/user.html:42
#, python-format
msgid "View all %(size)s"
msgstr "Näytä kaikki %(size)s"
#: bookwyrm/templates/user/user.html:52
#: bookwyrm/templates/user/user.html:56
msgid "View all books"
msgstr "Näytä kaikki kirjat"
#: bookwyrm/templates/user/user.html:59
#: bookwyrm/templates/user/user.html:63
#, python-format
msgid "%(current_year)s Reading Goal"
msgstr "Lukutavoite vuodelle %(current_year)s"
#: bookwyrm/templates/user/user.html:66
#: bookwyrm/templates/user/user.html:70
msgid "User Activity"
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"
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!"
msgstr "Ei toimintaa!"
@ -6449,16 +6521,43 @@ msgstr "Kirjaudu ulos"
msgid "File exceeds maximum size: 10MB"
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
#, python-format
msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s: %(subtitle)s"
#: bookwyrm/views/rss_feed.py:34
#: bookwyrm/views/rss_feed.py:35
#, python-brace-format
msgid "Status updates from {obj.display_name}"
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
#, python-format
msgid "Load %(count)d unread status"

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-11 22:46+0000\n"
"PO-Revision-Date: 2023-01-13 18:17\n"
"POT-Creation-Date: 2023-01-30 08:21+0000\n"
"PO-Revision-Date: 2023-02-02 14:57\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: French\n"
"Language: fr\n"
@ -256,14 +256,14 @@ msgstr "Abonné(e)s"
msgid "Private"
msgstr "Privé"
#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:157
#: bookwyrm/templates/settings/imports/imports.html:67
#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:168
#: bookwyrm/templates/settings/imports/imports.html:98
#: bookwyrm/templates/settings/users/user_admin.html:81
#: bookwyrm/templates/settings/users/user_info.html:28
msgid "Active"
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"
msgstr "Terminé"
@ -316,19 +316,19 @@ msgstr "Citations"
msgid "Everything else"
msgstr "Tout le reste"
#: bookwyrm/settings.py:214
#: bookwyrm/settings.py:217
msgid "Home Timeline"
msgstr "Mon fil dactualité"
#: bookwyrm/settings.py:214
#: bookwyrm/settings.py:217
msgid "Home"
msgstr "Accueil"
#: bookwyrm/settings.py:215
#: bookwyrm/settings.py:218
msgid "Books Timeline"
msgstr "Actualité de mes livres"
#: bookwyrm/settings.py:215
#: bookwyrm/settings.py:218
#: bookwyrm/templates/guided_tour/user_profile.html:101
#: bookwyrm/templates/search/layout.html:22
#: bookwyrm/templates/search/layout.html:43
@ -336,75 +336,75 @@ msgstr "Actualité de mes livres"
msgid "Books"
msgstr "Livres"
#: bookwyrm/settings.py:287
#: bookwyrm/settings.py:290
msgid "English"
msgstr "English"
#: bookwyrm/settings.py:288
#: bookwyrm/settings.py:291
msgid "Català (Catalan)"
msgstr "Català (Catalan)"
#: bookwyrm/settings.py:289
#: bookwyrm/settings.py:292
msgid "Deutsch (German)"
msgstr "Deutsch"
#: bookwyrm/settings.py:290
#: bookwyrm/settings.py:293
msgid "Español (Spanish)"
msgstr "Español"
#: bookwyrm/settings.py:291
#: bookwyrm/settings.py:294
msgid "Euskara (Basque)"
msgstr "Euskara (Basque)"
#: bookwyrm/settings.py:292
#: bookwyrm/settings.py:295
msgid "Galego (Galician)"
msgstr "Galego (Galicien)"
#: bookwyrm/settings.py:293
#: bookwyrm/settings.py:296
msgid "Italiano (Italian)"
msgstr "Italiano (Italien)"
#: bookwyrm/settings.py:294
#: bookwyrm/settings.py:297
msgid "Suomi (Finnish)"
msgstr "Suomi (Finnois)"
#: bookwyrm/settings.py:295
#: bookwyrm/settings.py:298
msgid "Français (French)"
msgstr "Français"
#: bookwyrm/settings.py:296
#: bookwyrm/settings.py:299
msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (Lituanien)"
#: bookwyrm/settings.py:297
#: bookwyrm/settings.py:300
msgid "Norsk (Norwegian)"
msgstr "Norsk (Norvégien)"
#: bookwyrm/settings.py:298
#: bookwyrm/settings.py:301
msgid "Polski (Polish)"
msgstr "Polski (Polonais)"
#: bookwyrm/settings.py:299
#: bookwyrm/settings.py:302
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português do Brasil (Portugais brésilien)"
#: bookwyrm/settings.py:300
#: bookwyrm/settings.py:303
msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Portugais européen)"
#: bookwyrm/settings.py:301
#: bookwyrm/settings.py:304
msgid "Română (Romanian)"
msgstr "Română (Roumain)"
#: bookwyrm/settings.py:302
#: bookwyrm/settings.py:305
msgid "Svenska (Swedish)"
msgstr "Svenska (Suédois)"
#: bookwyrm/settings.py:303
#: bookwyrm/settings.py:306
msgid "简体中文 (Simplified Chinese)"
msgstr "简化字"
#: bookwyrm/settings.py:304
#: bookwyrm/settings.py:307
msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (chinois traditionnel)"
@ -610,8 +610,8 @@ msgstr "Ce qui fait en moyenne %(pages)s pages par livre."
#, python-format
msgid "(No page data was available for %(no_page_number)s book)"
msgid_plural "(No page data was available for %(no_page_number)s books)"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "(Le nombre de pages n'était pas renseigné pour %(no_page_number)s livre)"
msgstr[1] "(Le nombre de pages n'était pas renseigné pour %(no_page_number)s livres)"
#: bookwyrm/templates/annual_summary/layout.html:150
msgid "Their shortest read this year…"
@ -847,10 +847,10 @@ msgstr "ISNI :"
#: bookwyrm/templates/settings/announcements/edit_announcement.html:120
#: bookwyrm/templates/settings/federation/edit_instance.html:98
#: bookwyrm/templates/settings/federation/instance.html:105
#: bookwyrm/templates/settings/registration.html:79
#: bookwyrm/templates/settings/registration.html:96
#: bookwyrm/templates/settings/registration_limited.html:76
#: bookwyrm/templates/settings/site.html:144
#: bookwyrm/templates/settings/users/user_moderation_actions.html:69
#: bookwyrm/templates/settings/users/user_moderation_actions.html:75
#: bookwyrm/templates/shelf/form.html:25
#: bookwyrm/templates/snippets/reading_modals/layout.html:18
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:112
#: 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"
msgstr "Retour"
@ -1372,7 +1372,7 @@ msgid "Domain"
msgstr "Domaine"
#: 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/settings/announcements/announcements.html:37
#: 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/settings/announcements/announcements.html:41
#: 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/themes.html:99
msgid "Actions"
@ -1905,13 +1905,13 @@ msgid "Add to your books"
msgstr "Ajouter à vos livres"
#: 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
msgid "To Read"
msgstr "À lire"
#: 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
msgid "Currently Reading"
msgstr "Lectures en cours"
@ -1921,12 +1921,12 @@ msgstr "Lectures en cours"
#: bookwyrm/templates/snippets/shelf_selector.html:46
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12
#: bookwyrm/templates/user/user.html:35 bookwyrm/templatetags/shelf_tags.py:52
#: bookwyrm/templates/user/user.html:39 bookwyrm/templatetags/shelf_tags.py:52
msgid "Read"
msgstr "Lu"
#: 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"
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é."
#: 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"
msgstr "Profil"
@ -2689,85 +2689,100 @@ msgstr "Importer des livres"
msgid "Not a valid CSV file"
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
msgid "On average, recent imports have taken %(hours)s hours."
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
msgid "On average, recent imports have taken %(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:"
msgstr "Source de données:"
#: bookwyrm/templates/import/import.html:47
#: bookwyrm/templates/import/import.html:53
msgid "Goodreads (CSV)"
msgstr "Goodreads (CSV)"
#: bookwyrm/templates/import/import.html:50
#: bookwyrm/templates/import/import.html:56
msgid "Storygraph (CSV)"
msgstr "Storygraph (CSV)"
#: bookwyrm/templates/import/import.html:53
#: bookwyrm/templates/import/import.html:59
msgid "LibraryThing (TSV)"
msgstr "LibraryThing (TSV)"
#: bookwyrm/templates/import/import.html:56
#: bookwyrm/templates/import/import.html:62
msgid "OpenLibrary (CSV)"
msgstr "OpenLibrary (CSV)"
#: bookwyrm/templates/import/import.html:59
#: bookwyrm/templates/import/import.html:65
msgid "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."
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:"
msgstr "Fichier de données:"
#: bookwyrm/templates/import/import.html:82
#: bookwyrm/templates/import/import.html:88
msgid "Include reviews"
msgstr "Importer les critiques"
#: bookwyrm/templates/import/import.html:87
#: bookwyrm/templates/import/import.html:93
msgid "Privacy setting for imported reviews:"
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/settings/federation/instance_blocklist.html:78
msgid "Import"
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."
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"
msgstr "Importations récentes"
#: bookwyrm/templates/import/import.html:113
#: bookwyrm/templates/settings/imports/imports.html:89
#: bookwyrm/templates/import/import.html:124
#: bookwyrm/templates/settings/imports/imports.html:120
msgid "Date Created"
msgstr "Date de Création"
#: bookwyrm/templates/import/import.html:116
#: bookwyrm/templates/import/import.html:127
msgid "Last Updated"
msgstr "Dernière Mise à jour"
#: bookwyrm/templates/import/import.html:119
#: bookwyrm/templates/settings/imports/imports.html:98
#: bookwyrm/templates/import/import.html:130
#: bookwyrm/templates/settings/imports/imports.html:129
msgid "Items"
msgstr "Éléments"
#: bookwyrm/templates/import/import.html:128
#: bookwyrm/templates/import/import.html:139
msgid "No recent imports"
msgstr "Aucune importation récente"
@ -2783,6 +2798,7 @@ msgid "Retry Status"
msgstr "Statut de la nouvelle tentative"
#: 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:9
#: bookwyrm/templates/settings/layout.html:82
@ -2802,7 +2818,7 @@ msgid "Refresh"
msgstr "Actualiser"
#: bookwyrm/templates/import/import_status.html:72
#: bookwyrm/templates/settings/imports/imports.html:130
#: bookwyrm/templates/settings/imports/imports.html:161
msgid "Stop import"
msgstr "Arrêter l'import"
@ -2920,7 +2936,7 @@ msgid "Reject"
msgstr "Rejeter"
#: bookwyrm/templates/import/troubleshoot.html:7
#: bookwyrm/templates/settings/imports/imports.html:107
#: bookwyrm/templates/settings/imports/imports.html:138
msgid "Failed items"
msgstr "Éléments dont l'importation a échoué"
@ -3171,7 +3187,7 @@ msgid "Delete this list?"
msgstr "Supprimer cette liste ?"
#: bookwyrm/templates/lists/edit_form.html:5
#: bookwyrm/templates/lists/layout.html:18
#: bookwyrm/templates/lists/layout.html:23
msgid "Edit List"
msgstr "Modifier la liste"
@ -4429,48 +4445,48 @@ msgstr "Priorité moyenne"
msgid "High priority"
msgstr "Priorité élevée"
#: bookwyrm/templates/settings/celery.html:40
#: bookwyrm/templates/settings/celery.html:46
msgid "Could not connect to Redis broker"
msgstr "Connexion au broker Redis impossible"
#: bookwyrm/templates/settings/celery.html:48
#: bookwyrm/templates/settings/celery.html:54
msgid "Active Tasks"
msgstr "Tâches actives"
#: bookwyrm/templates/settings/celery.html:53
#: bookwyrm/templates/settings/imports/imports.html:82
#: bookwyrm/templates/settings/celery.html:59
#: bookwyrm/templates/settings/imports/imports.html:113
msgid "ID"
msgstr "ID"
#: bookwyrm/templates/settings/celery.html:54
#: bookwyrm/templates/settings/celery.html:60
msgid "Task name"
msgstr "Nom de la tâche"
#: bookwyrm/templates/settings/celery.html:55
#: bookwyrm/templates/settings/celery.html:61
msgid "Run time"
msgstr "Durée"
#: bookwyrm/templates/settings/celery.html:56
#: bookwyrm/templates/settings/celery.html:62
msgid "Priority"
msgstr "Priorité"
#: bookwyrm/templates/settings/celery.html:61
#: bookwyrm/templates/settings/celery.html:67
msgid "No active tasks"
msgstr "Aucune tâche active"
#: bookwyrm/templates/settings/celery.html:79
#: bookwyrm/templates/settings/celery.html:85
msgid "Workers"
msgstr "Workers"
#: bookwyrm/templates/settings/celery.html:84
#: bookwyrm/templates/settings/celery.html:90
msgid "Uptime:"
msgstr "Uptime :"
#: bookwyrm/templates/settings/celery.html:94
#: bookwyrm/templates/settings/celery.html:100
msgid "Could not connect to Celery"
msgstr "Impossible de se connecter à Celery"
#: bookwyrm/templates/settings/celery.html:101
#: bookwyrm/templates/settings/celery.html:107
msgid "Errors"
msgstr "Erreurs"
@ -4850,27 +4866,55 @@ msgstr "Les utilisateurs ne peuvent pas commencer de nouvelles importations"
msgid "Enable imports"
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"
msgstr "Terminé"
#: bookwyrm/templates/settings/imports/imports.html:85
#: bookwyrm/templates/settings/imports/imports.html:116
msgid "User"
msgstr "Utilisateur"
#: bookwyrm/templates/settings/imports/imports.html:94
#: bookwyrm/templates/settings/imports/imports.html:125
msgid "Date Updated"
msgstr "Date de Mise à jour"
#: bookwyrm/templates/settings/imports/imports.html:101
#: bookwyrm/templates/settings/imports/imports.html:132
msgid "Pending items"
msgstr "Éléments en attente"
#: bookwyrm/templates/settings/imports/imports.html:104
#: bookwyrm/templates/settings/imports/imports.html:135
msgid "Successful items"
msgstr "Éléments réussis"
#: bookwyrm/templates/settings/imports/imports.html:139
#: bookwyrm/templates/settings/imports/imports.html:170
msgid "No matching imports found."
msgstr "Aucun import correspondant trouvé."
@ -5131,34 +5175,38 @@ msgstr "Impossible denregistrer les paramètres"
msgid "Allow registration"
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"
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)"
msgstr "(Recommandé si les inscriptions sont ouvertes)"
#: bookwyrm/templates/settings/registration.html:51
#: bookwyrm/templates/settings/registration.html:68
msgid "Allow invite requests"
msgstr "Autoriser les demandes dinvitation"
#: bookwyrm/templates/settings/registration.html:55
#: bookwyrm/templates/settings/registration.html:72
#: bookwyrm/templates/settings/registration_limited.html:42
msgid "Invite request text:"
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
msgid "Set a question for invite requests"
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
msgid "Question:"
msgstr "Question :"
#: bookwyrm/templates/settings/registration.html:73
#: bookwyrm/templates/settings/registration.html:90
#: bookwyrm/templates/settings/registration_limited.html:67
msgid "Registration closed text:"
msgstr "Texte affiché lorsque les inscriptions sont closes:"
@ -5400,7 +5448,7 @@ msgid "Remove theme"
msgstr "Supprimer le thème"
#: 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"
msgstr "Supprimer définitivement l'utilisateur"
@ -5522,14 +5570,18 @@ msgid "User Actions"
msgstr "Actions de l'utilisateur"
#: 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"
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"
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:"
msgstr "Niveau daccès:"
@ -6379,33 +6431,53 @@ msgstr "%(username)s ne suit personne"
msgid "No reviews or comments yet!"
msgstr "Aucune critique ou commentaire pour le moment !"
#: bookwyrm/templates/user/user.html:16
#: bookwyrm/templates/user/user.html:20
msgid "Edit profile"
msgstr "Modifier le profil"
#: bookwyrm/templates/user/user.html:38
#: bookwyrm/templates/user/user.html:42
#, python-format
msgid "View all %(size)s"
msgstr "Voir les %(size)s"
#: bookwyrm/templates/user/user.html:52
#: bookwyrm/templates/user/user.html:56
msgid "View all books"
msgstr "Voir tous les livres"
#: bookwyrm/templates/user/user.html:59
#: bookwyrm/templates/user/user.html:63
#, python-format
msgid "%(current_year)s Reading Goal"
msgstr "Défi lecture pour %(current_year)s"
#: bookwyrm/templates/user/user.html:66
#: bookwyrm/templates/user/user.html:70
msgid "User Activity"
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"
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!"
msgstr "Aucune activité pour linstant!"
@ -6449,16 +6521,43 @@ msgstr "Se déconnecter"
msgid "File exceeds maximum size: 10MB"
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
#, python-format
msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s (%(subtitle)s)"
#: bookwyrm/views/rss_feed.py:34
#: bookwyrm/views/rss_feed.py:35
#, python-brace-format
msgid "Status updates from {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
#, python-format
msgid "Load %(count)d unread status"

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-11 22:46+0000\n"
"PO-Revision-Date: 2023-01-12 06:35\n"
"POT-Creation-Date: 2023-01-30 08:21+0000\n"
"PO-Revision-Date: 2023-03-09 14:35\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Galician\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/templates/ostatus/error.html:29
msgid "username"
msgstr "nome de usuaria"
msgstr "identificador"
#: bookwyrm/models/fields.py:187
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/templates/snippets/privacy-icons.html:3
@ -256,14 +256,14 @@ msgstr "Seguidoras"
msgid "Private"
msgstr "Privado"
#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:157
#: bookwyrm/templates/settings/imports/imports.html:67
#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:168
#: bookwyrm/templates/settings/imports/imports.html:98
#: bookwyrm/templates/settings/users/user_admin.html:81
#: bookwyrm/templates/settings/users/user_info.html:28
msgid "Active"
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"
msgstr "Completa"
@ -316,19 +316,19 @@ msgstr "Citas"
msgid "Everything else"
msgstr "As outras cousas"
#: bookwyrm/settings.py:214
#: bookwyrm/settings.py:217
msgid "Home Timeline"
msgstr "Cronoloxía de Inicio"
#: bookwyrm/settings.py:214
#: bookwyrm/settings.py:217
msgid "Home"
msgstr "Inicio"
#: bookwyrm/settings.py:215
#: bookwyrm/settings.py:218
msgid "Books Timeline"
msgstr "Cronoloxía de libros"
#: bookwyrm/settings.py:215
#: bookwyrm/settings.py:218
#: bookwyrm/templates/guided_tour/user_profile.html:101
#: bookwyrm/templates/search/layout.html:22
#: bookwyrm/templates/search/layout.html:43
@ -336,75 +336,75 @@ msgstr "Cronoloxía de libros"
msgid "Books"
msgstr "Libros"
#: bookwyrm/settings.py:287
#: bookwyrm/settings.py:290
msgid "English"
msgstr "English (Inglés)"
#: bookwyrm/settings.py:288
#: bookwyrm/settings.py:291
msgid "Català (Catalan)"
msgstr "Català (Catalan)"
#: bookwyrm/settings.py:289
#: bookwyrm/settings.py:292
msgid "Deutsch (German)"
msgstr "Deutsch (Alemán)"
#: bookwyrm/settings.py:290
#: bookwyrm/settings.py:293
msgid "Español (Spanish)"
msgstr "Español (Español)"
#: bookwyrm/settings.py:291
#: bookwyrm/settings.py:294
msgid "Euskara (Basque)"
msgstr "Euskara (Éuscaro)"
#: bookwyrm/settings.py:292
#: bookwyrm/settings.py:295
msgid "Galego (Galician)"
msgstr "Galego (Galego)"
#: bookwyrm/settings.py:293
#: bookwyrm/settings.py:296
msgid "Italiano (Italian)"
msgstr "Italiano (Italiano)"
#: bookwyrm/settings.py:294
#: bookwyrm/settings.py:297
msgid "Suomi (Finnish)"
msgstr "Suomi (Finés)"
#: bookwyrm/settings.py:295
#: bookwyrm/settings.py:298
msgid "Français (French)"
msgstr "Français (Francés)"
#: bookwyrm/settings.py:296
#: bookwyrm/settings.py:299
msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (Lituano)"
#: bookwyrm/settings.py:297
#: bookwyrm/settings.py:300
msgid "Norsk (Norwegian)"
msgstr "Norsk (Noruegués)"
#: bookwyrm/settings.py:298
#: bookwyrm/settings.py:301
msgid "Polski (Polish)"
msgstr "Polski (Polaco)"
#: bookwyrm/settings.py:299
#: bookwyrm/settings.py:302
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português do Brasil (Portugués brasileiro)"
#: bookwyrm/settings.py:300
#: bookwyrm/settings.py:303
msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Portugués europeo)"
#: bookwyrm/settings.py:301
#: bookwyrm/settings.py:304
msgid "Română (Romanian)"
msgstr "Română (Rumanés)"
#: bookwyrm/settings.py:302
#: bookwyrm/settings.py:305
msgid "Svenska (Swedish)"
msgstr "Svenska (Sueco)"
#: bookwyrm/settings.py:303
#: bookwyrm/settings.py:306
msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (Chinés simplificado)"
#: bookwyrm/settings.py:304
#: bookwyrm/settings.py:307
msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (Chinés tradicional)"
@ -847,10 +847,10 @@ msgstr "ISNI:"
#: bookwyrm/templates/settings/announcements/edit_announcement.html:120
#: bookwyrm/templates/settings/federation/edit_instance.html:98
#: bookwyrm/templates/settings/federation/instance.html:105
#: bookwyrm/templates/settings/registration.html:79
#: bookwyrm/templates/settings/registration.html:96
#: bookwyrm/templates/settings/registration_limited.html:76
#: bookwyrm/templates/settings/site.html:144
#: bookwyrm/templates/settings/users/user_moderation_actions.html:69
#: bookwyrm/templates/settings/users/user_moderation_actions.html:75
#: bookwyrm/templates/shelf/form.html:25
#: bookwyrm/templates/snippets/reading_modals/layout.html:18
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:112
#: 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"
msgstr "Atrás"
@ -1372,7 +1372,7 @@ msgid "Domain"
msgstr "Dominio"
#: 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/settings/announcements/announcements.html:37
#: 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/settings/announcements/announcements.html:41
#: 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/themes.html:99
msgid "Actions"
@ -1905,13 +1905,13 @@ msgid "Add to your books"
msgstr "Engadir aos teus libros"
#: 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
msgid "To Read"
msgstr "Pendentes"
#: 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
msgid "Currently Reading"
msgstr "Lectura actual"
@ -1921,12 +1921,12 @@ msgstr "Lectura actual"
#: bookwyrm/templates/snippets/shelf_selector.html:46
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12
#: bookwyrm/templates/user/user.html:35 bookwyrm/templatetags/shelf_tags.py:52
#: bookwyrm/templates/user/user.html:39 bookwyrm/templatetags/shelf_tags.py:52
msgid "Read"
msgstr "Lidos"
#: 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"
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."
#: 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"
msgstr "Perfil da usuaria"
@ -2689,85 +2689,100 @@ msgstr "Importar libros"
msgid "Not a valid CSV file"
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
msgid "On average, recent imports have taken %(hours)s hours."
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
msgid "On average, recent imports have taken %(minutes)s minutes."
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:"
msgstr "Fonte de datos:"
#: bookwyrm/templates/import/import.html:47
#: bookwyrm/templates/import/import.html:53
msgid "Goodreads (CSV)"
msgstr "Goodreads (CSV)"
#: bookwyrm/templates/import/import.html:50
#: bookwyrm/templates/import/import.html:56
msgid "Storygraph (CSV)"
msgstr "Storygraph (CSV)"
#: bookwyrm/templates/import/import.html:53
#: bookwyrm/templates/import/import.html:59
msgid "LibraryThing (TSV)"
msgstr "LibraryThing (TSV)"
#: bookwyrm/templates/import/import.html:56
#: bookwyrm/templates/import/import.html:62
msgid "OpenLibrary (CSV)"
msgstr "OpenLibrary (CSV)"
#: bookwyrm/templates/import/import.html:59
#: bookwyrm/templates/import/import.html:65
msgid "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."
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:"
msgstr "Ficheiro de datos:"
#: bookwyrm/templates/import/import.html:82
#: bookwyrm/templates/import/import.html:88
msgid "Include reviews"
msgstr "Incluír recensións"
#: bookwyrm/templates/import/import.html:87
#: bookwyrm/templates/import/import.html:93
msgid "Privacy setting for imported reviews:"
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/settings/federation/instance_blocklist.html:78
msgid "Import"
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."
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"
msgstr "Importacións recentes"
#: bookwyrm/templates/import/import.html:113
#: bookwyrm/templates/settings/imports/imports.html:89
#: bookwyrm/templates/import/import.html:124
#: bookwyrm/templates/settings/imports/imports.html:120
msgid "Date Created"
msgstr "Data de creación"
#: bookwyrm/templates/import/import.html:116
#: bookwyrm/templates/import/import.html:127
msgid "Last Updated"
msgstr "Última actualización"
#: bookwyrm/templates/import/import.html:119
#: bookwyrm/templates/settings/imports/imports.html:98
#: bookwyrm/templates/import/import.html:130
#: bookwyrm/templates/settings/imports/imports.html:129
msgid "Items"
msgstr "Elementos"
#: bookwyrm/templates/import/import.html:128
#: bookwyrm/templates/import/import.html:139
msgid "No recent imports"
msgstr "Sen importacións recentes"
@ -2783,6 +2798,7 @@ msgid "Retry Status"
msgstr "Intenta outra vez"
#: 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:9
#: bookwyrm/templates/settings/layout.html:82
@ -2802,7 +2818,7 @@ msgid "Refresh"
msgstr "Actualizar"
#: bookwyrm/templates/import/import_status.html:72
#: bookwyrm/templates/settings/imports/imports.html:130
#: bookwyrm/templates/settings/imports/imports.html:161
msgid "Stop import"
msgstr "Deter a importación"
@ -2920,7 +2936,7 @@ msgid "Reject"
msgstr "Rexeitar"
#: bookwyrm/templates/import/troubleshoot.html:7
#: bookwyrm/templates/settings/imports/imports.html:107
#: bookwyrm/templates/settings/imports/imports.html:138
msgid "Failed items"
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/snippets/register_form.html:4
msgid "Username:"
msgstr "Nome de usuaria:"
msgstr "Identificador:"
#: bookwyrm/templates/landing/login.html:27
#: bookwyrm/templates/landing/password_reset.html:26
@ -3171,7 +3187,7 @@ msgid "Delete this list?"
msgstr "Eliminar esta lista?"
#: bookwyrm/templates/lists/edit_form.html:5
#: bookwyrm/templates/lists/layout.html:18
#: bookwyrm/templates/lists/layout.html:23
msgid "Edit List"
msgstr "Editar lista"
@ -3677,7 +3693,7 @@ msgstr "Estás ao día!"
#: bookwyrm/templates/ostatus/error.html:7
#, python-format
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:13
@ -3706,7 +3722,7 @@ msgstr "Algo fallou ao intentar seguir a <strong>%(account)s</strong>"
#: bookwyrm/templates/ostatus/error.html:47
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
#, python-format
@ -3736,7 +3752,7 @@ msgstr "Seguir a %(username)s no fediverso"
#: bookwyrm/templates/ostatus/remote_follow.html:33
#, python-format
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
msgid "User handle to follow from:"
@ -3912,7 +3928,7 @@ msgstr "Eliminar a conta de xeito definitivo"
#: bookwyrm/templates/preferences/delete_user.html:29
msgid "Deleting your account cannot be undone. The username will not be available to register in the future."
msgstr "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
msgid "Disable Two Factor Authentication"
@ -4429,48 +4445,48 @@ msgstr "Prioridade media"
msgid "High priority"
msgstr "Alta prioridade"
#: bookwyrm/templates/settings/celery.html:40
#: bookwyrm/templates/settings/celery.html:46
msgid "Could not connect to Redis broker"
msgstr "Non puido conectar con Redis broker"
#: bookwyrm/templates/settings/celery.html:48
#: bookwyrm/templates/settings/celery.html:54
msgid "Active Tasks"
msgstr "Tarefas activas"
#: bookwyrm/templates/settings/celery.html:53
#: bookwyrm/templates/settings/imports/imports.html:82
#: bookwyrm/templates/settings/celery.html:59
#: bookwyrm/templates/settings/imports/imports.html:113
msgid "ID"
msgstr "ID"
#: bookwyrm/templates/settings/celery.html:54
#: bookwyrm/templates/settings/celery.html:60
msgid "Task name"
msgstr "Nome da tarefa"
#: bookwyrm/templates/settings/celery.html:55
#: bookwyrm/templates/settings/celery.html:61
msgid "Run time"
msgstr "Tempo de execución"
#: bookwyrm/templates/settings/celery.html:56
#: bookwyrm/templates/settings/celery.html:62
msgid "Priority"
msgstr "Prioridade"
#: bookwyrm/templates/settings/celery.html:61
#: bookwyrm/templates/settings/celery.html:67
msgid "No active tasks"
msgstr "Nai tarefas activas"
#: bookwyrm/templates/settings/celery.html:79
#: bookwyrm/templates/settings/celery.html:85
msgid "Workers"
msgstr "Procesos"
#: bookwyrm/templates/settings/celery.html:84
#: bookwyrm/templates/settings/celery.html:90
msgid "Uptime:"
msgstr "Uptime:"
#: bookwyrm/templates/settings/celery.html:94
#: bookwyrm/templates/settings/celery.html:100
msgid "Could not connect to Celery"
msgstr "Non hai conexión con Celery"
#: bookwyrm/templates/settings/celery.html:101
#: bookwyrm/templates/settings/celery.html:107
msgid "Errors"
msgstr "Erros"
@ -4850,27 +4866,55 @@ msgstr "As usuarias actualmente non poden realizar importacións"
msgid "Enable imports"
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"
msgstr "Completada"
#: bookwyrm/templates/settings/imports/imports.html:85
#: bookwyrm/templates/settings/imports/imports.html:116
msgid "User"
msgstr "Usuaria"
#: bookwyrm/templates/settings/imports/imports.html:94
#: bookwyrm/templates/settings/imports/imports.html:125
msgid "Date Updated"
msgstr "Data de actualización"
#: bookwyrm/templates/settings/imports/imports.html:101
#: bookwyrm/templates/settings/imports/imports.html:132
msgid "Pending items"
msgstr "Elementos pendentes"
#: bookwyrm/templates/settings/imports/imports.html:104
#: bookwyrm/templates/settings/imports/imports.html:135
msgid "Successful items"
msgstr "Elementos correctos"
#: bookwyrm/templates/settings/imports/imports.html:139
#: bookwyrm/templates/settings/imports/imports.html:170
msgid "No matching imports found."
msgstr "Non se atopan importacións que concorden."
@ -5131,34 +5175,38 @@ msgstr "Non se gardaron os axustes"
msgid "Allow registration"
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"
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)"
msgstr "(Recomendable se o rexistro está aberto)"
#: bookwyrm/templates/settings/registration.html:51
#: bookwyrm/templates/settings/registration.html:68
msgid "Allow invite requests"
msgstr "Permitir solicitudes de convite"
#: bookwyrm/templates/settings/registration.html:55
#: bookwyrm/templates/settings/registration.html:72
#: bookwyrm/templates/settings/registration_limited.html:42
msgid "Invite request text:"
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
msgid "Set a question for invite requests"
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
msgid "Question:"
msgstr "Pregunta:"
#: bookwyrm/templates/settings/registration.html:73
#: bookwyrm/templates/settings/registration.html:90
#: bookwyrm/templates/settings/registration_limited.html:67
msgid "Registration closed text:"
msgstr "Texto se o rexistro está pechado:"
@ -5400,7 +5448,7 @@ msgid "Remove theme"
msgstr "Eliminar decorado"
#: 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"
msgstr "Eliminar definitivamente a usuaria"
@ -5425,7 +5473,7 @@ msgstr "Usuarias eliminadas"
#: bookwyrm/templates/settings/users/user_admin.html:44
#: bookwyrm/templates/settings/users/username_filter.html:5
msgid "Username"
msgstr "Nome de usuaria"
msgstr "Identificador"
#: bookwyrm/templates/settings/users/user_admin.html:48
msgid "Date Added"
@ -5522,14 +5570,18 @@ msgid "User Actions"
msgstr "Accións da usuaria"
#: 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"
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"
msgstr "Usuaria reactivada"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:48
#: bookwyrm/templates/settings/users/user_moderation_actions.html:54
msgid "Access level:"
msgstr "Nivel de acceso:"
@ -6379,33 +6431,53 @@ msgstr "%(username)s non segue a ninguén"
msgid "No reviews or comments yet!"
msgstr "Aínda non hai recensións ou comentarios!"
#: bookwyrm/templates/user/user.html:16
#: bookwyrm/templates/user/user.html:20
msgid "Edit profile"
msgstr "Editar perfil"
#: bookwyrm/templates/user/user.html:38
#: bookwyrm/templates/user/user.html:42
#, python-format
msgid "View all %(size)s"
msgstr "Ver os %(size)s"
#: bookwyrm/templates/user/user.html:52
#: bookwyrm/templates/user/user.html:56
msgid "View all books"
msgstr "Ver tódolos libros"
#: bookwyrm/templates/user/user.html:59
#: bookwyrm/templates/user/user.html:63
#, python-format
msgid "%(current_year)s Reading Goal"
msgstr "Obxectivo de Lectura para %(current_year)s"
#: bookwyrm/templates/user/user.html:66
#: bookwyrm/templates/user/user.html:70
msgid "User Activity"
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"
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!"
msgstr "Sen actividade!"
@ -6449,16 +6521,43 @@ msgstr "Desconectar"
msgid "File exceeds maximum size: 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
#, python-format
msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s: %(subtitle)s"
#: bookwyrm/views/rss_feed.py:34
#: bookwyrm/views/rss_feed.py:35
#, python-brace-format
msgid "Status updates from {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
#, python-format
msgid "Load %(count)d unread status"

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-11 22:46+0000\n"
"PO-Revision-Date: 2023-01-20 13:11\n"
"POT-Creation-Date: 2023-01-30 08:21+0000\n"
"PO-Revision-Date: 2023-03-07 12:09\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Italian\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
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
msgid "Reading finished date cannot be in the future."
@ -256,14 +256,14 @@ msgstr "Followers"
msgid "Private"
msgstr "Privata"
#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:157
#: bookwyrm/templates/settings/imports/imports.html:67
#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:168
#: bookwyrm/templates/settings/imports/imports.html:98
#: bookwyrm/templates/settings/users/user_admin.html:81
#: bookwyrm/templates/settings/users/user_info.html:28
msgid "Active"
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"
msgstr "Completato"
@ -316,19 +316,19 @@ msgstr "Citazioni"
msgid "Everything else"
msgstr "Tutto il resto"
#: bookwyrm/settings.py:214
#: bookwyrm/settings.py:217
msgid "Home Timeline"
msgstr "La tua timeline"
#: bookwyrm/settings.py:214
#: bookwyrm/settings.py:217
msgid "Home"
msgstr "Home"
#: bookwyrm/settings.py:215
#: bookwyrm/settings.py:218
msgid "Books Timeline"
msgstr "Timeline dei libri"
#: bookwyrm/settings.py:215
#: bookwyrm/settings.py:218
#: bookwyrm/templates/guided_tour/user_profile.html:101
#: bookwyrm/templates/search/layout.html:22
#: bookwyrm/templates/search/layout.html:43
@ -336,75 +336,75 @@ msgstr "Timeline dei libri"
msgid "Books"
msgstr "Libri"
#: bookwyrm/settings.py:287
#: bookwyrm/settings.py:290
msgid "English"
msgstr "English (Inglese)"
#: bookwyrm/settings.py:288
#: bookwyrm/settings.py:291
msgid "Català (Catalan)"
msgstr "Català (catalano)"
#: bookwyrm/settings.py:289
#: bookwyrm/settings.py:292
msgid "Deutsch (German)"
msgstr "Deutsch (Tedesco)"
#: bookwyrm/settings.py:290
#: bookwyrm/settings.py:293
msgid "Español (Spanish)"
msgstr "Español (Spagnolo)"
#: bookwyrm/settings.py:291
#: bookwyrm/settings.py:294
msgid "Euskara (Basque)"
msgstr "Euskara (Basque)"
#: bookwyrm/settings.py:292
#: bookwyrm/settings.py:295
msgid "Galego (Galician)"
msgstr "Galego (Galiziano)"
#: bookwyrm/settings.py:293
#: bookwyrm/settings.py:296
msgid "Italiano (Italian)"
msgstr "Italiano (Italiano)"
#: bookwyrm/settings.py:294
#: bookwyrm/settings.py:297
msgid "Suomi (Finnish)"
msgstr "Suomi (Finlandese)"
#: bookwyrm/settings.py:295
#: bookwyrm/settings.py:298
msgid "Français (French)"
msgstr "Français (Francese)"
#: bookwyrm/settings.py:296
#: bookwyrm/settings.py:299
msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (Lituano)"
#: bookwyrm/settings.py:297
#: bookwyrm/settings.py:300
msgid "Norsk (Norwegian)"
msgstr "Norsk (Norvegese)"
#: bookwyrm/settings.py:298
#: bookwyrm/settings.py:301
msgid "Polski (Polish)"
msgstr "Polski (Polacco)"
#: bookwyrm/settings.py:299
#: bookwyrm/settings.py:302
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português do Brasil (Portoghese Brasiliano)"
#: bookwyrm/settings.py:300
#: bookwyrm/settings.py:303
msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Portoghese europeo)"
#: bookwyrm/settings.py:301
#: bookwyrm/settings.py:304
msgid "Română (Romanian)"
msgstr "Rumeno (Romanian)"
#: bookwyrm/settings.py:302
#: bookwyrm/settings.py:305
msgid "Svenska (Swedish)"
msgstr "Svenska (Svedese)"
#: bookwyrm/settings.py:303
#: bookwyrm/settings.py:306
msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (Cinese Semplificato)"
#: bookwyrm/settings.py:304
#: bookwyrm/settings.py:307
msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (Cinese Tradizionale)"
@ -847,10 +847,10 @@ msgstr "ISNI:"
#: bookwyrm/templates/settings/announcements/edit_announcement.html:120
#: bookwyrm/templates/settings/federation/edit_instance.html:98
#: bookwyrm/templates/settings/federation/instance.html:105
#: bookwyrm/templates/settings/registration.html:79
#: bookwyrm/templates/settings/registration.html:96
#: bookwyrm/templates/settings/registration_limited.html:76
#: bookwyrm/templates/settings/site.html:144
#: bookwyrm/templates/settings/users/user_moderation_actions.html:69
#: bookwyrm/templates/settings/users/user_moderation_actions.html:75
#: bookwyrm/templates/shelf/form.html:25
#: bookwyrm/templates/snippets/reading_modals/layout.html:18
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:112
#: 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"
msgstr "Indietro"
@ -1372,7 +1372,7 @@ msgid "Domain"
msgstr "Dominio"
#: 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/settings/announcements/announcements.html:37
#: 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/settings/announcements/announcements.html:41
#: 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/themes.html:99
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/user_menu.html:44
msgid "Direct Messages"
msgstr "Messaggi Diretti"
msgstr "Messaggi diretti"
#: bookwyrm/templates/feed/direct_messages.html:13
msgid "All messages"
@ -1859,7 +1859,7 @@ msgstr "Aggiornamenti"
#: bookwyrm/templates/guided_tour/home.html:127
#: bookwyrm/templates/user_menu.html:39
msgid "Your Books"
msgstr "I Tuoi Libri"
msgstr "I tuoi libri"
#: bookwyrm/templates/feed/suggested_books.html:10
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"
#: 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
msgid "To Read"
msgstr "Da leggere"
#: 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
msgid "Currently Reading"
msgstr "Letture correnti"
@ -1921,12 +1921,12 @@ msgstr "Letture correnti"
#: bookwyrm/templates/snippets/shelf_selector.html:46
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12
#: bookwyrm/templates/user/user.html:35 bookwyrm/templatetags/shelf_tags.py:52
#: bookwyrm/templates/user/user.html:39 bookwyrm/templatetags/shelf_tags.py:52
msgid "Read"
msgstr "Letti"
#: 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"
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."
#: 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"
msgstr "Profilo utente"
@ -2689,85 +2689,100 @@ msgstr "Importa libri"
msgid "Not a valid CSV file"
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
msgid "On average, recent imports have taken %(hours)s hours."
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
msgid "On average, recent imports have taken %(minutes)s minutes."
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:"
msgstr "Sorgenti dati:"
#: bookwyrm/templates/import/import.html:47
#: bookwyrm/templates/import/import.html:53
msgid "Goodreads (CSV)"
msgstr "Goodreads (CSV)"
#: bookwyrm/templates/import/import.html:50
#: bookwyrm/templates/import/import.html:56
msgid "Storygraph (CSV)"
msgstr "Storygraph (CSV)"
#: bookwyrm/templates/import/import.html:53
#: bookwyrm/templates/import/import.html:59
msgid "LibraryThing (TSV)"
msgstr "LibraryThing (TSV)"
#: bookwyrm/templates/import/import.html:56
#: bookwyrm/templates/import/import.html:62
msgid "OpenLibrary (CSV)"
msgstr "OpenLibrary (CSV)"
#: bookwyrm/templates/import/import.html:59
#: bookwyrm/templates/import/import.html:65
msgid "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."
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:"
msgstr "Dati file:"
#: bookwyrm/templates/import/import.html:82
#: bookwyrm/templates/import/import.html:88
msgid "Include reviews"
msgstr "Includi recensioni"
#: bookwyrm/templates/import/import.html:87
#: bookwyrm/templates/import/import.html:93
msgid "Privacy setting for imported reviews:"
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/settings/federation/instance_blocklist.html:78
msgid "Import"
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."
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"
msgstr "Importazioni recenti"
#: bookwyrm/templates/import/import.html:113
#: bookwyrm/templates/settings/imports/imports.html:89
#: bookwyrm/templates/import/import.html:124
#: bookwyrm/templates/settings/imports/imports.html:120
msgid "Date Created"
msgstr "Data Creazione"
#: bookwyrm/templates/import/import.html:116
#: bookwyrm/templates/import/import.html:127
msgid "Last Updated"
msgstr "Ultimo Aggiornamento"
#: bookwyrm/templates/import/import.html:119
#: bookwyrm/templates/settings/imports/imports.html:98
#: bookwyrm/templates/import/import.html:130
#: bookwyrm/templates/settings/imports/imports.html:129
msgid "Items"
msgstr "Elementi"
#: bookwyrm/templates/import/import.html:128
#: bookwyrm/templates/import/import.html:139
msgid "No recent imports"
msgstr "Nessuna importazione recente"
@ -2783,6 +2798,7 @@ msgid "Retry Status"
msgstr "Riprova stato"
#: 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:9
#: bookwyrm/templates/settings/layout.html:82
@ -2802,7 +2818,7 @@ msgid "Refresh"
msgstr "Aggiorna"
#: bookwyrm/templates/import/import_status.html:72
#: bookwyrm/templates/settings/imports/imports.html:130
#: bookwyrm/templates/settings/imports/imports.html:161
msgid "Stop import"
msgstr "Interrompi importazione"
@ -2920,7 +2936,7 @@ msgid "Reject"
msgstr "Rifiutato"
#: bookwyrm/templates/import/troubleshoot.html:7
#: bookwyrm/templates/settings/imports/imports.html:107
#: bookwyrm/templates/settings/imports/imports.html:138
msgid "Failed items"
msgstr "Elementi non riusciti"
@ -3171,7 +3187,7 @@ msgid "Delete this list?"
msgstr "Vuoi eliminare la lista selezionata?"
#: bookwyrm/templates/lists/edit_form.html:5
#: bookwyrm/templates/lists/layout.html:18
#: bookwyrm/templates/lists/layout.html:23
msgid "Edit List"
msgstr "Modifica lista"
@ -3355,7 +3371,7 @@ msgstr "Tutte le liste"
#: bookwyrm/templates/lists/lists.html:40
msgid "Saved Lists"
msgstr "Liste Salvate"
msgstr "Liste salvate"
#: bookwyrm/templates/notifications/items/accept.html:18
#, python-format
@ -4429,48 +4445,48 @@ msgstr "Priorità media"
msgid "High priority"
msgstr "Priorità alta"
#: bookwyrm/templates/settings/celery.html:40
#: bookwyrm/templates/settings/celery.html:46
msgid "Could not connect to Redis broker"
msgstr "Impossibile connettersi al broker Redis"
#: bookwyrm/templates/settings/celery.html:48
#: bookwyrm/templates/settings/celery.html:54
msgid "Active Tasks"
msgstr "Processi attivi"
#: bookwyrm/templates/settings/celery.html:53
#: bookwyrm/templates/settings/imports/imports.html:82
#: bookwyrm/templates/settings/celery.html:59
#: bookwyrm/templates/settings/imports/imports.html:113
msgid "ID"
msgstr "ID"
#: bookwyrm/templates/settings/celery.html:54
#: bookwyrm/templates/settings/celery.html:60
msgid "Task name"
msgstr "Nome attività"
#: bookwyrm/templates/settings/celery.html:55
#: bookwyrm/templates/settings/celery.html:61
msgid "Run time"
msgstr "Tempo di esecuzione"
#: bookwyrm/templates/settings/celery.html:56
#: bookwyrm/templates/settings/celery.html:62
msgid "Priority"
msgstr "Priorità"
#: bookwyrm/templates/settings/celery.html:61
#: bookwyrm/templates/settings/celery.html:67
msgid "No active tasks"
msgstr "Nessun processo attivo"
#: bookwyrm/templates/settings/celery.html:79
#: bookwyrm/templates/settings/celery.html:85
msgid "Workers"
msgstr "Workers"
#: bookwyrm/templates/settings/celery.html:84
#: bookwyrm/templates/settings/celery.html:90
msgid "Uptime:"
msgstr "Tempo di attività:"
#: bookwyrm/templates/settings/celery.html:94
#: bookwyrm/templates/settings/celery.html:100
msgid "Could not connect to Celery"
msgstr "Impossibile connettersi a Celery"
#: bookwyrm/templates/settings/celery.html:101
#: bookwyrm/templates/settings/celery.html:107
msgid "Errors"
msgstr "Errori"
@ -4850,27 +4866,55 @@ msgstr "Al momento gli utenti non sono in grado di avviare nuove importazioni"
msgid "Enable imports"
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"
msgstr "Completati"
#: bookwyrm/templates/settings/imports/imports.html:85
#: bookwyrm/templates/settings/imports/imports.html:116
msgid "User"
msgstr "Utente"
#: bookwyrm/templates/settings/imports/imports.html:94
#: bookwyrm/templates/settings/imports/imports.html:125
msgid "Date Updated"
msgstr "Data Aggiornamento"
#: bookwyrm/templates/settings/imports/imports.html:101
#: bookwyrm/templates/settings/imports/imports.html:132
msgid "Pending items"
msgstr "Oggetti in sospeso"
#: bookwyrm/templates/settings/imports/imports.html:104
#: bookwyrm/templates/settings/imports/imports.html:135
msgid "Successful items"
msgstr "Oggetti riusciti"
#: bookwyrm/templates/settings/imports/imports.html:139
#: bookwyrm/templates/settings/imports/imports.html:170
msgid "No matching imports found."
msgstr "Nessuna importazione corrispondente."
@ -5131,34 +5175,38 @@ msgstr "Impossibile salvare le impostazioni"
msgid "Allow registration"
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"
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)"
msgstr "(Raccomandato se la registrazione è aperta)"
#: bookwyrm/templates/settings/registration.html:51
#: bookwyrm/templates/settings/registration.html:68
msgid "Allow invite requests"
msgstr "Consenti richieste di invito"
#: bookwyrm/templates/settings/registration.html:55
#: bookwyrm/templates/settings/registration.html:72
#: bookwyrm/templates/settings/registration_limited.html:42
msgid "Invite request text:"
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
msgid "Set a question for invite requests"
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
msgid "Question:"
msgstr "Domanda:"
#: bookwyrm/templates/settings/registration.html:73
#: bookwyrm/templates/settings/registration.html:90
#: bookwyrm/templates/settings/registration_limited.html:67
msgid "Registration closed text:"
msgstr "Registrazioni chiuse:"
@ -5400,7 +5448,7 @@ msgid "Remove theme"
msgstr "Rimuovi tema"
#: 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"
msgstr "Elimina definitivamente utente"
@ -5522,14 +5570,18 @@ msgid "User Actions"
msgstr "Azioni dell'utente"
#: 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"
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"
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:"
msgstr "Livello di accesso:"
@ -6379,33 +6431,53 @@ msgstr "%(username)s non sta seguendo nessun utente"
msgid "No reviews or comments yet!"
msgstr "Ancora nessuna recensione o commento!"
#: bookwyrm/templates/user/user.html:16
#: bookwyrm/templates/user/user.html:20
msgid "Edit profile"
msgstr "Modifica profilo"
#: bookwyrm/templates/user/user.html:38
#: bookwyrm/templates/user/user.html:42
#, python-format
msgid "View all %(size)s"
msgstr "Visualizza tutti i %(size)s"
#: bookwyrm/templates/user/user.html:52
#: bookwyrm/templates/user/user.html:56
msgid "View all books"
msgstr "Visualizza tutti i libri"
#: bookwyrm/templates/user/user.html:59
#: bookwyrm/templates/user/user.html:63
#, python-format
msgid "%(current_year)s Reading Goal"
msgstr "Obiettivo di lettura %(current_year)s"
#: bookwyrm/templates/user/user.html:66
#: bookwyrm/templates/user/user.html:70
msgid "User Activity"
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"
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!"
msgstr "Ancora nessuna attività!"
@ -6449,16 +6521,43 @@ msgstr "Esci"
msgid "File exceeds maximum size: 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
#, python-format
msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s: %(subtitle)s"
#: bookwyrm/views/rss_feed.py:34
#: bookwyrm/views/rss_feed.py:35
#, python-brace-format
msgid "Status updates from {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
#, python-format
msgid "Load %(count)d unread status"

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-11 22:46+0000\n"
"PO-Revision-Date: 2023-01-12 00:08\n"
"POT-Creation-Date: 2023-01-30 08:21+0000\n"
"PO-Revision-Date: 2023-03-02 21:34\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Lithuanian\n"
"Language: lt\n"
@ -256,14 +256,14 @@ msgstr "Sekėjai"
msgid "Private"
msgstr "Privatu"
#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:157
#: bookwyrm/templates/settings/imports/imports.html:67
#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:168
#: bookwyrm/templates/settings/imports/imports.html:98
#: bookwyrm/templates/settings/users/user_admin.html:81
#: bookwyrm/templates/settings/users/user_info.html:28
msgid "Active"
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"
msgstr "Užbaigti"
@ -316,19 +316,19 @@ msgstr "Citatos"
msgid "Everything else"
msgstr "Visa kita"
#: bookwyrm/settings.py:214
#: bookwyrm/settings.py:217
msgid "Home Timeline"
msgstr "Pagrindinė siena"
#: bookwyrm/settings.py:214
#: bookwyrm/settings.py:217
msgid "Home"
msgstr "Pagrindinis"
#: bookwyrm/settings.py:215
#: bookwyrm/settings.py:218
msgid "Books Timeline"
msgstr "Knygų siena"
#: bookwyrm/settings.py:215
#: bookwyrm/settings.py:218
#: bookwyrm/templates/guided_tour/user_profile.html:101
#: bookwyrm/templates/search/layout.html:22
#: bookwyrm/templates/search/layout.html:43
@ -336,75 +336,75 @@ msgstr "Knygų siena"
msgid "Books"
msgstr "Knygos"
#: bookwyrm/settings.py:287
#: bookwyrm/settings.py:290
msgid "English"
msgstr "English (Anglų)"
#: bookwyrm/settings.py:288
#: bookwyrm/settings.py:291
msgid "Català (Catalan)"
msgstr "Català (kataloniečių)"
#: bookwyrm/settings.py:289
#: bookwyrm/settings.py:292
msgid "Deutsch (German)"
msgstr "Deutsch (Vokiečių)"
#: bookwyrm/settings.py:290
#: bookwyrm/settings.py:293
msgid "Español (Spanish)"
msgstr "Español (Ispanų)"
#: bookwyrm/settings.py:291
#: bookwyrm/settings.py:294
msgid "Euskara (Basque)"
msgstr ""
#: bookwyrm/settings.py:292
#: bookwyrm/settings.py:295
msgid "Galego (Galician)"
msgstr "Galego (galisų)"
#: bookwyrm/settings.py:293
#: bookwyrm/settings.py:296
msgid "Italiano (Italian)"
msgstr "Italų (Italian)"
#: bookwyrm/settings.py:294
#: bookwyrm/settings.py:297
msgid "Suomi (Finnish)"
msgstr "Suomi (suomių)"
#: bookwyrm/settings.py:295
#: bookwyrm/settings.py:298
msgid "Français (French)"
msgstr "Français (Prancūzų)"
#: bookwyrm/settings.py:296
#: bookwyrm/settings.py:299
msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių"
#: bookwyrm/settings.py:297
#: bookwyrm/settings.py:300
msgid "Norsk (Norwegian)"
msgstr "Norvegų (Norwegian)"
#: bookwyrm/settings.py:298
#: bookwyrm/settings.py:301
msgid "Polski (Polish)"
msgstr "Polski (lenkų)"
#: bookwyrm/settings.py:299
#: bookwyrm/settings.py:302
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português brasileiro (Brazilijos portugalų)"
#: bookwyrm/settings.py:300
#: bookwyrm/settings.py:303
msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Europos portugalų)"
#: bookwyrm/settings.py:301
#: bookwyrm/settings.py:304
msgid "Română (Romanian)"
msgstr "Română (rumunų)"
#: bookwyrm/settings.py:302
#: bookwyrm/settings.py:305
msgid "Svenska (Swedish)"
msgstr "Svenska (Švedų)"
#: bookwyrm/settings.py:303
#: bookwyrm/settings.py:306
msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (Supaprastinta kinų)"
#: bookwyrm/settings.py:304
#: bookwyrm/settings.py:307
msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (Tradicinė kinų)"
@ -855,10 +855,10 @@ msgstr "ISNI:"
#: bookwyrm/templates/settings/announcements/edit_announcement.html:120
#: bookwyrm/templates/settings/federation/edit_instance.html:98
#: bookwyrm/templates/settings/federation/instance.html:105
#: bookwyrm/templates/settings/registration.html:79
#: bookwyrm/templates/settings/registration.html:96
#: bookwyrm/templates/settings/registration_limited.html:76
#: bookwyrm/templates/settings/site.html:144
#: bookwyrm/templates/settings/users/user_moderation_actions.html:69
#: bookwyrm/templates/settings/users/user_moderation_actions.html:75
#: bookwyrm/templates/shelf/form.html:25
#: bookwyrm/templates/snippets/reading_modals/layout.html:18
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:112
#: 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"
msgstr "Atgal"
@ -1384,7 +1384,7 @@ msgid "Domain"
msgstr "Domenas"
#: 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/settings/announcements/announcements.html:37
#: 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/settings/announcements/announcements.html:41
#: 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/themes.html:99
msgid "Actions"
@ -1921,13 +1921,13 @@ msgid "Add to your books"
msgstr "Pridėti prie savo knygų"
#: 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
msgid "To Read"
msgstr "Norimos perskaityti"
#: 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
msgid "Currently Reading"
msgstr "Šiuo metu skaitomos"
@ -1937,12 +1937,12 @@ msgstr "Šiuo metu skaitomos"
#: bookwyrm/templates/snippets/shelf_selector.html:46
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12
#: bookwyrm/templates/user/user.html:35 bookwyrm/templatetags/shelf_tags.py:52
#: bookwyrm/templates/user/user.html:39 bookwyrm/templatetags/shelf_tags.py:52
msgid "Read"
msgstr "Perskaitytos"
#: 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"
msgstr "Nustota skaityti"
@ -2030,7 +2030,7 @@ msgstr "Baigti"
#: bookwyrm/templates/get_started/profile.html:15
#: bookwyrm/templates/preferences/edit_user.html:41
msgid "Display name:"
msgstr "Rodomas vardą:"
msgstr "Rodomas vardas:"
#: bookwyrm/templates/get_started/profile.html:29
#: 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ų."
#: 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"
msgstr "Nario paskyra"
@ -2709,85 +2709,100 @@ msgstr "Importuoti knygas"
msgid "Not a valid CSV file"
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
msgid "On average, recent imports have taken %(hours)s hours."
msgstr "Vidutiniškai importavimas užima %(hours)s val."
#: bookwyrm/templates/import/import.html:26
#: bookwyrm/templates/import/import.html:32
#, python-format
msgid "On average, recent imports have taken %(minutes)s minutes."
msgstr "Vidutiniškai importavimas užima %(minutes)s min."
#: bookwyrm/templates/import/import.html:41
#: bookwyrm/templates/import/import.html:47
msgid "Data source:"
msgstr "Duomenų šaltinis:"
#: bookwyrm/templates/import/import.html:47
#: bookwyrm/templates/import/import.html:53
msgid "Goodreads (CSV)"
msgstr "Goodreads (CSV)"
#: bookwyrm/templates/import/import.html:50
#: bookwyrm/templates/import/import.html:56
msgid "Storygraph (CSV)"
msgstr "Storygraph (CSV)"
#: bookwyrm/templates/import/import.html:53
#: bookwyrm/templates/import/import.html:59
msgid "LibraryThing (TSV)"
msgstr "LibraryThing (TSV)"
#: bookwyrm/templates/import/import.html:56
#: bookwyrm/templates/import/import.html:62
msgid "OpenLibrary (CSV)"
msgstr "OpenLibrary (CSV)"
#: bookwyrm/templates/import/import.html:59
#: bookwyrm/templates/import/import.html:65
msgid "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."
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:"
msgstr "Duomenų failas:"
#: bookwyrm/templates/import/import.html:82
#: bookwyrm/templates/import/import.html:88
msgid "Include reviews"
msgstr "Įtraukti atsiliepimus"
#: bookwyrm/templates/import/import.html:87
#: bookwyrm/templates/import/import.html:93
msgid "Privacy setting for imported reviews:"
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/settings/federation/instance_blocklist.html:78
msgid "Import"
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."
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"
msgstr "Pastaruoju metu importuota"
#: bookwyrm/templates/import/import.html:113
#: bookwyrm/templates/settings/imports/imports.html:89
#: bookwyrm/templates/import/import.html:124
#: bookwyrm/templates/settings/imports/imports.html:120
msgid "Date Created"
msgstr "Sukūrimo data"
#: bookwyrm/templates/import/import.html:116
#: bookwyrm/templates/import/import.html:127
msgid "Last Updated"
msgstr "Paskutinį kartą atnaujinta"
#: bookwyrm/templates/import/import.html:119
#: bookwyrm/templates/settings/imports/imports.html:98
#: bookwyrm/templates/import/import.html:130
#: bookwyrm/templates/settings/imports/imports.html:129
msgid "Items"
msgstr "Elementai"
#: bookwyrm/templates/import/import.html:128
#: bookwyrm/templates/import/import.html:139
msgid "No recent imports"
msgstr "Pastaruoju metu neimportuota"
@ -2803,6 +2818,7 @@ msgid "Retry Status"
msgstr "Pakartojimo būsena"
#: 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:9
#: bookwyrm/templates/settings/layout.html:82
@ -2822,7 +2838,7 @@ msgid "Refresh"
msgstr "Atnaujinti"
#: bookwyrm/templates/import/import_status.html:72
#: bookwyrm/templates/settings/imports/imports.html:130
#: bookwyrm/templates/settings/imports/imports.html:161
msgid "Stop import"
msgstr "Sustabdyti importavimą"
@ -2944,7 +2960,7 @@ msgid "Reject"
msgstr "Atmesti"
#: bookwyrm/templates/import/troubleshoot.html:7
#: bookwyrm/templates/settings/imports/imports.html:107
#: bookwyrm/templates/settings/imports/imports.html:138
msgid "Failed items"
msgstr "Nepavykę elementai"
@ -3195,7 +3211,7 @@ msgid "Delete this list?"
msgstr "Ištrinti šį sąrašą?"
#: bookwyrm/templates/lists/edit_form.html:5
#: bookwyrm/templates/lists/layout.html:18
#: bookwyrm/templates/lists/layout.html:23
msgid "Edit List"
msgstr "Redaguoti sąrašą"
@ -4463,48 +4479,48 @@ msgstr ""
msgid "High priority"
msgstr ""
#: bookwyrm/templates/settings/celery.html:40
#: bookwyrm/templates/settings/celery.html:46
msgid "Could not connect to Redis broker"
msgstr ""
#: bookwyrm/templates/settings/celery.html:48
#: bookwyrm/templates/settings/celery.html:54
msgid "Active Tasks"
msgstr ""
#: bookwyrm/templates/settings/celery.html:53
#: bookwyrm/templates/settings/imports/imports.html:82
#: bookwyrm/templates/settings/celery.html:59
#: bookwyrm/templates/settings/imports/imports.html:113
msgid "ID"
msgstr "ID"
#: bookwyrm/templates/settings/celery.html:54
#: bookwyrm/templates/settings/celery.html:60
msgid "Task name"
msgstr "Užduoties pavadinimas"
#: bookwyrm/templates/settings/celery.html:55
#: bookwyrm/templates/settings/celery.html:61
msgid "Run time"
msgstr "Rodymo laikas"
#: bookwyrm/templates/settings/celery.html:56
#: bookwyrm/templates/settings/celery.html:62
msgid "Priority"
msgstr "Prioritetas"
#: bookwyrm/templates/settings/celery.html:61
#: bookwyrm/templates/settings/celery.html:67
msgid "No active tasks"
msgstr "Nėra aktyvių užduočių"
#: bookwyrm/templates/settings/celery.html:79
#: bookwyrm/templates/settings/celery.html:85
msgid "Workers"
msgstr "Darbuotojai"
#: bookwyrm/templates/settings/celery.html:84
#: bookwyrm/templates/settings/celery.html:90
msgid "Uptime:"
msgstr "Veikimo laikas:"
#: bookwyrm/templates/settings/celery.html:94
#: bookwyrm/templates/settings/celery.html:100
msgid "Could not connect to Celery"
msgstr "Nepavyko prisijungti prie „Celery“"
#: bookwyrm/templates/settings/celery.html:101
#: bookwyrm/templates/settings/celery.html:107
msgid "Errors"
msgstr "Klaidos"
@ -4892,27 +4908,55 @@ msgstr "Naudotojai nebegali pradėti importuoti"
msgid "Enable imports"
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"
msgstr "Užbaigta"
#: bookwyrm/templates/settings/imports/imports.html:85
#: bookwyrm/templates/settings/imports/imports.html:116
msgid "User"
msgstr "Vartotojas"
#: bookwyrm/templates/settings/imports/imports.html:94
#: bookwyrm/templates/settings/imports/imports.html:125
msgid "Date Updated"
msgstr "Atnaujinimo data"
#: bookwyrm/templates/settings/imports/imports.html:101
#: bookwyrm/templates/settings/imports/imports.html:132
msgid "Pending items"
msgstr "Laukiami elementai"
#: bookwyrm/templates/settings/imports/imports.html:104
#: bookwyrm/templates/settings/imports/imports.html:135
msgid "Successful items"
msgstr "Sėkmingi elementai"
#: bookwyrm/templates/settings/imports/imports.html:139
#: bookwyrm/templates/settings/imports/imports.html:170
msgid "No matching imports found."
msgstr "Nerasta atitinkančių importų."
@ -5173,34 +5217,38 @@ msgstr "Nepavyko išsaugoti nustatymų"
msgid "Allow registration"
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"
msgstr "Reikalauti el. pašto patvirtinimo"
#: bookwyrm/templates/settings/registration.html:46
#: bookwyrm/templates/settings/registration.html:63
msgid "(Recommended if registration is open)"
msgstr "(Rekomenduojama, jei leidžiama registruotis)"
#: bookwyrm/templates/settings/registration.html:51
#: bookwyrm/templates/settings/registration.html:68
msgid "Allow invite requests"
msgstr "Leisti prašyti kvietimų"
#: bookwyrm/templates/settings/registration.html:55
#: bookwyrm/templates/settings/registration.html:72
#: bookwyrm/templates/settings/registration_limited.html:42
msgid "Invite request text:"
msgstr "Kvietimo prašymo tekstas:"
#: bookwyrm/templates/settings/registration.html:63
#: bookwyrm/templates/settings/registration.html:80
#: bookwyrm/templates/settings/registration_limited.html:50
msgid "Set a question for invite requests"
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
msgid "Question:"
msgstr "Klausimas:"
#: bookwyrm/templates/settings/registration.html:73
#: bookwyrm/templates/settings/registration.html:90
#: bookwyrm/templates/settings/registration_limited.html:67
msgid "Registration closed text:"
msgstr "Užrakintos registracijos tekstas:"
@ -5442,7 +5490,7 @@ msgid "Remove theme"
msgstr "Pašalinti temą"
#: 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"
msgstr "Visam laikui ištrinti vartotoją"
@ -5564,14 +5612,18 @@ msgid "User Actions"
msgstr "Nario veiksmai"
#: 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"
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"
msgstr "Atblokuoti narį"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:48
#: bookwyrm/templates/settings/users/user_moderation_actions.html:54
msgid "Access level:"
msgstr "Priėjimo lygis:"
@ -6435,33 +6487,53 @@ msgstr "%(username)s nieko neseka"
msgid "No reviews or comments yet!"
msgstr ""
#: bookwyrm/templates/user/user.html:16
#: bookwyrm/templates/user/user.html:20
msgid "Edit profile"
msgstr "Redaguoti paskyrą"
#: bookwyrm/templates/user/user.html:38
#: bookwyrm/templates/user/user.html:42
#, python-format
msgid "View all %(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"
msgstr "Žiūrėti visas knygas"
#: bookwyrm/templates/user/user.html:59
#: bookwyrm/templates/user/user.html:63
#, python-format
msgid "%(current_year)s Reading Goal"
msgstr "%(current_year)s skaitymo tikslas"
#: bookwyrm/templates/user/user.html:66
#: bookwyrm/templates/user/user.html:70
msgid "User Activity"
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"
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!"
msgstr "Įrašų dar nėra"
@ -6509,16 +6581,45 @@ msgstr "Atsijungti"
msgid "File exceeds maximum size: 10MB"
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
#, python-format
msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s: %(subtitle)s"
#: bookwyrm/views/rss_feed.py:34
#: bookwyrm/views/rss_feed.py:35
#, python-brace-format
msgid "Status updates from {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
#, python-format
msgid "Load %(count)d unread status"

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-11 22:46+0000\n"
"PO-Revision-Date: 2023-01-12 00:08\n"
"POT-Creation-Date: 2023-01-30 08:21+0000\n"
"PO-Revision-Date: 2023-01-30 17:36\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Norwegian\n"
"Language: no\n"
@ -256,14 +256,14 @@ msgstr "Følgere"
msgid "Private"
msgstr "Privat"
#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:157
#: bookwyrm/templates/settings/imports/imports.html:67
#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:168
#: bookwyrm/templates/settings/imports/imports.html:98
#: bookwyrm/templates/settings/users/user_admin.html:81
#: bookwyrm/templates/settings/users/user_info.html:28
msgid "Active"
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"
msgstr ""
@ -316,19 +316,19 @@ msgstr "Sitater"
msgid "Everything else"
msgstr "Andre ting"
#: bookwyrm/settings.py:214
#: bookwyrm/settings.py:217
msgid "Home Timeline"
msgstr "Lokal tidslinje"
#: bookwyrm/settings.py:214
#: bookwyrm/settings.py:217
msgid "Home"
msgstr "Hjem"
#: bookwyrm/settings.py:215
#: bookwyrm/settings.py:218
msgid "Books Timeline"
msgstr "Boktidslinja"
#: bookwyrm/settings.py:215
#: bookwyrm/settings.py:218
#: bookwyrm/templates/guided_tour/user_profile.html:101
#: bookwyrm/templates/search/layout.html:22
#: bookwyrm/templates/search/layout.html:43
@ -336,75 +336,75 @@ msgstr "Boktidslinja"
msgid "Books"
msgstr "Bøker"
#: bookwyrm/settings.py:287
#: bookwyrm/settings.py:290
msgid "English"
msgstr "English (Engelsk)"
#: bookwyrm/settings.py:288
#: bookwyrm/settings.py:291
msgid "Català (Catalan)"
msgstr "Català (katalansk)"
#: bookwyrm/settings.py:289
#: bookwyrm/settings.py:292
msgid "Deutsch (German)"
msgstr "Deutsch (Tysk)"
#: bookwyrm/settings.py:290
#: bookwyrm/settings.py:293
msgid "Español (Spanish)"
msgstr "Español (Spansk)"
#: bookwyrm/settings.py:291
#: bookwyrm/settings.py:294
msgid "Euskara (Basque)"
msgstr ""
#: bookwyrm/settings.py:292
#: bookwyrm/settings.py:295
msgid "Galego (Galician)"
msgstr "Galego (Gallisk)"
#: bookwyrm/settings.py:293
#: bookwyrm/settings.py:296
msgid "Italiano (Italian)"
msgstr "Italiano (Italiensk)"
#: bookwyrm/settings.py:294
#: bookwyrm/settings.py:297
msgid "Suomi (Finnish)"
msgstr "Suomi (finsk)"
#: bookwyrm/settings.py:295
#: bookwyrm/settings.py:298
msgid "Français (French)"
msgstr "Français (Fransk)"
#: bookwyrm/settings.py:296
#: bookwyrm/settings.py:299
msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (Litauisk)"
#: bookwyrm/settings.py:297
#: bookwyrm/settings.py:300
msgid "Norsk (Norwegian)"
msgstr "Norsk (Norsk)"
#: bookwyrm/settings.py:298
#: bookwyrm/settings.py:301
msgid "Polski (Polish)"
msgstr "Polski (Polsk)"
#: bookwyrm/settings.py:299
#: bookwyrm/settings.py:302
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português - Brasil (Brasiliansk portugisisk)"
#: bookwyrm/settings.py:300
#: bookwyrm/settings.py:303
msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Europeisk Portugisisk)"
#: bookwyrm/settings.py:301
#: bookwyrm/settings.py:304
msgid "Română (Romanian)"
msgstr "Română (romansk)"
#: bookwyrm/settings.py:302
#: bookwyrm/settings.py:305
msgid "Svenska (Swedish)"
msgstr "Svenska (Svensk)"
#: bookwyrm/settings.py:303
#: bookwyrm/settings.py:306
msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (Forenklet kinesisk)"
#: bookwyrm/settings.py:304
#: bookwyrm/settings.py:307
msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (Tradisjonelt kinesisk)"
@ -847,10 +847,10 @@ msgstr "ISNI:"
#: bookwyrm/templates/settings/announcements/edit_announcement.html:120
#: bookwyrm/templates/settings/federation/edit_instance.html:98
#: bookwyrm/templates/settings/federation/instance.html:105
#: bookwyrm/templates/settings/registration.html:79
#: bookwyrm/templates/settings/registration.html:96
#: bookwyrm/templates/settings/registration_limited.html:76
#: bookwyrm/templates/settings/site.html:144
#: bookwyrm/templates/settings/users/user_moderation_actions.html:69
#: bookwyrm/templates/settings/users/user_moderation_actions.html:75
#: bookwyrm/templates/shelf/form.html:25
#: bookwyrm/templates/snippets/reading_modals/layout.html:18
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:112
#: 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"
msgstr "Tilbake"
@ -1372,7 +1372,7 @@ msgid "Domain"
msgstr "Domene"
#: 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/settings/announcements/announcements.html:37
#: 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/settings/announcements/announcements.html:41
#: 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/themes.html:99
msgid "Actions"
@ -1905,13 +1905,13 @@ msgid "Add to your books"
msgstr "Legg til i bøkene dine"
#: 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
msgid "To Read"
msgstr "Å lese"
#: 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
msgid "Currently Reading"
msgstr "Leser nå"
@ -1921,12 +1921,12 @@ msgstr "Leser nå"
#: bookwyrm/templates/snippets/shelf_selector.html:46
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12
#: bookwyrm/templates/user/user.html:35 bookwyrm/templatetags/shelf_tags.py:52
#: bookwyrm/templates/user/user.html:39 bookwyrm/templatetags/shelf_tags.py:52
msgid "Read"
msgstr "Lest"
#: 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"
msgstr "Stoppet lesing"
@ -2642,7 +2642,7 @@ msgid "This is your user profile. All your latest activities will be listed here
msgstr ""
#: 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"
msgstr "Brukerprofil"
@ -2689,85 +2689,100 @@ msgstr "Importer bøker"
msgid "Not a valid CSV file"
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
msgid "On average, recent imports have taken %(hours)s hours."
msgstr ""
#: bookwyrm/templates/import/import.html:26
#: bookwyrm/templates/import/import.html:32
#, python-format
msgid "On average, recent imports have taken %(minutes)s minutes."
msgstr ""
#: bookwyrm/templates/import/import.html:41
#: bookwyrm/templates/import/import.html:47
msgid "Data source:"
msgstr "Datakilde:"
#: bookwyrm/templates/import/import.html:47
#: bookwyrm/templates/import/import.html:53
msgid "Goodreads (CSV)"
msgstr ""
#: bookwyrm/templates/import/import.html:50
#: bookwyrm/templates/import/import.html:56
msgid "Storygraph (CSV)"
msgstr ""
#: bookwyrm/templates/import/import.html:53
#: bookwyrm/templates/import/import.html:59
msgid "LibraryThing (TSV)"
msgstr ""
#: bookwyrm/templates/import/import.html:56
#: bookwyrm/templates/import/import.html:62
msgid "OpenLibrary (CSV)"
msgstr ""
#: bookwyrm/templates/import/import.html:59
#: bookwyrm/templates/import/import.html:65
msgid "Calibre (CSV)"
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."
msgstr ""
#: bookwyrm/templates/import/import.html:74
#: bookwyrm/templates/import/import.html:80
msgid "Data file:"
msgstr "Datafil:"
#: bookwyrm/templates/import/import.html:82
#: bookwyrm/templates/import/import.html:88
msgid "Include reviews"
msgstr "Inkluder anmeldelser"
#: bookwyrm/templates/import/import.html:87
#: bookwyrm/templates/import/import.html:93
msgid "Privacy setting for imported reviews:"
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/settings/federation/instance_blocklist.html:78
msgid "Import"
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."
msgstr ""
#: bookwyrm/templates/import/import.html:108
#: bookwyrm/templates/import/import.html:119
msgid "Recent Imports"
msgstr "Nylig importer"
#: bookwyrm/templates/import/import.html:113
#: bookwyrm/templates/settings/imports/imports.html:89
#: bookwyrm/templates/import/import.html:124
#: bookwyrm/templates/settings/imports/imports.html:120
msgid "Date Created"
msgstr ""
#: bookwyrm/templates/import/import.html:116
#: bookwyrm/templates/import/import.html:127
msgid "Last Updated"
msgstr ""
#: bookwyrm/templates/import/import.html:119
#: bookwyrm/templates/settings/imports/imports.html:98
#: bookwyrm/templates/import/import.html:130
#: bookwyrm/templates/settings/imports/imports.html:129
msgid "Items"
msgstr ""
#: bookwyrm/templates/import/import.html:128
#: bookwyrm/templates/import/import.html:139
msgid "No recent imports"
msgstr "Ingen nylige importer"
@ -2783,6 +2798,7 @@ msgid "Retry Status"
msgstr "Status for nytt forsøk"
#: 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:9
#: bookwyrm/templates/settings/layout.html:82
@ -2802,7 +2818,7 @@ msgid "Refresh"
msgstr "Oppdater"
#: bookwyrm/templates/import/import_status.html:72
#: bookwyrm/templates/settings/imports/imports.html:130
#: bookwyrm/templates/settings/imports/imports.html:161
msgid "Stop import"
msgstr ""
@ -2920,7 +2936,7 @@ msgid "Reject"
msgstr "Avslå"
#: bookwyrm/templates/import/troubleshoot.html:7
#: bookwyrm/templates/settings/imports/imports.html:107
#: bookwyrm/templates/settings/imports/imports.html:138
msgid "Failed items"
msgstr "Mislykkede ting"
@ -3171,7 +3187,7 @@ msgid "Delete this list?"
msgstr "Slett denne lista?"
#: bookwyrm/templates/lists/edit_form.html:5
#: bookwyrm/templates/lists/layout.html:18
#: bookwyrm/templates/lists/layout.html:23
msgid "Edit List"
msgstr "Redigér lista"
@ -4427,48 +4443,48 @@ msgstr ""
msgid "High priority"
msgstr ""
#: bookwyrm/templates/settings/celery.html:40
#: bookwyrm/templates/settings/celery.html:46
msgid "Could not connect to Redis broker"
msgstr ""
#: bookwyrm/templates/settings/celery.html:48
#: bookwyrm/templates/settings/celery.html:54
msgid "Active Tasks"
msgstr ""
#: bookwyrm/templates/settings/celery.html:53
#: bookwyrm/templates/settings/imports/imports.html:82
#: bookwyrm/templates/settings/celery.html:59
#: bookwyrm/templates/settings/imports/imports.html:113
msgid "ID"
msgstr ""
#: bookwyrm/templates/settings/celery.html:54
#: bookwyrm/templates/settings/celery.html:60
msgid "Task name"
msgstr ""
#: bookwyrm/templates/settings/celery.html:55
#: bookwyrm/templates/settings/celery.html:61
msgid "Run time"
msgstr ""
#: bookwyrm/templates/settings/celery.html:56
#: bookwyrm/templates/settings/celery.html:62
msgid "Priority"
msgstr ""
#: bookwyrm/templates/settings/celery.html:61
#: bookwyrm/templates/settings/celery.html:67
msgid "No active tasks"
msgstr ""
#: bookwyrm/templates/settings/celery.html:79
#: bookwyrm/templates/settings/celery.html:85
msgid "Workers"
msgstr ""
#: bookwyrm/templates/settings/celery.html:84
#: bookwyrm/templates/settings/celery.html:90
msgid "Uptime:"
msgstr ""
#: bookwyrm/templates/settings/celery.html:94
#: bookwyrm/templates/settings/celery.html:100
msgid "Could not connect to Celery"
msgstr ""
#: bookwyrm/templates/settings/celery.html:101
#: bookwyrm/templates/settings/celery.html:107
msgid "Errors"
msgstr ""
@ -4848,27 +4864,55 @@ msgstr ""
msgid "Enable imports"
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"
msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:85
#: bookwyrm/templates/settings/imports/imports.html:116
msgid "User"
msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:94
#: bookwyrm/templates/settings/imports/imports.html:125
msgid "Date Updated"
msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:101
#: bookwyrm/templates/settings/imports/imports.html:132
msgid "Pending items"
msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:104
#: bookwyrm/templates/settings/imports/imports.html:135
msgid "Successful items"
msgstr ""
#: bookwyrm/templates/settings/imports/imports.html:139
#: bookwyrm/templates/settings/imports/imports.html:170
msgid "No matching imports found."
msgstr ""
@ -5129,34 +5173,38 @@ msgstr ""
msgid "Allow registration"
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"
msgstr "Medlemmer må bekrefte e-postadresse"
#: bookwyrm/templates/settings/registration.html:46
#: bookwyrm/templates/settings/registration.html:63
msgid "(Recommended if registration is open)"
msgstr "(anbefales for åpen registrering)"
#: bookwyrm/templates/settings/registration.html:51
#: bookwyrm/templates/settings/registration.html:68
msgid "Allow invite requests"
msgstr "Tillat invitasjonsforespørsler"
#: bookwyrm/templates/settings/registration.html:55
#: bookwyrm/templates/settings/registration.html:72
#: bookwyrm/templates/settings/registration_limited.html:42
msgid "Invite request text:"
msgstr "Invitasjonsforespørsel tekst:"
#: bookwyrm/templates/settings/registration.html:63
#: bookwyrm/templates/settings/registration.html:80
#: bookwyrm/templates/settings/registration_limited.html:50
msgid "Set a question for invite requests"
msgstr ""
#: bookwyrm/templates/settings/registration.html:68
#: bookwyrm/templates/settings/registration.html:85
#: bookwyrm/templates/settings/registration_limited.html:55
msgid "Question:"
msgstr ""
#: bookwyrm/templates/settings/registration.html:73
#: bookwyrm/templates/settings/registration.html:90
#: bookwyrm/templates/settings/registration_limited.html:67
msgid "Registration closed text:"
msgstr "Registrering lukket tekst:"
@ -5398,7 +5446,7 @@ msgid "Remove theme"
msgstr ""
#: 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"
msgstr "Slett medlem for godt"
@ -5520,14 +5568,18 @@ msgid "User Actions"
msgstr "Brukerhandlinger"
#: 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"
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"
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:"
msgstr "Tilgangsnivå:"
@ -6377,33 +6429,53 @@ msgstr "%(username)s følger ingen andre medlemmer"
msgid "No reviews or comments yet!"
msgstr ""
#: bookwyrm/templates/user/user.html:16
#: bookwyrm/templates/user/user.html:20
msgid "Edit profile"
msgstr "Rediger profil"
#: bookwyrm/templates/user/user.html:38
#: bookwyrm/templates/user/user.html:42
#, python-format
msgid "View all %(size)s"
msgstr "Vis alle %(size)s"
#: bookwyrm/templates/user/user.html:52
#: bookwyrm/templates/user/user.html:56
msgid "View all books"
msgstr "Se alle bøker"
#: bookwyrm/templates/user/user.html:59
#: bookwyrm/templates/user/user.html:63
#, python-format
msgid "%(current_year)s Reading Goal"
msgstr "%(current_year)s lesemål"
#: bookwyrm/templates/user/user.html:66
#: bookwyrm/templates/user/user.html:70
msgid "User Activity"
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"
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!"
msgstr "Ingen aktivitet enda!"
@ -6447,16 +6519,43 @@ msgstr "Logg ut"
msgid "File exceeds maximum size: 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
#, python-format
msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s: %(subtitle)s"
#: bookwyrm/views/rss_feed.py:34
#: bookwyrm/views/rss_feed.py:35
#, python-brace-format
msgid "Status updates from {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
#, python-format
msgid "Load %(count)d unread status"

Binary file not shown.

View file

@ -2,8 +2,8 @@ msgid ""
msgstr ""
"Project-Id-Version: bookwyrm\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-01-11 22:46+0000\n"
"PO-Revision-Date: 2023-01-12 00:08\n"
"POT-Creation-Date: 2023-01-30 08:21+0000\n"
"PO-Revision-Date: 2023-01-30 17:35\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: Polish\n"
"Language: pl\n"
@ -256,14 +256,14 @@ msgstr "Obserwujący"
msgid "Private"
msgstr "Prywatne"
#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:157
#: bookwyrm/templates/settings/imports/imports.html:67
#: bookwyrm/models/import_job.py:48 bookwyrm/templates/import/import.html:168
#: bookwyrm/templates/settings/imports/imports.html:98
#: bookwyrm/templates/settings/users/user_admin.html:81
#: bookwyrm/templates/settings/users/user_info.html:28
msgid "Active"
msgstr "Aktywne"
#: 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"
msgstr "Zakończone"
@ -316,19 +316,19 @@ msgstr "Cytaty"
msgid "Everything else"
msgstr "Wszystko inne"
#: bookwyrm/settings.py:214
#: bookwyrm/settings.py:217
msgid "Home Timeline"
msgstr "Strona główna"
#: bookwyrm/settings.py:214
#: bookwyrm/settings.py:217
msgid "Home"
msgstr "Start"
#: bookwyrm/settings.py:215
#: bookwyrm/settings.py:218
msgid "Books Timeline"
msgstr "Oś czasu książek"
#: bookwyrm/settings.py:215
#: bookwyrm/settings.py:218
#: bookwyrm/templates/guided_tour/user_profile.html:101
#: bookwyrm/templates/search/layout.html:22
#: bookwyrm/templates/search/layout.html:43
@ -336,75 +336,75 @@ msgstr "Oś czasu książek"
msgid "Books"
msgstr "Książki"
#: bookwyrm/settings.py:287
#: bookwyrm/settings.py:290
msgid "English"
msgstr "English (Angielski)"
#: bookwyrm/settings.py:288
#: bookwyrm/settings.py:291
msgid "Català (Catalan)"
msgstr "Català (Kataloński)"
#: bookwyrm/settings.py:289
#: bookwyrm/settings.py:292
msgid "Deutsch (German)"
msgstr "Deutsch (Niemiecki)"
#: bookwyrm/settings.py:290
#: bookwyrm/settings.py:293
msgid "Español (Spanish)"
msgstr "Español (Hiszpański)"
#: bookwyrm/settings.py:291
#: bookwyrm/settings.py:294
msgid "Euskara (Basque)"
msgstr ""
#: bookwyrm/settings.py:292
#: bookwyrm/settings.py:295
msgid "Galego (Galician)"
msgstr "Galego (Galicyjski)"
#: bookwyrm/settings.py:293
#: bookwyrm/settings.py:296
msgid "Italiano (Italian)"
msgstr "Italiano (Włoski)"
#: bookwyrm/settings.py:294
#: bookwyrm/settings.py:297
msgid "Suomi (Finnish)"
msgstr "Suomi (Fiński)"
#: bookwyrm/settings.py:295
#: bookwyrm/settings.py:298
msgid "Français (French)"
msgstr "Français (Francuski)"
#: bookwyrm/settings.py:296
#: bookwyrm/settings.py:299
msgid "Lietuvių (Lithuanian)"
msgstr "Lietuvių (Litewski)"
#: bookwyrm/settings.py:297
#: bookwyrm/settings.py:300
msgid "Norsk (Norwegian)"
msgstr "Norsk (Norweski)"
#: bookwyrm/settings.py:298
#: bookwyrm/settings.py:301
msgid "Polski (Polish)"
msgstr "Polski"
#: bookwyrm/settings.py:299
#: bookwyrm/settings.py:302
msgid "Português do Brasil (Brazilian Portuguese)"
msgstr "Português do Brasil (Brazylijski Portugalski)"
#: bookwyrm/settings.py:300
#: bookwyrm/settings.py:303
msgid "Português Europeu (European Portuguese)"
msgstr "Português Europeu (Portugalski)"
#: bookwyrm/settings.py:301
#: bookwyrm/settings.py:304
msgid "Română (Romanian)"
msgstr "Română (Rumuński)"
#: bookwyrm/settings.py:302
#: bookwyrm/settings.py:305
msgid "Svenska (Swedish)"
msgstr "Svenska (Szwedzki)"
#: bookwyrm/settings.py:303
#: bookwyrm/settings.py:306
msgid "简体中文 (Simplified Chinese)"
msgstr "简体中文 (Uproszczony chiński)"
#: bookwyrm/settings.py:304
#: bookwyrm/settings.py:307
msgid "繁體中文 (Traditional Chinese)"
msgstr "繁體中文 (Tradycyjny chiński)"
@ -855,10 +855,10 @@ msgstr "ISNI:"
#: bookwyrm/templates/settings/announcements/edit_announcement.html:120
#: bookwyrm/templates/settings/federation/edit_instance.html:98
#: bookwyrm/templates/settings/federation/instance.html:105
#: bookwyrm/templates/settings/registration.html:79
#: bookwyrm/templates/settings/registration.html:96
#: bookwyrm/templates/settings/registration_limited.html:76
#: bookwyrm/templates/settings/site.html:144
#: bookwyrm/templates/settings/users/user_moderation_actions.html:69
#: bookwyrm/templates/settings/users/user_moderation_actions.html:75
#: bookwyrm/templates/shelf/form.html:25
#: bookwyrm/templates/snippets/reading_modals/layout.html:18
msgid "Save"
@ -1172,7 +1172,7 @@ msgstr "To jest nowe dzieło"
#: bookwyrm/templates/guided_tour/user_profile.html:89
#: bookwyrm/templates/guided_tour/user_profile.html:112
#: bookwyrm/templates/guided_tour/user_profile.html:135
#: bookwyrm/templates/user_menu.html:18
#: bookwyrm/templates/user/user.html:87 bookwyrm/templates/user_menu.html:18
msgid "Back"
msgstr "Wstecz"
@ -1384,7 +1384,7 @@ msgid "Domain"
msgstr "Domena"
#: 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/settings/announcements/announcements.html:37
#: bookwyrm/templates/settings/invites/manage_invite_requests.html:48
@ -1397,7 +1397,7 @@ msgstr "Status"
#: bookwyrm/templates/book/file_links/edit_links.html:37
#: bookwyrm/templates/settings/announcements/announcements.html:41
#: bookwyrm/templates/settings/federation/instance.html:112
#: bookwyrm/templates/settings/imports/imports.html:110
#: bookwyrm/templates/settings/imports/imports.html:141
#: bookwyrm/templates/settings/reports/report_links_table.html:6
#: bookwyrm/templates/settings/themes.html:99
msgid "Actions"
@ -1921,13 +1921,13 @@ msgid "Add to your books"
msgstr "Dodaj do swoich książek"
#: 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
msgid "To Read"
msgstr "Do przeczytania"
#: 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
msgid "Currently Reading"
msgstr "Obecnie czytane"
@ -1937,12 +1937,12 @@ msgstr "Obecnie czytane"
#: bookwyrm/templates/snippets/shelf_selector.html:46
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:24
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12
#: bookwyrm/templates/user/user.html:35 bookwyrm/templatetags/shelf_tags.py:52
#: bookwyrm/templates/user/user.html:39 bookwyrm/templatetags/shelf_tags.py:52
msgid "Read"
msgstr "Przeczytane"
#: 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"
msgstr "Zaprzestano czytania"
@ -2662,7 +2662,7 @@ msgid "This is your user profile. All your latest activities will be listed here
msgstr "To jest Twój profil użytkownika. Wszystkie Twoje najnowsze aktywności będą tutaj widoczne. Pozostali użytkownicy BookWyrm mogą również widzieć części tej strony - to, co mogą zobaczyć zależy od Twoich ustawień prywatności."
#: 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"
msgstr "Profil użytkownika"
@ -2709,85 +2709,100 @@ msgstr "Importuj książki"
msgid "Not a valid CSV file"
msgstr "To nie jest prawidłowy plik CSV"
#: 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
msgid "On average, recent imports have taken %(hours)s hours."
msgstr "Ostatnie importy zajmowały średnio %(hours)s godzin."
#: bookwyrm/templates/import/import.html:26
#: bookwyrm/templates/import/import.html:32
#, python-format
msgid "On average, recent imports have taken %(minutes)s minutes."
msgstr "Ostatnie importy zajmowały średnio %(minutes)s minut."
#: bookwyrm/templates/import/import.html:41
#: bookwyrm/templates/import/import.html:47
msgid "Data source:"
msgstr "Źródło danych:"
#: bookwyrm/templates/import/import.html:47
#: bookwyrm/templates/import/import.html:53
msgid "Goodreads (CSV)"
msgstr "Goodreads (CSV)"
#: bookwyrm/templates/import/import.html:50
#: bookwyrm/templates/import/import.html:56
msgid "Storygraph (CSV)"
msgstr "Storygraph (CSV)"
#: bookwyrm/templates/import/import.html:53
#: bookwyrm/templates/import/import.html:59
msgid "LibraryThing (TSV)"
msgstr "LibraryThing (TSV)"
#: bookwyrm/templates/import/import.html:56
#: bookwyrm/templates/import/import.html:62
msgid "OpenLibrary (CSV)"
msgstr "OpenLibrary (CSV)"
#: bookwyrm/templates/import/import.html:59
#: bookwyrm/templates/import/import.html:65
msgid "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."
msgstr ""
#: bookwyrm/templates/import/import.html:74
#: bookwyrm/templates/import/import.html:80
msgid "Data file:"
msgstr "Plik danych:"
#: bookwyrm/templates/import/import.html:82
#: bookwyrm/templates/import/import.html:88
msgid "Include reviews"
msgstr "Uwzględnij recenzje"
#: bookwyrm/templates/import/import.html:87
#: bookwyrm/templates/import/import.html:93
msgid "Privacy setting for imported reviews:"
msgstr "Ustawienia prywatności dla importowanych recenzji:"
#: 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/settings/federation/instance_blocklist.html:78
msgid "Import"
msgstr "Importuj"
#: 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."
msgstr "Importowanie jest tymczasowo wyłączone; dziękujemy za Twoją cierpliwość."
#: bookwyrm/templates/import/import.html:108
#: bookwyrm/templates/import/import.html:119
msgid "Recent Imports"
msgstr "Najnowsze recenzje"
#: bookwyrm/templates/import/import.html:113
#: bookwyrm/templates/settings/imports/imports.html:89
#: bookwyrm/templates/import/import.html:124
#: bookwyrm/templates/settings/imports/imports.html:120
msgid "Date Created"
msgstr ""
#: bookwyrm/templates/import/import.html:116
#: bookwyrm/templates/import/import.html:127
msgid "Last Updated"
msgstr "Najnowsza aktualizacja"
#: bookwyrm/templates/import/import.html:119
#: bookwyrm/templates/settings/imports/imports.html:98
#: bookwyrm/templates/import/import.html:130
#: bookwyrm/templates/settings/imports/imports.html:129
msgid "Items"
msgstr ""
#: bookwyrm/templates/import/import.html:128
#: bookwyrm/templates/import/import.html:139
msgid "No recent imports"
msgstr "Brak ostatnich importów"
@ -2803,6 +2818,7 @@ msgid "Retry Status"
msgstr ""
#: 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:9
#: bookwyrm/templates/settings/layout.html:82
@ -2822,7 +2838,7 @@ msgid "Refresh"
msgstr "Odśwież"
#: bookwyrm/templates/import/import_status.html:72
#: bookwyrm/templates/settings/imports/imports.html:130
#: bookwyrm/templates/settings/imports/imports.html:161
msgid "Stop import"
msgstr "Wstrzymaj import"
@ -2944,7 +2960,7 @@ msgid "Reject"
msgstr "Odrzuć"
#: bookwyrm/templates/import/troubleshoot.html:7
#: bookwyrm/templates/settings/imports/imports.html:107
#: bookwyrm/templates/settings/imports/imports.html:138
msgid "Failed items"
msgstr ""
@ -3195,7 +3211,7 @@ msgid "Delete this list?"
msgstr "Usunąć te listę?"
#: bookwyrm/templates/lists/edit_form.html:5
#: bookwyrm/templates/lists/layout.html:18
#: bookwyrm/templates/lists/layout.html:23
msgid "Edit List"
msgstr "Edytuj listę"
@ -4463,48 +4479,48 @@ msgstr "Średni priorytet"
msgid "High priority"
msgstr "Wysoki priorytet"
#: bookwyrm/templates/settings/celery.html:40
#: bookwyrm/templates/settings/celery.html:46
msgid "Could not connect to Redis broker"
msgstr ""
#: bookwyrm/templates/settings/celery.html:48
#: bookwyrm/templates/settings/celery.html:54
msgid "Active Tasks"
msgstr "Aktywne zadania"
#: bookwyrm/templates/settings/celery.html:53
#: bookwyrm/templates/settings/imports/imports.html:82
#: bookwyrm/templates/settings/celery.html:59
#: bookwyrm/templates/settings/imports/imports.html:113
msgid "ID"
msgstr "ID"
#: bookwyrm/templates/settings/celery.html:54
#: bookwyrm/templates/settings/celery.html:60
msgid "Task name"
msgstr "Nazwa zadania"
#: bookwyrm/templates/settings/celery.html:55
#: bookwyrm/templates/settings/celery.html:61
msgid "Run time"
msgstr "Czas wykonywania"
#: bookwyrm/templates/settings/celery.html:56
#: bookwyrm/templates/settings/celery.html:62
msgid "Priority"
msgstr "Priorytet"
#: bookwyrm/templates/settings/celery.html:61
#: bookwyrm/templates/settings/celery.html:67
msgid "No active tasks"
msgstr "Brak aktywnych zadań"
#: bookwyrm/templates/settings/celery.html:79
#: bookwyrm/templates/settings/celery.html:85
msgid "Workers"
msgstr ""
#: bookwyrm/templates/settings/celery.html:84
#: bookwyrm/templates/settings/celery.html:90
msgid "Uptime:"
msgstr ""
#: bookwyrm/templates/settings/celery.html:94
#: bookwyrm/templates/settings/celery.html:100
msgid "Could not connect to Celery"
msgstr "Błąd połączenia z Celery"
#: bookwyrm/templates/settings/celery.html:101
#: bookwyrm/templates/settings/celery.html:107
msgid "Errors"
msgstr "Błędy"
@ -4892,27 +4908,55 @@ msgstr ""
msgid "Enable imports"
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"
msgstr "Zakończone"
#: bookwyrm/templates/settings/imports/imports.html:85
#: bookwyrm/templates/settings/imports/imports.html:116
msgid "User"
msgstr "Użytkownik"
#: bookwyrm/templates/settings/imports/imports.html:94
#: bookwyrm/templates/settings/imports/imports.html:125
msgid "Date Updated"
msgstr "Data przesłania"
#: bookwyrm/templates/settings/imports/imports.html:101
#: bookwyrm/templates/settings/imports/imports.html:132
msgid "Pending items"
msgstr "Oczekujące"
#: bookwyrm/templates/settings/imports/imports.html:104
#: bookwyrm/templates/settings/imports/imports.html:135
msgid "Successful items"
msgstr "Zakończone elementy"
#: bookwyrm/templates/settings/imports/imports.html:139
#: bookwyrm/templates/settings/imports/imports.html:170
msgid "No matching imports found."
msgstr "Nie znaleziono pasujących importów."
@ -5173,34 +5217,38 @@ msgstr "Błąd zapisywania ustawień"
msgid "Allow registration"
msgstr "Zezwól na rejestrację"
#: 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"
msgstr "Wymagaj od użytkowników potwierdzenia adresu e-mail"
#: bookwyrm/templates/settings/registration.html:46
#: bookwyrm/templates/settings/registration.html:63
msgid "(Recommended if registration is open)"
msgstr "(Zalecane, gdy rejestracja jest otwarta)"
#: bookwyrm/templates/settings/registration.html:51
#: bookwyrm/templates/settings/registration.html:68
msgid "Allow invite requests"
msgstr ""
#: bookwyrm/templates/settings/registration.html:55
#: bookwyrm/templates/settings/registration.html:72
#: bookwyrm/templates/settings/registration_limited.html:42
msgid "Invite request text:"
msgstr ""
#: bookwyrm/templates/settings/registration.html:63
#: bookwyrm/templates/settings/registration.html:80
#: bookwyrm/templates/settings/registration_limited.html:50
msgid "Set a question for invite requests"
msgstr ""
#: bookwyrm/templates/settings/registration.html:68
#: bookwyrm/templates/settings/registration.html:85
#: bookwyrm/templates/settings/registration_limited.html:55
msgid "Question:"
msgstr "Pytanie:"
#: bookwyrm/templates/settings/registration.html:73
#: bookwyrm/templates/settings/registration.html:90
#: bookwyrm/templates/settings/registration_limited.html:67
msgid "Registration closed text:"
msgstr ""
@ -5442,7 +5490,7 @@ msgid "Remove theme"
msgstr "Usuń motyw"
#: 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"
msgstr "Trwale usuń użytkownika"
@ -5564,14 +5612,18 @@ msgid "User Actions"
msgstr ""
#: 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"
msgstr "Zawieś użytkownika"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:26
#: bookwyrm/templates/settings/users/user_moderation_actions.html:32
msgid "Un-suspend user"
msgstr "Przywróć użytkownika"
#: bookwyrm/templates/settings/users/user_moderation_actions.html:48
#: bookwyrm/templates/settings/users/user_moderation_actions.html:54
msgid "Access level:"
msgstr "Poziom dostępu:"
@ -6435,33 +6487,53 @@ msgstr "%(username)s nie obserwuje nikogo"
msgid "No reviews or comments yet!"
msgstr ""
#: bookwyrm/templates/user/user.html:16
#: bookwyrm/templates/user/user.html:20
msgid "Edit profile"
msgstr "Edytuj profil"
#: bookwyrm/templates/user/user.html:38
#: bookwyrm/templates/user/user.html:42
#, python-format
msgid "View all %(size)s"
msgstr "Wyświetl wszystkie %(size)s"
#: bookwyrm/templates/user/user.html:52
#: bookwyrm/templates/user/user.html:56
msgid "View all books"
msgstr "Wyświetl wszystkie książki"
#: bookwyrm/templates/user/user.html:59
#: bookwyrm/templates/user/user.html:63
#, python-format
msgid "%(current_year)s Reading Goal"
msgstr "Cel czytania roku %(current_year)s"
#: bookwyrm/templates/user/user.html:66
#: bookwyrm/templates/user/user.html:70
msgid "User Activity"
msgstr "Aktywność użytkownika"
#: 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"
msgstr "Kanał 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!"
msgstr "Jeszcze brak aktywności!"
@ -6509,16 +6581,45 @@ msgstr "Wyloguj się"
msgid "File exceeds maximum size: 10MB"
msgstr "Rozmiar pliku przekracza maksymalny rozmiar: 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] ""
msgstr[2] ""
msgstr[3] ""
#: bookwyrm/templatetags/utilities.py:39
#, python-format
msgid "%(title)s: %(subtitle)s"
msgstr "%(title)s: %(subtitle)s"
#: bookwyrm/views/rss_feed.py:34
#: bookwyrm/views/rss_feed.py:35
#, python-brace-format
msgid "Status updates from {obj.display_name}"
msgstr "Aktualizacje statusu od {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
#, python-format
msgid "Load %(count)d unread status"

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