diff --git a/.env.dev.example b/.env.dev.example index d4476fd2..1e4fb981 100644 --- a/.env.dev.example +++ b/.env.dev.example @@ -16,7 +16,7 @@ DEFAULT_LANGUAGE="English" MEDIA_ROOT=images/ -POSTGRES_PORT=5432 +PGPORT=5432 POSTGRES_PASSWORD=securedbypassword123 POSTGRES_USER=fedireads POSTGRES_DB=fedireads diff --git a/.env.prod.example b/.env.prod.example index 99520916..49729d53 100644 --- a/.env.prod.example +++ b/.env.prod.example @@ -16,7 +16,7 @@ DEFAULT_LANGUAGE="English" MEDIA_ROOT=images/ -POSTGRES_PORT=5432 +PGPORT=5432 POSTGRES_PASSWORD=securedbypassword123 POSTGRES_USER=fedireads POSTGRES_DB=fedireads diff --git a/.github/workflows/pylint.yml b/.github/workflows/pylint.yml index 2a81eaa3..1b14149f 100644 --- a/.github/workflows/pylint.yml +++ b/.github/workflows/pylint.yml @@ -24,5 +24,5 @@ jobs: pip install pylint - name: Analysing the code with pylint run: | - pylint bookwyrm/ --ignore=migrations,tests --disable=E1101,E1135,E1136,R0903,R0901,R0902,W0707,W0511,W0406,R0401,R0801,C0209 + pylint bookwyrm/ --ignore=migrations,tests --disable=E1101,E1135,E1136,R0903,R0901,R0902,W0707,W0511,W0406,R0401,R0801 diff --git a/Dockerfile b/Dockerfile index 1892ae23..349dd82b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -8,4 +8,4 @@ WORKDIR /app COPY requirements.txt /app/ RUN pip install -r requirements.txt --no-cache-dir -RUN apt-get update && apt-get install -y gettext libgettextpo-dev && apt-get clean +RUN apt-get update && apt-get install -y gettext libgettextpo-dev tidy && apt-get clean diff --git a/bookwyrm/activitypub/base_activity.py b/bookwyrm/activitypub/base_activity.py index 4f7b55d5..24d383ac 100644 --- a/bookwyrm/activitypub/base_activity.py +++ b/bookwyrm/activitypub/base_activity.py @@ -101,7 +101,7 @@ class ActivityObject: except KeyError: if field.default == MISSING and field.default_factory == MISSING: raise ActivitySerializerError( - "Missing required field: %s" % field.name + f"Missing required field: {field.name}" ) value = field.default setattr(self, field.name, value) @@ -219,8 +219,8 @@ def set_related_field( model_name, origin_model_name, related_field_name, related_remote_id, data ): """load reverse related fields (editions, attachments) without blocking""" - model = apps.get_model("bookwyrm.%s" % model_name, require_ready=True) - origin_model = apps.get_model("bookwyrm.%s" % origin_model_name, require_ready=True) + model = apps.get_model(f"bookwyrm.{model_name}", require_ready=True) + origin_model = apps.get_model(f"bookwyrm.{origin_model_name}", require_ready=True) with transaction.atomic(): if isinstance(data, str): @@ -234,7 +234,7 @@ def set_related_field( # this must exist because it's the object that triggered this function instance = origin_model.find_existing_by_remote_id(related_remote_id) if not instance: - raise ValueError("Invalid related remote id: %s" % related_remote_id) + raise ValueError(f"Invalid related remote id: {related_remote_id}") # set the origin's remote id on the activity so it will be there when # the model instance is created @@ -265,7 +265,7 @@ def get_model_from_type(activity_type): ] if not model: raise ActivitySerializerError( - 'No model found for activity type "%s"' % activity_type + f'No model found for activity type "{activity_type}"' ) return model[0] @@ -286,7 +286,7 @@ def resolve_remote_id( data = get_data(remote_id) except ConnectorException: raise ActivitySerializerError( - "Could not connect to host for remote_id in: %s" % (remote_id) + f"Could not connect to host for remote_id: {remote_id}" ) # determine the model implicitly, if not provided # or if it's a model with subclasses like Status, check again diff --git a/bookwyrm/activitypub/book.py b/bookwyrm/activitypub/book.py index bd27c4e6..d8599c4b 100644 --- a/bookwyrm/activitypub/book.py +++ b/bookwyrm/activitypub/book.py @@ -54,6 +54,7 @@ class Edition(Book): asin: str = "" pages: int = None physicalFormat: str = "" + physicalFormatDetail: str = "" publishers: List[str] = field(default_factory=lambda: []) editionRank: int = 0 diff --git a/bookwyrm/activitystreams.py b/bookwyrm/activitystreams.py index 10149993..5e0969e5 100644 --- a/bookwyrm/activitystreams.py +++ b/bookwyrm/activitystreams.py @@ -16,11 +16,12 @@ class ActivityStream(RedisStore): def stream_id(self, user): """the redis key for this user's instance of this stream""" - return "{}-{}".format(user.id, self.key) + return f"{user.id}-{self.key}" def unread_id(self, user): """the redis key for this user's unread count for this stream""" - return "{}-unread".format(self.stream_id(user)) + stream_id = self.stream_id(user) + return f"{stream_id}-unread" def get_rank(self, obj): # pylint: disable=no-self-use """statuses are sorted by date published""" diff --git a/bookwyrm/connectors/abstract_connector.py b/bookwyrm/connectors/abstract_connector.py index 5c58f8f8..c032986d 100644 --- a/bookwyrm/connectors/abstract_connector.py +++ b/bookwyrm/connectors/abstract_connector.py @@ -8,6 +8,7 @@ from requests.exceptions import RequestException from bookwyrm import activitypub, models, settings from .connector_manager import load_more_data, ConnectorException +from .format_mappings import format_mappings logger = logging.getLogger(__name__) @@ -41,7 +42,7 @@ class AbstractMinimalConnector(ABC): params["min_confidence"] = min_confidence data = self.get_search_data( - "%s%s" % (self.search_url, query), + f"{self.search_url}{query}", params=params, timeout=timeout, ) @@ -55,7 +56,7 @@ class AbstractMinimalConnector(ABC): """isbn search""" params = {} data = self.get_search_data( - "%s%s" % (self.isbn_search_url, query), + f"{self.isbn_search_url}{query}", params=params, ) results = [] @@ -129,7 +130,7 @@ class AbstractConnector(AbstractMinimalConnector): work_data = data if not work_data or not edition_data: - raise ConnectorException("Unable to load book data: %s" % remote_id) + raise ConnectorException(f"Unable to load book data: {remote_id}") with transaction.atomic(): # create activitypub object @@ -220,9 +221,7 @@ def get_data(url, params=None, timeout=10): """wrapper for request.get""" # check if the url is blocked if models.FederatedServer.is_blocked(url): - raise ConnectorException( - "Attempting to load data from blocked url: {:s}".format(url) - ) + raise ConnectorException(f"Attempting to load data from blocked url: {url}") try: resp = requests.get( @@ -286,3 +285,25 @@ class Mapping: return self.formatter(value) except: # pylint: disable=bare-except return None + + +def infer_physical_format(format_text): + """try to figure out what the standardized format is from the free value""" + format_text = format_text.lower() + if format_text in format_mappings: + # try a direct match + return format_mappings[format_text] + # failing that, try substring + matches = [v for k, v in format_mappings.items() if k in format_text] + if not matches: + return None + return matches[0] + + +def unique_physical_format(format_text): + """only store the format if it isn't diretly in the format mappings""" + format_text = format_text.lower() + if format_text in format_mappings: + # try a direct match, so saving this would be redundant + return None + return format_text diff --git a/bookwyrm/connectors/connector_manager.py b/bookwyrm/connectors/connector_manager.py index d9c997e6..45530cd6 100644 --- a/bookwyrm/connectors/connector_manager.py +++ b/bookwyrm/connectors/connector_manager.py @@ -100,10 +100,10 @@ def get_or_create_connector(remote_id): connector_info = models.Connector.objects.create( identifier=identifier, connector_file="bookwyrm_connector", - base_url="https://%s" % identifier, - books_url="https://%s/book" % identifier, - covers_url="https://%s/images/covers" % identifier, - search_url="https://%s/search?q=" % identifier, + base_url=f"https://{identifier}", + books_url=f"https://{identifier}/book", + covers_url=f"https://{identifier}/images/covers", + search_url=f"https://{identifier}/search?q=", priority=2, ) @@ -122,7 +122,7 @@ def load_more_data(connector_id, book_id): def load_connector(connector_info): """instantiate the connector class""" connector = importlib.import_module( - "bookwyrm.connectors.%s" % connector_info.connector_file + f"bookwyrm.connectors.{connector_info.connector_file}" ) return connector.Connector(connector_info.identifier) @@ -132,4 +132,4 @@ def load_connector(connector_info): def create_connector(sender, instance, created, *args, **kwargs): """create a connector to an external bookwyrm server""" if instance.application_type == "bookwyrm": - get_or_create_connector("https://{:s}".format(instance.server_name)) + get_or_create_connector(f"https://{instance.server_name}") diff --git a/bookwyrm/connectors/format_mappings.py b/bookwyrm/connectors/format_mappings.py new file mode 100644 index 00000000..61f61efa --- /dev/null +++ b/bookwyrm/connectors/format_mappings.py @@ -0,0 +1,43 @@ +""" comparing a free text format to the standardized one """ +format_mappings = { + "paperback": "Paperback", + "soft": "Paperback", + "pamphlet": "Paperback", + "peperback": "Paperback", + "tapa blanda": "Paperback", + "turtleback": "Paperback", + "pocket": "Paperback", + "spiral": "Paperback", + "ring": "Paperback", + "平装": "Paperback", + "简装": "Paperback", + "hardcover": "Hardcover", + "hardcocer": "Hardcover", + "hardover": "Hardcover", + "hardback": "Hardcover", + "library": "Hardcover", + "tapa dura": "Hardcover", + "leather": "Hardcover", + "clothbound": "Hardcover", + "精装": "Hardcover", + "ebook": "EBook", + "e-book": "EBook", + "digital": "EBook", + "computer file": "EBook", + "epub": "EBook", + "online": "EBook", + "pdf": "EBook", + "elektronische": "EBook", + "electronic": "EBook", + "audiobook": "AudiobookFormat", + "audio": "AudiobookFormat", + "cd": "AudiobookFormat", + "dvd": "AudiobookFormat", + "mp3": "AudiobookFormat", + "cassette": "AudiobookFormat", + "kindle": "AudiobookFormat", + "talking": "AudiobookFormat", + "sound": "AudiobookFormat", + "comic": "GraphicNovel", + "graphic": "GraphicNovel", +} diff --git a/bookwyrm/connectors/inventaire.py b/bookwyrm/connectors/inventaire.py index 8b85dbd9..faed5429 100644 --- a/bookwyrm/connectors/inventaire.py +++ b/bookwyrm/connectors/inventaire.py @@ -9,7 +9,7 @@ from .connector_manager import ConnectorException class Connector(AbstractConnector): - """instantiate a connector for OL""" + """instantiate a connector for inventaire""" def __init__(self, identifier): super().__init__(identifier) @@ -60,7 +60,7 @@ class Connector(AbstractConnector): def get_remote_id(self, value): """convert an id/uri into a url""" - return "{:s}?action=by-uris&uris={:s}".format(self.books_url, value) + return f"{self.books_url}?action=by-uris&uris={value}" def get_book_data(self, remote_id): data = get_data(remote_id) @@ -88,11 +88,7 @@ class Connector(AbstractConnector): def format_search_result(self, search_result): images = search_result.get("image") - cover = ( - "{:s}/img/entities/{:s}".format(self.covers_url, images[0]) - if images - else None - ) + cover = f"{self.covers_url}/img/entities/{images[0]}" if images else None # a deeply messy translation of inventaire's scores confidence = float(search_result.get("_score", 0.1)) confidence = 0.1 if confidence < 150 else 0.999 @@ -100,9 +96,7 @@ class Connector(AbstractConnector): title=search_result.get("label"), key=self.get_remote_id(search_result.get("uri")), author=search_result.get("description"), - view_link="{:s}/entity/{:s}".format( - self.base_url, search_result.get("uri") - ), + view_link=f"{self.base_url}/entity/{search_result.get('uri')}", cover=cover, confidence=confidence, connector=self, @@ -124,9 +118,7 @@ class Connector(AbstractConnector): title=title[0], key=self.get_remote_id(search_result.get("uri")), author=search_result.get("description"), - view_link="{:s}/entity/{:s}".format( - self.base_url, search_result.get("uri") - ), + view_link=f"{self.base_url}/entity/{search_result.get('uri')}", cover=self.get_cover_url(search_result.get("image")), connector=self, ) @@ -136,11 +128,7 @@ class Connector(AbstractConnector): def load_edition_data(self, work_uri): """get a list of editions for a work""" - url = ( - "{:s}?action=reverse-claims&property=wdt:P629&value={:s}&sort=true".format( - self.books_url, work_uri - ) - ) + url = f"{self.books_url}?action=reverse-claims&property=wdt:P629&value={work_uri}&sort=true" return get_data(url) def get_edition_from_work_data(self, data): @@ -196,7 +184,7 @@ class Connector(AbstractConnector): # cover may or may not be an absolute url already if re.match(r"^http", cover_id): return cover_id - return "%s%s" % (self.covers_url, cover_id) + return f"{self.covers_url}{cover_id}" def resolve_keys(self, keys): """cool, it's "wd:Q3156592" now what the heck does that mean""" @@ -214,9 +202,7 @@ class Connector(AbstractConnector): link = links.get("enwiki") if not link: return "" - url = "{:s}/api/data?action=wp-extract&lang=en&title={:s}".format( - self.base_url, link - ) + url = f"{self.base_url}/api/data?action=wp-extract&lang=en&title={link}" try: data = get_data(url) except ConnectorException: diff --git a/bookwyrm/connectors/openlibrary.py b/bookwyrm/connectors/openlibrary.py index 0bfc6ef1..b8afc7ca 100644 --- a/bookwyrm/connectors/openlibrary.py +++ b/bookwyrm/connectors/openlibrary.py @@ -4,7 +4,7 @@ import re from bookwyrm import models from bookwyrm.book_search import SearchResult from .abstract_connector import AbstractConnector, Mapping -from .abstract_connector import get_data +from .abstract_connector import get_data, infer_physical_format, unique_physical_format from .connector_manager import ConnectorException from .openlibrary_languages import languages @@ -44,7 +44,16 @@ class Connector(AbstractConnector): ), Mapping("publishedDate", remote_field="publish_date"), Mapping("pages", remote_field="number_of_pages"), - Mapping("physicalFormat", remote_field="physical_format"), + Mapping( + "physicalFormat", + remote_field="physical_format", + formatter=infer_physical_format, + ), + Mapping( + "physicalFormatDetail", + remote_field="physical_format", + formatter=unique_physical_format, + ), Mapping("publishers"), ] @@ -72,7 +81,7 @@ class Connector(AbstractConnector): key = data["key"] except KeyError: raise ConnectorException("Invalid book data") - return "%s%s" % (self.books_url, key) + return f"{self.books_url}{key}" def is_work_data(self, data): return bool(re.match(r"^[\/\w]+OL\d+W$", data["key"])) @@ -82,7 +91,7 @@ class Connector(AbstractConnector): key = data["key"] except KeyError: raise ConnectorException("Invalid book data") - url = "%s%s/editions" % (self.books_url, key) + url = f"{self.books_url}{key}/editions" data = self.get_book_data(url) edition = pick_default_edition(data["entries"]) if not edition: @@ -94,7 +103,7 @@ class Connector(AbstractConnector): key = data["works"][0]["key"] except (IndexError, KeyError): raise ConnectorException("No work found for edition") - url = "%s%s" % (self.books_url, key) + url = f"{self.books_url}{key}" return self.get_book_data(url) def get_authors_from_data(self, data): @@ -103,7 +112,7 @@ class Connector(AbstractConnector): author_blob = author_blob.get("author", author_blob) # this id is "/authors/OL1234567A" author_id = author_blob["key"] - url = "%s%s" % (self.base_url, author_id) + url = f"{self.base_url}{author_id}" author = self.get_or_create_author(url) if not author: continue @@ -114,8 +123,8 @@ class Connector(AbstractConnector): if not cover_blob: return None cover_id = cover_blob[0] - image_name = "%s-%s.jpg" % (cover_id, size) - return "%s/b/id/%s" % (self.covers_url, image_name) + image_name = f"{cover_id}-{size}.jpg" + return f"{self.covers_url}/b/id/{image_name}" def parse_search_data(self, data): return data.get("docs") @@ -153,7 +162,7 @@ class Connector(AbstractConnector): def load_edition_data(self, olkey): """query openlibrary for editions of a work""" - url = "%s/works/%s/editions" % (self.books_url, olkey) + url = f"{self.books_url}/works/{olkey}/editions" return self.get_book_data(url) def expand_book_data(self, book): diff --git a/bookwyrm/emailing.py b/bookwyrm/emailing.py index 4f43c69e..c6a197f2 100644 --- a/bookwyrm/emailing.py +++ b/bookwyrm/emailing.py @@ -11,7 +11,7 @@ def email_data(): """fields every email needs""" site = models.SiteSettings.objects.get() if site.logo_small: - logo_path = "/images/{}".format(site.logo_small.url) + logo_path = f"/images/{site.logo_small.url}" else: logo_path = "/static/images/logo-small.png" @@ -48,18 +48,12 @@ def password_reset_email(reset_code): def format_email(email_name, data): """render the email templates""" - subject = ( - get_template("email/{}/subject.html".format(email_name)).render(data).strip() - ) + subject = get_template(f"email/{email_name}/subject.html").render(data).strip() html_content = ( - get_template("email/{}/html_content.html".format(email_name)) - .render(data) - .strip() + get_template(f"email/{email_name}/html_content.html").render(data).strip() ) text_content = ( - get_template("email/{}/text_content.html".format(email_name)) - .render(data) - .strip() + get_template(f"email/{email_name}/text_content.html").render(data).strip() ) return (subject, html_content, text_content) diff --git a/bookwyrm/forms.py b/bookwyrm/forms.py index b53d0b6a..5acde9ea 100644 --- a/bookwyrm/forms.py +++ b/bookwyrm/forms.py @@ -29,8 +29,7 @@ class CustomForm(ModelForm): input_type = visible.field.widget.input_type if isinstance(visible.field.widget, Textarea): input_type = "textarea" - visible.field.widget.attrs["cols"] = None - visible.field.widget.attrs["rows"] = None + visible.field.widget.attrs["rows"] = 5 visible.field.widget.attrs["class"] = css_classes[input_type] @@ -228,7 +227,7 @@ class ExpiryWidget(widgets.Select): elif selected_string == "forever": return None else: - return selected_string # "This will raise + return selected_string # This will raise return timezone.now() + interval @@ -260,10 +259,7 @@ class CreateInviteForm(CustomForm): ] ), "use_limit": widgets.Select( - choices=[ - (i, _("%(count)d uses" % {"count": i})) - for i in [1, 5, 10, 25, 50, 100] - ] + choices=[(i, _(f"{i} uses")) for i in [1, 5, 10, 25, 50, 100]] + [(None, _("Unlimited"))] ), } @@ -272,7 +268,7 @@ class CreateInviteForm(CustomForm): class ShelfForm(CustomForm): class Meta: model = models.Shelf - fields = ["user", "name", "privacy"] + fields = ["user", "name", "privacy", "description"] class GoalForm(CustomForm): @@ -311,6 +307,12 @@ class EmailBlocklistForm(CustomForm): fields = ["domain"] +class IPBlocklistForm(CustomForm): + class Meta: + model = models.IPBlocklist + fields = ["address"] + + class ServerForm(CustomForm): class Meta: model = models.FederatedServer diff --git a/bookwyrm/importers/importer.py b/bookwyrm/importers/importer.py index caa137ec..a10b4060 100644 --- a/bookwyrm/importers/importer.py +++ b/bookwyrm/importers/importer.py @@ -127,6 +127,7 @@ def handle_imported_book(source, user, item, include_reviews, privacy): # but "now" is a bad guess published_date_guess = item.date_read or item.date_added if item.review: + # pylint: disable=consider-using-f-string review_title = ( "Review of {!r} on {!r}".format( item.book.title, diff --git a/bookwyrm/middleware/__init__.py b/bookwyrm/middleware/__init__.py new file mode 100644 index 00000000..03843c5a --- /dev/null +++ b/bookwyrm/middleware/__init__.py @@ -0,0 +1,3 @@ +""" look at all this nice middleware! """ +from .timezone_middleware import TimezoneMiddleware +from .ip_middleware import IPBlocklistMiddleware diff --git a/bookwyrm/middleware/ip_middleware.py b/bookwyrm/middleware/ip_middleware.py new file mode 100644 index 00000000..8063dd1f --- /dev/null +++ b/bookwyrm/middleware/ip_middleware.py @@ -0,0 +1,16 @@ +""" Block IP addresses """ +from django.http import Http404 +from bookwyrm import models + + +class IPBlocklistMiddleware: + """check incoming traffic against an IP block-list""" + + def __init__(self, get_response): + self.get_response = get_response + + def __call__(self, request): + address = request.META.get("REMOTE_ADDR") + if models.IPBlocklist.objects.filter(address=address).exists(): + raise Http404() + return self.get_response(request) diff --git a/bookwyrm/timezone_middleware.py b/bookwyrm/middleware/timezone_middleware.py similarity index 100% rename from bookwyrm/timezone_middleware.py rename to bookwyrm/middleware/timezone_middleware.py diff --git a/bookwyrm/migrations/0097_auto_20210917_1858.py b/bookwyrm/migrations/0097_auto_20210917_1858.py new file mode 100644 index 00000000..28cf94e2 --- /dev/null +++ b/bookwyrm/migrations/0097_auto_20210917_1858.py @@ -0,0 +1,38 @@ +# Generated by Django 3.2.4 on 2021-09-17 18:58 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0096_merge_20210912_0044"), + ] + + operations = [ + migrations.CreateModel( + name="IPBlocklist", + fields=[ + ( + "id", + models.AutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("created_date", models.DateTimeField(auto_now_add=True)), + ("address", models.CharField(max_length=255, unique=True)), + ("is_active", models.BooleanField(default=True)), + ], + options={ + "ordering": ("-created_date",), + }, + ), + migrations.AddField( + model_name="emailblocklist", + name="is_active", + field=models.BooleanField(default=True), + ), + ] diff --git a/bookwyrm/migrations/0098_auto_20210918_2238.py b/bookwyrm/migrations/0098_auto_20210918_2238.py new file mode 100644 index 00000000..09fdba31 --- /dev/null +++ b/bookwyrm/migrations/0098_auto_20210918_2238.py @@ -0,0 +1,27 @@ +# Generated by Django 3.2.4 on 2021-09-18 22:38 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0097_auto_20210917_1858"), + ] + + operations = [ + migrations.AddField( + model_name="sitesettings", + name="invite_request_text", + field=models.TextField( + default="If your request is approved, you will receive an email with a registration link." + ), + ), + migrations.AlterField( + model_name="sitesettings", + name="registration_closed_text", + field=models.TextField( + default='We aren\'t taking new users at this time. You can find an open instance at joinbookwyrm.com/instances.' + ), + ), + ] diff --git a/bookwyrm/migrations/0099_readthrough_is_active.py b/bookwyrm/migrations/0099_readthrough_is_active.py new file mode 100644 index 00000000..e7b177ba --- /dev/null +++ b/bookwyrm/migrations/0099_readthrough_is_active.py @@ -0,0 +1,37 @@ +# Generated by Django 3.2.4 on 2021-09-22 16:53 + +from django.db import migrations, models + + +def set_active_readthrough(apps, schema_editor): + """best-guess for deactivation date""" + db_alias = schema_editor.connection.alias + apps.get_model("bookwyrm", "ReadThrough").objects.using(db_alias).filter( + start_date__isnull=False, + finish_date__isnull=True, + ).update(is_active=True) + + +def reverse_func(apps, schema_editor): + """noop""" + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0098_auto_20210918_2238"), + ] + + operations = [ + migrations.AddField( + model_name="readthrough", + name="is_active", + field=models.BooleanField(default=False), + ), + migrations.RunPython(set_active_readthrough, reverse_func), + migrations.AlterField( + model_name="readthrough", + name="is_active", + field=models.BooleanField(default=True), + ), + ] diff --git a/bookwyrm/migrations/0100_shelf_description.py b/bookwyrm/migrations/0100_shelf_description.py new file mode 100644 index 00000000..18185b17 --- /dev/null +++ b/bookwyrm/migrations/0100_shelf_description.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.5 on 2021-09-28 23:20 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0099_readthrough_is_active"), + ] + + operations = [ + migrations.AddField( + model_name="shelf", + name="description", + field=models.TextField(blank=True, max_length=500, null=True), + ), + ] diff --git a/bookwyrm/migrations/0101_auto_20210929_1847.py b/bookwyrm/migrations/0101_auto_20210929_1847.py new file mode 100644 index 00000000..3fca28ea --- /dev/null +++ b/bookwyrm/migrations/0101_auto_20210929_1847.py @@ -0,0 +1,56 @@ +# Generated by Django 3.2 on 2021-05-21 00:17 + +from django.db import migrations +import bookwyrm +from bookwyrm.connectors.abstract_connector import infer_physical_format + + +def infer_format(app_registry, schema_editor): + """set the new phsyical format field based on existing format data""" + db_alias = schema_editor.connection.alias + + editions = ( + app_registry.get_model("bookwyrm", "Edition") + .objects.using(db_alias) + .filter(physical_format_detail__isnull=False) + ) + for edition in editions: + free_format = edition.physical_format_detail.lower() + edition.physical_format = infer_physical_format(free_format) + edition.save() + + +def reverse(app_registry, schema_editor): + """doesn't need to do anything""" + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0100_shelf_description"), + ] + + operations = [ + migrations.RenameField( + model_name="edition", + old_name="physical_format", + new_name="physical_format_detail", + ), + migrations.AddField( + model_name="edition", + name="physical_format", + field=bookwyrm.models.fields.CharField( + blank=True, + choices=[ + ("AudiobookFormat", "Audiobook"), + ("EBook", "eBook"), + ("GraphicNovel", "Graphic novel"), + ("Hardcover", "Hardcover"), + ("Paperback", "Paperback"), + ], + max_length=255, + null=True, + ), + ), + migrations.RunPython(infer_format, reverse), + ] diff --git a/bookwyrm/models/__init__.py b/bookwyrm/models/__init__.py index e8e1b696..bffd62b4 100644 --- a/bookwyrm/models/__init__.py +++ b/bookwyrm/models/__init__.py @@ -14,7 +14,6 @@ from .status import Review, ReviewRating from .status import Boost from .attachment import Image from .favorite import Favorite -from .notification import Notification from .readthrough import ReadThrough, ProgressUpdate, ProgressMode from .user import User, KeyPair, AnnualGoal @@ -26,8 +25,10 @@ from .import_job import ImportJob, ImportItem from .site import SiteSettings, SiteInvite from .site import PasswordReset, InviteRequest -from .site import EmailBlocklist from .announcement import Announcement +from .antispam import EmailBlocklist, IPBlocklist + +from .notification import Notification cls_members = inspect.getmembers(sys.modules[__name__], inspect.isclass) activity_models = { diff --git a/bookwyrm/models/activitypub_mixin.py b/bookwyrm/models/activitypub_mixin.py index ed51158b..3a88c524 100644 --- a/bookwyrm/models/activitypub_mixin.py +++ b/bookwyrm/models/activitypub_mixin.py @@ -266,7 +266,7 @@ class ObjectMixin(ActivitypubMixin): signed_message = signer.sign(SHA256.new(content.encode("utf8"))) signature = activitypub.Signature( - creator="%s#main-key" % user.remote_id, + creator=f"{user.remote_id}#main-key", created=activity_object.published, signatureValue=b64encode(signed_message).decode("utf8"), ) @@ -285,16 +285,16 @@ class ObjectMixin(ActivitypubMixin): return activitypub.Delete( id=self.remote_id + "/activity", actor=user.remote_id, - to=["%s/followers" % user.remote_id], + to=[f"{user.remote_id}/followers"], cc=["https://www.w3.org/ns/activitystreams#Public"], object=self, ).serialize() def to_update_activity(self, user): """wrapper for Updates to an activity""" - activity_id = "%s#update/%s" % (self.remote_id, uuid4()) + uuid = uuid4() return activitypub.Update( - id=activity_id, + id=f"{self.remote_id}#update/{uuid}", actor=user.remote_id, to=["https://www.w3.org/ns/activitystreams#Public"], object=self, @@ -337,8 +337,8 @@ class OrderedCollectionPageMixin(ObjectMixin): paginated = Paginator(queryset, PAGE_LENGTH) # add computed fields specific to orderd collections activity["totalItems"] = paginated.count - activity["first"] = "%s?page=1" % remote_id - activity["last"] = "%s?page=%d" % (remote_id, paginated.num_pages) + activity["first"] = f"{remote_id}?page=1" + activity["last"] = f"{remote_id}?page={paginated.num_pages}" return serializer(**activity) @@ -420,7 +420,7 @@ class CollectionItemMixin(ActivitypubMixin): """AP for shelving a book""" collection_field = getattr(self, self.collection_field) return activitypub.Add( - id="{:s}#add".format(collection_field.remote_id), + id=f"{collection_field.remote_id}#add", actor=user.remote_id, object=self.to_activity_dataclass(), target=collection_field.remote_id, @@ -430,7 +430,7 @@ class CollectionItemMixin(ActivitypubMixin): """AP for un-shelving a book""" collection_field = getattr(self, self.collection_field) return activitypub.Remove( - id="{:s}#remove".format(collection_field.remote_id), + id=f"{collection_field.remote_id}#remove", actor=user.remote_id, object=self.to_activity_dataclass(), target=collection_field.remote_id, @@ -458,7 +458,7 @@ class ActivityMixin(ActivitypubMixin): """undo an action""" user = self.user if hasattr(self, "user") else self.user_subject return activitypub.Undo( - id="%s#undo" % self.remote_id, + id=f"{self.remote_id}#undo", actor=user.remote_id, object=self, ).serialize() @@ -555,11 +555,11 @@ def to_ordered_collection_page( prev_page = next_page = None if activity_page.has_next(): - next_page = "%s?page=%d" % (remote_id, activity_page.next_page_number()) + next_page = f"{remote_id}?page={activity_page.next_page_number()}" if activity_page.has_previous(): - prev_page = "%s?page=%d" % (remote_id, activity_page.previous_page_number()) + prev_page = f"{remote_id}?page=%d{activity_page.previous_page_number()}" return activitypub.OrderedCollectionPage( - id="%s?page=%s" % (remote_id, page), + id=f"{remote_id}?page={page}", partOf=remote_id, orderedItems=items, next=next_page, diff --git a/bookwyrm/models/antispam.py b/bookwyrm/models/antispam.py new file mode 100644 index 00000000..7a85bbcf --- /dev/null +++ b/bookwyrm/models/antispam.py @@ -0,0 +1,35 @@ +""" Lets try NOT to sell viagra """ +from django.db import models + +from .user import User + + +class EmailBlocklist(models.Model): + """blocked email addresses""" + + created_date = models.DateTimeField(auto_now_add=True) + domain = models.CharField(max_length=255, unique=True) + is_active = models.BooleanField(default=True) + + class Meta: + """default sorting""" + + ordering = ("-created_date",) + + @property + def users(self): + """find the users associated with this address""" + return User.objects.filter(email__endswith=f"@{self.domain}") + + +class IPBlocklist(models.Model): + """blocked ip addresses""" + + created_date = models.DateTimeField(auto_now_add=True) + address = models.CharField(max_length=255, unique=True) + is_active = models.BooleanField(default=True) + + class Meta: + """default sorting""" + + ordering = ("-created_date",) diff --git a/bookwyrm/models/author.py b/bookwyrm/models/author.py index 6da80b17..53cf94ff 100644 --- a/bookwyrm/models/author.py +++ b/bookwyrm/models/author.py @@ -35,7 +35,7 @@ class Author(BookDataModel): def get_remote_id(self): """editions and works both use "book" instead of model_name""" - return "https://%s/author/%s" % (DOMAIN, self.id) + return f"https://{DOMAIN}/author/{self.id}" activity_serializer = activitypub.Author diff --git a/bookwyrm/models/base_model.py b/bookwyrm/models/base_model.py index 0ac2061a..ca32521a 100644 --- a/bookwyrm/models/base_model.py +++ b/bookwyrm/models/base_model.py @@ -1,8 +1,11 @@ """ base model with default fields """ import base64 from Crypto import Random + +from django.core.exceptions import PermissionDenied from django.db import models from django.dispatch import receiver +from django.http import Http404 from django.utils.translation import gettext_lazy as _ from bookwyrm.settings import DOMAIN @@ -32,11 +35,11 @@ class BookWyrmModel(models.Model): def get_remote_id(self): """generate a url that resolves to the local object""" - base_path = "https://%s" % DOMAIN + base_path = f"https://{DOMAIN}" if hasattr(self, "user"): - base_path = "%s%s" % (base_path, self.user.local_path) + base_path = f"{base_path}{self.user.local_path}" model_name = type(self).__name__.lower() - return "%s/%s/%d" % (base_path, model_name, self.id) + return f"{base_path}/{model_name}/{self.id}" class Meta: """this is just here to provide default fields for other models""" @@ -46,28 +49,28 @@ class BookWyrmModel(models.Model): @property def local_path(self): """how to link to this object in the local app""" - return self.get_remote_id().replace("https://%s" % DOMAIN, "") + return self.get_remote_id().replace(f"https://{DOMAIN}", "") - def visible_to_user(self, viewer): + def raise_visible_to_user(self, viewer): """is a user authorized to view an object?""" # make sure this is an object with privacy owned by a user if not hasattr(self, "user") or not hasattr(self, "privacy"): - return None + return # viewer can't see it if the object's owner blocked them if viewer in self.user.blocks.all(): - return False + raise Http404() # you can see your own posts and any public or unlisted posts if viewer == self.user or self.privacy in ["public", "unlisted"]: - return True + return # you can see the followers only posts of people you follow if ( self.privacy == "followers" and self.user.followers.filter(id=viewer.id).first() ): - return True + return # you can see dms you are tagged in if hasattr(self, "mention_users"): @@ -75,8 +78,32 @@ class BookWyrmModel(models.Model): self.privacy == "direct" and self.mention_users.filter(id=viewer.id).first() ): - return True - return False + return + raise Http404() + + def raise_not_editable(self, viewer): + """does this user have permission to edit this object? liable to be overwritten + by models that inherit this base model class""" + if not hasattr(self, "user"): + return + + # generally moderators shouldn't be able to edit other people's stuff + if self.user == viewer: + return + + raise PermissionDenied() + + def raise_not_deletable(self, viewer): + """does this user have permission to delete this object? liable to be + overwritten by models that inherit this base model class""" + if not hasattr(self, "user"): + return + + # but generally moderators can delete other people's stuff + if self.user == viewer or viewer.has_perm("moderate_post"): + return + + raise PermissionDenied() @receiver(models.signals.post_save) diff --git a/bookwyrm/models/book.py b/bookwyrm/models/book.py index ec1c14ec..8ae75baf 100644 --- a/bookwyrm/models/book.py +++ b/bookwyrm/models/book.py @@ -3,9 +3,10 @@ import re from django.contrib.postgres.search import SearchVectorField from django.contrib.postgres.indexes import GinIndex -from django.db import models -from django.db import transaction +from django.db import models, transaction +from django.db.models import Prefetch from django.dispatch import receiver +from django.utils.translation import gettext_lazy as _ from model_utils import FieldTracker from model_utils.managers import InheritanceManager from imagekit.models import ImageSpecField @@ -164,9 +165,9 @@ class Book(BookDataModel): @property def alt_text(self): """image alt test""" - text = "%s" % self.title + text = self.title if self.edition_info: - text += " (%s)" % self.edition_info + text += f" ({self.edition_info})" return text def save(self, *args, **kwargs): @@ -177,9 +178,10 @@ class Book(BookDataModel): def get_remote_id(self): """editions and works both use "book" instead of model_name""" - return "https://%s/book/%d" % (DOMAIN, self.id) + return f"https://{DOMAIN}/book/{self.id}" def __repr__(self): + # pylint: disable=consider-using-f-string return "<{} key={!r} title={!r}>".format( self.__class__, self.openlibrary_key, @@ -216,7 +218,7 @@ class Work(OrderedCollectionPageMixin, Book): """an ordered collection of editions""" return self.to_ordered_collection( self.editions.order_by("-edition_rank").all(), - remote_id="%s/editions" % self.remote_id, + remote_id=f"{self.remote_id}/editions", **kwargs, ) @@ -225,6 +227,16 @@ class Work(OrderedCollectionPageMixin, Book): deserialize_reverse_fields = [("editions", "editions")] +# https://schema.org/BookFormatType +FormatChoices = [ + ("AudiobookFormat", _("Audiobook")), + ("EBook", _("eBook")), + ("GraphicNovel", _("Graphic novel")), + ("Hardcover", _("Hardcover")), + ("Paperback", _("Paperback")), +] + + class Edition(Book): """an edition of a book""" @@ -242,7 +254,10 @@ class Edition(Book): max_length=255, blank=True, null=True, deduplication_field=True ) pages = fields.IntegerField(blank=True, null=True) - physical_format = fields.CharField(max_length=255, blank=True, null=True) + physical_format = fields.CharField( + max_length=255, choices=FormatChoices, null=True, blank=True + ) + physical_format_detail = fields.CharField(max_length=255, blank=True, null=True) publishers = fields.ArrayField( models.CharField(max_length=255), blank=True, default=list ) @@ -306,6 +321,27 @@ class Edition(Book): return super().save(*args, **kwargs) + @classmethod + def viewer_aware_objects(cls, viewer): + """annotate a book query with metadata related to the user""" + queryset = cls.objects + if not viewer or not viewer.is_authenticated: + return queryset + + queryset = queryset.prefetch_related( + Prefetch( + "shelfbook_set", + queryset=viewer.shelfbook_set.all(), + to_attr="current_shelves", + ), + Prefetch( + "readthrough_set", + queryset=viewer.readthrough_set.filter(is_active=True).all(), + to_attr="active_readthroughs", + ), + ) + return queryset + def isbn_10_to_13(isbn_10): """convert an isbn 10 into an isbn 13""" diff --git a/bookwyrm/models/connector.py b/bookwyrm/models/connector.py index b982c0ff..99e73ab3 100644 --- a/bookwyrm/models/connector.py +++ b/bookwyrm/models/connector.py @@ -28,7 +28,4 @@ class Connector(BookWyrmModel): isbn_search_url = models.CharField(max_length=255, null=True, blank=True) def __str__(self): - return "{} ({})".format( - self.identifier, - self.id, - ) + return f"{self.identifier} ({self.id})" diff --git a/bookwyrm/models/favorite.py b/bookwyrm/models/favorite.py index 9ab300b3..4c367521 100644 --- a/bookwyrm/models/favorite.py +++ b/bookwyrm/models/favorite.py @@ -1,7 +1,5 @@ """ like/fav/star a status """ -from django.apps import apps from django.db import models -from django.utils import timezone from bookwyrm import activitypub from .activitypub_mixin import ActivityMixin @@ -29,38 +27,9 @@ class Favorite(ActivityMixin, BookWyrmModel): def save(self, *args, **kwargs): """update user active time""" - self.user.last_active_date = timezone.now() - self.user.save(broadcast=False, update_fields=["last_active_date"]) + self.user.update_active_date() super().save(*args, **kwargs) - if self.status.user.local and self.status.user != self.user: - notification_model = apps.get_model( - "bookwyrm.Notification", require_ready=True - ) - notification_model.objects.create( - user=self.status.user, - notification_type="FAVORITE", - related_user=self.user, - related_status=self.status, - ) - - def delete(self, *args, **kwargs): - """delete and delete notifications""" - # check for notification - if self.status.user.local: - notification_model = apps.get_model( - "bookwyrm.Notification", require_ready=True - ) - notification = notification_model.objects.filter( - user=self.status.user, - related_user=self.user, - related_status=self.status, - notification_type="FAVORITE", - ).first() - if notification: - notification.delete() - super().delete(*args, **kwargs) - class Meta: """can't fav things twice""" diff --git a/bookwyrm/models/fields.py b/bookwyrm/models/fields.py index cc5a7bb5..ccd669cb 100644 --- a/bookwyrm/models/fields.py +++ b/bookwyrm/models/fields.py @@ -56,7 +56,7 @@ class ActivitypubFieldMixin: activitypub_field=None, activitypub_wrapper=None, deduplication_field=False, - **kwargs + **kwargs, ): self.deduplication_field = deduplication_field if activitypub_wrapper: @@ -308,7 +308,7 @@ class ManyToManyField(ActivitypubFieldMixin, models.ManyToManyField): def field_to_activity(self, value): if self.link_only: - return "%s/%s" % (value.instance.remote_id, self.name) + return f"{value.instance.remote_id}/{self.name}" return [i.remote_id for i in value.all()] def field_from_activity(self, value): @@ -388,7 +388,7 @@ def image_serializer(value, alt): else: return None if not url[:4] == "http": - url = "https://{:s}{:s}".format(DOMAIN, url) + url = f"https://{DOMAIN}{url}" return activitypub.Document(url=url, name=alt) @@ -448,7 +448,7 @@ class ImageField(ActivitypubFieldMixin, models.ImageField): image_content = ContentFile(response.content) extension = imghdr.what(None, image_content.read()) or "" - image_name = "{:s}.{:s}".format(str(uuid4()), extension) + image_name = f"{uuid4()}.{extension}" return [image_name, image_content] def formfield(self, **kwargs): diff --git a/bookwyrm/models/import_job.py b/bookwyrm/models/import_job.py index 7d8ce9e3..22253fef 100644 --- a/bookwyrm/models/import_job.py +++ b/bookwyrm/models/import_job.py @@ -2,7 +2,6 @@ import re import dateutil.parser -from django.apps import apps from django.db import models from django.utils import timezone @@ -50,19 +49,6 @@ class ImportJob(models.Model): ) retry = models.BooleanField(default=False) - def save(self, *args, **kwargs): - """save and notify""" - super().save(*args, **kwargs) - if self.complete: - notification_model = apps.get_model( - "bookwyrm.Notification", require_ready=True - ) - notification_model.objects.create( - user=self.user, - notification_type="IMPORT", - related_import=self, - ) - class ImportItem(models.Model): """a single line of a csv being imported""" @@ -198,7 +184,9 @@ class ImportItem(models.Model): return [] def __repr__(self): + # pylint: disable=consider-using-f-string return "<{!r}Item {!r}>".format(self.data["import_source"], self.data["Title"]) def __str__(self): + # pylint: disable=consider-using-f-string return "{} by {}".format(self.data["Title"], self.data["Author"]) diff --git a/bookwyrm/models/list.py b/bookwyrm/models/list.py index bbad5ba9..022a0d98 100644 --- a/bookwyrm/models/list.py +++ b/bookwyrm/models/list.py @@ -42,7 +42,7 @@ class List(OrderedCollectionMixin, BookWyrmModel): def get_remote_id(self): """don't want the user to be in there in this case""" - return "https://%s/list/%d" % (DOMAIN, self.id) + return f"https://{DOMAIN}/list/{self.id}" @property def collection_queryset(self): @@ -92,6 +92,12 @@ class ListItem(CollectionItemMixin, BookWyrmModel): notification_type="ADD", ) + def raise_not_deletable(self, viewer): + """the associated user OR the list owner can delete""" + if self.book_list.user == viewer: + return + super().raise_not_deletable(viewer) + class Meta: """A book may only be placed into a list once, and each order in the list may be used only once""" diff --git a/bookwyrm/models/notification.py b/bookwyrm/models/notification.py index ff0b4e5a..a4968f61 100644 --- a/bookwyrm/models/notification.py +++ b/bookwyrm/models/notification.py @@ -1,6 +1,8 @@ """ alert a user to activity """ from django.db import models +from django.dispatch import receiver from .base_model import BookWyrmModel +from . import Boost, Favorite, ImportJob, Report, Status, User NotificationType = models.TextChoices( @@ -53,3 +55,127 @@ class Notification(BookWyrmModel): name="notification_type_valid", ) ] + + +@receiver(models.signals.post_save, sender=Favorite) +# pylint: disable=unused-argument +def notify_on_fav(sender, instance, *args, **kwargs): + """someone liked your content, you ARE loved""" + if not instance.status.user.local or instance.status.user == instance.user: + return + Notification.objects.create( + user=instance.status.user, + notification_type="FAVORITE", + related_user=instance.user, + related_status=instance.status, + ) + + +@receiver(models.signals.post_delete, sender=Favorite) +# pylint: disable=unused-argument +def notify_on_unfav(sender, instance, *args, **kwargs): + """oops, didn't like that after all""" + if not instance.status.user.local: + return + Notification.objects.filter( + user=instance.status.user, + related_user=instance.user, + related_status=instance.status, + notification_type="FAVORITE", + ).delete() + + +@receiver(models.signals.post_save) +# pylint: disable=unused-argument +def notify_user_on_mention(sender, instance, *args, **kwargs): + """creating and deleting statuses with @ mentions and replies""" + if not issubclass(sender, Status): + return + + if instance.deleted: + Notification.objects.filter(related_status=instance).delete() + return + + if ( + instance.reply_parent + and instance.reply_parent.user != instance.user + and instance.reply_parent.user.local + ): + Notification.objects.create( + user=instance.reply_parent.user, + notification_type="REPLY", + related_user=instance.user, + related_status=instance, + ) + for mention_user in instance.mention_users.all(): + # avoid double-notifying about this status + if not mention_user.local or ( + instance.reply_parent and mention_user == instance.reply_parent.user + ): + continue + Notification.objects.create( + user=mention_user, + notification_type="MENTION", + related_user=instance.user, + related_status=instance, + ) + + +@receiver(models.signals.post_save, sender=Boost) +# pylint: disable=unused-argument +def notify_user_on_boost(sender, instance, *args, **kwargs): + """boosting a status""" + if ( + not instance.boosted_status.user.local + or instance.boosted_status.user == instance.user + ): + return + + Notification.objects.create( + user=instance.boosted_status.user, + related_status=instance.boosted_status, + related_user=instance.user, + notification_type="BOOST", + ) + + +@receiver(models.signals.post_delete, sender=Boost) +# pylint: disable=unused-argument +def notify_user_on_unboost(sender, instance, *args, **kwargs): + """unboosting a status""" + Notification.objects.filter( + user=instance.boosted_status.user, + related_status=instance.boosted_status, + related_user=instance.user, + notification_type="BOOST", + ).delete() + + +@receiver(models.signals.post_save, sender=ImportJob) +# pylint: disable=unused-argument +def notify_user_on_import_complete(sender, instance, *args, **kwargs): + """we imported your books! aren't you proud of us""" + if not instance.complete: + return + Notification.objects.create( + user=instance.user, + notification_type="IMPORT", + related_import=instance, + ) + + +@receiver(models.signals.post_save, sender=Report) +# pylint: disable=unused-argument +def notify_admins_on_report(sender, instance, *args, **kwargs): + """something is up, make sure the admins know""" + # moderators and superusers should be notified + admins = User.objects.filter( + models.Q(user_permissions__name__in=["moderate_user", "moderate_post"]) + | models.Q(is_superuser=True) + ).all() + for admin in admins: + Notification.objects.create( + user=admin, + related_report=instance, + notification_type="REPORT", + ) diff --git a/bookwyrm/models/readthrough.py b/bookwyrm/models/readthrough.py index 343d3c11..f75918ac 100644 --- a/bookwyrm/models/readthrough.py +++ b/bookwyrm/models/readthrough.py @@ -2,7 +2,6 @@ from django.core import validators from django.db import models from django.db.models import F, Q -from django.utils import timezone from .base_model import BookWyrmModel @@ -27,11 +26,14 @@ class ReadThrough(BookWyrmModel): ) start_date = models.DateTimeField(blank=True, null=True) finish_date = models.DateTimeField(blank=True, null=True) + is_active = models.BooleanField(default=True) def save(self, *args, **kwargs): """update user active time""" - self.user.last_active_date = timezone.now() - self.user.save(broadcast=False, update_fields=["last_active_date"]) + self.user.update_active_date() + # an active readthrough must have an unset finish date + if self.finish_date: + self.is_active = False super().save(*args, **kwargs) def create_update(self): @@ -65,6 +67,5 @@ class ProgressUpdate(BookWyrmModel): def save(self, *args, **kwargs): """update user active time""" - self.user.last_active_date = timezone.now() - self.user.save(broadcast=False, update_fields=["last_active_date"]) + self.user.update_active_date() super().save(*args, **kwargs) diff --git a/bookwyrm/models/relationship.py b/bookwyrm/models/relationship.py index edb89d13..fc7a9df8 100644 --- a/bookwyrm/models/relationship.py +++ b/bookwyrm/models/relationship.py @@ -53,7 +53,7 @@ class UserRelationship(BookWyrmModel): def get_remote_id(self): """use shelf identifier in remote_id""" base_path = self.user_subject.remote_id - return "%s#follows/%d" % (base_path, self.id) + return f"{base_path}#follows/{self.id}" class UserFollows(ActivityMixin, UserRelationship): @@ -144,7 +144,8 @@ class UserFollowRequest(ActivitypubMixin, UserRelationship): """get id for sending an accept or reject of a local user""" base_path = self.user_object.remote_id - return "%s#%s/%d" % (base_path, status, self.id or 0) + status_id = self.id or 0 + return f"{base_path}#{status}/{status_id}" def accept(self, broadcast_only=False): """turn this request into the real deal""" diff --git a/bookwyrm/models/report.py b/bookwyrm/models/report.py index 7ff4c909..636817cb 100644 --- a/bookwyrm/models/report.py +++ b/bookwyrm/models/report.py @@ -1,5 +1,4 @@ """ flagged for moderation """ -from django.apps import apps from django.db import models from django.db.models import F, Q from .base_model import BookWyrmModel @@ -16,23 +15,6 @@ class Report(BookWyrmModel): statuses = models.ManyToManyField("Status", blank=True) resolved = models.BooleanField(default=False) - def save(self, *args, **kwargs): - """notify admins when a report is created""" - super().save(*args, **kwargs) - user_model = apps.get_model("bookwyrm.User", require_ready=True) - # moderators and superusers should be notified - admins = user_model.objects.filter( - Q(user_permissions__name__in=["moderate_user", "moderate_post"]) - | Q(is_superuser=True) - ).all() - notification_model = apps.get_model("bookwyrm.Notification", require_ready=True) - for admin in admins: - notification_model.objects.create( - user=admin, - related_report=self, - notification_type="REPORT", - ) - class Meta: """don't let users report themselves""" diff --git a/bookwyrm/models/shelf.py b/bookwyrm/models/shelf.py index c4e907d2..c578f082 100644 --- a/bookwyrm/models/shelf.py +++ b/bookwyrm/models/shelf.py @@ -1,5 +1,6 @@ """ puttin' books on shelves """ import re +from django.core.exceptions import PermissionDenied from django.db import models from django.utils import timezone @@ -20,6 +21,7 @@ class Shelf(OrderedCollectionMixin, BookWyrmModel): name = fields.CharField(max_length=100) identifier = models.CharField(max_length=100) + description = models.TextField(blank=True, null=True, max_length=500) user = fields.ForeignKey( "User", on_delete=models.PROTECT, activitypub_field="owner" ) @@ -44,18 +46,29 @@ class Shelf(OrderedCollectionMixin, BookWyrmModel): def get_identifier(self): """custom-shelf-123 for the url""" slug = re.sub(r"[^\w]", "", self.name).lower() - return "{:s}-{:d}".format(slug, self.id) + return f"{slug}-{self.id}" @property def collection_queryset(self): """list of books for this shelf, overrides OrderedCollectionMixin""" return self.books.order_by("shelfbook") + @property + def deletable(self): + """can the shelf be safely deleted?""" + return self.editable and not self.shelfbook_set.exists() + def get_remote_id(self): """shelf identifier instead of id""" base_path = self.user.remote_id identifier = self.identifier or self.get_identifier() - return "%s/books/%s" % (base_path, identifier) + return f"{base_path}/books/{identifier}" + + def raise_not_deletable(self, viewer): + """don't let anyone delete a default shelf""" + super().raise_not_deletable(viewer) + if not self.deletable: + raise PermissionDenied() class Meta: """user/shelf unqiueness""" diff --git a/bookwyrm/models/site.py b/bookwyrm/models/site.py index 09732c2f..8338fff8 100644 --- a/bookwyrm/models/site.py +++ b/bookwyrm/models/site.py @@ -24,7 +24,13 @@ class SiteSettings(models.Model): # about page registration_closed_text = models.TextField( - default="Contact an administrator to get an invite" + default="We aren't taking new users at this time. You can find an open " + 'instance at ' + "joinbookwyrm.com/instances." + ) + invite_request_text = models.TextField( + default="If your request is approved, you will receive an email with a " + "registration link." ) code_of_conduct = models.TextField(default="Add a code of conduct here.") privacy_policy = models.TextField(default="Add a privacy policy here.") @@ -81,7 +87,7 @@ class SiteInvite(models.Model): @property def link(self): """formats the invite link""" - return "https://{}/invite/{}".format(DOMAIN, self.code) + return f"https://{DOMAIN}/invite/{self.code}" class InviteRequest(BookWyrmModel): @@ -121,24 +127,7 @@ class PasswordReset(models.Model): @property def link(self): """formats the invite link""" - return "https://{}/password-reset/{}".format(DOMAIN, self.code) - - -class EmailBlocklist(models.Model): - """blocked email addresses""" - - created_date = models.DateTimeField(auto_now_add=True) - domain = models.CharField(max_length=255, unique=True) - - class Meta: - """default sorting""" - - ordering = ("-created_date",) - - @property - def users(self): - """find the users associated with this address""" - return User.objects.filter(email__endswith=f"@{self.domain}") + return f"https://{DOMAIN}/password-reset/{self.code}" # pylint: disable=unused-argument diff --git a/bookwyrm/models/status.py b/bookwyrm/models/status.py index d0f094d2..b6203678 100644 --- a/bookwyrm/models/status.py +++ b/bookwyrm/models/status.py @@ -3,6 +3,7 @@ from dataclasses import MISSING import re from django.apps import apps +from django.core.exceptions import PermissionDenied from django.core.validators import MaxValueValidator, MinValueValidator from django.db import models from django.dispatch import receiver @@ -67,40 +68,6 @@ class Status(OrderedCollectionPageMixin, BookWyrmModel): ordering = ("-published_date",) - def save(self, *args, **kwargs): - """save and notify""" - super().save(*args, **kwargs) - - notification_model = apps.get_model("bookwyrm.Notification", require_ready=True) - - if self.deleted: - notification_model.objects.filter(related_status=self).delete() - return - - if ( - self.reply_parent - and self.reply_parent.user != self.user - and self.reply_parent.user.local - ): - notification_model.objects.create( - user=self.reply_parent.user, - notification_type="REPLY", - related_user=self.user, - related_status=self, - ) - for mention_user in self.mention_users.all(): - # avoid double-notifying about this status - if not mention_user.local or ( - self.reply_parent and mention_user == self.reply_parent.user - ): - continue - notification_model.objects.create( - user=mention_user, - notification_type="MENTION", - related_user=self.user, - related_status=self, - ) - def delete(self, *args, **kwargs): # pylint: disable=unused-argument """ "delete" a status""" if hasattr(self, "boosted_status"): @@ -108,6 +75,10 @@ class Status(OrderedCollectionPageMixin, BookWyrmModel): super().delete(*args, **kwargs) return self.deleted = True + # clear user content + self.content = None + if hasattr(self, "quotation"): + self.quotation = None # pylint: disable=attribute-defined-outside-init self.deleted_date = timezone.now() self.save() @@ -179,9 +150,9 @@ class Status(OrderedCollectionPageMixin, BookWyrmModel): """helper function for loading AP serialized replies to a status""" return self.to_ordered_collection( self.replies(self), - remote_id="%s/replies" % self.remote_id, + remote_id=f"{self.remote_id}/replies", collection_only=True, - **kwargs + **kwargs, ).serialize() def to_activity_dataclass(self, pure=False): # pylint: disable=arguments-differ @@ -217,6 +188,13 @@ class Status(OrderedCollectionPageMixin, BookWyrmModel): """json serialized activitypub class""" return self.to_activity_dataclass(pure=pure).serialize() + def raise_not_editable(self, viewer): + """certain types of status aren't editable""" + # first, the standard raise + super().raise_not_editable(viewer) + if isinstance(self, (GeneratedNote, ReviewRating)): + raise PermissionDenied() + class GeneratedNote(Status): """these are app-generated messages about user activity""" @@ -226,10 +204,10 @@ class GeneratedNote(Status): """indicate the book in question for mastodon (or w/e) users""" message = self.content books = ", ".join( - '"%s"' % (book.remote_id, book.title) + f'"{book.title}"' for book in self.mention_books.all() ) - return "%s %s %s" % (self.user.display_name, message, books) + return f"{self.user.display_name} {message} {books}" activity_serializer = activitypub.GeneratedNote pure_type = "Note" @@ -277,10 +255,9 @@ class Comment(BookStatus): @property def pure_content(self): """indicate the book in question for mastodon (or w/e) users""" - return '%s

(comment on "%s")

' % ( - self.content, - self.book.remote_id, - self.book.title, + return ( + f'{self.content}

(comment on ' + f'"{self.book.title}")

' ) activity_serializer = activitypub.Comment @@ -306,11 +283,9 @@ class Quotation(BookStatus): """indicate the book in question for mastodon (or w/e) users""" quote = re.sub(r"^

", '

"', self.quote) quote = re.sub(r"

$", '"

', quote) - return '%s

-- "%s"

%s' % ( - quote, - self.book.remote_id, - self.book.title, - self.content, + return ( + f'{quote}

-- ' + f'"{self.book.title}"

{self.content}' ) activity_serializer = activitypub.Quotation @@ -389,27 +364,6 @@ class Boost(ActivityMixin, Status): return super().save(*args, **kwargs) - if not self.boosted_status.user.local or self.boosted_status.user == self.user: - return - - notification_model = apps.get_model("bookwyrm.Notification", require_ready=True) - notification_model.objects.create( - user=self.boosted_status.user, - related_status=self.boosted_status, - related_user=self.user, - notification_type="BOOST", - ) - - def delete(self, *args, **kwargs): - """delete and un-notify""" - notification_model = apps.get_model("bookwyrm.Notification", require_ready=True) - notification_model.objects.filter( - user=self.boosted_status.user, - related_status=self.boosted_status, - related_user=self.user, - notification_type="BOOST", - ).delete() - super().delete(*args, **kwargs) def __init__(self, *args, **kwargs): """the user field is "actor" here instead of "attributedTo" """ @@ -422,10 +376,6 @@ class Boost(ActivityMixin, Status): self.image_fields = [] self.deserialize_reverse_fields = [] - # This constraint can't work as it would cross tables. - # class Meta: - # unique_together = ('user', 'boosted_status') - # pylint: disable=unused-argument @receiver(models.signals.post_save) diff --git a/bookwyrm/models/user.py b/bookwyrm/models/user.py index a33daf72..637baa6e 100644 --- a/bookwyrm/models/user.py +++ b/bookwyrm/models/user.py @@ -152,12 +152,13 @@ class User(OrderedCollectionPageMixin, AbstractUser): @property def following_link(self): """just how to find out the following info""" - return "{:s}/following".format(self.remote_id) + return f"{self.remote_id}/following" @property def alt_text(self): """alt text with username""" - return "avatar for %s" % (self.localname or self.username) + # pylint: disable=consider-using-f-string + return "avatar for {:s}".format(self.localname or self.username) @property def display_name(self): @@ -194,12 +195,15 @@ class User(OrderedCollectionPageMixin, AbstractUser): queryset = queryset.exclude(blocks=viewer) return queryset + def update_active_date(self): + """this user is here! they are doing things!""" + self.last_active_date = timezone.now() + self.save(broadcast=False, update_fields=["last_active_date"]) + def to_outbox(self, filter_type=None, **kwargs): """an ordered collection of statuses""" if filter_type: - filter_class = apps.get_model( - "bookwyrm.%s" % filter_type, require_ready=True - ) + filter_class = apps.get_model(f"bookwyrm.{filter_type}", require_ready=True) if not issubclass(filter_class, Status): raise TypeError( "filter_status_class must be a subclass of models.Status" @@ -223,7 +227,7 @@ class User(OrderedCollectionPageMixin, AbstractUser): def to_following_activity(self, **kwargs): """activitypub following list""" - remote_id = "%s/following" % self.remote_id + remote_id = f"{self.remote_id}/following" return self.to_ordered_collection( self.following.order_by("-updated_date").all(), remote_id=remote_id, @@ -266,7 +270,7 @@ class User(OrderedCollectionPageMixin, AbstractUser): if not self.local and not re.match(regex.FULL_USERNAME, self.username): # generate a username that uses the domain (webfinger format) actor_parts = urlparse(self.remote_id) - self.username = "%s@%s" % (self.username, actor_parts.netloc) + self.username = f"{self.username}@{actor_parts.netloc}" # this user already exists, no need to populate fields if not created: @@ -320,7 +324,8 @@ class User(OrderedCollectionPageMixin, AbstractUser): @property def local_path(self): """this model doesn't inherit bookwyrm model, so here we are""" - return "/user/%s" % (self.localname or self.username) + # pylint: disable=consider-using-f-string + return "/user/{:s}".format(self.localname or self.username) def create_shelves(self): """default shelves for a new user""" @@ -361,7 +366,7 @@ class KeyPair(ActivitypubMixin, BookWyrmModel): def get_remote_id(self): # self.owner is set by the OneToOneField on User - return "%s/#main-key" % self.owner.remote_id + return f"{self.owner.remote_id}/#main-key" def save(self, *args, **kwargs): """create a key pair""" @@ -398,7 +403,7 @@ class AnnualGoal(BookWyrmModel): def get_remote_id(self): """put the year in the path""" - return "{:s}/goal/{:d}".format(self.user.remote_id, self.year) + return f"{self.user.remote_id}/goal/{self.year}" @property def books(self): @@ -454,7 +459,7 @@ def get_or_create_remote_server(domain): pass try: - data = get_data("https://%s/.well-known/nodeinfo" % domain) + data = get_data(f"https://{domain}/.well-known/nodeinfo") try: nodeinfo_url = data.get("links")[0].get("href") except (TypeError, KeyError): diff --git a/bookwyrm/preview_images.py b/bookwyrm/preview_images.py index 900a3e12..8224a278 100644 --- a/bookwyrm/preview_images.py +++ b/bookwyrm/preview_images.py @@ -220,6 +220,7 @@ def generate_default_inner_img(): # pylint: disable=too-many-locals +# pylint: disable=too-many-statements def generate_preview_image( texts=None, picture=None, rating=None, show_instance_layer=True ): @@ -237,7 +238,8 @@ def generate_preview_image( # Color if BG_COLOR in ["use_dominant_color_light", "use_dominant_color_dark"]: - image_bg_color = "rgb(%s, %s, %s)" % dominant_color + red, green, blue = dominant_color + image_bg_color = f"rgb({red}, {green}, {blue})" # Adjust color image_bg_color_rgb = [x / 255.0 for x in ImageColor.getrgb(image_bg_color)] @@ -315,7 +317,8 @@ def save_and_cleanup(image, instance=None): """Save and close the file""" if not isinstance(instance, (models.Book, models.User, models.SiteSettings)): return False - file_name = "%s-%s.jpg" % (str(instance.id), str(uuid4())) + uuid = uuid4() + file_name = f"{instance.id}-{uuid}.jpg" image_buffer = BytesIO() try: @@ -412,7 +415,7 @@ def generate_user_preview_image_task(user_id): texts = { "text_one": user.display_name, - "text_three": "@{}@{}".format(user.localname, settings.DOMAIN), + "text_three": f"@{user.localname}@{settings.DOMAIN}", } if user.avatar: diff --git a/bookwyrm/sanitize_html.py b/bookwyrm/sanitize_html.py index 0be64c58..8b0e3c4c 100644 --- a/bookwyrm/sanitize_html.py +++ b/bookwyrm/sanitize_html.py @@ -48,7 +48,7 @@ class InputHtmlParser(HTMLParser): # pylint: disable=abstract-method return self.tag_stack = self.tag_stack[:-1] - self.output.append(("tag", "" % tag)) + self.output.append(("tag", f"")) def handle_data(self, data): """extract the answer, if we're in an answer tag""" diff --git a/bookwyrm/settings.py b/bookwyrm/settings.py index 452b8d94..895a537a 100644 --- a/bookwyrm/settings.py +++ b/bookwyrm/settings.py @@ -13,7 +13,7 @@ VERSION = "0.0.1" PAGE_LENGTH = env("PAGE_LENGTH", 15) DEFAULT_LANGUAGE = env("DEFAULT_LANGUAGE", "English") -JS_CACHE = "e5832a26" +JS_CACHE = "e2bc0653" # email EMAIL_BACKEND = env("EMAIL_BACKEND", "django.core.mail.backends.smtp.EmailBackend") @@ -23,7 +23,7 @@ EMAIL_HOST_USER = env("EMAIL_HOST_USER") EMAIL_HOST_PASSWORD = env("EMAIL_HOST_PASSWORD") EMAIL_USE_TLS = env.bool("EMAIL_USE_TLS", True) EMAIL_USE_SSL = env.bool("EMAIL_USE_SSL", False) -DEFAULT_FROM_EMAIL = "admin@{:s}".format(env("DOMAIN")) +DEFAULT_FROM_EMAIL = f"admin@{DOMAIN}" # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) @@ -77,7 +77,8 @@ MIDDLEWARE = [ "django.middleware.common.CommonMiddleware", "django.middleware.csrf.CsrfViewMiddleware", "django.contrib.auth.middleware.AuthenticationMiddleware", - "bookwyrm.timezone_middleware.TimezoneMiddleware", + "bookwyrm.middleware.TimezoneMiddleware", + "bookwyrm.middleware.IPBlocklistMiddleware", "django.contrib.messages.middleware.MessageMiddleware", "django.middleware.clickjacking.XFrameOptionsMiddleware", ] @@ -126,7 +127,7 @@ DATABASES = { "USER": env("POSTGRES_USER", "fedireads"), "PASSWORD": env("POSTGRES_PASSWORD", "fedireads"), "HOST": env("POSTGRES_HOST", ""), - "PORT": env("POSTGRES_PORT", 5432), + "PORT": env("PGPORT", 5432), }, } @@ -177,11 +178,8 @@ USE_L10N = True USE_TZ = True -USER_AGENT = "%s (BookWyrm/%s; +https://%s/)" % ( - requests.utils.default_user_agent(), - VERSION, - DOMAIN, -) +agent = requests.utils.default_user_agent() +USER_AGENT = f"{agent} (BookWyrm/{VERSION}; +https://{DOMAIN}/)" # Imagekit generated thumbnails ENABLE_THUMBNAIL_GENERATION = env.bool("ENABLE_THUMBNAIL_GENERATION", False) @@ -212,11 +210,11 @@ if USE_S3: AWS_S3_OBJECT_PARAMETERS = {"CacheControl": "max-age=86400"} # S3 Static settings STATIC_LOCATION = "static" - STATIC_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, STATIC_LOCATION) + STATIC_URL = f"https://{AWS_S3_CUSTOM_DOMAIN}/{STATIC_LOCATION}/" STATICFILES_STORAGE = "bookwyrm.storage_backends.StaticStorage" # S3 Media settings MEDIA_LOCATION = "images" - MEDIA_URL = "https://%s/%s/" % (AWS_S3_CUSTOM_DOMAIN, MEDIA_LOCATION) + MEDIA_URL = f"https://{AWS_S3_CUSTOM_DOMAIN}/{MEDIA_LOCATION}/" MEDIA_FULL_URL = MEDIA_URL DEFAULT_FILE_STORAGE = "bookwyrm.storage_backends.ImagesStorage" # I don't know if it's used, but the site crashes without it @@ -226,5 +224,5 @@ else: STATIC_URL = "/static/" STATIC_ROOT = os.path.join(BASE_DIR, env("STATIC_ROOT", "static")) MEDIA_URL = "/images/" - MEDIA_FULL_URL = "%s://%s%s" % (PROTOCOL, DOMAIN, MEDIA_URL) + MEDIA_FULL_URL = f"{PROTOCOL}://{DOMAIN}{MEDIA_URL}" MEDIA_ROOT = os.path.join(BASE_DIR, env("MEDIA_ROOT", "images")) diff --git a/bookwyrm/signatures.py b/bookwyrm/signatures.py index c8c90028..61cafe71 100644 --- a/bookwyrm/signatures.py +++ b/bookwyrm/signatures.py @@ -26,21 +26,21 @@ def make_signature(sender, destination, date, digest): """uses a private key to sign an outgoing message""" inbox_parts = urlparse(destination) signature_headers = [ - "(request-target): post %s" % inbox_parts.path, - "host: %s" % inbox_parts.netloc, - "date: %s" % date, - "digest: %s" % digest, + f"(request-target): post {inbox_parts.path}", + f"host: {inbox_parts.netloc}", + f"date: {date}", + f"digest: {digest}", ] message_to_sign = "\n".join(signature_headers) signer = pkcs1_15.new(RSA.import_key(sender.key_pair.private_key)) signed_message = signer.sign(SHA256.new(message_to_sign.encode("utf8"))) signature = { - "keyId": "%s#main-key" % sender.remote_id, + "keyId": f"{sender.remote_id}#main-key", "algorithm": "rsa-sha256", "headers": "(request-target) host date digest", "signature": b64encode(signed_message).decode("utf8"), } - return ",".join('%s="%s"' % (k, v) for (k, v) in signature.items()) + return ",".join(f'{k}="{v}"' for (k, v) in signature.items()) def make_digest(data): @@ -58,7 +58,7 @@ def verify_digest(request): elif algorithm == "SHA-512": hash_function = hashlib.sha512 else: - raise ValueError("Unsupported hash function: {}".format(algorithm)) + raise ValueError(f"Unsupported hash function: {algorithm}") expected = hash_function(request.body).digest() if b64decode(digest) != expected: @@ -95,18 +95,18 @@ class Signature: def verify(self, public_key, request): """verify rsa signature""" if http_date_age(request.headers["date"]) > MAX_SIGNATURE_AGE: - raise ValueError("Request too old: %s" % (request.headers["date"],)) + raise ValueError(f"Request too old: {request.headers['date']}") public_key = RSA.import_key(public_key) comparison_string = [] for signed_header_name in self.headers.split(" "): if signed_header_name == "(request-target)": - comparison_string.append("(request-target): post %s" % request.path) + comparison_string.append(f"(request-target): post {request.path}") else: if signed_header_name == "digest": verify_digest(request) comparison_string.append( - "%s: %s" % (signed_header_name, request.headers[signed_header_name]) + f"{signed_header_name}: {request.headers[signed_header_name]}" ) comparison_string = "\n".join(comparison_string) diff --git a/bookwyrm/static/css/bookwyrm.css b/bookwyrm/static/css/bookwyrm.css index 9065d7fb..e1012c2f 100644 --- a/bookwyrm/static/css/bookwyrm.css +++ b/bookwyrm/static/css/bookwyrm.css @@ -378,6 +378,13 @@ input[type=file]::file-selector-button:hover { right: 1em; } +/** Tooltips + ******************************************************************************/ + +.tooltip { + width: 100%; +} + /** States ******************************************************************************/ diff --git a/bookwyrm/static/js/status_cache.js b/bookwyrm/static/js/status_cache.js index b3e345b1..2a50bfcb 100644 --- a/bookwyrm/static/js/status_cache.js +++ b/bookwyrm/static/js/status_cache.js @@ -141,8 +141,10 @@ let StatusCache = new class { modal.getElementsByClassName("modal-close")[0].click(); // Update shelve buttons - document.querySelectorAll("[data-shelve-button-book='" + form.book.value +"']") - .forEach(button => this.cycleShelveButtons(button, form.reading_status.value)); + if (form.reading_status) { + document.querySelectorAll("[data-shelve-button-book='" + form.book.value +"']") + .forEach(button => this.cycleShelveButtons(button, form.reading_status.value)); + } return; } diff --git a/bookwyrm/suggested_users.py b/bookwyrm/suggested_users.py index 88343061..e8f23632 100644 --- a/bookwyrm/suggested_users.py +++ b/bookwyrm/suggested_users.py @@ -24,8 +24,8 @@ class SuggestedUsers(RedisStore): def store_id(self, user): # pylint: disable=no-self-use """the key used to store this user's recs""" if isinstance(user, int): - return "{:d}-suggestions".format(user) - return "{:d}-suggestions".format(user.id) + return f"{user}-suggestions" + return f"{user.id}-suggestions" def get_counts_from_rank(self, rank): # pylint: disable=no-self-use """calculate mutuals count and shared books count from rank""" diff --git a/bookwyrm/templates/book/edit_book.html b/bookwyrm/templates/book/edit_book.html index 2f6ca324..5a859e3d 100644 --- a/bookwyrm/templates/book/edit_book.html +++ b/bookwyrm/templates/book/edit_book.html @@ -236,14 +236,12 @@ {{ form.cover }} - {% if book %}
- +
- {% endif %} {% for error in form.cover.errors %}

{{ error | escape }}

{% endfor %} @@ -253,12 +251,27 @@

{% trans "Physical Properties" %}

-
- - {{ form.physical_format }} - {% for error in form.physical_format.errors %} -

{{ error | escape }}

- {% endfor %} +
+
+
+ +
+ {{ form.physical_format }} +
+ {% for error in form.physical_format.errors %} +

{{ error | escape }}

+ {% endfor %} +
+
+
+
+ + {{ form.physical_format_detail }} + {% for error in form.physical_format_detail.errors %} +

{{ error | escape }}

+ {% endfor %} +
+
diff --git a/bookwyrm/templates/book/publisher_info.html b/bookwyrm/templates/book/publisher_info.html index b7975a62..42cb4098 100644 --- a/bookwyrm/templates/book/publisher_info.html +++ b/bookwyrm/templates/book/publisher_info.html @@ -4,13 +4,15 @@ {% load humanize %}

- {% with format=book.physical_format pages=book.pages %} + {% firstof book.physical_format_detail book.physical_format as format %} + {% firstof book.physical_format book.physical_format_detail as format_property %} + {% with pages=book.pages %} {% if format %} {% comment %} @todo The bookFormat property is limited to a list of values whereas the book edition is free text. @see https://schema.org/bookFormat {% endcomment %} - + {% endif %} {% if pages %} diff --git a/bookwyrm/templates/components/inline_form.html b/bookwyrm/templates/components/inline_form.html index a8924ef2..37f9f556 100644 --- a/bookwyrm/templates/components/inline_form.html +++ b/bookwyrm/templates/components/inline_form.html @@ -1,5 +1,5 @@ {% load i18n %} -

diff --git a/bookwyrm/templates/directory/community_filter.html b/bookwyrm/templates/directory/community_filter.html index bd0ba778..91783fd3 100644 --- a/bookwyrm/templates/directory/community_filter.html +++ b/bookwyrm/templates/directory/community_filter.html @@ -8,7 +8,7 @@ {% trans "Local users" %} {% endblock %} diff --git a/bookwyrm/templates/directory/sort_filter.html b/bookwyrm/templates/directory/sort_filter.html index 82b561fb..c7c19f6f 100644 --- a/bookwyrm/templates/directory/sort_filter.html +++ b/bookwyrm/templates/directory/sort_filter.html @@ -5,8 +5,8 @@
{% endblock %} diff --git a/bookwyrm/templates/discover/discover.html b/bookwyrm/templates/discover/discover.html index 01ef2186..f55f81a0 100644 --- a/bookwyrm/templates/discover/discover.html +++ b/bookwyrm/templates/discover/discover.html @@ -15,14 +15,15 @@

+ {% with tile_classes="tile is-child box has-background-white-ter is-clipped" %}
-
+
{% include 'discover/large-book.html' with status=large_activities.0 %}
-
+
{% include 'discover/large-book.html' with status=large_activities.1 %}
@@ -31,18 +32,18 @@
-
+
{% include 'discover/large-book.html' with status=large_activities.2 %}
-
+
{% include 'discover/small-book.html' with status=small_activities.0 %}
-
+
{% include 'discover/small-book.html' with status=small_activities.1 %}
@@ -51,18 +52,18 @@
-
+
{% include 'discover/small-book.html' with status=small_activities.2 %}
-
+
{% include 'discover/small-book.html' with status=small_activities.3 %}
-
+
{% include 'discover/large-book.html' with status=large_activities.3 %}
@@ -71,16 +72,17 @@
-
+
{% include 'discover/large-book.html' with status=large_activities.4 %}
-
+
{% include 'discover/large-book.html' with status=large_activities.5 %}
+ {% endwith %}
diff --git a/bookwyrm/templates/feed/direct_messages.html b/bookwyrm/templates/feed/direct_messages.html index 115e1e6f..77f9aac1 100644 --- a/bookwyrm/templates/feed/direct_messages.html +++ b/bookwyrm/templates/feed/direct_messages.html @@ -14,7 +14,7 @@
- {% include 'snippets/create_status/status.html' with type="direct" uuid=1 mention=partner %} + {% include 'snippets/create_status/status.html' with type="direct" uuid=1 mention=partner no_script=True %}
diff --git a/bookwyrm/templates/feed/feed.html b/bookwyrm/templates/feed/feed.html index b8e351c9..a6175199 100644 --- a/bookwyrm/templates/feed/feed.html +++ b/bookwyrm/templates/feed/feed.html @@ -25,7 +25,7 @@ {% if request.user.show_goal and not goal and tab.key == 'home' %} {% now 'Y' as year %}
- {% include 'snippets/goal_card.html' with year=year %} + {% include 'feed/goal_card.html' with year=year %}
{% endif %} diff --git a/bookwyrm/templates/snippets/goal_card.html b/bookwyrm/templates/feed/goal_card.html similarity index 77% rename from bookwyrm/templates/snippets/goal_card.html rename to bookwyrm/templates/feed/goal_card.html index 329fea54..40ba614e 100644 --- a/bookwyrm/templates/snippets/goal_card.html +++ b/bookwyrm/templates/feed/goal_card.html @@ -7,13 +7,8 @@ {% endblock %} - {% block card-content %} -
-

{% blocktrans %}Set a goal for how many books you'll finish reading in {{ year }}, and track your progress throughout the year.{% endblocktrans %}

- - {% include 'snippets/goal_form.html' %} -
+{% include 'snippets/goal_form.html' %} {% endblock %} {% block card-footer %} diff --git a/bookwyrm/templates/import/import_status.html b/bookwyrm/templates/import/import_status.html index 1c425af6..1c073944 100644 --- a/bookwyrm/templates/import/import_status.html +++ b/bookwyrm/templates/import/import_status.html @@ -77,7 +77,7 @@ class="checkbox" type="checkbox" data-action="toggle-all" - data-target="failed-imports" + data-target="failed_imports" /> {% trans "Select all" %} diff --git a/bookwyrm/templates/invite.html b/bookwyrm/templates/invite.html index 22a3a32c..fcd379e2 100644 --- a/bookwyrm/templates/invite.html +++ b/bookwyrm/templates/invite.html @@ -5,11 +5,11 @@ {% block content %} +

{% trans "Create an Account" %}

{% if valid %} -

{% trans "Create an Account" %}

@@ -25,7 +25,7 @@
-
+
{% include 'snippets/about.html' %}
diff --git a/bookwyrm/templates/landing/about.html b/bookwyrm/templates/landing/about.html index dd7036c4..c3b1e84e 100644 --- a/bookwyrm/templates/landing/about.html +++ b/bookwyrm/templates/landing/about.html @@ -1,4 +1,4 @@ -{% extends 'landing/landing_layout.html' %} +{% extends 'landing/layout.html' %} {% load i18n %} {% block panel %} diff --git a/bookwyrm/templates/landing/landing.html b/bookwyrm/templates/landing/landing.html index 7a30f161..d13cd582 100644 --- a/bookwyrm/templates/landing/landing.html +++ b/bookwyrm/templates/landing/landing.html @@ -1,4 +1,4 @@ -{% extends 'landing/landing_layout.html' %} +{% extends 'landing/layout.html' %} {% load i18n %} {% block panel %} diff --git a/bookwyrm/templates/landing/landing_layout.html b/bookwyrm/templates/landing/layout.html similarity index 53% rename from bookwyrm/templates/landing/landing_layout.html rename to bookwyrm/templates/landing/layout.html index 946482cb..0d6f231c 100644 --- a/bookwyrm/templates/landing/landing_layout.html +++ b/bookwyrm/templates/landing/layout.html @@ -40,38 +40,41 @@
{% if not request.user.is_authenticated %}
+

+ {% if site.allow_registration %} + {% blocktrans with name=site.name %}Join {{ name }}{% endblocktrans %} + {% elif site.allow_invite_requests %} + {% trans "Request an Invitation" %} + {% else %} + {% blocktrans with name=site.name%}{{ name}} registration is closed{% endblocktrans %} + {% endif %} +

+ {% if site.allow_registration %} -

{% blocktrans with name=site.name %}Join {{ name }}{% endblocktrans %}

- - {% include 'snippets/register_form.html' %} - - +
+ {% include 'snippets/register_form.html' %} +
+ {% elif site.allow_invite_requests %} + {% if request_received %} +

+ {% trans "Thank you! Your request has been received." %} +

+ {% else %} +

{{ site.invite_request_text }}

+
+ {% csrf_token %} +
+ + + {% for error in request_form.email.errors %} +

{{ error|escape }}

+ {% endfor %} +
+ +
+ {% endif %} {% else %} - -

{% trans "This instance is closed" %}

-

{{ site.registration_closed_text|safe}}

- - {% if site.allow_invite_requests %} - {% if request_received %} -

- {% trans "Thank you! Your request has been received." %} -

- {% else %} -

{% trans "Request an Invitation" %}

-
- {% csrf_token %} -
- - - {% for error in request_form.email.errors %} -

{{ error|escape }}

- {% endfor %} -
- -
- {% endif %} - {% endif %} - +

{{ site.registration_closed_text|safe}}

{% endif %}
{% else %} diff --git a/bookwyrm/templates/layout.html b/bookwyrm/templates/layout.html index c00a0fee..ce3eee2b 100644 --- a/bookwyrm/templates/layout.html +++ b/bookwyrm/templates/layout.html @@ -4,12 +4,14 @@ - {% block title %}BookWyrm{% endblock %} | {{ site.name }} + {% block title %}BookWyrm{% endblock %} - {{ site.name }} + + {% if preview_images_enabled is True %} @@ -17,8 +19,8 @@ {% else %} {% endif %} - - + + @@ -34,10 +36,15 @@ -
+ {% if list.id %}
{% trans "Delete list" as button_text %} {% include 'snippets/toggle/toggle_button.html' with class="is-danger" text=button_text icon_with_text="x" controls_text="delete_list" controls_uid=list.id focus="modal_title_delete_list" %}
+ {% endif %}
diff --git a/bookwyrm/templates/lists/list.html b/bookwyrm/templates/lists/list.html index 35014a7b..dbee2f1f 100644 --- a/bookwyrm/templates/lists/list.html +++ b/bookwyrm/templates/lists/list.html @@ -66,14 +66,14 @@

{% blocktrans with username=item.user.display_name user_path=item.user.local_path %}Added by {{ username }}{% endblocktrans %}

- {% if list.user == request.user or list.curation == 'open' and item.user == request.user %} + {% if list.user == request.user %} -
+ + + +
+

{% trans "Display preferences" %}

+
+
+ + + + {% url 'directory' as path %} +

+ {% blocktrans %}Your account will show up in the directory, and may be recommended to other BookWyrm users.{% endblocktrans %} +

+
+
+ +
+ {{ form.preferred_timezone }} +
+
-
-
+ + + + +
+

{% trans "Privacy" %}

+
+
+ +
+
+ +
+ {{ form.default_post_privacy }} +
+
+
+
+
{% endblock %} diff --git a/bookwyrm/templates/preferences/layout.html b/bookwyrm/templates/preferences/layout.html index 758be9e5..bf4fed7d 100644 --- a/bookwyrm/templates/preferences/layout.html +++ b/bookwyrm/templates/preferences/layout.html @@ -12,7 +12,8 @@ {% endif %} {% if perms.bookwyrm.edit_instance_settings %} @@ -70,14 +74,7 @@
  • {% url 'settings-site' as url %} {% trans "Site Settings" %} - {% if url in request.path %} - - {% endif %} + {% block site-subtabs %}{% endblock %}
  • {% endif %} diff --git a/bookwyrm/templates/moderation/report.html b/bookwyrm/templates/settings/reports/report.html similarity index 78% rename from bookwyrm/templates/moderation/report.html rename to bookwyrm/templates/settings/reports/report.html index d0e4026a..37593f3c 100644 --- a/bookwyrm/templates/moderation/report.html +++ b/bookwyrm/templates/settings/reports/report.html @@ -3,20 +3,21 @@ {% load humanize %} {% block title %}{% blocktrans with report_id=report.id username=report.user.username %}Report #{{ report_id }}: {{ username }}{% endblocktrans %}{% endblock %} -{% block header %}{% blocktrans with report_id=report.id username=report.user.username %}Report #{{ report_id }}: {{ username }}{% endblocktrans %}{% endblock %} + +{% block header %} +{% blocktrans with report_id=report.id username=report.user.username %}Report #{{ report_id }}: {{ username }}{% endblocktrans %} +{% trans "Back to reports" %} +{% endblock %} {% block panel %} -
    - {% include 'moderation/report_preview.html' with report=report %} + {% include 'settings/reports/report_preview.html' with report=report %}
    -{% include 'user_admin/user_info.html' with user=report.user %} +{% include 'settings/users/user_info.html' with user=report.user %} -{% include 'user_admin/user_moderation_actions.html' with user=report.user %} +{% include 'settings/users/user_moderation_actions.html' with user=report.user %}

    {% trans "Moderator Comments" %}

    diff --git a/bookwyrm/templates/moderation/report_preview.html b/bookwyrm/templates/settings/reports/report_preview.html similarity index 100% rename from bookwyrm/templates/moderation/report_preview.html rename to bookwyrm/templates/settings/reports/report_preview.html diff --git a/bookwyrm/templates/moderation/reports.html b/bookwyrm/templates/settings/reports/reports.html similarity index 90% rename from bookwyrm/templates/moderation/reports.html rename to bookwyrm/templates/settings/reports/reports.html index c83f626f..c72fd03d 100644 --- a/bookwyrm/templates/moderation/reports.html +++ b/bookwyrm/templates/settings/reports/reports.html @@ -30,7 +30,7 @@
    -{% include 'user_admin/user_admin_filters.html' %} +{% include 'settings/users/user_admin_filters.html' %}
    {% if not reports %} @@ -39,7 +39,7 @@ {% for report in reports %}
    - {% include 'moderation/report_preview.html' with report=report %} + {% include 'settings/reports/report_preview.html' with report=report %}
    {% endfor %}
    diff --git a/bookwyrm/templates/settings/site.html b/bookwyrm/templates/settings/site.html index 945e5749..da5b7705 100644 --- a/bookwyrm/templates/settings/site.html +++ b/bookwyrm/templates/settings/site.html @@ -5,36 +5,46 @@ {% block header %}{% trans "Site Settings" %}{% endblock %} -{% block panel %} +{% block site-subtabs %} + +{% endblock %} +{% block panel %}
    {% csrf_token %}

    {% trans "Instance Info" %}

    -
    - - {{ site_form.name }} -
    -
    - - {{ site_form.instance_tagline }} -
    -
    - - {{ site_form.instance_description }} -
    -
    - -

    {% trans "Used when the instance is previewed on joinbookwyrm.com. Does not support html or markdown." %}

    - {{ site_form.instance_short_description }} -
    -
    - - {{ site_form.code_of_conduct }} -
    -
    - - {{ site_form.privacy_policy }} +
    +
    + + {{ site_form.name }} +
    +
    + + {{ site_form.instance_tagline }} +
    +
    + + {{ site_form.instance_description }} +
    +
    + +

    {% trans "Used when the instance is previewed on joinbookwyrm.com. Does not support html or markdown." %}

    + {{ site_form.instance_short_description }} +
    +
    + + {{ site_form.code_of_conduct }} +
    +
    + + {{ site_form.privacy_policy }} +
    @@ -42,16 +52,16 @@

    {% trans "Images" %}

    -
    -
    +
    +
    {{ site_form.logo }}
    -
    +
    {{ site_form.logo_small }}
    -
    +
    {{ site_form.favicon }}
    @@ -62,21 +72,23 @@ @@ -84,28 +96,37 @@

    {% trans "Registration" %}

    -
    - -
    -
    - -
    -
    - -

    {% trans "(Recommended if registration is open)" %}

    -
    -
    - - {{ site_form.registration_closed_text }} +
    +
    + +
    +
    + +
    +
    + +

    {% trans "(Recommended if registration is open)" %}

    +
    +
    + + {{ site_form.registration_closed_text }} +
    +
    + + {{ site_form.invite_request_text }} + {% for error in site_form.invite_request_text.errors %} +

    {{ error|escape }}

    + {% endfor %} +
    diff --git a/bookwyrm/templates/user_admin/delete_user_form.html b/bookwyrm/templates/settings/users/delete_user_form.html similarity index 100% rename from bookwyrm/templates/user_admin/delete_user_form.html rename to bookwyrm/templates/settings/users/delete_user_form.html diff --git a/bookwyrm/templates/user_admin/server_filter.html b/bookwyrm/templates/settings/users/server_filter.html similarity index 100% rename from bookwyrm/templates/user_admin/server_filter.html rename to bookwyrm/templates/settings/users/server_filter.html diff --git a/bookwyrm/templates/settings/users/user.html b/bookwyrm/templates/settings/users/user.html new file mode 100644 index 00000000..676502e6 --- /dev/null +++ b/bookwyrm/templates/settings/users/user.html @@ -0,0 +1,16 @@ +{% extends 'settings/layout.html' %} +{% load i18n %} + +{% block title %}{{ user.username }}{% endblock %} +{% block header %} +{{ user.username }} +{% trans "Back to users" %} +{% endblock %} + +{% block panel %} +{% include 'settings/users/user_info.html' with user=user %} + +{% include 'settings/users/user_moderation_actions.html' with user=user %} + +{% endblock %} + diff --git a/bookwyrm/templates/user_admin/user_admin.html b/bookwyrm/templates/settings/users/user_admin.html similarity index 97% rename from bookwyrm/templates/user_admin/user_admin.html rename to bookwyrm/templates/settings/users/user_admin.html index 024ebfec..874ce818 100644 --- a/bookwyrm/templates/user_admin/user_admin.html +++ b/bookwyrm/templates/settings/users/user_admin.html @@ -13,7 +13,7 @@ {% block panel %} -{% include 'user_admin/user_admin_filters.html' %} +{% include 'settings/users/user_admin_filters.html' %} diff --git a/bookwyrm/templates/user_admin/user_admin_filters.html b/bookwyrm/templates/settings/users/user_admin_filters.html similarity index 59% rename from bookwyrm/templates/user_admin/user_admin_filters.html rename to bookwyrm/templates/settings/users/user_admin_filters.html index c9c7a93f..48a3b7c8 100644 --- a/bookwyrm/templates/user_admin/user_admin_filters.html +++ b/bookwyrm/templates/settings/users/user_admin_filters.html @@ -1,7 +1,7 @@ {% extends 'snippets/filters_panel/filters_panel.html' %} {% block filter_fields %} -{% include 'user_admin/username_filter.html' %} +{% include 'settings/users/username_filter.html' %} {% include 'directory/community_filter.html' %} -{% include 'user_admin/server_filter.html' %} +{% include 'settings/users/server_filter.html' %} {% endblock %} diff --git a/bookwyrm/templates/user_admin/user_info.html b/bookwyrm/templates/settings/users/user_info.html similarity index 57% rename from bookwyrm/templates/user_admin/user_info.html rename to bookwyrm/templates/settings/users/user_info.html index 7ad57e0e..8d332b1a 100644 --- a/bookwyrm/templates/user_admin/user_info.html +++ b/bookwyrm/templates/settings/users/user_info.html @@ -48,58 +48,42 @@
    {% if user.local %} -
    -
    {% trans "Email:" %}
    -
    {{ user.email }}
    -
    +
    {% trans "Email:" %}
    +
    {{ user.email }}
    {% endif %} {% with report_count=user.report_set.count %} -
    -
    {% trans "Reports:" %}
    -
    - {{ report_count|intcomma }} - {% if report_count > 0 %} - - {% trans "(View reports)" %} - - {% endif %} -
    -
    +
    {% trans "Reports:" %}
    +
    + {{ report_count|intcomma }} + {% if report_count > 0 %} + + {% trans "(View reports)" %} + + {% endif %} +
    {% endwith %} -
    -
    {% trans "Blocked by count:" %}
    -
    {{ user.blocked_by.count }}
    -
    +
    {% trans "Blocked by count:" %}
    +
    {{ user.blocked_by.count }}
    -
    -
    {% trans "Last active date:" %}
    -
    {{ user.last_active_date }}
    -
    +
    {% trans "Last active date:" %}
    +
    {{ user.last_active_date }}
    -
    -
    {% trans "Manually approved followers:" %}
    -
    {{ user.manually_approves_followers }}
    -
    +
    {% trans "Manually approved followers:" %}
    +
    {{ user.manually_approves_followers }}
    -
    -
    {% trans "Discoverable:" %}
    -
    {{ user.discoverable }}
    -
    +
    {% trans "Discoverable:" %}
    +
    {{ user.discoverable }}
    {% if not user.is_active %} -
    -
    {% trans "Deactivation reason:" %}
    -
    {{ user.deactivation_reason }}
    -
    +
    {% trans "Deactivation reason:" %}
    +
    {{ user.deactivation_reason }}
    {% endif %} {% if not user.is_active and user.deactivation_reason == "pending" %} -
    -
    {% trans "Confirmation code:" %}
    -
    {{ user.confirmation_code }}
    -
    +
    {% trans "Confirmation code:" %}
    +
    {{ user.confirmation_code }}
    {% endif %}
    @@ -113,18 +97,14 @@ {% if server %}
    {{ server.server_name }}
    -
    -
    {% trans "Software:" %}
    -
    {{ server.application_type }}
    -
    -
    -
    {% trans "Version:" %}
    -
    {{ server.application_version }}
    -
    -
    -
    {% trans "Status:" %}
    -
    {{ server.status }}
    -
    +
    {% trans "Software:" %}
    +
    {{ server.application_type }}
    + +
    {% trans "Version:" %}
    +
    {{ server.application_version }}
    + +
    {% trans "Status:" %}
    +
    {{ server.status }}
    {% if server.notes %}
    {% trans "Notes" %}
    diff --git a/bookwyrm/templates/user_admin/user_moderation_actions.html b/bookwyrm/templates/settings/users/user_moderation_actions.html similarity index 95% rename from bookwyrm/templates/user_admin/user_moderation_actions.html rename to bookwyrm/templates/settings/users/user_moderation_actions.html index 12b70d3c..a976359f 100644 --- a/bookwyrm/templates/user_admin/user_moderation_actions.html +++ b/bookwyrm/templates/settings/users/user_moderation_actions.html @@ -36,7 +36,7 @@ {% if user.local %}
    - {% include "user_admin/delete_user_form.html" with controls_text="delete_user" class="mt-2 mb-2" %} + {% include "settings/users/delete_user_form.html" with controls_text="delete_user" class="mt-2 mb-2" %}
    {% endif %} diff --git a/bookwyrm/templates/user_admin/username_filter.html b/bookwyrm/templates/settings/users/username_filter.html similarity index 100% rename from bookwyrm/templates/user_admin/username_filter.html rename to bookwyrm/templates/settings/users/username_filter.html diff --git a/bookwyrm/templates/shelf/create_shelf_form.html b/bookwyrm/templates/shelf/create_shelf_form.html new file mode 100644 index 00000000..e15e1cc1 --- /dev/null +++ b/bookwyrm/templates/shelf/create_shelf_form.html @@ -0,0 +1,13 @@ +{% extends 'components/inline_form.html' %} +{% load i18n %} + +{% block header %} +{% trans "Create Shelf" %} +{% endblock %} + +{% block form %} + + {% include "shelf/form.html" with editable=shelf.editable form=create_form %} + +{% endblock %} + diff --git a/bookwyrm/templates/shelf/edit_shelf_form.html b/bookwyrm/templates/shelf/edit_shelf_form.html new file mode 100644 index 00000000..5951b6da --- /dev/null +++ b/bookwyrm/templates/shelf/edit_shelf_form.html @@ -0,0 +1,13 @@ +{% extends 'components/inline_form.html' %} +{% load i18n %} + +{% block header %} +{% trans "Edit Shelf" %} +{% endblock %} + +{% block form %} + + {% include "shelf/form.html" with editable=shelf.editable form=edit_form privacy=shelf.privacy %} + +{% endblock %} + diff --git a/bookwyrm/templates/shelf/form.html b/bookwyrm/templates/shelf/form.html new file mode 100644 index 00000000..ff7f8b5e --- /dev/null +++ b/bookwyrm/templates/shelf/form.html @@ -0,0 +1,28 @@ +{% load i18n %} +{% load utilities %} +{% with 0|uuid as uuid %} +{% csrf_token %} + + +{% if editable %} +
    + + +
    +{% else %} + +{% endif %} + +
    + + +
    +
    +
    + {% include 'snippets/privacy_select.html' with current=privacy %} +
    +
    + +
    +
    +{% endwith %} diff --git a/bookwyrm/templates/user/shelf/shelf.html b/bookwyrm/templates/shelf/shelf.html similarity index 70% rename from bookwyrm/templates/user/shelf/shelf.html rename to bookwyrm/templates/shelf/shelf.html index 06507d3e..88f4b2bb 100644 --- a/bookwyrm/templates/user/shelf/shelf.html +++ b/bookwyrm/templates/shelf/shelf.html @@ -5,7 +5,7 @@ {% load i18n %} {% block title %} -{% include 'user/shelf/books_header.html' %} +{% include 'user/books_header.html' %} {% endblock %} {% block opengraph_images %} @@ -15,7 +15,7 @@ {% block content %}

    - {% include 'user/shelf/books_header.html' %} + {% include 'user/books_header.html' %}

    @@ -60,45 +60,62 @@
    - {% include 'user/shelf/create_shelf_form.html' with controls_text='create_shelf_form' %} + {% include 'shelf/create_shelf_form.html' with controls_text='create_shelf_form' %}
    -
    -
    -

    - {{ shelf.name }} - - {% include 'snippets/privacy-icons.html' with item=shelf %} - - {% with count=books.paginator.count %} - {% if count %} -

    - {% blocktrans trimmed count counter=count with formatted_count=count|intcomma %} - {{ formatted_count }} book - {% plural %} - {{ formatted_count }} books - {% endblocktrans %} - - {% if books.has_other_pages %} - {% blocktrans trimmed with start=books.start_index end=books.end_index %} - (showing {{ start }}-{{ end }}) +

    +
    +
    +

    + {{ shelf.name }} + + {% include 'snippets/privacy-icons.html' with item=shelf %} + + {% with count=books.paginator.count %} + {% if count %} +

    + {% blocktrans trimmed count counter=count with formatted_count=count|intcomma %} + {{ formatted_count }} book + {% plural %} + {{ formatted_count }} books {% endblocktrans %} + + {% if books.has_other_pages %} + {% blocktrans trimmed with start=books.start_index end=books.end_index %} + (showing {{ start }}-{{ end }}) + {% endblocktrans %} + {% endif %} +

    {% endif %} -

    - {% endif %} - {% endwith %} -

    -
    - {% if is_self and shelf.id %} -
    - {% trans "Edit shelf" as button_text %} - {% include 'snippets/toggle/open_button.html' with text=button_text icon_with_text="pencil" controls_text="edit_shelf_form" focus="edit_shelf_form_header" %} + {% endwith %} +

    +
    + {% if is_self and shelf.id %} +
    +
    + {% trans "Edit shelf" as button_text %} + {% include 'snippets/toggle/open_button.html' with text=button_text icon_with_text="pencil" controls_text="edit_shelf_form" focus="edit_shelf_form_header" %} + + {% if shelf.deletable %} +
    + {% csrf_token %} + + + + {% endif %} +
    +
    + {% endif %}
    + {% if shelf.description %} +

    {{ shelf.description }}

    {% endif %}
    - {% include 'user/shelf/edit_shelf_form.html' with controls_text="edit_shelf_form" %} + {% include 'shelf/edit_shelf_form.html' with controls_text="edit_shelf_form" %}
    @@ -167,17 +184,7 @@
    {% else %} -

    {% trans "This shelf is empty." %}

    - {% if shelf.id and shelf.editable %} -
    - {% csrf_token %} - - -
    - {% endif %} - +

    {% trans "This shelf is empty." %}

    {% endif %}
    diff --git a/bookwyrm/templates/snippets/create_status/content_warning_field.html b/bookwyrm/templates/snippets/create_status/content_warning_field.html index 86b40ae2..ab96c72e 100644 --- a/bookwyrm/templates/snippets/create_status/content_warning_field.html +++ b/bookwyrm/templates/snippets/create_status/content_warning_field.html @@ -1,14 +1,22 @@ {% load i18n %} -
    - +
    +
    diff --git a/bookwyrm/templates/snippets/create_status/content_warning_toggle.html b/bookwyrm/templates/snippets/create_status/content_warning_toggle.html index 1c7676db..f29d47c4 100644 --- a/bookwyrm/templates/snippets/create_status/content_warning_toggle.html +++ b/bookwyrm/templates/snippets/create_status/content_warning_toggle.html @@ -5,12 +5,13 @@ type="checkbox" class="is-hidden" name="sensitive" - id="id_show_spoilers_{{ uuid }}" + id="id_show_spoilers_{{ uuid }}{{ local_uuid }}" {% if draft.content_warning or status.content_warning %}checked{% endif %} aria-hidden="true" data-cache-draft="id_sensitive_{{ book.id }}_{{ type }}{{ reply_parent.id }}" > {% trans "Include spoiler alert" as button_text %} {% firstof draft.content_warning status.content_warning as pressed %} - {% include 'snippets/toggle/toggle_button.html' with text=button_text icon="warning is-size-4" controls_text="spoilers" controls_uid=uuid focus="id_content_warning" checkbox="id_show_spoilers" class="toggle-button" pressed=pressed %} + {% firstof local_uuid '' as local_uuid %} + {% include 'snippets/toggle/toggle_button.html' with text=button_text icon="warning is-size-4" controls_text="spoilers" controls_uid=uuid|add:local_uuid focus="id_content_warning" checkbox="id_show_spoilers" class="toggle-button" pressed=pressed %}
    diff --git a/bookwyrm/templates/snippets/create_status/layout.html b/bookwyrm/templates/snippets/create_status/layout.html index b4b11bb1..1e10085c 100644 --- a/bookwyrm/templates/snippets/create_status/layout.html +++ b/bookwyrm/templates/snippets/create_status/layout.html @@ -14,7 +14,13 @@ reply_parent: the Status object this post will be in reply to, if applicable {% block form_open %} {# default form tag syntax, can be overriddden #} -
    + {% endblock %} {% csrf_token %} @@ -25,23 +31,19 @@ reply_parent: the Status object this post will be in reply to, if applicable {% endblock %} + {% include "snippets/create_status/content_warning_field.html" %} + + {# fields that go between the content warnings and the content field (ie, quote) #} + {% block pre_content_additions %}{% endblock %} + + +
    -
    - {% include "snippets/create_status/content_warning_field.html" %} -
    - - {# fields that go between the content warnings and the content field (ie, quote) #} - {% block pre_content_additions %}{% endblock %} - - - -
    - {% include "snippets/create_status/content_field.html" with placeholder=placeholder %} -
    + {% include "snippets/create_status/content_field.html" with placeholder=placeholder %}
    {# additional fields that go after the content block (ie, progress) #} diff --git a/bookwyrm/templates/snippets/goal_form.html b/bookwyrm/templates/snippets/goal_form.html index 09f052a7..f05d8b8b 100644 --- a/bookwyrm/templates/snippets/goal_form.html +++ b/bookwyrm/templates/snippets/goal_form.html @@ -1,36 +1,36 @@ {% load i18n %} - - {% csrf_token %} - - +
    +

    {% blocktrans %}Set a goal for how many books you'll finish reading in {{ year }}, and track your progress throughout the year.{% endblocktrans %}

    -
    -
    - -
    -
    - + + {% csrf_token %} + + + +
    +
    + +
    +
    + +
    +
    - +
    + +
    + + {% include 'snippets/privacy_select.html' with no_label=True current=goal.privacy uuid=goal.id %}
    -
    - -
    -
    - + -

    - - {% if goal %} - {% trans "Cancel" as button_text %} - {% include 'snippets/toggle/close_button.html' with text=button_text controls_text="show_edit_goal" %} - {% endif %} -

    - +
    + +
    + +
    diff --git a/bookwyrm/templates/snippets/privacy_select.html b/bookwyrm/templates/snippets/privacy_select.html index d7184e13..e1053051 100644 --- a/bookwyrm/templates/snippets/privacy_select.html +++ b/bookwyrm/templates/snippets/privacy_select.html @@ -1,7 +1,7 @@ {% load i18n %} {% load utilities %}
    - {% with 0|uuid as uuid %} + {% firstof uuid 0|uuid as uuid %} {% if not no_label %} {% endif %} @@ -20,6 +20,5 @@ {% trans "Private" %} - {% endwith %}
    diff --git a/bookwyrm/templates/snippets/progress_field.html b/bookwyrm/templates/snippets/progress_field.html new file mode 100644 index 00000000..8feb5a58 --- /dev/null +++ b/bookwyrm/templates/snippets/progress_field.html @@ -0,0 +1,27 @@ +{% load i18n %} +
    +
    + +
    +
    + +
    +
    diff --git a/bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html b/bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html index b041b70a..96e4da9b 100644 --- a/bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html +++ b/bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html @@ -11,6 +11,7 @@ Finish "{{ book_title }}" {% block modal-form-open %}
    {% csrf_token %} + {% endblock %} diff --git a/bookwyrm/templates/snippets/reading_modals/form.html b/bookwyrm/templates/snippets/reading_modals/form.html index d1ba916f..4a7ac3a5 100644 --- a/bookwyrm/templates/snippets/reading_modals/form.html +++ b/bookwyrm/templates/snippets/reading_modals/form.html @@ -5,7 +5,9 @@ {% block content_label %} {% trans "Comment:" %} +{% if optional %} {% trans "(Optional)" %} +{% endif %} {% endblock %} {% block initial_fields %} diff --git a/bookwyrm/templates/snippets/reading_modals/layout.html b/bookwyrm/templates/snippets/reading_modals/layout.html index 0f5dedb0..95010b37 100644 --- a/bookwyrm/templates/snippets/reading_modals/layout.html +++ b/bookwyrm/templates/snippets/reading_modals/layout.html @@ -13,14 +13,18 @@ {% trans "Post to feed" %}
    - {% include "snippets/reading_modals/form.html" with optional=True %} + {% comparison_bool controls_text "progress_update" True as optional %} + {% include "snippets/reading_modals/form.html" with optional=optional %}
    {% endwith %} diff --git a/bookwyrm/templates/snippets/reading_modals/progress_update_modal.html b/bookwyrm/templates/snippets/reading_modals/progress_update_modal.html index b4ed8e0c..713dad8d 100644 --- a/bookwyrm/templates/snippets/reading_modals/progress_update_modal.html +++ b/bookwyrm/templates/snippets/reading_modals/progress_update_modal.html @@ -1,4 +1,4 @@ -{% extends 'components/modal.html' %} +{% extends 'snippets/reading_modals/layout.html' %} {% load i18n %} {% block modal-title %} @@ -6,41 +6,12 @@ {% endblock %} {% block modal-form-open %} - -{% endblock %} - -{% block modal-body %} + {% csrf_token %} - -
    - -
    -
    - -
    -
    - -
    -
    - {% if readthrough.progress_mode == 'PG' and book.pages %} -

    {% blocktrans with pages=book.pages %}of {{ pages }} pages{% endblocktrans %}

    - {% endif %} -
    + {% endblock %} -{% block modal-footer %} - -{% trans "Cancel" as button_text %} -{% include 'snippets/toggle/toggle_button.html' with text=button_text %} +{% block reading-dates %} + +{% include "snippets/progress_field.html" with progress_required=True %} {% endblock %} -{% block modal-form-close %}{% endblock %} diff --git a/bookwyrm/templates/snippets/readthrough_form.html b/bookwyrm/templates/snippets/readthrough_form.html index 132472d2..8810778c 100644 --- a/bookwyrm/templates/snippets/readthrough_form.html +++ b/bookwyrm/templates/snippets/readthrough_form.html @@ -13,17 +13,7 @@ -
    -
    - -
    -
    - -
    -
    +{% include "snippets/progress_field.html" %} {% endif %}
    diff --git a/bookwyrm/templates/snippets/trimmed_text.html b/bookwyrm/templates/snippets/trimmed_text.html index e0227a44..0c14405c 100644 --- a/bookwyrm/templates/snippets/trimmed_text.html +++ b/bookwyrm/templates/snippets/trimmed_text.html @@ -10,7 +10,7 @@ {% if not no_trim and trimmed != full %}
    -
    {{ trimmed }}
    +
    {{ trimmed }}
    {% if not hide_more %} @@ -25,6 +25,7 @@
    {{ full }} @@ -41,6 +42,7 @@
    {{ full }} diff --git a/bookwyrm/templates/user/shelf/books_header.html b/bookwyrm/templates/user/books_header.html similarity index 100% rename from bookwyrm/templates/user/shelf/books_header.html rename to bookwyrm/templates/user/books_header.html diff --git a/bookwyrm/templates/goal.html b/bookwyrm/templates/user/goal.html similarity index 68% rename from bookwyrm/templates/goal.html rename to bookwyrm/templates/user/goal.html index 8c014cb3..f3547243 100644 --- a/bookwyrm/templates/goal.html +++ b/bookwyrm/templates/user/goal.html @@ -1,5 +1,6 @@ {% extends 'user/layout.html' %} {% load i18n %} +{% load utilities %} {% block header %}
    @@ -19,20 +20,8 @@
    {% now 'Y' as current_year %} {% if user == request.user and year|add:0 == current_year|add:0 %} -
    -
    -
    -

    - {% blocktrans %}{{ year }} Reading Goal{% endblocktrans %} -

    -
    -
    -

    {% blocktrans %}Set a goal for how many books you'll finish reading in {{ year }}, and track your progress throughout the year.{% endblocktrans %}

    - - {% include 'snippets/goal_form.html' with goal=goal year=year %} -
    -
    -
    + {% comparison_bool goal None as visible %} + {% include 'user/goal_form.html' with goal=goal year=year visible=visible controls_text="show_edit_goal" class="block" %} {% endif %} {% if not goal and user != request.user %} diff --git a/bookwyrm/templates/user/goal_form.html b/bookwyrm/templates/user/goal_form.html new file mode 100644 index 00000000..14fb4763 --- /dev/null +++ b/bookwyrm/templates/user/goal_form.html @@ -0,0 +1,12 @@ +{% extends 'components/inline_form.html' %} +{% load i18n %} + +{% block header %} + +{% blocktrans %}{{ year }} Reading Goal{% endblocktrans %} +{% endblock %} + +{% block form %} +{% include "snippets/goal_form.html" %} +{% endblock %} + diff --git a/bookwyrm/templates/user/relationships/followers.html b/bookwyrm/templates/user/relationships/followers.html index 223f38c7..c7d6833b 100644 --- a/bookwyrm/templates/user/relationships/followers.html +++ b/bookwyrm/templates/user/relationships/followers.html @@ -9,6 +9,6 @@ {% block nullstate %}
    - {% blocktrans with username=user.display_name %}{{ username }} has no followers{% endblocktrans %} + {% blocktrans with username=user.display_name %}{{ username }} has no followers{% endblocktrans %}
    {% endblock %} diff --git a/bookwyrm/templates/user/relationships/following.html b/bookwyrm/templates/user/relationships/following.html index 475d40ab..3952d045 100644 --- a/bookwyrm/templates/user/relationships/following.html +++ b/bookwyrm/templates/user/relationships/following.html @@ -9,7 +9,7 @@ {% block nullstate %}
    - {% blocktrans with username=user.display_name %}{{ username }} isn't following any users{% endblocktrans %} + {% blocktrans with username=user.display_name %}{{ username }} isn't following any users{% endblocktrans %}
    {% endblock %} diff --git a/bookwyrm/templates/user/shelf/create_shelf_form.html b/bookwyrm/templates/user/shelf/create_shelf_form.html deleted file mode 100644 index b7ea27de..00000000 --- a/bookwyrm/templates/user/shelf/create_shelf_form.html +++ /dev/null @@ -1,27 +0,0 @@ -{% extends 'components/inline_form.html' %} -{% load i18n %} - -{% block header %} -{% trans "Create Shelf" %} -{% endblock %} - -{% block form %} -
    - {% csrf_token %} - -
    - - -
    - -
    -
    - {% include 'snippets/privacy_select.html' %} -
    -
    - -
    -
    -
    -{% endblock %} - diff --git a/bookwyrm/templates/user/shelf/edit_shelf_form.html b/bookwyrm/templates/user/shelf/edit_shelf_form.html deleted file mode 100644 index 753d0681..00000000 --- a/bookwyrm/templates/user/shelf/edit_shelf_form.html +++ /dev/null @@ -1,31 +0,0 @@ -{% extends 'components/inline_form.html' %} -{% load i18n %} - -{% block header %} -{% trans "Edit Shelf" %} -{% endblock %} - -{% block form %} -
    - {% csrf_token %} - - {% if shelf.editable %} -
    - - -
    - {% else %} - - {% endif %} - -
    -
    - {% include 'snippets/privacy_select.html' with current=shelf.privacy %} -
    -
    - -
    -
    -
    -{% endblock %} - diff --git a/bookwyrm/templates/user/user.html b/bookwyrm/templates/user/user.html index f360a30a..36e646aa 100755 --- a/bookwyrm/templates/user/user.html +++ b/bookwyrm/templates/user/user.html @@ -24,7 +24,7 @@ {% if user.bookwyrm_user %}

    - {% include 'user/shelf/books_header.html' %} + {% include 'user/books_header.html' %}

    {% for shelf in shelves %} diff --git a/bookwyrm/templates/user_admin/user.html b/bookwyrm/templates/user_admin/user.html deleted file mode 100644 index e3a2413a..00000000 --- a/bookwyrm/templates/user_admin/user.html +++ /dev/null @@ -1,19 +0,0 @@ -{% extends 'settings/layout.html' %} -{% load i18n %} - -{% block title %}{{ user.username }}{% endblock %} -{% block header %} -{{ user.username }} -

    - {% trans "Back to users" %} -

    - -{% endblock %} - -{% block panel %} -{% include 'user_admin/user_info.html' with user=user %} - -{% include 'user_admin/user_moderation_actions.html' with user=user %} - -{% endblock %} - diff --git a/bookwyrm/templatetags/bookwyrm_tags.py b/bookwyrm/templatetags/bookwyrm_tags.py index 30a48e90..e683f9c2 100644 --- a/bookwyrm/templatetags/bookwyrm_tags.py +++ b/bookwyrm/templatetags/bookwyrm_tags.py @@ -12,7 +12,7 @@ register = template.Library() def get_rating(book, user): """get the overall rating of a book""" queryset = views.helpers.privacy_filter( - user, models.Review.objects.filter(book__in=book.parent_work.editions.all()) + user, models.Review.objects.filter(book__parent_work__editions=book) ) return queryset.aggregate(Avg("rating"))["rating__avg"] @@ -70,10 +70,13 @@ def related_status(notification): @register.simple_tag(takes_context=True) def active_shelf(context, book): """check what shelf a user has a book on, if any""" + if hasattr(book, "current_shelves"): + return book.current_shelves[0] if len(book.current_shelves) else {"book": book} + shelf = ( models.ShelfBook.objects.filter( shelf__user=context["request"].user, - book__in=book.parent_work.editions.all(), + book__parent_work__editions=book, ) .select_related("book", "shelf") .first() @@ -84,8 +87,11 @@ def active_shelf(context, book): @register.simple_tag(takes_context=False) def latest_read_through(book, user): """the most recent read activity""" + if hasattr(book, "active_readthroughs"): + return book.active_readthroughs[0] if len(book.active_readthroughs) else None + return ( - models.ReadThrough.objects.filter(user=user, book=book) + models.ReadThrough.objects.filter(user=user, book=book, is_active=True) .order_by("-start_date") .first() ) @@ -97,4 +103,4 @@ def mutuals_count(context, user): viewer = context["request"].user if not viewer.is_authenticated: return None - return user.followers.filter(id__in=viewer.following.all()).count() + return user.followers.filter(followers=viewer).count() diff --git a/bookwyrm/templatetags/utilities.py b/bookwyrm/templatetags/utilities.py index fe83278a..d31f0e4d 100644 --- a/bookwyrm/templatetags/utilities.py +++ b/bookwyrm/templatetags/utilities.py @@ -12,7 +12,7 @@ register = template.Library() @register.filter(name="uuid") def get_uuid(identifier): """for avoiding clashing ids when there are many forms""" - return "%s%s" % (identifier, uuid4()) + return f"{identifier}{uuid4()}" @register.filter(name="username") @@ -36,8 +36,10 @@ def get_title(book, too_short=5): @register.simple_tag(takes_context=False) -def comparison_bool(str1, str2): +def comparison_bool(str1, str2, reverse=False): """idk why I need to write a tag for this, it returns a bool""" + if reverse: + return str1 != str2 return str1 == str2 @@ -50,7 +52,7 @@ def truncatepath(value, arg): length = int(arg) except ValueError: # invalid literal for int() return path_list[-1] # Fail silently. - return "%s/…%s" % (path_list[0], path_list[-1][-length:]) + return f"{path_list[0]}/…{path_list[-1][-length:]}" @register.simple_tag(takes_context=False) @@ -60,7 +62,7 @@ def get_book_cover_thumbnail(book, size="medium", ext="jpg"): if size == "": size = "medium" try: - cover_thumbnail = getattr(book, "cover_bw_book_%s_%s" % (size, ext)) + cover_thumbnail = getattr(book, f"cover_bw_book_{size}_{ext}") return cover_thumbnail.url except OSError: return static("images/no_cover.jpg") diff --git a/bookwyrm/tests/models/test_base_model.py b/bookwyrm/tests/models/test_base_model.py index 28564740..7c7b48de 100644 --- a/bookwyrm/tests/models/test_base_model.py +++ b/bookwyrm/tests/models/test_base_model.py @@ -1,5 +1,6 @@ """ testing models """ from unittest.mock import patch +from django.http import Http404 from django.test import TestCase from bookwyrm import models @@ -39,14 +40,14 @@ class BaseModel(TestCase): """these should be generated""" self.test_model.id = 1 expected = self.test_model.get_remote_id() - self.assertEqual(expected, "https://%s/bookwyrmtestmodel/1" % DOMAIN) + self.assertEqual(expected, f"https://{DOMAIN}/bookwyrmtestmodel/1") def test_remote_id_with_user(self): """format of remote id when there's a user object""" self.test_model.user = self.local_user self.test_model.id = 1 expected = self.test_model.get_remote_id() - self.assertEqual(expected, "https://%s/user/mouse/bookwyrmtestmodel/1" % DOMAIN) + self.assertEqual(expected, f"https://{DOMAIN}/user/mouse/bookwyrmtestmodel/1") def test_set_remote_id(self): """this function sets remote ids after creation""" @@ -55,9 +56,7 @@ class BaseModel(TestCase): instance = models.Work.objects.create(title="work title") instance.remote_id = None base_model.set_remote_id(None, instance, True) - self.assertEqual( - instance.remote_id, "https://%s/book/%d" % (DOMAIN, instance.id) - ) + self.assertEqual(instance.remote_id, f"https://{DOMAIN}/book/{instance.id}") # shouldn't set remote_id if it's not created instance.remote_id = None @@ -70,28 +69,30 @@ class BaseModel(TestCase): obj = models.Status.objects.create( content="hi", user=self.remote_user, privacy="public" ) - self.assertTrue(obj.visible_to_user(self.local_user)) + self.assertIsNone(obj.raise_visible_to_user(self.local_user)) obj = models.Shelf.objects.create( name="test", user=self.remote_user, privacy="unlisted" ) - self.assertTrue(obj.visible_to_user(self.local_user)) + self.assertIsNone(obj.raise_visible_to_user(self.local_user)) obj = models.Status.objects.create( content="hi", user=self.remote_user, privacy="followers" ) - self.assertFalse(obj.visible_to_user(self.local_user)) + with self.assertRaises(Http404): + obj.raise_visible_to_user(self.local_user) obj = models.Status.objects.create( content="hi", user=self.remote_user, privacy="direct" ) - self.assertFalse(obj.visible_to_user(self.local_user)) + with self.assertRaises(Http404): + obj.raise_visible_to_user(self.local_user) obj = models.Status.objects.create( content="hi", user=self.remote_user, privacy="direct" ) obj.mention_users.add(self.local_user) - self.assertTrue(obj.visible_to_user(self.local_user)) + self.assertIsNone(obj.raise_visible_to_user(self.local_user)) @patch("bookwyrm.activitystreams.add_status_task.delay") def test_object_visible_to_user_follower(self, _): @@ -100,18 +101,19 @@ class BaseModel(TestCase): obj = models.Status.objects.create( content="hi", user=self.remote_user, privacy="followers" ) - self.assertTrue(obj.visible_to_user(self.local_user)) + self.assertIsNone(obj.raise_visible_to_user(self.local_user)) obj = models.Status.objects.create( content="hi", user=self.remote_user, privacy="direct" ) - self.assertFalse(obj.visible_to_user(self.local_user)) + with self.assertRaises(Http404): + obj.raise_visible_to_user(self.local_user) obj = models.Status.objects.create( content="hi", user=self.remote_user, privacy="direct" ) obj.mention_users.add(self.local_user) - self.assertTrue(obj.visible_to_user(self.local_user)) + self.assertIsNone(obj.raise_visible_to_user(self.local_user)) @patch("bookwyrm.activitystreams.add_status_task.delay") def test_object_visible_to_user_blocked(self, _): @@ -120,9 +122,11 @@ class BaseModel(TestCase): obj = models.Status.objects.create( content="hi", user=self.remote_user, privacy="public" ) - self.assertFalse(obj.visible_to_user(self.local_user)) + with self.assertRaises(Http404): + obj.raise_visible_to_user(self.local_user) obj = models.Shelf.objects.create( name="test", user=self.remote_user, privacy="unlisted" ) - self.assertFalse(obj.visible_to_user(self.local_user)) + with self.assertRaises(Http404): + obj.raise_visible_to_user(self.local_user) diff --git a/bookwyrm/tests/models/test_site.py b/bookwyrm/tests/models/test_site.py new file mode 100644 index 00000000..b7c19c4b --- /dev/null +++ b/bookwyrm/tests/models/test_site.py @@ -0,0 +1,95 @@ +""" testing models """ +from datetime import timedelta +from unittest.mock import patch + +from django.db import IntegrityError +from django.test import TestCase +from django.utils import timezone + +from bookwyrm import models, settings + + +class SiteModels(TestCase): + """tests for site models""" + + def setUp(self): + """we need basic test data and mocks""" + with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( + "bookwyrm.activitystreams.populate_stream_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", + ) + + def test_site_settings_absent(self): + """create and load site settings""" + self.assertFalse(models.SiteSettings.objects.exists()) + result = models.SiteSettings.get() + self.assertTrue(models.SiteSettings.objects.exists()) + self.assertEqual(result.id, 1) + self.assertEqual(result.name, "BookWyrm") + + def test_site_settings_present(self): + """load site settings""" + models.SiteSettings.objects.create(id=1, name="Fish Town") + result = models.SiteSettings.get() + self.assertEqual(result.id, 1) + self.assertEqual(result.name, "Fish Town") + self.assertEqual(models.SiteSettings.objects.all().count(), 1) + + def test_site_invite(self): + """default invite""" + invite = models.SiteInvite.objects.create( + user=self.local_user, + ) + self.assertTrue(invite.valid()) + + def test_site_invite_with_limit(self): + """with use limit""" + # valid + invite = models.SiteInvite.objects.create(user=self.local_user, use_limit=1) + self.assertTrue(invite.valid()) + + # invalid + invite = models.SiteInvite.objects.create(user=self.local_user, use_limit=0) + self.assertFalse(invite.valid()) + invite = models.SiteInvite.objects.create( + user=self.local_user, use_limit=1, times_used=1 + ) + self.assertFalse(invite.valid()) + + def test_site_invite_with_expiry(self): + """with expiration date""" + date = timezone.now() + timedelta(days=1) + invite = models.SiteInvite.objects.create(user=self.local_user, expiry=date) + self.assertTrue(invite.valid()) + + date = timezone.now() - timedelta(days=1) + invite = models.SiteInvite.objects.create(user=self.local_user, expiry=date) + self.assertFalse(invite.valid()) + + def test_site_invite_link(self): + """invite link generator""" + invite = models.SiteInvite.objects.create(user=self.local_user, code="hello") + self.assertEqual(invite.link, f"https://{settings.DOMAIN}/invite/hello") + + def test_invite_request(self): + """someone wants an invite""" + # normal and good + request = models.InviteRequest.objects.create(email="mouse.reeve@gmail.com") + self.assertIsNone(request.invite) + + # already in use + with self.assertRaises(IntegrityError): + request = models.InviteRequest.objects.create(email="mouse@mouse.com") + + def test_password_reset(self): + """password reset token""" + token = models.PasswordReset.objects.create(user=self.local_user, code="hello") + self.assertTrue(token.valid()) + self.assertEqual(token.link, f"https://{settings.DOMAIN}/password-reset/hello") diff --git a/bookwyrm/tests/test_preview_images.py b/bookwyrm/tests/test_preview_images.py index 760ff4c4..f95e623c 100644 --- a/bookwyrm/tests/test_preview_images.py +++ b/bookwyrm/tests/test_preview_images.py @@ -20,6 +20,7 @@ from bookwyrm.preview_images import ( # pylint: disable=unused-argument # pylint: disable=missing-function-docstring +# pylint: disable=consider-using-with class PreviewImages(TestCase): """every response to a get request, html or json""" @@ -120,3 +121,11 @@ class PreviewImages(TestCase): self.assertEqual( self.local_user.preview_image.height, settings.PREVIEW_IMG_HEIGHT ) + + def test_generate_user_preview_images_task(self, *args, **kwargs): + """test task's external calls""" + with patch("bookwyrm.preview_images.generate_preview_image") as generate_mock: + generate_user_preview_image_task(self.local_user.id) + args = generate_mock.call_args.kwargs + self.assertEqual(args["texts"]["text_one"], "possum") + self.assertEqual(args["texts"]["text_three"], f"@possum@{settings.DOMAIN}") diff --git a/bookwyrm/tests/views/admin/__init__.py b/bookwyrm/tests/views/admin/__init__.py new file mode 100644 index 00000000..b6e690fd --- /dev/null +++ b/bookwyrm/tests/views/admin/__init__.py @@ -0,0 +1 @@ +from . import * diff --git a/bookwyrm/tests/views/test_announcements.py b/bookwyrm/tests/views/admin/test_announcements.py similarity index 100% rename from bookwyrm/tests/views/test_announcements.py rename to bookwyrm/tests/views/admin/test_announcements.py diff --git a/bookwyrm/tests/views/test_dashboard.py b/bookwyrm/tests/views/admin/test_dashboard.py similarity index 88% rename from bookwyrm/tests/views/test_dashboard.py rename to bookwyrm/tests/views/admin/test_dashboard.py index 6ce30c18..70cc40fe 100644 --- a/bookwyrm/tests/views/test_dashboard.py +++ b/bookwyrm/tests/views/admin/test_dashboard.py @@ -1,5 +1,6 @@ """ test for app action functionality """ from unittest.mock import patch +from tidylib import tidy_document from django.template.response import TemplateResponse from django.test import TestCase from django.test.client import RequestFactory @@ -34,5 +35,8 @@ class DashboardViews(TestCase): request.user.is_superuser = True result = view(request) self.assertIsInstance(result, TemplateResponse) - result.render() + html = result.render() + _, errors = tidy_document(html.content) + if errors: + raise Exception(errors) self.assertEqual(result.status_code, 200) diff --git a/bookwyrm/tests/views/test_email_blocks.py b/bookwyrm/tests/views/admin/test_email_blocks.py similarity index 86% rename from bookwyrm/tests/views/test_email_blocks.py rename to bookwyrm/tests/views/admin/test_email_blocks.py index be3d9d70..24cdf8a4 100644 --- a/bookwyrm/tests/views/test_email_blocks.py +++ b/bookwyrm/tests/views/admin/test_email_blocks.py @@ -1,5 +1,7 @@ """ test for app action functionality """ from unittest.mock import patch +from tidylib import tidy_document + from django.template.response import TemplateResponse from django.test import TestCase from django.test.client import RequestFactory @@ -36,7 +38,10 @@ class EmailBlocklistViews(TestCase): result = view(request) self.assertIsInstance(result, TemplateResponse) - result.render() + html = result.render() + _, errors = tidy_document(html.content, options={"drop-empty-elements": False}) + if errors: + raise Exception(errors) self.assertEqual(result.status_code, 200) def test_blocklist_page_post(self): @@ -49,7 +54,10 @@ class EmailBlocklistViews(TestCase): result = view(request) self.assertIsInstance(result, TemplateResponse) - result.render() + html = result.render() + _, errors = tidy_document(html.content, options={"drop-empty-elements": False}) + if errors: + raise Exception(errors) self.assertEqual(result.status_code, 200) self.assertTrue( diff --git a/bookwyrm/tests/views/test_federation.py b/bookwyrm/tests/views/admin/test_federation.py similarity index 90% rename from bookwyrm/tests/views/test_federation.py rename to bookwyrm/tests/views/admin/test_federation.py index ebd311d3..2501a81a 100644 --- a/bookwyrm/tests/views/test_federation.py +++ b/bookwyrm/tests/views/admin/test_federation.py @@ -1,6 +1,8 @@ """ test for app action functionality """ import json from unittest.mock import patch +from tidylib import tidy_document + from django.core.files.uploadedfile import SimpleUploadedFile from django.template.response import TemplateResponse from django.test import TestCase @@ -46,10 +48,19 @@ class FederationViews(TestCase): request.user.is_superuser = True result = view(request) self.assertIsInstance(result, TemplateResponse) - result.render() + html = result.render() + _, errors = tidy_document( + html.content, + options={ + "drop-empty-elements": False, + "warn-proprietary-attributes": False, + }, + ) + if errors: + raise Exception(errors) self.assertEqual(result.status_code, 200) - def test_server_page(self): + def test_instance_page(self): """there are so many views, this just makes sure it LOADS""" server = models.FederatedServer.objects.create(server_name="hi.there.com") view = views.FederatedServer.as_view() @@ -59,7 +70,10 @@ class FederationViews(TestCase): result = view(request, server.id) self.assertIsInstance(result, TemplateResponse) - result.render() + html = result.render() + _, errors = tidy_document(html.content, options={"drop-empty-elements": False}) + if errors: + raise Exception(errors) self.assertEqual(result.status_code, 200) def test_server_page_block(self): @@ -148,7 +162,10 @@ class FederationViews(TestCase): result = view(request) self.assertIsInstance(result, TemplateResponse) - result.render() + html = result.render() + _, errors = tidy_document(html.content) + if errors: + raise Exception(errors) self.assertEqual(result.status_code, 200) def test_add_view_post_create(self): @@ -169,6 +186,7 @@ class FederationViews(TestCase): self.assertEqual(server.application_type, "coolsoft") self.assertEqual(server.status, "blocked") + # pylint: disable=consider-using-with def test_import_blocklist(self): """load a json file with a list of servers to block""" server = models.FederatedServer.objects.create(server_name="hi.there.com") @@ -180,7 +198,7 @@ class FederationViews(TestCase): {"instance": "hi.there.com", "url": "https://explanation.url"}, # existing {"a": "b"}, # invalid ] - json.dump(data, open("file.json", "w")) + json.dump(data, open("file.json", "w")) # pylint: disable=unspecified-encoding view = views.ImportServerBlocklist.as_view() request = self.factory.post( diff --git a/bookwyrm/tests/views/admin/test_ip_blocklist.py b/bookwyrm/tests/views/admin/test_ip_blocklist.py new file mode 100644 index 00000000..fb249b76 --- /dev/null +++ b/bookwyrm/tests/views/admin/test_ip_blocklist.py @@ -0,0 +1,44 @@ +""" test for app action functionality """ +from unittest.mock import patch +from tidylib import tidy_document +from django.template.response import TemplateResponse +from django.test import TestCase +from django.test.client import RequestFactory + +from bookwyrm import models, views + + +class IPBlocklistViews(TestCase): + """every response to a get request, html or json""" + + def setUp(self): + """we need basic test data and mocks""" + self.factory = RequestFactory() + with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( + "bookwyrm.activitystreams.populate_stream_task.delay" + ): + self.local_user = models.User.objects.create_user( + "mouse@local.com", + "mouse@mouse.mouse", + "password", + local=True, + localname="mouse", + ) + + models.SiteSettings.objects.create() + + def test_blocklist_page_get(self): + """there are so many views, this just makes sure it LOADS""" + view = views.IPBlocklist.as_view() + request = self.factory.get("") + request.user = self.local_user + request.user.is_superuser = True + + result = view(request) + + self.assertIsInstance(result, TemplateResponse) + html = result.render() + _, errors = tidy_document(html.content, options={"drop-empty-elements": False}) + if errors: + raise Exception(errors) + self.assertEqual(result.status_code, 200) diff --git a/bookwyrm/tests/views/test_reports.py b/bookwyrm/tests/views/admin/test_reports.py similarity index 87% rename from bookwyrm/tests/views/test_reports.py rename to bookwyrm/tests/views/admin/test_reports.py index 9fbeae04..456dff55 100644 --- a/bookwyrm/tests/views/test_reports.py +++ b/bookwyrm/tests/views/admin/test_reports.py @@ -1,6 +1,8 @@ """ test for app action functionality """ import json from unittest.mock import patch +from tidylib import tidy_document + from django.template.response import TemplateResponse from django.test import TestCase from django.test.client import RequestFactory @@ -42,7 +44,16 @@ class ReportViews(TestCase): result = view(request) self.assertIsInstance(result, TemplateResponse) - result.render() + html = result.render() + _, errors = tidy_document( + html.content, + options={ + "drop-empty-elements": False, + "warn-proprietary-attributes": False, + }, + ) + if errors: + raise Exception(errors) self.assertEqual(result.status_code, 200) def test_reports_page_with_data(self): @@ -55,7 +66,16 @@ class ReportViews(TestCase): result = view(request) self.assertIsInstance(result, TemplateResponse) - result.render() + html = result.render() + _, errors = tidy_document( + html.content, + options={ + "drop-empty-elements": False, + "warn-proprietary-attributes": False, + }, + ) + if errors: + raise Exception(errors) self.assertEqual(result.status_code, 200) def test_report_page(self): @@ -69,7 +89,10 @@ class ReportViews(TestCase): result = view(request, report.id) self.assertIsInstance(result, TemplateResponse) - result.render() + html = result.render() + _, errors = tidy_document(html.content, options={"drop-empty-elements": False}) + if errors: + raise Exception(errors) self.assertEqual(result.status_code, 200) def test_report_comment(self): diff --git a/bookwyrm/tests/views/test_user_admin.py b/bookwyrm/tests/views/admin/test_user_admin.py similarity index 82% rename from bookwyrm/tests/views/test_user_admin.py rename to bookwyrm/tests/views/admin/test_user_admin.py index 3917a6fd..3336cf24 100644 --- a/bookwyrm/tests/views/test_user_admin.py +++ b/bookwyrm/tests/views/admin/test_user_admin.py @@ -1,5 +1,7 @@ """ test for app action functionality """ from unittest.mock import patch +from tidylib import tidy_document + from django.contrib.auth.models import Group from django.template.response import TemplateResponse from django.test import TestCase @@ -34,7 +36,10 @@ class UserAdminViews(TestCase): request.user.is_superuser = True result = view(request) self.assertIsInstance(result, TemplateResponse) - result.render() + html = result.render() + _, errors = tidy_document(html.content, options={"drop-empty-elements": False}) + if errors: + raise Exception(errors) self.assertEqual(result.status_code, 200) def test_user_admin_page(self): @@ -47,7 +52,10 @@ class UserAdminViews(TestCase): result = view(request, self.local_user.id) self.assertIsInstance(result, TemplateResponse) - result.render() + html = result.render() + _, errors = tidy_document(html.content, options={"drop-empty-elements": False}) + if errors: + raise Exception(errors) self.assertEqual(result.status_code, 200) @patch("bookwyrm.suggested_users.rerank_suggestions_task.delay") @@ -69,7 +77,10 @@ class UserAdminViews(TestCase): result = view(request, self.local_user.id) self.assertIsInstance(result, TemplateResponse) - result.render() + html = result.render() + _, errors = tidy_document(html.content, options={"drop-empty-elements": False}) + if errors: + raise Exception(errors) self.assertEqual( list(self.local_user.groups.values_list("name", flat=True)), ["editor"] diff --git a/bookwyrm/tests/views/inbox/test_inbox.py b/bookwyrm/tests/views/inbox/test_inbox.py index a84458ab..47e6a86e 100644 --- a/bookwyrm/tests/views/inbox/test_inbox.py +++ b/bookwyrm/tests/views/inbox/test_inbox.py @@ -3,6 +3,7 @@ import json import pathlib from unittest.mock import patch +from django.core.exceptions import PermissionDenied from django.http import HttpResponseNotAllowed, HttpResponseNotFound from django.test import TestCase, Client from django.test.client import RequestFactory @@ -130,22 +131,24 @@ class Inbox(TestCase): "", HTTP_USER_AGENT="http.rb/4.4.1 (Mastodon/3.3.0; +https://mastodon.social/)", ) - self.assertFalse(views.inbox.is_blocked_user_agent(request)) + self.assertIsNone(views.inbox.raise_is_blocked_user_agent(request)) models.FederatedServer.objects.create( server_name="mastodon.social", status="blocked" ) - self.assertTrue(views.inbox.is_blocked_user_agent(request)) + with self.assertRaises(PermissionDenied): + views.inbox.raise_is_blocked_user_agent(request) def test_is_blocked_activity(self): """check for blocked servers""" activity = {"actor": "https://mastodon.social/user/whaatever/else"} - self.assertFalse(views.inbox.is_blocked_activity(activity)) + self.assertIsNone(views.inbox.raise_is_blocked_activity(activity)) models.FederatedServer.objects.create( server_name="mastodon.social", status="blocked" ) - self.assertTrue(views.inbox.is_blocked_activity(activity)) + with self.assertRaises(PermissionDenied): + views.inbox.raise_is_blocked_activity(activity) @patch("bookwyrm.suggested_users.remove_user_task.delay") def test_create_by_deactivated_user(self, _): @@ -157,11 +160,11 @@ class Inbox(TestCase): activity = self.create_json activity["actor"] = self.remote_user.remote_id activity["object"] = status_data + activity["type"] = "Create" - with patch("bookwyrm.views.inbox.has_valid_signature") as mock_valid: - mock_valid.return_value = True - - result = self.client.post( - "/inbox", json.dumps(activity), content_type="application/json" - ) - self.assertEqual(result.status_code, 403) + response = self.client.post( + "/inbox", + json.dumps(activity), + content_type="application/json", + ) + self.assertEqual(response.status_code, 403) diff --git a/bookwyrm/tests/views/preferences/__init__.py b/bookwyrm/tests/views/preferences/__init__.py new file mode 100644 index 00000000..b6e690fd --- /dev/null +++ b/bookwyrm/tests/views/preferences/__init__.py @@ -0,0 +1 @@ +from . import * diff --git a/bookwyrm/tests/views/test_block.py b/bookwyrm/tests/views/preferences/test_block.py similarity index 93% rename from bookwyrm/tests/views/test_block.py rename to bookwyrm/tests/views/preferences/test_block.py index f1ec42f0..6663aa63 100644 --- a/bookwyrm/tests/views/test_block.py +++ b/bookwyrm/tests/views/preferences/test_block.py @@ -1,5 +1,7 @@ """ test for app action functionality """ from unittest.mock import patch +from tidylib import tidy_document + from django.template.response import TemplateResponse from django.test import TestCase from django.test.client import RequestFactory @@ -44,7 +46,10 @@ class BlockViews(TestCase): request.user = self.local_user result = view(request) self.assertIsInstance(result, TemplateResponse) - result.render() + html = result.render() + _, errors = tidy_document(html.content) + if errors: + raise Exception(errors) self.assertEqual(result.status_code, 200) def test_block_post(self, _): @@ -75,6 +80,6 @@ class BlockViews(TestCase): request.user = self.local_user with patch("bookwyrm.activitystreams.add_user_statuses_task.delay"): - views.block.unblock(request, self.remote_user.id) + views.unblock(request, self.remote_user.id) self.assertFalse(models.UserBlocks.objects.exists()) diff --git a/bookwyrm/tests/views/preferences/test_change_password.py b/bookwyrm/tests/views/preferences/test_change_password.py new file mode 100644 index 00000000..17afb8f7 --- /dev/null +++ b/bookwyrm/tests/views/preferences/test_change_password.py @@ -0,0 +1,61 @@ +""" test for app action functionality """ +from unittest.mock import patch +from tidylib import tidy_document + +from django.template.response import TemplateResponse +from django.test import TestCase +from django.test.client import RequestFactory + +from bookwyrm import models, views + + +class ChangePasswordViews(TestCase): + """view user and edit profile""" + + def setUp(self): + """we need basic test data and mocks""" + self.factory = RequestFactory() + with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( + "bookwyrm.activitystreams.populate_stream_task.delay" + ): + self.local_user = models.User.objects.create_user( + "mouse@local.com", + "mouse@mouse.com", + "password", + local=True, + localname="mouse", + ) + models.SiteSettings.objects.create(id=1) + + def test_password_change_get(self): + """there are so many views, this just makes sure it LOADS""" + view = views.ChangePassword.as_view() + request = self.factory.get("") + request.user = self.local_user + + result = view(request) + self.assertIsInstance(result, TemplateResponse) + html = result.render() + _, errors = tidy_document(html.content) + if errors: + raise Exception(errors) + self.assertEqual(result.status_code, 200) + + def test_password_change(self): + """change password""" + view = views.ChangePassword.as_view() + password_hash = self.local_user.password + request = self.factory.post("", {"password": "hi", "confirm-password": "hi"}) + request.user = self.local_user + with patch("bookwyrm.views.preferences.change_password.login"): + view(request) + self.assertNotEqual(self.local_user.password, password_hash) + + def test_password_change_mismatch(self): + """change password""" + view = views.ChangePassword.as_view() + password_hash = self.local_user.password + request = self.factory.post("", {"password": "hi", "confirm-password": "hihi"}) + request.user = self.local_user + view(request) + self.assertEqual(self.local_user.password, password_hash) diff --git a/bookwyrm/tests/views/preferences/test_delete_user.py b/bookwyrm/tests/views/preferences/test_delete_user.py new file mode 100644 index 00000000..40a28d44 --- /dev/null +++ b/bookwyrm/tests/views/preferences/test_delete_user.py @@ -0,0 +1,89 @@ +""" test for app action functionality """ +import json +from unittest.mock import patch +from tidylib import tidy_document + +from django.contrib.sessions.middleware import SessionMiddleware +from django.template.response import TemplateResponse +from django.test import TestCase +from django.test.client import RequestFactory + +from bookwyrm import forms, models, views + + +@patch("bookwyrm.suggested_users.remove_user_task.delay") +class DeleteUserViews(TestCase): + """view user and edit profile""" + + def setUp(self): + """we need basic test data and mocks""" + self.factory = RequestFactory() + with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( + "bookwyrm.activitystreams.populate_stream_task.delay" + ): + self.local_user = models.User.objects.create_user( + "mouse@local.com", + "mouse@mouse.mouse", + "password", + local=True, + localname="mouse", + ) + self.rat = models.User.objects.create_user( + "rat@local.com", "rat@rat.rat", "password", local=True, localname="rat" + ) + + self.book = models.Edition.objects.create( + title="test", parent_work=models.Work.objects.create(title="test work") + ) + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"), patch( + "bookwyrm.activitystreams.add_book_statuses_task.delay" + ): + models.ShelfBook.objects.create( + book=self.book, + user=self.local_user, + shelf=self.local_user.shelf_set.first(), + ) + + models.SiteSettings.objects.create() + + def test_delete_user_page(self, _): + """there are so many views, this just makes sure it LOADS""" + view = views.DeleteUser.as_view() + request = self.factory.get("") + request.user = self.local_user + result = view(request) + self.assertIsInstance(result, TemplateResponse) + html = result.render() + _, errors = tidy_document(html.content) + if errors: + raise Exception(errors) + self.assertEqual(result.status_code, 200) + + @patch("bookwyrm.suggested_users.rerank_suggestions_task") + def test_delete_user(self, *_): + """use a form to update a user""" + view = views.DeleteUser.as_view() + form = forms.DeleteUserForm() + form.data["password"] = "password" + request = self.factory.post("", form.data) + request.user = self.local_user + middleware = SessionMiddleware() + middleware.process_request(request) + request.session.save() + + self.assertIsNone(self.local_user.name) + with patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.delay" + ) as delay_mock: + view(request) + self.assertEqual(delay_mock.call_count, 1) + activity = json.loads(delay_mock.call_args[0][1]) + self.assertEqual(activity["type"], "Delete") + self.assertEqual(activity["actor"], self.local_user.remote_id) + self.assertEqual( + activity["cc"][0], "https://www.w3.org/ns/activitystreams#Public" + ) + + self.local_user.refresh_from_db() + self.assertFalse(self.local_user.is_active) + self.assertEqual(self.local_user.deactivation_reason, "self_deletion") diff --git a/bookwyrm/tests/views/test_edit_user.py b/bookwyrm/tests/views/preferences/test_edit_user.py similarity index 71% rename from bookwyrm/tests/views/test_edit_user.py rename to bookwyrm/tests/views/preferences/test_edit_user.py index 07e54e4e..3dccf518 100644 --- a/bookwyrm/tests/views/test_edit_user.py +++ b/bookwyrm/tests/views/preferences/test_edit_user.py @@ -1,11 +1,10 @@ """ test for app action functionality """ -import json import pathlib from unittest.mock import patch from PIL import Image +from tidylib import tidy_document from django.contrib.auth.models import AnonymousUser -from django.contrib.sessions.middleware import SessionMiddleware from django.core.files.base import ContentFile from django.core.files.uploadedfile import SimpleUploadedFile from django.template.response import TemplateResponse @@ -59,7 +58,10 @@ class EditUserViews(TestCase): request.user = self.local_user result = view(request) self.assertIsInstance(result, TemplateResponse) - result.render() + html = result.render() + _, errors = tidy_document(html.content) + if errors: + raise Exception(errors) self.assertEqual(result.status_code, 200) def test_edit_user(self, _): @@ -91,8 +93,9 @@ class EditUserViews(TestCase): form.data["default_post_privacy"] = "public" form.data["preferred_timezone"] = "UTC" image_file = pathlib.Path(__file__).parent.joinpath( - "../../static/images/no_cover.jpg" + "../../../static/images/no_cover.jpg" ) + # pylint: disable=consider-using-with form.data["avatar"] = SimpleUploadedFile( image_file, open(image_file, "rb").read(), content_type="image/jpeg" ) @@ -113,50 +116,11 @@ class EditUserViews(TestCase): def test_crop_avatar(self, _): """reduce that image size""" image_file = pathlib.Path(__file__).parent.joinpath( - "../../static/images/no_cover.jpg" + "../../../static/images/no_cover.jpg" ) image = Image.open(image_file) - result = views.edit_user.crop_avatar(image) + result = views.preferences.edit_user.crop_avatar(image) self.assertIsInstance(result, ContentFile) image_result = Image.open(result) self.assertEqual(image_result.size, (120, 120)) - - def test_delete_user_page(self, _): - """there are so many views, this just makes sure it LOADS""" - view = views.DeleteUser.as_view() - request = self.factory.get("") - request.user = self.local_user - result = view(request) - self.assertIsInstance(result, TemplateResponse) - result.render() - self.assertEqual(result.status_code, 200) - - @patch("bookwyrm.suggested_users.rerank_suggestions_task") - def test_delete_user(self, *_): - """use a form to update a user""" - view = views.DeleteUser.as_view() - form = forms.DeleteUserForm() - form.data["password"] = "password" - request = self.factory.post("", form.data) - request.user = self.local_user - middleware = SessionMiddleware() - middleware.process_request(request) - request.session.save() - - self.assertIsNone(self.local_user.name) - with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.delay" - ) as delay_mock: - view(request) - self.assertEqual(delay_mock.call_count, 1) - activity = json.loads(delay_mock.call_args[0][1]) - self.assertEqual(activity["type"], "Delete") - self.assertEqual(activity["actor"], self.local_user.remote_id) - self.assertEqual( - activity["cc"][0], "https://www.w3.org/ns/activitystreams#Public" - ) - - self.local_user.refresh_from_db() - self.assertFalse(self.local_user.is_active) - self.assertEqual(self.local_user.deactivation_reason, "self_deletion") diff --git a/bookwyrm/tests/views/test_book.py b/bookwyrm/tests/views/test_book.py index 99022ec5..cf86a596 100644 --- a/bookwyrm/tests/views/test_book.py +++ b/bookwyrm/tests/views/test_book.py @@ -9,6 +9,7 @@ import responses from django.contrib.auth.models import Group, Permission from django.contrib.contenttypes.models import ContentType from django.core.files.uploadedfile import SimpleUploadedFile +from django.http import Http404 from django.template.response import TemplateResponse from django.test import TestCase from django.test.client import RequestFactory @@ -133,8 +134,8 @@ class BookViews(TestCase): request.user = self.local_user with patch("bookwyrm.views.books.is_api_request") as is_api: is_api.return_value = False - result = view(request, 0) - self.assertEqual(result.status_code, 404) + with self.assertRaises(Http404): + view(request, 0) def test_book_page_work_id(self): """there are so many views, this just makes sure it LOADS""" @@ -282,6 +283,46 @@ class BookViews(TestCase): self.assertEqual(book.authors.first().name, "Sappho") self.assertEqual(book.authors.first(), book.parent_work.authors.first()) + def _setup_cover_url(self): + cover_url = "http://example.com" + image_file = pathlib.Path(__file__).parent.joinpath( + "../../static/images/default_avi.jpg" + ) + image = Image.open(image_file) + output = BytesIO() + image.save(output, format=image.format) + responses.add( + responses.GET, + cover_url, + body=output.getvalue(), + status=200, + ) + return cover_url + + @responses.activate + def test_create_book_upload_cover_url(self): + """create an entirely new book and work with cover url""" + self.assertFalse(self.book.cover) + view = views.ConfirmEditBook.as_view() + self.local_user.groups.add(self.group) + cover_url = self._setup_cover_url() + + form = forms.EditionForm() + form.data["title"] = "New Title" + form.data["last_edited_by"] = self.local_user.id + form.data["cover-url"] = cover_url + request = self.factory.post("", form.data) + request.user = self.local_user + + with patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.delay" + ) as delay_mock: + views.upload_cover(request, self.book.id) + self.assertEqual(delay_mock.call_count, 1) + + self.book.refresh_from_db() + self.assertTrue(self.book.cover) + def test_upload_cover_file(self): """add a cover via file upload""" self.assertFalse(self.book.cover) @@ -310,21 +351,8 @@ class BookViews(TestCase): def test_upload_cover_url(self): """add a cover via url""" self.assertFalse(self.book.cover) - image_file = pathlib.Path(__file__).parent.joinpath( - "../../static/images/default_avi.jpg" - ) - image = Image.open(image_file) - output = BytesIO() - image.save(output, format=image.format) - responses.add( - responses.GET, - "http://example.com", - body=output.getvalue(), - status=200, - ) - form = forms.CoverForm(instance=self.book) - form.data["cover-url"] = "http://example.com" + form.data["cover-url"] = self._setup_cover_url() request = self.factory.post("", form.data) request.user = self.local_user diff --git a/bookwyrm/tests/views/test_directory.py b/bookwyrm/tests/views/test_directory.py index 90638b0a..0193d19d 100644 --- a/bookwyrm/tests/views/test_directory.py +++ b/bookwyrm/tests/views/test_directory.py @@ -1,5 +1,6 @@ """ test for app action functionality """ from unittest.mock import patch +from tidylib import tidy_document from django.contrib.auth.models import AnonymousUser from django.template.response import TemplateResponse @@ -51,7 +52,16 @@ class DirectoryViews(TestCase): result = view(request) self.assertIsInstance(result, TemplateResponse) - result.render() + html = result.render() + _, errors = tidy_document( + html.content, + options={ + "drop-empty-elements": False, + "warn-proprietary-attributes": False, + }, + ) + if errors: + raise Exception(errors) self.assertEqual(result.status_code, 200) def test_directory_page_empty(self): @@ -62,7 +72,10 @@ class DirectoryViews(TestCase): result = view(request) self.assertIsInstance(result, TemplateResponse) - result.render() + html = result.render() + _, errors = tidy_document(html.content, options={"drop-empty-elements": False}) + if errors: + raise Exception(errors) self.assertEqual(result.status_code, 200) def test_directory_page_logged_out(self): diff --git a/bookwyrm/tests/views/test_feed.py b/bookwyrm/tests/views/test_feed.py index 526cb0f9..a6f220b5 100644 --- a/bookwyrm/tests/views/test_feed.py +++ b/bookwyrm/tests/views/test_feed.py @@ -5,6 +5,7 @@ import pathlib from PIL import Image from django.core.files.base import ContentFile +from django.http import Http404 from django.template.response import TemplateResponse from django.test import TestCase from django.test.client import RequestFactory @@ -81,9 +82,8 @@ class FeedViews(TestCase): request.user = self.local_user with patch("bookwyrm.views.feed.is_api_request") as is_api: is_api.return_value = False - result = view(request, "mouse", 12345) - - self.assertEqual(result.status_code, 404) + with self.assertRaises(Http404): + view(request, "mouse", 12345) def test_status_page_not_found_wrong_user(self, *_): """there are so many views, this just makes sure it LOADS""" @@ -102,9 +102,8 @@ class FeedViews(TestCase): request.user = self.local_user with patch("bookwyrm.views.feed.is_api_request") as is_api: is_api.return_value = False - result = view(request, "mouse", status.id) - - self.assertEqual(result.status_code, 404) + with self.assertRaises(Http404): + view(request, "mouse", status.id) def test_status_page_with_image(self, *_): """there are so many views, this just makes sure it LOADS""" diff --git a/bookwyrm/tests/views/test_goal.py b/bookwyrm/tests/views/test_goal.py index 2ecce0ac..741fca9c 100644 --- a/bookwyrm/tests/views/test_goal.py +++ b/bookwyrm/tests/views/test_goal.py @@ -1,11 +1,13 @@ """ test for app action functionality """ from unittest.mock import patch -from django.utils import timezone +from tidylib import tidy_document 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 django.utils import timezone from bookwyrm import models, views @@ -60,7 +62,16 @@ class GoalViews(TestCase): request.user = self.local_user result = view(request, self.local_user.localname, self.year) - result.render() + html = result.render() + _, errors = tidy_document( + html.content, + options={ + "drop-empty-elements": False, + "warn-proprietary-attributes": False, + }, + ) + if errors: + raise Exception(errors) self.assertIsInstance(result, TemplateResponse) def test_goal_page_anonymous(self): @@ -91,7 +102,16 @@ class GoalViews(TestCase): request.user = self.rat result = view(request, self.local_user.localname, timezone.now().year) - result.render() + html = result.render() + _, errors = tidy_document( + html.content, + options={ + "drop-empty-elements": False, + "warn-proprietary-attributes": False, + }, + ) + if errors: + raise Exception(errors) self.assertIsInstance(result, TemplateResponse) def test_goal_page_private(self): @@ -103,8 +123,8 @@ class GoalViews(TestCase): request = self.factory.get("") request.user = self.rat - result = view(request, self.local_user.localname, self.year) - self.assertEqual(result.status_code, 404) + with self.assertRaises(Http404): + view(request, self.local_user.localname, self.year) @patch("bookwyrm.activitystreams.add_status_task.delay") def test_create_goal(self, _): diff --git a/bookwyrm/tests/views/test_list_actions.py b/bookwyrm/tests/views/test_list_actions.py index 58515681..f7775d19 100644 --- a/bookwyrm/tests/views/test_list_actions.py +++ b/bookwyrm/tests/views/test_list_actions.py @@ -568,5 +568,6 @@ class ListActionViews(TestCase): ) request.user = self.rat - views.list.remove_book(request, self.list.id) + with self.assertRaises(PermissionDenied): + views.list.remove_book(request, self.list.id) self.assertTrue(self.list.listitem_set.exists()) diff --git a/bookwyrm/tests/views/test_password.py b/bookwyrm/tests/views/test_password.py index b07d98a7..47d8bb27 100644 --- a/bookwyrm/tests/views/test_password.py +++ b/bookwyrm/tests/views/test_password.py @@ -43,12 +43,14 @@ class PasswordViews(TestCase): def test_password_reset_request_post(self): """send 'em an email""" request = self.factory.post("", {"email": "aa@bb.ccc"}) + request.user = self.anonymous_user view = views.PasswordResetRequest.as_view() resp = view(request) self.assertEqual(resp.status_code, 200) resp.render() request = self.factory.post("", {"email": "mouse@mouse.com"}) + request.user = self.anonymous_user with patch("bookwyrm.emailing.send_email.delay"): resp = view(request) resp.render() @@ -93,33 +95,3 @@ class PasswordViews(TestCase): resp = view(request, code.code) resp.render() self.assertTrue(models.PasswordReset.objects.exists()) - - def test_password_change_get(self): - """there are so many views, this just makes sure it LOADS""" - view = views.ChangePassword.as_view() - request = self.factory.get("") - request.user = self.local_user - - result = view(request) - self.assertIsInstance(result, TemplateResponse) - result.render() - self.assertEqual(result.status_code, 200) - - def test_password_change(self): - """change password""" - view = views.ChangePassword.as_view() - password_hash = self.local_user.password - request = self.factory.post("", {"password": "hi", "confirm-password": "hi"}) - request.user = self.local_user - with patch("bookwyrm.views.password.login"): - view(request) - self.assertNotEqual(self.local_user.password, password_hash) - - def test_password_change_mismatch(self): - """change password""" - view = views.ChangePassword.as_view() - password_hash = self.local_user.password - request = self.factory.post("", {"password": "hi", "confirm-password": "hihi"}) - request.user = self.local_user - view(request) - self.assertEqual(self.local_user.password, password_hash) diff --git a/bookwyrm/tests/views/test_reading.py b/bookwyrm/tests/views/test_reading.py index 3f5846d0..52d10aa6 100644 --- a/bookwyrm/tests/views/test_reading.py +++ b/bookwyrm/tests/views/test_reading.py @@ -113,6 +113,7 @@ class ReadingViews(TestCase): { "post-status": True, "privacy": "followers", + "start_date": readthrough.start_date, "finish_date": timezone.now().isoformat(), "id": readthrough.id, }, diff --git a/bookwyrm/tests/views/test_shelf.py b/bookwyrm/tests/views/test_shelf.py index d873edc6..d769d93c 100644 --- a/bookwyrm/tests/views/test_shelf.py +++ b/bookwyrm/tests/views/test_shelf.py @@ -1,11 +1,14 @@ """ test for app action functionality """ import json from unittest.mock import patch +from tidylib import tidy_document + +from django.core.exceptions import PermissionDenied from django.template.response import TemplateResponse from django.test import TestCase from django.test.client import RequestFactory -from bookwyrm import models, views +from bookwyrm import forms, models, views from bookwyrm.activitypub import ActivitypubResponse @@ -53,7 +56,16 @@ class ShelfViews(TestCase): is_api.return_value = False result = view(request, self.local_user.username, shelf.identifier) self.assertIsInstance(result, TemplateResponse) - result.render() + html = result.render() + _, errors = tidy_document( + html.content, + options={ + "drop-empty-elements": False, + "warn-proprietary-attributes": False, + }, + ) + if errors: + raise Exception(errors) self.assertEqual(result.status_code, 200) with patch("bookwyrm.views.shelf.is_api_request") as is_api: @@ -105,7 +117,7 @@ class ShelfViews(TestCase): shelf.refresh_from_db() self.assertEqual(shelf.name, "cool name") - self.assertEqual(shelf.identifier, "testshelf-%d" % shelf.id) + self.assertEqual(shelf.identifier, f"testshelf-{shelf.id}") def test_edit_shelf_name_not_editable(self, *_): """can't change the name of an non-editable shelf""" @@ -122,7 +134,7 @@ class ShelfViews(TestCase): self.assertEqual(shelf.name, "To Read") - def test_handle_shelve(self, *_): + def test_shelve(self, *_): """shelve a book""" request = self.factory.post( "", {"book": self.book.id, "shelf": self.shelf.identifier} @@ -140,7 +152,7 @@ class ShelfViews(TestCase): # make sure the book is on the shelf self.assertEqual(self.shelf.books.get(), self.book) - def test_handle_shelve_to_read(self, *_): + def test_shelve_to_read(self, *_): """special behavior for the to-read shelf""" shelf = models.Shelf.objects.get(identifier="to-read") request = self.factory.post( @@ -153,7 +165,7 @@ class ShelfViews(TestCase): # make sure the book is on the shelf self.assertEqual(shelf.books.get(), self.book) - def test_handle_shelve_reading(self, *_): + def test_shelve_reading(self, *_): """special behavior for the reading shelf""" shelf = models.Shelf.objects.get(identifier="reading") request = self.factory.post( @@ -166,7 +178,7 @@ class ShelfViews(TestCase): # make sure the book is on the shelf self.assertEqual(shelf.books.get(), self.book) - def test_handle_shelve_read(self, *_): + def test_shelve_read(self, *_): """special behavior for the read shelf""" shelf = models.Shelf.objects.get(identifier="read") request = self.factory.post( @@ -179,7 +191,7 @@ class ShelfViews(TestCase): # make sure the book is on the shelf self.assertEqual(shelf.books.get(), self.book) - def test_handle_unshelve(self, *_): + def test_unshelve(self, *_): """remove a book from a shelf""" with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): models.ShelfBook.objects.create( @@ -197,3 +209,76 @@ class ShelfViews(TestCase): self.assertEqual(activity["type"], "Remove") self.assertEqual(activity["object"]["id"], item.remote_id) self.assertEqual(self.shelf.books.count(), 0) + + def test_create_shelf(self, *_): + """a brand new custom shelf""" + form = forms.ShelfForm() + form.data["user"] = self.local_user.id + form.data["name"] = "new shelf name" + form.data["description"] = "desc" + form.data["privacy"] = "unlisted" + request = self.factory.post("", form.data) + request.user = self.local_user + + views.create_shelf(request) + + shelf = models.Shelf.objects.get(name="new shelf name") + self.assertEqual(shelf.privacy, "unlisted") + self.assertEqual(shelf.description, "desc") + self.assertEqual(shelf.user, self.local_user) + + def test_delete_shelf(self, *_): + """delete a brand new custom shelf""" + request = self.factory.post("") + request.user = self.local_user + shelf_id = self.shelf.id + + views.delete_shelf(request, shelf_id) + + self.assertFalse(models.Shelf.objects.filter(id=shelf_id).exists()) + + def test_delete_shelf_unauthorized(self, *_): + """delete a brand new custom shelf""" + with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( + "bookwyrm.activitystreams.populate_stream_task.delay" + ): + rat = models.User.objects.create_user( + "rat@local.com", + "rat@mouse.mouse", + "password", + local=True, + localname="rat", + ) + request = self.factory.post("") + request.user = rat + + with self.assertRaises(PermissionDenied): + views.delete_shelf(request, self.shelf.id) + + self.assertTrue(models.Shelf.objects.filter(id=self.shelf.id).exists()) + + def test_delete_shelf_has_book(self, *_): + """delete a brand new custom shelf""" + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + models.ShelfBook.objects.create( + book=self.book, user=self.local_user, shelf=self.shelf + ) + request = self.factory.post("") + request.user = self.local_user + + with self.assertRaises(PermissionDenied): + views.delete_shelf(request, self.shelf.id) + + self.assertTrue(models.Shelf.objects.filter(id=self.shelf.id).exists()) + + def test_delete_shelf_not_editable(self, *_): + """delete a brand new custom shelf""" + shelf = self.local_user.shelf_set.first() + self.assertFalse(shelf.editable) + request = self.factory.post("") + request.user = self.local_user + + with self.assertRaises(PermissionDenied): + views.delete_shelf(request, shelf.id) + + self.assertTrue(models.Shelf.objects.filter(id=shelf.id).exists()) diff --git a/bookwyrm/tests/views/test_status.py b/bookwyrm/tests/views/test_status.py index c95d8417..6a09807c 100644 --- a/bookwyrm/tests/views/test_status.py +++ b/bookwyrm/tests/views/test_status.py @@ -1,6 +1,7 @@ """ test for app action functionality """ import json from unittest.mock import patch +from django.core.exceptions import PermissionDenied from django.test import TestCase from django.test.client import RequestFactory @@ -101,7 +102,7 @@ class StatusViews(TestCase): """@mention a user in a post""" view = views.CreateStatus.as_view() user = models.User.objects.create_user( - "rat@%s" % DOMAIN, + f"rat@{DOMAIN}", "rat@rat.com", "password", local=True, @@ -124,7 +125,7 @@ class StatusViews(TestCase): self.assertEqual(list(status.mention_users.all()), [user]) self.assertEqual(models.Notification.objects.get().user, user) self.assertEqual( - status.content, '

    hi @rat

    ' % user.remote_id + status.content, f'

    hi @rat

    ' ) def test_handle_status_reply_with_mentions(self, *_): @@ -196,9 +197,9 @@ class StatusViews(TestCase): ) with patch("bookwyrm.activitystreams.remove_status_task.delay") as mock: - result = view(request, status.id) + with self.assertRaises(PermissionDenied): + view(request, status.id) self.assertFalse(mock.called) - self.assertEqual(result.status_code, 400) status.refresh_from_db() self.assertFalse(status.deleted) @@ -214,9 +215,9 @@ class StatusViews(TestCase): ) with patch("bookwyrm.activitystreams.remove_status_task.delay") as mock: - result = view(request, status.id) + with self.assertRaises(PermissionDenied): + view(request, status.id) self.assertFalse(mock.called) - self.assertEqual(result.status_code, 400) status.refresh_from_db() self.assertFalse(status.deleted) @@ -224,13 +225,13 @@ class StatusViews(TestCase): def test_find_mentions(self, *_): """detect and look up @ mentions of users""" user = models.User.objects.create_user( - "nutria@%s" % DOMAIN, + f"nutria@{DOMAIN}", "nutria@nutria.com", "password", local=True, localname="nutria", ) - self.assertEqual(user.username, "nutria@%s" % DOMAIN) + self.assertEqual(user.username, f"nutria@{DOMAIN}") self.assertEqual( list(views.status.find_mentions("@nutria"))[0], ("@nutria", user) @@ -263,19 +264,19 @@ class StatusViews(TestCase): self.assertEqual(list(views.status.find_mentions("@beep@beep.com")), []) self.assertEqual( - list(views.status.find_mentions("@nutria@%s" % DOMAIN))[0], - ("@nutria@%s" % DOMAIN, user), + list(views.status.find_mentions(f"@nutria@{DOMAIN}"))[0], + (f"@nutria@{DOMAIN}", user), ) def test_format_links_simple_url(self, *_): """find and format urls into a tags""" url = "http://www.fish.com/" self.assertEqual( - views.status.format_links(url), 'www.fish.com/' % url + views.status.format_links(url), f'www.fish.com/' ) self.assertEqual( - views.status.format_links("(%s)" % url), - '(www.fish.com/)' % url, + views.status.format_links(f"({url})"), + f'(www.fish.com/)', ) def test_format_links_paragraph_break(self, *_): @@ -292,8 +293,8 @@ http://www.fish.com/""" """find and format urls into a tags""" url = "http://www.fish.com/" self.assertEqual( - views.status.format_links("(%s)" % url), - '(www.fish.com/)' % url, + views.status.format_links(f"({url})"), + f'(www.fish.com/)', ) def test_format_links_special_chars(self, *_): @@ -301,27 +302,27 @@ http://www.fish.com/""" url = "https://archive.org/details/dli.granth.72113/page/n25/mode/2up" self.assertEqual( views.status.format_links(url), - '' - "archive.org/details/dli.granth.72113/page/n25/mode/2up" % url, + f'' + "archive.org/details/dli.granth.72113/page/n25/mode/2up", ) url = "https://openlibrary.org/search?q=arkady+strugatsky&mode=everything" self.assertEqual( views.status.format_links(url), - 'openlibrary.org/search' - "?q=arkady+strugatsky&mode=everything" % url, + f'openlibrary.org/search' + "?q=arkady+strugatsky&mode=everything", ) url = "https://tech.lgbt/@bookwyrm" self.assertEqual( - views.status.format_links(url), 'tech.lgbt/@bookwyrm' % url + views.status.format_links(url), f'tech.lgbt/@bookwyrm' ) url = "https://users.speakeasy.net/~lion/nb/book.pdf" self.assertEqual( views.status.format_links(url), - 'users.speakeasy.net/~lion/nb/book.pdf' % url, + f'users.speakeasy.net/~lion/nb/book.pdf', ) - url = "https://pkm.one/#/page/The%20Book%20which%20launched%20a%201000%20Note%20taking%20apps" + url = "https://pkm.one/#/page/The%20Book%20launched%20a%201000%20Note%20apps" self.assertEqual( - views.status.format_links(url), '%s' % (url, url[8:]) + views.status.format_links(url), f'{url[8:]}' ) def test_to_markdown(self, *_): @@ -375,7 +376,8 @@ http://www.fish.com/""" request = self.factory.post("") request.user = self.remote_user - view(request, status.id) + with self.assertRaises(PermissionDenied): + view(request, status.id) status.refresh_from_db() self.assertFalse(status.deleted) diff --git a/bookwyrm/tests/views/test_user.py b/bookwyrm/tests/views/test_user.py index 614f772d..f2d9b861 100644 --- a/bookwyrm/tests/views/test_user.py +++ b/bookwyrm/tests/views/test_user.py @@ -1,5 +1,6 @@ """ test for app action functionality """ from unittest.mock import patch +from tidylib import tidy_document from django.contrib.auth.models import AnonymousUser from django.http.response import Http404 @@ -55,7 +56,16 @@ class UserViews(TestCase): is_api.return_value = False result = view(request, "mouse") self.assertIsInstance(result, TemplateResponse) - result.render() + html = result.render() + _, errors = tidy_document( + html.content, + options={ + "drop-empty-elements": False, + "warn-proprietary-attributes": False, + }, + ) + if errors: + raise Exception(errors) self.assertEqual(result.status_code, 200) request.user = self.anonymous_user @@ -63,7 +73,16 @@ class UserViews(TestCase): is_api.return_value = False result = view(request, "mouse") self.assertIsInstance(result, TemplateResponse) - result.render() + html = result.render() + _, errors = tidy_document( + html.content, + options={ + "drop-empty-elements": False, + "warn-proprietary-attributes": False, + }, + ) + if errors: + raise Exception(errors) self.assertEqual(result.status_code, 200) with patch("bookwyrm.views.user.is_api_request") as is_api: @@ -92,7 +111,16 @@ class UserViews(TestCase): is_api.return_value = False result = view(request, "mouse") self.assertIsInstance(result, TemplateResponse) - result.render() + html = result.render() + _, errors = tidy_document( + html.content, + options={ + "drop-empty-elements": False, + "warn-proprietary-attributes": False, + }, + ) + if errors: + raise Exception(errors) self.assertEqual(result.status_code, 200) with patch("bookwyrm.views.user.is_api_request") as is_api: @@ -123,7 +151,16 @@ class UserViews(TestCase): is_api.return_value = False result = view(request, "mouse") self.assertIsInstance(result, TemplateResponse) - result.render() + html = result.render() + _, errors = tidy_document( + html.content, + options={ + "drop-empty-elements": False, + "warn-proprietary-attributes": False, + }, + ) + if errors: + raise Exception(errors) self.assertEqual(result.status_code, 200) with patch("bookwyrm.views.user.is_api_request") as is_api: diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py index 15086a66..8c260b9e 100644 --- a/bookwyrm/urls.py +++ b/bookwyrm/urls.py @@ -7,8 +7,8 @@ from django.views.generic.base import TemplateView from bookwyrm import settings, views from bookwyrm.utils import regex -USER_PATH = r"^user/(?P%s)" % regex.USERNAME -LOCAL_USER_PATH = r"^user/(?P%s)" % regex.LOCALNAME +USER_PATH = rf"^user/(?P{regex.USERNAME})" +LOCAL_USER_PATH = rf"^user/(?P{regex.LOCALNAME})" status_types = [ "status", @@ -19,7 +19,9 @@ status_types = [ "boost", "generatednote", ] -STATUS_PATH = r"%s/(%s)/(?P\d+)" % (USER_PATH, "|".join(status_types)) + +STATUS_TYPES_STRING = "|".join(status_types) +STATUS_PATH = rf"{USER_PATH}/({STATUS_TYPES_STRING})/(?P\d+)" BOOK_PATH = r"^book/(?P\d+)" @@ -33,14 +35,15 @@ urlpatterns = [ ), # federation endpoints re_path(r"^inbox/?$", views.Inbox.as_view()), - re_path(r"%s/inbox/?$" % LOCAL_USER_PATH, views.Inbox.as_view()), - re_path(r"%s/outbox/?$" % LOCAL_USER_PATH, views.Outbox.as_view()), + re_path(rf"{LOCAL_USER_PATH}/inbox/?$", views.Inbox.as_view()), + re_path(rf"{LOCAL_USER_PATH}/outbox/?$", views.Outbox.as_view()), re_path(r"^\.well-known/webfinger/?$", views.webfinger), re_path(r"^\.well-known/nodeinfo/?$", views.nodeinfo_pointer), re_path(r"^\.well-known/host-meta/?$", views.host_meta), re_path(r"^nodeinfo/2\.0/?$", views.nodeinfo), re_path(r"^api/v1/instance/?$", views.instance_info), re_path(r"^api/v1/instance/peers/?$", views.peers), + re_path(r"^opensearch.xml$", views.opensearch, name="opensearch"), # polling updates re_path("^api/updates/notifications/?$", views.get_notification_count), re_path("^api/updates/stream/(?P[a-z]+)/?$", views.get_unread_status_count), @@ -54,7 +57,7 @@ urlpatterns = [ views.ConfirmEmailCode.as_view(), name="confirm-email-code", ), - re_path(r"resend-link", views.resend_link, name="resend-link"), + re_path(r"^resend-link/?$", views.resend_link, name="resend-link"), re_path(r"^logout/?$", views.Logout.as_view(), name="logout"), re_path( r"^password-reset/?$", @@ -154,6 +157,16 @@ urlpatterns = [ views.EmailBlocklist.as_view(), name="settings-email-blocks-delete", ), + re_path( + r"^settings/ip-blocklist/?$", + views.IPBlocklist.as_view(), + name="settings-ip-blocks", + ), + re_path( + r"^settings/ip-blocks/(?P\d+)/delete/?$", + views.IPBlocklist.as_view(), + name="settings-ip-blocks-delete", + ), # moderation re_path(r"^settings/reports/?$", views.Reports.as_view(), name="settings-reports"), re_path( @@ -210,12 +223,12 @@ urlpatterns = [ name="get-started-users", ), # feeds - re_path(r"^(?P{:s})/?$".format(STREAMS), views.Feed.as_view()), + re_path(rf"^(?P{STREAMS})/?$", views.Feed.as_view()), re_path( r"^direct-messages/?$", views.DirectMessage.as_view(), name="direct-messages" ), re_path( - r"^direct-messages/(?P%s)?$" % regex.USERNAME, + rf"^direct-messages/(?P{regex.USERNAME})?$", views.DirectMessage.as_view(), name="direct-messages-user", ), @@ -226,22 +239,22 @@ urlpatterns = [ re_path(r"^import/?$", views.Import.as_view(), name="import"), re_path(r"^import/(\d+)/?$", views.ImportStatus.as_view(), name="import-status"), # users - re_path(r"%s\.json$" % USER_PATH, views.User.as_view()), - re_path(r"%s/?$" % USER_PATH, views.User.as_view(), name="user-feed"), - re_path(r"%s/rss" % USER_PATH, views.rss_feed.RssFeed(), name="user-rss"), + re_path(rf"{USER_PATH}\.json$", views.User.as_view()), + re_path(rf"{USER_PATH}/?$", views.User.as_view(), name="user-feed"), + re_path(rf"{USER_PATH}/rss/?$", views.rss_feed.RssFeed(), name="user-rss"), re_path( - r"%s/followers(.json)?/?$" % USER_PATH, + rf"{USER_PATH}/followers(.json)?/?$", views.Followers.as_view(), name="user-followers", ), re_path( - r"%s/following(.json)?/?$" % USER_PATH, + rf"{USER_PATH}/following(.json)?/?$", views.Following.as_view(), name="user-following", ), re_path(r"^hide-suggestions/?$", views.hide_suggestions, name="hide-suggestions"), # lists - re_path(r"%s/lists/?$" % USER_PATH, views.UserLists.as_view(), name="user-lists"), + re_path(rf"{USER_PATH}/lists/?$", views.UserLists.as_view(), name="user-lists"), re_path(r"^list/?$", views.Lists.as_view(), name="lists"), re_path(r"^list/saved/?$", views.SavedLists.as_view(), name="saved-lists"), re_path(r"^list/(?P\d+)(.json)?/?$", views.List.as_view(), name="list"), @@ -263,14 +276,14 @@ urlpatterns = [ re_path(r"^save-list/(?P\d+)/?$", views.save_list, name="list-save"), re_path(r"^unsave-list/(?P\d+)/?$", views.unsave_list, name="list-unsave"), # User books - re_path(r"%s/books/?$" % USER_PATH, views.Shelf.as_view(), name="user-shelves"), + re_path(rf"{USER_PATH}/books/?$", views.Shelf.as_view(), name="user-shelves"), re_path( - r"^%s/(helf|books)/(?P[\w-]+)(.json)?/?$" % USER_PATH, + rf"^{USER_PATH}/(shelf|books)/(?P[\w-]+)(.json)?/?$", views.Shelf.as_view(), name="shelf", ), re_path( - r"^%s/(books|shelf)/(?P[\w-]+)(.json)?/?$" % LOCAL_USER_PATH, + rf"^{LOCAL_USER_PATH}/(books|shelf)/(?P[\w-]+)(.json)?/?$", views.Shelf.as_view(), name="shelf", ), @@ -280,7 +293,7 @@ urlpatterns = [ re_path(r"^unshelve/?$", views.unshelve), # goals re_path( - r"%s/goal/(?P\d{4})/?$" % USER_PATH, + rf"{LOCAL_USER_PATH}/goal/(?P\d+)/?$", views.Goal.as_view(), name="user-goal", ), @@ -297,10 +310,10 @@ urlpatterns = [ re_path(r"^block/(?P\d+)/?$", views.Block.as_view()), re_path(r"^unblock/(?P\d+)/?$", views.unblock), # statuses - re_path(r"%s(.json)?/?$" % STATUS_PATH, views.Status.as_view(), name="status"), - re_path(r"%s/activity/?$" % STATUS_PATH, views.Status.as_view(), name="status"), + re_path(rf"{STATUS_PATH}(.json)?/?$", views.Status.as_view(), name="status"), + re_path(rf"{STATUS_PATH}/activity/?$", views.Status.as_view(), name="status"), re_path( - r"%s/replies(.json)?/?$" % STATUS_PATH, views.Replies.as_view(), name="replies" + rf"{STATUS_PATH}/replies(.json)?/?$", views.Replies.as_view(), name="replies" ), re_path( r"^post/?$", @@ -330,17 +343,17 @@ urlpatterns = [ re_path(r"^boost/(?P\d+)/?$", views.Boost.as_view()), re_path(r"^unboost/(?P\d+)/?$", views.Unboost.as_view()), # books - re_path(r"%s(.json)?/?$" % BOOK_PATH, views.Book.as_view(), name="book"), + re_path(rf"{BOOK_PATH}(.json)?/?$", views.Book.as_view(), name="book"), re_path( - r"%s/(?Preview|comment|quote)/?$" % BOOK_PATH, + rf"{BOOK_PATH}/(?Preview|comment|quote)/?$", views.Book.as_view(), name="book-user-statuses", ), - re_path(r"%s/edit/?$" % BOOK_PATH, views.EditBook.as_view(), name="edit-book"), - re_path(r"%s/confirm/?$" % BOOK_PATH, views.ConfirmEditBook.as_view()), + re_path(rf"{BOOK_PATH}/edit/?$", views.EditBook.as_view(), name="edit-book"), + re_path(rf"{BOOK_PATH}/confirm/?$", views.ConfirmEditBook.as_view()), re_path(r"^create-book/?$", views.EditBook.as_view(), name="create-book"), re_path(r"^create-book/confirm?$", views.ConfirmEditBook.as_view()), - re_path(r"%s/editions(.json)?/?$" % BOOK_PATH, views.Editions.as_view()), + re_path(rf"{BOOK_PATH}/editions(.json)?/?$", views.Editions.as_view()), re_path( r"^upload-cover/(?P\d+)/?$", views.upload_cover, name="upload-cover" ), @@ -358,6 +371,11 @@ urlpatterns = [ re_path(r"^create-readthrough/?$", views.create_readthrough), re_path(r"^delete-progressupdate/?$", views.delete_progressupdate), # shelve actions + re_path( + r"^reading-status/update/(?P\d+)/?$", + views.update_progress, + name="reading-status-update", + ), re_path( r"^reading-status/(?Pwant|start|finish)/(?P\d+)/?$", views.ReadingStatus.as_view(), diff --git a/bookwyrm/utils/regex.py b/bookwyrm/utils/regex.py index 3ac5a0ff..f0c44245 100644 --- a/bookwyrm/utils/regex.py +++ b/bookwyrm/utils/regex.py @@ -3,8 +3,8 @@ DOMAIN = r"[\w_\-\.]+\.[a-z]{2,}" LOCALNAME = r"@?[a-zA-Z_\-\.0-9]+" STRICT_LOCALNAME = r"@[a-zA-Z_\-\.0-9]+" -USERNAME = r"%s(@%s)?" % (LOCALNAME, DOMAIN) -STRICT_USERNAME = r"\B%s(@%s)?\b" % (STRICT_LOCALNAME, DOMAIN) -FULL_USERNAME = r"%s@%s\b" % (LOCALNAME, DOMAIN) +USERNAME = rf"{LOCALNAME}(@{DOMAIN})?" +STRICT_USERNAME = rf"\B{STRICT_LOCALNAME}(@{DOMAIN})?\b" +FULL_USERNAME = rf"{LOCALNAME}@{DOMAIN}\b" # should match (BookWyrm/1.0.0; or (BookWyrm/99.1.2; BOOKWYRM_USER_AGENT = r"\(BookWyrm/[0-9]+\.[0-9]+\.[0-9]+;" diff --git a/bookwyrm/views/__init__.py b/bookwyrm/views/__init__.py index 95f3fc7f..be59d59c 100644 --- a/bookwyrm/views/__init__.py +++ b/bookwyrm/views/__init__.py @@ -1,10 +1,12 @@ """ make sure all our nice views are available """ +# site admin from .admin.announcements import Announcements, Announcement, delete_announcement from .admin.dashboard import Dashboard from .admin.federation import Federation, FederatedServer from .admin.federation import AddFederatedServer, ImportServerBlocklist from .admin.federation import block_server, unblock_server from .admin.email_blocklist import EmailBlocklist +from .admin.ip_blocklist import IPBlocklist from .admin.invite import ManageInvites, Invite, InviteRequest from .admin.invite import ManageInviteRequests, ignore_invite_request from .admin.reports import ( @@ -18,13 +20,19 @@ from .admin.reports import ( ) from .admin.site import Site from .admin.user_admin import UserAdmin, UserAdminList + +# user preferences +from .preferences.change_password import ChangePassword +from .preferences.edit_user import EditUser +from .preferences.delete_user import DeleteUser +from .preferences.block import Block, unblock + +# misc views from .author import Author, EditAuthor -from .block import Block, unblock from .books import Book, EditBook, ConfirmEditBook from .books import upload_cover, add_description, resolve_book from .directory import Directory from .discover import Discover -from .edit_user import EditUser, DeleteUser from .editions import Editions, switch_edition from .feed import DirectMessage, Feed, Replies, Status from .follow import follow, unfollow @@ -46,12 +54,12 @@ from .reading import delete_readthrough, delete_progressupdate from .reading import ReadingStatus from .register import Register, ConfirmEmail, ConfirmEmailCode, resend_link from .rss_feed import RssFeed -from .password import PasswordResetRequest, PasswordReset, ChangePassword +from .password import PasswordResetRequest, PasswordReset from .search import Search from .shelf import Shelf from .shelf import create_shelf, delete_shelf from .shelf import shelve, unshelve -from .status import CreateStatus, DeleteStatus, DeleteAndRedraft +from .status import CreateStatus, DeleteStatus, DeleteAndRedraft, update_progress from .updates import get_notification_count, get_unread_status_count from .user import User, Followers, Following, hide_suggestions from .wellknown import * diff --git a/bookwyrm/views/admin/__init__.py b/bookwyrm/views/admin/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/bookwyrm/views/admin/announcements.py b/bookwyrm/views/admin/announcements.py index 05386b7b..92ec1766 100644 --- a/bookwyrm/views/admin/announcements.py +++ b/bookwyrm/views/admin/announcements.py @@ -31,6 +31,7 @@ class Announcements(View): "end_date", "active", ] + # pylint: disable=consider-using-f-string if sort in sort_fields + ["-{:s}".format(f) for f in sort_fields]: announcements = announcements.order_by(sort) data = { @@ -40,7 +41,9 @@ class Announcements(View): "form": forms.AnnouncementForm(), "sort": sort, } - return TemplateResponse(request, "settings/announcements.html", data) + return TemplateResponse( + request, "settings/announcements/announcements.html", data + ) def post(self, request): """edit the site settings""" @@ -55,7 +58,9 @@ class Announcements(View): ).get_page(request.GET.get("page")), "form": form, } - return TemplateResponse(request, "settings/announcements.html", data) + return TemplateResponse( + request, "settings/announcements/announcements.html", data + ) @method_decorator(login_required, name="dispatch") @@ -73,7 +78,9 @@ class Announcement(View): "announcement": announcement, "form": forms.AnnouncementForm(instance=announcement), } - return TemplateResponse(request, "settings/announcement.html", data) + return TemplateResponse( + request, "settings/announcements/announcement.html", data + ) def post(self, request, announcement_id): """edit announcement""" @@ -86,7 +93,9 @@ class Announcement(View): "announcement": announcement, "form": form, } - return TemplateResponse(request, "settings/announcement.html", data) + return TemplateResponse( + request, "settings/announcements/announcement.html", data + ) @login_required diff --git a/bookwyrm/views/admin/dashboard.py b/bookwyrm/views/admin/dashboard.py index 161dc6da..e02b9143 100644 --- a/bookwyrm/views/admin/dashboard.py +++ b/bookwyrm/views/admin/dashboard.py @@ -85,4 +85,4 @@ class Dashboard(View): "user_stats": user_stats, "status_stats": status_stats, } - return TemplateResponse(request, "settings/dashboard.html", data) + return TemplateResponse(request, "settings/dashboard/dashboard.html", data) diff --git a/bookwyrm/views/admin/email_blocklist.py b/bookwyrm/views/admin/email_blocklist.py index 2ed8c152..eecad4ff 100644 --- a/bookwyrm/views/admin/email_blocklist.py +++ b/bookwyrm/views/admin/email_blocklist.py @@ -1,4 +1,4 @@ -""" moderation via flagged posts and users """ +""" Manage email blocklist""" from django.contrib.auth.decorators import login_required, permission_required from django.shortcuts import get_object_or_404, redirect from django.template.response import TemplateResponse @@ -14,7 +14,7 @@ from bookwyrm import forms, models name="dispatch", ) class EmailBlocklist(View): - """Block users by email address""" + """Block registration by email address""" def get(self, request): """view and compose blocks""" @@ -22,7 +22,9 @@ class EmailBlocklist(View): "domains": models.EmailBlocklist.objects.order_by("-created_date").all(), "form": forms.EmailBlocklistForm(), } - return TemplateResponse(request, "settings/email_blocklist.html", data) + return TemplateResponse( + request, "settings/email_blocklist/email_blocklist.html", data + ) def post(self, request, domain_id=None): """create a new domain block""" @@ -35,11 +37,15 @@ class EmailBlocklist(View): "form": form, } if not form.is_valid(): - return TemplateResponse(request, "settings/email_blocklist.html", data) + return TemplateResponse( + request, "settings/email_blocklist/email_blocklist.html", data + ) form.save() data["form"] = forms.EmailBlocklistForm() - return TemplateResponse(request, "settings/email_blocklist.html", data) + return TemplateResponse( + request, "settings/email_blocklist/email_blocklist.html", data + ) # pylint: disable=unused-argument def delete(self, request, domain_id): diff --git a/bookwyrm/views/admin/federation.py b/bookwyrm/views/admin/federation.py index 0368a50c..19bba30d 100644 --- a/bookwyrm/views/admin/federation.py +++ b/bookwyrm/views/admin/federation.py @@ -28,6 +28,7 @@ class Federation(View): sort = request.GET.get("sort") sort_fields = ["created_date", "application_type", "server_name"] + # pylint: disable=consider-using-f-string if not sort in sort_fields + ["-{:s}".format(f) for f in sort_fields]: sort = "-created_date" servers = servers.order_by(sort) @@ -43,7 +44,7 @@ class Federation(View): "sort": sort, "form": forms.ServerForm(), } - return TemplateResponse(request, "settings/federation.html", data) + return TemplateResponse(request, "settings/federation/instance_list.html", data) class AddFederatedServer(View): @@ -52,14 +53,16 @@ class AddFederatedServer(View): def get(self, request): """add server form""" data = {"form": forms.ServerForm()} - return TemplateResponse(request, "settings/edit_server.html", data) + return TemplateResponse(request, "settings/federation/edit_instance.html", data) def post(self, request): """add a server from the admin panel""" form = forms.ServerForm(request.POST) if not form.is_valid(): data = {"form": form} - return TemplateResponse(request, "settings/edit_server.html", data) + return TemplateResponse( + request, "settings/federation/edit_instance.html", data + ) server = form.save() return redirect("settings-federated-server", server.id) @@ -74,7 +77,7 @@ class ImportServerBlocklist(View): def get(self, request): """add server form""" - return TemplateResponse(request, "settings/server_blocklist.html") + return TemplateResponse(request, "settings/federation/instance_blocklist.html") def post(self, request): """add a server from the admin panel""" @@ -97,7 +100,9 @@ class ImportServerBlocklist(View): server.block() success_count += 1 data = {"failed": failed, "succeeded": success_count} - return TemplateResponse(request, "settings/server_blocklist.html", data) + return TemplateResponse( + request, "settings/federation/instance_blocklist.html", data + ) @method_decorator(login_required, name="dispatch") @@ -122,7 +127,7 @@ class FederatedServer(View): user_subject__in=users.all() ), } - return TemplateResponse(request, "settings/federated_server.html", data) + return TemplateResponse(request, "settings/federation/instance.html", data) def post(self, request, server): # pylint: disable=unused-argument """update note""" diff --git a/bookwyrm/views/admin/invite.py b/bookwyrm/views/admin/invite.py index 44644e19..8a3db61a 100644 --- a/bookwyrm/views/admin/invite.py +++ b/bookwyrm/views/admin/invite.py @@ -45,13 +45,13 @@ class ManageInvites(View): ), "form": forms.CreateInviteForm(), } - return TemplateResponse(request, "settings/manage_invites.html", data) + return TemplateResponse(request, "settings/invites/manage_invites.html", data) def post(self, request): """creates an invite database entry""" form = forms.CreateInviteForm(request.POST) if not form.is_valid(): - return HttpResponseBadRequest("ERRORS : %s" % (form.errors,)) + return HttpResponseBadRequest(f"ERRORS: {form.errors}") invite = form.save(commit=False) invite.user = request.user @@ -64,7 +64,7 @@ class ManageInvites(View): PAGE_LENGTH, ) data = {"invites": paginated.page(1), "form": form} - return TemplateResponse(request, "settings/manage_invites.html", data) + return TemplateResponse(request, "settings/invites/manage_invites.html", data) class Invite(View): @@ -98,6 +98,7 @@ class ManageInviteRequests(View): "invite__times_used", "invite__invitees__created_date", ] + # pylint: disable=consider-using-f-string if not sort in sort_fields + ["-{:s}".format(f) for f in sort_fields]: sort = "-created_date" @@ -134,7 +135,9 @@ class ManageInviteRequests(View): ), "sort": sort, } - return TemplateResponse(request, "settings/manage_invite_requests.html", data) + return TemplateResponse( + request, "settings/invites/manage_invite_requests.html", data + ) def post(self, request): """send out an invite""" @@ -149,6 +152,7 @@ class ManageInviteRequests(View): ) invite_request.save() emailing.invite_email(invite_request) + # pylint: disable=consider-using-f-string return redirect( "{:s}?{:s}".format( reverse("settings-invite-requests"), urlencode(request.GET.dict()) diff --git a/bookwyrm/views/admin/ip_blocklist.py b/bookwyrm/views/admin/ip_blocklist.py new file mode 100644 index 00000000..d57a2422 --- /dev/null +++ b/bookwyrm/views/admin/ip_blocklist.py @@ -0,0 +1,55 @@ +""" Manage IP blocklist """ +from django.contrib.auth.decorators import login_required, permission_required +from django.shortcuts import get_object_or_404, redirect +from django.template.response import TemplateResponse +from django.utils.decorators import method_decorator +from django.views import View + +from bookwyrm import forms, models + +# pylint: disable=no-self-use +@method_decorator(login_required, name="dispatch") +@method_decorator( + permission_required("bookwyrm.moderate_user", raise_exception=True), + name="dispatch", +) +class IPBlocklist(View): + """Block registration by ip address""" + + def get(self, request): + """view and compose blocks""" + data = { + "addresses": models.IPBlocklist.objects.all(), + "form": forms.IPBlocklistForm(), + } + return TemplateResponse( + request, "settings/ip_blocklist/ip_blocklist.html", data + ) + + def post(self, request, block_id=None): + """create a new ip address block""" + if block_id: + return self.delete(request, block_id) + + form = forms.IPBlocklistForm(request.POST) + data = { + "addresses": models.IPBlocklist.objects.all(), + "form": form, + } + if not form.is_valid(): + return TemplateResponse( + request, "settings/ip_blocklist/ip_blocklist.html", data + ) + form.save() + + data["form"] = forms.IPBlocklistForm() + return TemplateResponse( + request, "settings/ip_blocklist/ip_blocklist.html", data + ) + + # pylint: disable=unused-argument + def delete(self, request, domain_id): + """remove a domain block""" + domain = get_object_or_404(models.IPBlocklist, id=domain_id) + domain.delete() + return redirect("settings-ip-blocks") diff --git a/bookwyrm/views/admin/reports.py b/bookwyrm/views/admin/reports.py index 72b7f4db..f72d7970 100644 --- a/bookwyrm/views/admin/reports.py +++ b/bookwyrm/views/admin/reports.py @@ -40,7 +40,7 @@ class Reports(View): "server": server, "reports": models.Report.objects.filter(**filters), } - return TemplateResponse(request, "moderation/reports.html", data) + return TemplateResponse(request, "settings/reports/reports.html", data) @method_decorator(login_required, name="dispatch") @@ -60,7 +60,7 @@ class Report(View): data = { "report": get_object_or_404(models.Report, id=report_id), } - return TemplateResponse(request, "moderation/report.html", data) + return TemplateResponse(request, "settings/reports/report.html", data) def post(self, request, report_id): """comment on a report""" @@ -105,7 +105,7 @@ def moderator_delete_user(request, user_id): # we can't delete users on other instances if not user.local: - raise PermissionDenied + raise PermissionDenied() form = forms.DeleteUserForm(request.POST, instance=user) diff --git a/bookwyrm/views/admin/site.py b/bookwyrm/views/admin/site.py index 42e8a6dd..b66fdb9f 100644 --- a/bookwyrm/views/admin/site.py +++ b/bookwyrm/views/admin/site.py @@ -41,9 +41,9 @@ def email_preview(request): """for development, renders and example email template""" template = request.GET.get("email") data = emailing.email_data() - data["subject_path"] = "email/{}/subject.html".format(template) - data["html_content_path"] = "email/{}/html_content.html".format(template) - data["text_content_path"] = "email/{}/text_content.html".format(template) + data["subject_path"] = f"email/{template}/subject.html" + data["html_content_path"] = f"email/{template}/html_content.html" + data["text_content_path"] = f"email/{template}/text_content.html" data["reset_link"] = "https://example.com/link" data["invite_link"] = "https://example.com/link" data["confirmation_link"] = "https://example.com/link" diff --git a/bookwyrm/views/admin/user_admin.py b/bookwyrm/views/admin/user_admin.py index 574356c2..aa847959 100644 --- a/bookwyrm/views/admin/user_admin.py +++ b/bookwyrm/views/admin/user_admin.py @@ -47,6 +47,7 @@ class UserAdminList(View): "federated_server__server_name", "is_active", ] + # pylint: disable=consider-using-f-string if sort in sort_fields + ["-{:s}".format(f) for f in sort_fields]: users = users.order_by(sort) @@ -56,7 +57,7 @@ class UserAdminList(View): "sort": sort, "server": server, } - return TemplateResponse(request, "user_admin/user_admin.html", data) + return TemplateResponse(request, "settings/users/user_admin.html", data) @method_decorator(login_required, name="dispatch") @@ -71,7 +72,7 @@ class UserAdmin(View): """user view""" user = get_object_or_404(models.User, id=user) data = {"user": user, "group_form": forms.UserGroupForm()} - return TemplateResponse(request, "user_admin/user.html", data) + return TemplateResponse(request, "settings/users/user.html", data) def post(self, request, user): """update user group""" @@ -80,4 +81,4 @@ class UserAdmin(View): if form.is_valid(): form.save() data = {"user": user, "group_form": form} - return TemplateResponse(request, "user_admin/user.html", data) + return TemplateResponse(request, "settings/users/user.html", data) diff --git a/bookwyrm/views/author.py b/bookwyrm/views/author.py index e51dc7d8..e1e9247d 100644 --- a/bookwyrm/views/author.py +++ b/bookwyrm/views/author.py @@ -55,4 +55,4 @@ class EditAuthor(View): return TemplateResponse(request, "author/edit_author.html", data) author = form.save() - return redirect("/author/%s" % author.id) + return redirect(f"/author/{author.id}") diff --git a/bookwyrm/views/books.py b/bookwyrm/views/books.py index c2525295..71199e54 100644 --- a/bookwyrm/views/books.py +++ b/bookwyrm/views/books.py @@ -8,7 +8,7 @@ from django.core.files.base import ContentFile from django.core.paginator import Paginator from django.db import transaction from django.db.models import Avg, Q -from django.http import HttpResponseBadRequest, HttpResponseNotFound +from django.http import HttpResponseBadRequest, Http404 from django.shortcuts import get_object_or_404, redirect from django.template.response import TemplateResponse from django.utils.datastructures import MultiValueDictKeyError @@ -30,25 +30,31 @@ class Book(View): def get(self, request, book_id, user_statuses=False): """info about a book""" - user_statuses = user_statuses if request.user.is_authenticated else False - try: - book = models.Book.objects.select_subclasses().get(id=book_id) - except models.Book.DoesNotExist: - return HttpResponseNotFound() - if is_api_request(request): + book = get_object_or_404( + models.Book.objects.select_subclasses(), id=book_id + ) return ActivitypubResponse(book.to_activity()) - if isinstance(book, models.Work): - book = book.default_edition + user_statuses = user_statuses if request.user.is_authenticated else False + + # it's safe to use this OR because edition and work and subclasses of the same + # table, so they never have clashing IDs + book = ( + models.Edition.viewer_aware_objects(request.user) + .filter(Q(id=book_id) | Q(parent_work__id=book_id)) + .order_by("-edition_rank") + .select_related("parent_work") + .prefetch_related("authors") + .first() + ) + if not book or not book.parent_work: - return HttpResponseNotFound() + raise Http404() - work = book.parent_work - - # all reviews for the book + # all reviews for all editions of the book reviews = privacy_filter( - request.user, models.Review.objects.filter(book__in=work.editions.all()) + request.user, models.Review.objects.filter(book__parent_work__editions=book) ) # the reviews to show @@ -174,7 +180,7 @@ class EditBook(View): # check if this is an edition of an existing work author_text = book.author_text if book else add_author data["book_matches"] = connector_manager.local_search( - "%s %s" % (form.cleaned_data.get("title"), author_text), + f'{form.cleaned_data.get("title")} {author_text}', min_confidence=0.5, raw=True, )[:5] @@ -185,6 +191,8 @@ class EditBook(View): data["confirm_mode"] = True # this isn't preserved because it isn't part of the form obj data["remove_authors"] = request.POST.getlist("remove_authors") + data["cover_url"] = request.POST.get("cover-url") + # make sure the dates are passed in as datetime, they're currently a string # QueryDicts are immutable, we need to copy formcopy = data["form"].data.copy() @@ -212,7 +220,7 @@ class EditBook(View): if image: book.cover.save(*image, save=False) book.save() - return redirect("/book/%s" % book.id) + return redirect(f"/book/{book.id}") @method_decorator(login_required, name="dispatch") @@ -238,14 +246,14 @@ class ConfirmEditBook(View): # get or create author as needed for i in range(int(request.POST.get("author-match-count", 0))): - match = request.POST.get("author_match-%d" % i) + match = request.POST.get(f"author_match-{i}") if not match: return HttpResponseBadRequest() try: # if it's an int, it's an ID match = int(match) author = get_object_or_404( - models.Author, id=request.POST["author_match-%d" % i] + models.Author, id=request.POST[f"author_match-{i}"] ) except ValueError: # otherwise it's a name @@ -261,13 +269,21 @@ class ConfirmEditBook(View): work = models.Work.objects.create(title=form.cleaned_data["title"]) work.authors.set(book.authors.all()) book.parent_work = work - # we don't tell the world when creating a book - book.save(broadcast=False) for author_id in request.POST.getlist("remove_authors"): book.authors.remove(author_id) - return redirect("/book/%s" % book.id) + # import cover, if requested + url = request.POST.get("cover-url") + if url: + image = set_cover_from_url(url) + if image: + book.cover.save(*image, save=False) + + # we don't tell the world when creating a book + book.save(broadcast=False) + + return redirect(f"/book/{book.id}") @login_required @@ -283,7 +299,7 @@ def upload_cover(request, book_id): if image: book.cover.save(*image) - return redirect("{:s}?cover_error=True".format(book.local_path)) + return redirect(f"{book.local_path}?cover_error=True") form = forms.CoverForm(request.POST, request.FILES, instance=book) if not form.is_valid() or not form.files.get("cover"): diff --git a/bookwyrm/views/directory.py b/bookwyrm/views/directory.py index 8d893047..81898af2 100644 --- a/bookwyrm/views/directory.py +++ b/bookwyrm/views/directory.py @@ -25,10 +25,10 @@ class Directory(View): users = suggested_users.get_annotated_users(request.user, **filters) sort = request.GET.get("sort") - if sort == "recent": - users = users.order_by("-last_active_date") - else: + if sort == "suggested": users = users.order_by("-mutuals", "-last_active_date") + else: + users = users.order_by("-last_active_date") paginated = Paginator(users, 12) diff --git a/bookwyrm/views/editions.py b/bookwyrm/views/editions.py index 7615c497..d044f17c 100644 --- a/bookwyrm/views/editions.py +++ b/bookwyrm/views/editions.py @@ -96,4 +96,4 @@ def switch_edition(request): readthrough.book = new_edition readthrough.save() - return redirect("/book/%d" % new_edition.id) + return redirect(f"/book/{new_edition.id}") diff --git a/bookwyrm/views/feed.py b/bookwyrm/views/feed.py index d17de8f9..0c2647ae 100644 --- a/bookwyrm/views/feed.py +++ b/bookwyrm/views/feed.py @@ -3,6 +3,7 @@ from django.contrib.auth.decorators import login_required from django.core.paginator import Paginator from django.db.models import Q from django.http import HttpResponseNotFound, Http404 +from django.shortcuts import get_object_or_404 from django.template.response import TemplateResponse from django.utils import timezone from django.utils.decorators import method_decorator @@ -42,7 +43,7 @@ class Feed(View): "tab": tab, "streams": STREAMS, "goal_form": forms.GoalForm(), - "path": "/%s" % tab["key"], + "path": f"/{tab['key']}", }, } return TemplateResponse(request, "feed/feed.html", data) @@ -93,17 +94,15 @@ class Status(View): def get(self, request, username, status_id): """display a particular status (and replies, etc)""" - try: - user = get_user_from_username(request.user, username) - status = models.Status.objects.select_subclasses().get( - user=user, id=status_id, deleted=False - ) - except (ValueError, models.Status.DoesNotExist): - return HttpResponseNotFound() - + user = get_user_from_username(request.user, username) + status = get_object_or_404( + models.Status.objects.select_subclasses(), + user=user, + id=status_id, + deleted=False, + ) # make sure the user is authorized to see the status - if not status.visible_to_user(request.user): - return HttpResponseNotFound() + status.raise_visible_to_user(request.user) if is_api_request(request): return ActivitypubResponse( @@ -133,6 +132,7 @@ class Replies(View): status = models.Status.objects.get(id=status_id) if status.user.localname != username: return HttpResponseNotFound() + status.raise_visible_to_user(request.user) return ActivitypubResponse(status.to_replies(**request.GET)) @@ -168,9 +168,11 @@ def get_suggested_books(user, max_books=5): shelf_preview = { "name": shelf.name, "identifier": shelf.identifier, - "books": shelf.books.order_by("shelfbook").prefetch_related("authors")[ - :limit - ], + "books": models.Edition.viewer_aware_objects(user) + .filter( + shelfbook__shelf=shelf, + ) + .prefetch_related("authors")[:limit], } suggested_books.append(shelf_preview) book_count += len(shelf_preview["books"]) diff --git a/bookwyrm/views/follow.py b/bookwyrm/views/follow.py index c3336a94..7d91ce5b 100644 --- a/bookwyrm/views/follow.py +++ b/bookwyrm/views/follow.py @@ -1,8 +1,7 @@ """ views for actions you can take in the application """ from django.contrib.auth.decorators import login_required from django.db import IntegrityError -from django.http import HttpResponseBadRequest -from django.shortcuts import redirect +from django.shortcuts import get_object_or_404, redirect from django.views.decorators.http import require_POST from bookwyrm import models @@ -78,12 +77,10 @@ def delete_follow_request(request): username = request.POST["user"] requester = get_user_from_username(request.user, username) - try: - follow_request = models.UserFollowRequest.objects.get( - user_subject=requester, user_object=request.user - ) - except models.UserFollowRequest.DoesNotExist: - return HttpResponseBadRequest() + follow_request = get_object_or_404( + models.UserFollowRequest, user_subject=requester, user_object=request.user + ) + follow_request.raise_not_deletable(request.user) follow_request.delete() - return redirect("/user/%s" % request.user.localname) + return redirect(f"/user/{request.user.localname}") diff --git a/bookwyrm/views/get_started.py b/bookwyrm/views/get_started.py index 981c62a2..709b3754 100644 --- a/bookwyrm/views/get_started.py +++ b/bookwyrm/views/get_started.py @@ -5,7 +5,6 @@ from django.contrib.auth.decorators import login_required from django.contrib.postgres.search import TrigramSimilarity from django.db.models.functions import Greatest from django.db.models import Count, Q -from django.http import HttpResponseNotFound from django.shortcuts import get_object_or_404, redirect from django.template.response import TemplateResponse from django.utils.decorators import method_decorator @@ -13,7 +12,7 @@ from django.views import View from bookwyrm import book_search, forms, models from bookwyrm.suggested_users import suggested_users -from .edit_user import save_user_form +from .preferences.edit_user import save_user_form # pylint: disable= no-self-use @@ -90,9 +89,8 @@ class GetStartedBooks(View): for (book_id, shelf_id) in shelve_actions: book = get_object_or_404(models.Edition, id=book_id) shelf = get_object_or_404(models.Shelf, id=shelf_id) - if shelf.user != request.user: - # hmmmmm - return HttpResponseNotFound() + shelf.raise_not_editable(request.user) + models.ShelfBook.objects.create(book=book, shelf=shelf, user=request.user) return redirect(self.next_view) diff --git a/bookwyrm/views/goal.py b/bookwyrm/views/goal.py index 12224517..b28c0476 100644 --- a/bookwyrm/views/goal.py +++ b/bookwyrm/views/goal.py @@ -31,8 +31,8 @@ class Goal(View): if not goal and year != timezone.now().year: return redirect("user-goal", username, current_year) - if goal and not goal.visible_to_user(request.user): - return HttpResponseNotFound() + if goal: + goal.raise_visible_to_user(request.user) data = { "goal_form": forms.GoalForm(instance=goal), @@ -41,16 +41,16 @@ class Goal(View): "year": year, "is_self": request.user == user, } - return TemplateResponse(request, "goal.html", data) + return TemplateResponse(request, "user/goal.html", data) def post(self, request, username, year): """update or create an annual goal""" - user = get_user_from_username(request.user, username) - if user != request.user: - return HttpResponseNotFound() - year = int(year) - goal = models.AnnualGoal.objects.filter(year=year, user=request.user).first() + user = get_user_from_username(request.user, username) + goal = models.AnnualGoal.objects.filter(year=year, user=user).first() + if goal: + goal.raise_not_editable(request.user) + form = forms.GoalForm(request.POST, instance=goal) if not form.is_valid(): data = { @@ -58,15 +58,15 @@ class Goal(View): "goal": goal, "year": year, } - return TemplateResponse(request, "goal.html", data) + return TemplateResponse(request, "user/goal.html", data) goal = form.save() if request.POST.get("post-status"): - # create status, if appropraite + # create status, if appropriate template = get_template("snippets/generated_status/goal.html") create_generated_note( request.user, - template.render({"goal": goal, "user": request.user}).strip(), + template.render({"goal": goal, "user": user}).strip(), privacy=goal.privacy, ) @@ -78,5 +78,5 @@ class Goal(View): def hide_goal(request): """don't keep bugging people to set a goal""" request.user.show_goal = False - request.user.save(broadcast=False) + request.user.save(broadcast=False, update_fields=["show_goal"]) return redirect(request.headers.get("Referer", "/")) diff --git a/bookwyrm/views/helpers.py b/bookwyrm/views/helpers.py index aa26ae18..fc5493f5 100644 --- a/bookwyrm/views/helpers.py +++ b/bookwyrm/views/helpers.py @@ -79,7 +79,7 @@ def privacy_filter(viewer, queryset, privacy_levels=None, following_only=False): elif "followers" in privacy_levels: queryset = queryset.exclude( ~Q( # user isn't following and it isn't their own status - Q(user__in=viewer.following.all()) | Q(user=viewer) + Q(user__followers=viewer) | Q(user=viewer) ), privacy="followers", # and the status is followers only ) @@ -115,7 +115,7 @@ def handle_remote_webfinger(query): try: user = models.User.objects.get(username__iexact=query) except models.User.DoesNotExist: - url = "https://%s/.well-known/webfinger?resource=acct:%s" % (domain, query) + url = f"https://{domain}/.well-known/webfinger?resource=acct:{query}" try: data = get_data(url) except (ConnectorException, HTTPError): diff --git a/bookwyrm/views/import_data.py b/bookwyrm/views/import_data.py index 634940a0..fe54c39a 100644 --- a/bookwyrm/views/import_data.py +++ b/bookwyrm/views/import_data.py @@ -68,7 +68,7 @@ class Import(View): importer.start_import(job) - return redirect("/import/%d" % job.id) + return redirect(f"/import/{job.id}") return HttpResponseBadRequest() @@ -80,7 +80,7 @@ class ImportStatus(View): """status of an import job""" job = get_object_or_404(models.ImportJob, id=job_id) if job.user != request.user: - raise PermissionDenied + raise PermissionDenied() try: task = app.AsyncResult(job.task_id) @@ -112,4 +112,4 @@ class ImportStatus(View): items, ) importer.start_import(job) - return redirect("/import/%d" % job.id) + return redirect(f"/import/{job.id}") diff --git a/bookwyrm/views/inbox.py b/bookwyrm/views/inbox.py index e255b4fa..23982495 100644 --- a/bookwyrm/views/inbox.py +++ b/bookwyrm/views/inbox.py @@ -3,8 +3,9 @@ import json import re from urllib.parse import urldefrag -from django.http import HttpResponse, HttpResponseNotFound -from django.http import HttpResponseBadRequest, HttpResponseForbidden +from django.http import HttpResponse, Http404 +from django.core.exceptions import BadRequest, PermissionDenied +from django.shortcuts import get_object_or_404 from django.utils.decorators import method_decorator from django.views import View from django.views.decorators.csrf import csrf_exempt @@ -21,36 +22,30 @@ from bookwyrm.utils import regex class Inbox(View): """requests sent by outside servers""" - # pylint: disable=too-many-return-statements def post(self, request, username=None): """only works as POST request""" # first check if this server is on our shitlist - if is_blocked_user_agent(request): - return HttpResponseForbidden() + raise_is_blocked_user_agent(request) # make sure the user's inbox even exists if username: - try: - models.User.objects.get(localname=username) - except models.User.DoesNotExist: - return HttpResponseNotFound() + get_object_or_404(models.User, localname=username, is_active=True) # is it valid json? does it at least vaguely resemble an activity? try: activity_json = json.loads(request.body) except json.decoder.JSONDecodeError: - return HttpResponseBadRequest() + raise BadRequest() # let's be extra sure we didn't block this domain - if is_blocked_activity(activity_json): - return HttpResponseForbidden() + raise_is_blocked_activity(activity_json) if ( not "object" in activity_json or not "type" in activity_json or not activity_json["type"] in activitypub.activity_objects ): - return HttpResponseNotFound() + raise Http404() # verify the signature if not has_valid_signature(request, activity_json): @@ -65,32 +60,35 @@ class Inbox(View): return HttpResponse() -def is_blocked_user_agent(request): +def raise_is_blocked_user_agent(request): """check if a request is from a blocked server based on user agent""" # check user agent user_agent = request.headers.get("User-Agent") if not user_agent: - return False - url = re.search(r"https?://{:s}/?".format(regex.DOMAIN), user_agent) + return + url = re.search(rf"https?://{regex.DOMAIN}/?", user_agent) if not url: - return False + return url = url.group() - return models.FederatedServer.is_blocked(url) + if models.FederatedServer.is_blocked(url): + raise PermissionDenied() -def is_blocked_activity(activity_json): +def raise_is_blocked_activity(activity_json): """get the sender out of activity json and check if it's blocked""" actor = activity_json.get("actor") # check if the user is banned/deleted existing = models.User.find_existing_by_remote_id(actor) if existing and existing.deleted: - return True + raise PermissionDenied() if not actor: # well I guess it's not even a valid activity so who knows - return False - return models.FederatedServer.is_blocked(actor) + return + + if models.FederatedServer.is_blocked(actor): + raise PermissionDenied() @app.task(queue="medium_priority") diff --git a/bookwyrm/views/list.py b/bookwyrm/views/list.py index e2eab7ef..a9d77597 100644 --- a/bookwyrm/views/list.py +++ b/bookwyrm/views/list.py @@ -3,12 +3,11 @@ from typing import Optional from urllib.parse import urlencode from django.contrib.auth.decorators import login_required -from django.core.exceptions import PermissionDenied from django.core.paginator import Paginator from django.db import IntegrityError, transaction from django.db.models import Avg, Count, DecimalField, Q, Max from django.db.models.functions import Coalesce -from django.http import HttpResponseNotFound, HttpResponseBadRequest, HttpResponse +from django.http import HttpResponseBadRequest, HttpResponse from django.shortcuts import get_object_or_404, redirect from django.template.response import TemplateResponse from django.urls import reverse @@ -35,6 +34,8 @@ class Lists(View): item_count=Count("listitem", filter=Q(listitem__approved=True)) ) .filter(item_count__gt=0) + .select_related("user") + .prefetch_related("listitem_set") .order_by("-updated_date") .distinct() ) @@ -108,8 +109,7 @@ class List(View): def get(self, request, list_id): """display a book list""" book_list = get_object_or_404(models.List, id=list_id) - if not book_list.visible_to_user(request.user): - return HttpResponseNotFound() + book_list.raise_visible_to_user(request.user) if is_api_request(request): return ActivitypubResponse(book_list.to_activity(**request.GET)) @@ -189,6 +189,8 @@ class List(View): def post(self, request, list_id): """edit a list""" book_list = get_object_or_404(models.List, id=list_id) + book_list.raise_not_editable(request.user) + form = forms.ListForm(request.POST, instance=book_list) if not form.is_valid(): return redirect("list", book_list.id) @@ -203,9 +205,7 @@ class Curate(View): def get(self, request, list_id): """display a pending list""" book_list = get_object_or_404(models.List, id=list_id) - if not book_list.user == request.user: - # only the creater can curate the list - return HttpResponseNotFound() + book_list.raise_not_editable(request.user) data = { "list": book_list, @@ -219,6 +219,8 @@ class Curate(View): def post(self, request, list_id): """edit a book_list""" book_list = get_object_or_404(models.List, id=list_id) + book_list.raise_not_editable(request.user) + suggestion = get_object_or_404(models.ListItem, id=request.POST.get("item")) approved = request.POST.get("approved") == "true" if approved: @@ -266,8 +268,7 @@ def delete_list(request, list_id): book_list = get_object_or_404(models.List, id=list_id) # only the owner or a moderator can delete a list - if book_list.user != request.user and not request.user.has_perm("moderate_post"): - raise PermissionDenied + book_list.raise_not_deletable(request.user) book_list.delete() return redirect("lists") @@ -278,8 +279,7 @@ def delete_list(request, list_id): def add_book(request): """put a book on a list""" book_list = get_object_or_404(models.List, id=request.POST.get("list")) - if not book_list.visible_to_user(request.user): - return HttpResponseNotFound() + book_list.raise_visible_to_user(request.user) book = get_object_or_404(models.Edition, id=request.POST.get("book")) # do you have permission to add to the list? @@ -320,23 +320,21 @@ def add_book(request): path = reverse("list", args=[book_list.id]) params = request.GET.copy() params["updated"] = True - return redirect("{:s}?{:s}".format(path, urlencode(params))) + return redirect(f"{path}?{urlencode(params)}") @require_POST @login_required def remove_book(request, list_id): """remove a book from a list""" + book_list = get_object_or_404(models.List, id=list_id) + item = get_object_or_404(models.ListItem, id=request.POST.get("item")) + item.raise_not_deletable(request.user) + with transaction.atomic(): - book_list = get_object_or_404(models.List, id=list_id) - item = get_object_or_404(models.ListItem, id=request.POST.get("item")) - - if not book_list.user == request.user and not item.user == request.user: - return HttpResponseNotFound() - deleted_order = item.order item.delete() - normalize_book_list_ordering(book_list.id, start=deleted_order) + normalize_book_list_ordering(book_list.id, start=deleted_order) return redirect("list", list_id) @@ -347,34 +345,32 @@ def set_book_position(request, list_item_id): Action for when the list user manually specifies a list position, takes special care with the unique ordering per list. """ + list_item = get_object_or_404(models.ListItem, id=list_item_id) + list_item.book_list.raise_not_editable(request.user) + try: + int_position = int(request.POST.get("position")) + except ValueError: + return HttpResponseBadRequest("bad value for position. should be an integer") + + if int_position < 1: + return HttpResponseBadRequest("position cannot be less than 1") + + book_list = list_item.book_list + + # the max position to which a book may be set is the highest order for + # books which are approved + order_max = book_list.listitem_set.filter(approved=True).aggregate(Max("order"))[ + "order__max" + ] + + int_position = min(int_position, order_max) + + original_order = list_item.order + if original_order == int_position: + # no change + return HttpResponse(status=204) + with transaction.atomic(): - list_item = get_object_or_404(models.ListItem, id=list_item_id) - try: - int_position = int(request.POST.get("position")) - except ValueError: - return HttpResponseBadRequest( - "bad value for position. should be an integer" - ) - - if int_position < 1: - return HttpResponseBadRequest("position cannot be less than 1") - - book_list = list_item.book_list - - # the max position to which a book may be set is the highest order for - # books which are approved - order_max = book_list.listitem_set.filter(approved=True).aggregate( - Max("order") - )["order__max"] - - int_position = min(int_position, order_max) - - if request.user not in (book_list.user, list_item.user): - return HttpResponseNotFound() - - original_order = list_item.order - if original_order == int_position: - return HttpResponse(status=204) if original_order > int_position: list_item.order = -1 list_item.save() @@ -394,7 +390,7 @@ def set_book_position(request, list_item_id): def increment_order_in_reverse( book_list_id: int, start: int, end: Optional[int] = None ): - """increase the order nu,ber for every item in a list""" + """increase the order number for every item in a list""" try: book_list = models.List.objects.get(id=book_list_id) except models.List.DoesNotExist: diff --git a/bookwyrm/views/login.py b/bookwyrm/views/login.py index 97d54169..e96d421a 100644 --- a/bookwyrm/views/login.py +++ b/bookwyrm/views/login.py @@ -3,7 +3,6 @@ from django.contrib.auth import authenticate, login, logout from django.contrib.auth.decorators import login_required from django.shortcuts import redirect from django.template.response import TemplateResponse -from django.utils import timezone from django.utils.decorators import method_decorator from django.utils.translation import gettext_lazy as _ from django.views import View @@ -46,7 +45,7 @@ class Login(View): except models.User.DoesNotExist: # maybe it's a full username? username = localname else: - username = "%s@%s" % (localname, DOMAIN) + username = f"{localname}@{DOMAIN}" password = login_form.data["password"] # perform authentication @@ -54,8 +53,7 @@ class Login(View): if user is not None: # successful login login(request, user) - user.last_active_date = timezone.now() - user.save(broadcast=False, update_fields=["last_active_date"]) + user.update_active_date() if request.POST.get("first_login"): return redirect("get-started-profile") return redirect(request.GET.get("next", "/")) diff --git a/bookwyrm/views/notifications.py b/bookwyrm/views/notifications.py index b96bc925..d6897f39 100644 --- a/bookwyrm/views/notifications.py +++ b/bookwyrm/views/notifications.py @@ -29,4 +29,4 @@ class Notifications(View): def post(self, request): """permanently delete notification for user""" request.user.notification_set.filter(read=True).delete() - return redirect("/notifications") + return redirect("notifications") diff --git a/bookwyrm/views/password.py b/bookwyrm/views/password.py index 6d202ce2..ff2a0262 100644 --- a/bookwyrm/views/password.py +++ b/bookwyrm/views/password.py @@ -1,10 +1,8 @@ """ class views for password management """ from django.contrib.auth import login -from django.contrib.auth.decorators import login_required from django.core.exceptions import PermissionDenied from django.shortcuts import redirect from django.template.response import TemplateResponse -from django.utils.decorators import method_decorator from django.utils.translation import gettext_lazy as _ from django.views import View @@ -27,7 +25,9 @@ class PasswordResetRequest(View): """create a password reset token""" email = request.POST.get("email") try: - user = models.User.objects.get(email=email, email__isnull=False) + user = models.User.viewer_aware_objects(request.user).get( + email=email, email__isnull=False + ) except models.User.DoesNotExist: data = {"error": _("No user with that email address was found.")} return TemplateResponse(request, "password_reset_request.html", data) @@ -38,7 +38,7 @@ class PasswordResetRequest(View): # create a new reset code code = models.PasswordReset.objects.create(user=user) password_reset_email(code) - data = {"message": _("A password reset link sent to %s" % email)} + data = {"message": _(f"A password reset link sent to {email}")} return TemplateResponse(request, "password_reset_request.html", data) @@ -52,9 +52,9 @@ class PasswordReset(View): try: reset_code = models.PasswordReset.objects.get(code=code) if not reset_code.valid(): - raise PermissionDenied + raise PermissionDenied() except models.PasswordReset.DoesNotExist: - raise PermissionDenied + raise PermissionDenied() return TemplateResponse(request, "password_reset.html", {"code": code}) @@ -80,26 +80,3 @@ class PasswordReset(View): login(request, user) reset_code.delete() return redirect("/") - - -@method_decorator(login_required, name="dispatch") -class ChangePassword(View): - """change password as logged in user""" - - def get(self, request): - """change password page""" - data = {"user": request.user} - return TemplateResponse(request, "preferences/change_password.html", data) - - def post(self, request): - """allow a user to change their password""" - new_password = request.POST.get("password") - confirm_password = request.POST.get("confirm-password") - - if new_password != confirm_password: - return redirect("preferences/password") - - request.user.set_password(new_password) - request.user.save(broadcast=False, update_fields=["password"]) - login(request, request.user) - return redirect(request.user.local_path) diff --git a/bookwyrm/views/preferences/__init__.py b/bookwyrm/views/preferences/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/bookwyrm/views/block.py b/bookwyrm/views/preferences/block.py similarity index 74% rename from bookwyrm/views/block.py rename to bookwyrm/views/preferences/block.py index 99014a93..90b3be90 100644 --- a/bookwyrm/views/block.py +++ b/bookwyrm/views/preferences/block.py @@ -1,6 +1,5 @@ """ views for actions you can take in the application """ from django.contrib.auth.decorators import login_required -from django.http import HttpResponseNotFound from django.shortcuts import get_object_or_404, redirect from django.template.response import TemplateResponse from django.utils.decorators import method_decorator @@ -24,7 +23,7 @@ class Block(View): models.UserBlocks.objects.create( user_subject=request.user, user_object=to_block ) - return redirect("/preferences/block") + return redirect("prefs-block") @require_POST @@ -32,12 +31,10 @@ class Block(View): def unblock(request, user_id): """undo a block""" to_unblock = get_object_or_404(models.User, id=user_id) - try: - block = models.UserBlocks.objects.get( - user_subject=request.user, - user_object=to_unblock, - ) - except models.UserBlocks.DoesNotExist: - return HttpResponseNotFound() + block = get_object_or_404( + models.UserBlocks, + user_subject=request.user, + user_object=to_unblock, + ) block.delete() - return redirect("/preferences/block") + return redirect("prefs-block") diff --git a/bookwyrm/views/preferences/change_password.py b/bookwyrm/views/preferences/change_password.py new file mode 100644 index 00000000..cdfc9d33 --- /dev/null +++ b/bookwyrm/views/preferences/change_password.py @@ -0,0 +1,31 @@ +""" class views for password management """ +from django.contrib.auth import login +from django.contrib.auth.decorators import login_required +from django.shortcuts import redirect +from django.template.response import TemplateResponse +from django.utils.decorators import method_decorator +from django.views import View + + +# pylint: disable= no-self-use +@method_decorator(login_required, name="dispatch") +class ChangePassword(View): + """change password as logged in user""" + + def get(self, request): + """change password page""" + data = {"user": request.user} + return TemplateResponse(request, "preferences/change_password.html", data) + + def post(self, request): + """allow a user to change their password""" + new_password = request.POST.get("password") + confirm_password = request.POST.get("confirm-password") + + if new_password != confirm_password: + return redirect("prefs-password") + + request.user.set_password(new_password) + request.user.save(broadcast=False, update_fields=["password"]) + login(request, request.user) + return redirect("user-feed", request.user.localname) diff --git a/bookwyrm/views/preferences/delete_user.py b/bookwyrm/views/preferences/delete_user.py new file mode 100644 index 00000000..17daf021 --- /dev/null +++ b/bookwyrm/views/preferences/delete_user.py @@ -0,0 +1,38 @@ +""" edit your own account """ +from django.contrib.auth import logout +from django.contrib.auth.decorators import login_required +from django.shortcuts import redirect +from django.template.response import TemplateResponse +from django.utils.decorators import method_decorator +from django.views import View + +from bookwyrm import forms, models + + +# pylint: disable=no-self-use +@method_decorator(login_required, name="dispatch") +class DeleteUser(View): + """delete user view""" + + def get(self, request): + """delete page for a user""" + data = { + "form": forms.DeleteUserForm(), + "user": request.user, + } + return TemplateResponse(request, "preferences/delete_user.html", data) + + def post(self, request): + """les get fancy with images""" + form = forms.DeleteUserForm(request.POST, instance=request.user) + # idk why but I couldn't get check_password to work on request.user + user = models.User.objects.get(id=request.user.id) + if form.is_valid() and user.check_password(form.cleaned_data["password"]): + user.deactivation_reason = "self_deletion" + user.delete() + logout(request) + return redirect("/") + + form.errors["password"] = ["Invalid password"] + data = {"form": form, "user": request.user} + return TemplateResponse(request, "preferences/delete_user.html", data) diff --git a/bookwyrm/views/edit_user.py b/bookwyrm/views/preferences/edit_user.py similarity index 63% rename from bookwyrm/views/edit_user.py rename to bookwyrm/views/preferences/edit_user.py index b97f2737..275304d7 100644 --- a/bookwyrm/views/edit_user.py +++ b/bookwyrm/views/preferences/edit_user.py @@ -1,9 +1,8 @@ -""" edit or delete ones own account""" +""" edit your own account """ from io import BytesIO from uuid import uuid4 from PIL import Image -from django.contrib.auth import logout from django.contrib.auth.decorators import login_required from django.core.files.base import ContentFile from django.shortcuts import redirect @@ -11,7 +10,7 @@ from django.template.response import TemplateResponse from django.utils.decorators import method_decorator from django.views import View -from bookwyrm import forms, models +from bookwyrm import forms # pylint: disable=no-self-use @@ -34,38 +33,9 @@ class EditUser(View): data = {"form": form, "user": request.user} return TemplateResponse(request, "preferences/edit_user.html", data) - user = save_user_form(form) + save_user_form(form) - return redirect(user.local_path) - - -# pylint: disable=no-self-use -@method_decorator(login_required, name="dispatch") -class DeleteUser(View): - """delete user view""" - - def get(self, request): - """delete page for a user""" - data = { - "form": forms.DeleteUserForm(), - "user": request.user, - } - return TemplateResponse(request, "preferences/delete_user.html", data) - - def post(self, request): - """les get fancy with images""" - form = forms.DeleteUserForm(request.POST, instance=request.user) - # idk why but I couldn't get check_password to work on request.user - user = models.User.objects.get(id=request.user.id) - if form.is_valid() and user.check_password(form.cleaned_data["password"]): - user.deactivation_reason = "self_deletion" - user.delete() - logout(request) - return redirect("/") - - form.errors["password"] = ["Invalid password"] - data = {"form": form, "user": request.user} - return TemplateResponse(request, "preferences/delete_user.html", data) + return redirect("user-feed", request.user.localname) def save_user_form(form): @@ -79,7 +49,7 @@ def save_user_form(form): # set the name to a hash extension = form.files["avatar"].name.split(".")[-1] - filename = "%s.%s" % (uuid4(), extension) + filename = f"{uuid4()}.{extension}" user.avatar.save(filename, image, save=False) user.save() return user diff --git a/bookwyrm/views/reading.py b/bookwyrm/views/reading.py index 4c35db00..012f151a 100644 --- a/bookwyrm/views/reading.py +++ b/bookwyrm/views/reading.py @@ -5,6 +5,7 @@ import dateutil.tz from dateutil.parser import ParserError from django.contrib.auth.decorators import login_required +from django.db import transaction from django.http import HttpResponse, HttpResponseBadRequest, HttpResponseNotFound from django.shortcuts import get_object_or_404, redirect from django.template.response import TemplateResponse @@ -35,7 +36,7 @@ class ReadingStatus(View): return TemplateResponse(request, f"reading_progress/{template}", {"book": book}) def post(self, request, status, book_id): - """desire a book""" + """Change the state of a book by shelving it and adding reading dates""" identifier = { "want": models.Shelf.TO_READ, "start": models.Shelf.READING, @@ -44,22 +45,25 @@ class ReadingStatus(View): if not identifier: return HttpResponseBadRequest() - desired_shelf = models.Shelf.objects.filter( - identifier=identifier, user=request.user - ).first() - - book = get_edition(book_id) - - current_status_shelfbook = ( - models.ShelfBook.objects.select_related("shelf") - .filter( - shelf__identifier__in=models.Shelf.READ_STATUS_IDENTIFIERS, - user=request.user, - book=book, - ) - .first() + desired_shelf = get_object_or_404( + models.Shelf, identifier=identifier, user=request.user ) + book = ( + models.Edition.viewer_aware_objects(request.user) + .prefetch_related("shelfbook_set__shelf") + .get(id=book_id) + ) + + # gets the first shelf that indicates a reading status, or None + shelves = [ + s + for s in book.current_shelves + if s.shelf.identifier in models.Shelf.READ_STATUS_IDENTIFIERS + ] + current_status_shelfbook = shelves[0] if shelves else None + + # checking the referer prevents redirecting back to the modal page referer = request.headers.get("Referer", "/") referer = "/" if "reading-status" in referer else referer if current_status_shelfbook is not None: @@ -72,11 +76,13 @@ class ReadingStatus(View): book=book, shelf=desired_shelf, user=request.user ) - if desired_shelf.identifier != models.Shelf.TO_READ: - # update or create a readthrough - readthrough = update_readthrough(request, book=book) - if readthrough: - readthrough.save() + update_readthrough_on_shelve( + request.user, + book, + desired_shelf.identifier, + start_date=request.POST.get("start_date"), + finish_date=request.POST.get("finish_date"), + ) # post about it (if you want) if request.POST.get("post-status"): @@ -97,23 +103,72 @@ class ReadingStatus(View): return redirect(referer) +@transaction.atomic +def update_readthrough_on_shelve( + user, annotated_book, status, start_date=None, finish_date=None +): + """update the current readthrough for a book when it is re-shelved""" + # there *should* only be one of current active readthrough, but it's a list + active_readthrough = next(iter(annotated_book.active_readthroughs), None) + + # deactivate all existing active readthroughs + for readthrough in annotated_book.active_readthroughs: + readthrough.is_active = False + readthrough.save() + + # if the state is want-to-read, deactivating existing readthroughs is all we need + if status == models.Shelf.TO_READ: + return + + # if we're starting a book, we need a fresh clean active readthrough + if status == models.Shelf.READING or not active_readthrough: + active_readthrough = models.ReadThrough.objects.create( + user=user, book=annotated_book + ) + # santiize and set dates + active_readthrough.start_date = load_date_in_user_tz_as_utc(start_date, user) + # if the finish date is set, the readthrough will be automatically set as inactive + active_readthrough.finish_date = load_date_in_user_tz_as_utc(finish_date, user) + + active_readthrough.save() + + @login_required @require_POST def edit_readthrough(request): """can't use the form because the dates are too finnicky""" - readthrough = update_readthrough(request, create=False) - if not readthrough: - return HttpResponseNotFound() + readthrough = get_object_or_404(models.ReadThrough, id=request.POST.get("id")) + readthrough.raise_not_editable(request.user) + + readthrough.start_date = load_date_in_user_tz_as_utc( + request.POST.get("start_date"), request.user + ) + readthrough.finish_date = load_date_in_user_tz_as_utc( + request.POST.get("finish_date"), request.user + ) + + progress = request.POST.get("progress") + try: + progress = int(progress) + readthrough.progress = progress + except (ValueError, TypeError): + pass + + progress_mode = request.POST.get("progress_mode") + try: + progress_mode = models.ProgressMode(progress_mode) + readthrough.progress_mode = progress_mode + except ValueError: + pass - # don't let people edit other people's data - if request.user != readthrough.user: - return HttpResponseBadRequest() readthrough.save() # record the progress update individually # use default now for date field readthrough.create_update() + if is_api_request(request): + return HttpResponse() return redirect(request.headers.get("Referer", "/")) @@ -122,10 +177,7 @@ def edit_readthrough(request): def delete_readthrough(request): """remove a readthrough""" readthrough = get_object_or_404(models.ReadThrough, id=request.POST.get("id")) - - # don't let people edit other people's data - if request.user != readthrough.user: - return HttpResponseBadRequest() + readthrough.raise_not_deletable(request.user) readthrough.delete() return redirect(request.headers.get("Referer", "/")) @@ -136,73 +188,32 @@ def delete_readthrough(request): def create_readthrough(request): """can't use the form because the dates are too finnicky""" book = get_object_or_404(models.Edition, id=request.POST.get("book")) - readthrough = update_readthrough(request, create=True, book=book) - if not readthrough: - return redirect(book.local_path) - readthrough.save() - return redirect(request.headers.get("Referer", "/")) + + start_date = load_date_in_user_tz_as_utc( + request.POST.get("start_date"), request.user + ) + finish_date = load_date_in_user_tz_as_utc( + request.POST.get("finish_date"), request.user + ) + models.ReadThrough.objects.create( + user=request.user, + book=book, + start_date=start_date, + finish_date=finish_date, + ) + return redirect("book", book.id) def load_date_in_user_tz_as_utc(date_str: str, user: models.User) -> datetime: """ensures that data is stored consistently in the UTC timezone""" - user_tz = dateutil.tz.gettz(user.preferred_timezone) - start_date = dateutil.parser.parse(date_str, ignoretz=True) - return start_date.replace(tzinfo=user_tz).astimezone(dateutil.tz.UTC) - - -def update_readthrough(request, book=None, create=True): - """updates but does not save dates on a readthrough""" - try: - read_id = request.POST.get("id") - if not read_id: - raise models.ReadThrough.DoesNotExist - readthrough = models.ReadThrough.objects.get(id=read_id) - except models.ReadThrough.DoesNotExist: - if not create or not book: - return None - readthrough = models.ReadThrough( - user=request.user, - book=book, - ) - - start_date = request.POST.get("start_date") - if start_date: - try: - readthrough.start_date = load_date_in_user_tz_as_utc( - start_date, request.user - ) - except ParserError: - pass - - finish_date = request.POST.get("finish_date") - if finish_date: - try: - readthrough.finish_date = load_date_in_user_tz_as_utc( - finish_date, request.user - ) - except ParserError: - pass - - progress = request.POST.get("progress") - if progress: - try: - progress = int(progress) - readthrough.progress = progress - except ValueError: - pass - - progress_mode = request.POST.get("progress_mode") - if progress_mode: - try: - progress_mode = models.ProgressMode(progress_mode) - readthrough.progress_mode = progress_mode - except ValueError: - pass - - if not readthrough.start_date and not readthrough.finish_date: + if not date_str: + return None + user_tz = dateutil.tz.gettz(user.preferred_timezone) + date = dateutil.parser.parse(date_str, ignoretz=True) + try: + return date.replace(tzinfo=user_tz).astimezone(dateutil.tz.UTC) + except ParserError: return None - - return readthrough @login_required @@ -210,10 +221,7 @@ def update_readthrough(request, book=None, create=True): def delete_progressupdate(request): """remove a progress update""" update = get_object_or_404(models.ProgressUpdate, id=request.POST.get("id")) - - # don't let people edit other people's data - if request.user != update.user: - return HttpResponseBadRequest() + update.raise_not_deletable(request.user) update.delete() return redirect(request.headers.get("Referer", "/")) diff --git a/bookwyrm/views/register.py b/bookwyrm/views/register.py index 1a0615ac..dd824920 100644 --- a/bookwyrm/views/register.py +++ b/bookwyrm/views/register.py @@ -16,6 +16,10 @@ from bookwyrm.settings import DOMAIN class Register(View): """register a user""" + def get(self, request): # pylint: disable=unused-argument + """whether or not you're logged in, just go to the home view""" + return redirect("/") + @sensitive_variables("password") @method_decorator(sensitive_post_parameters("password")) def post(self, request): @@ -25,11 +29,11 @@ class Register(View): invite_code = request.POST.get("invite_code") if not invite_code: - raise PermissionDenied + raise PermissionDenied() invite = get_object_or_404(models.SiteInvite, code=invite_code) if not invite.valid(): - raise PermissionDenied + raise PermissionDenied() else: invite = None @@ -64,7 +68,7 @@ class Register(View): return TemplateResponse(request, "invite.html", data) return TemplateResponse(request, "login.html", data) - username = "%s@%s" % (localname, DOMAIN) + username = f"{localname}@{DOMAIN}" user = models.User.objects.create_user( username, email, diff --git a/bookwyrm/views/search.py b/bookwyrm/views/search.py index 60a1879a..df891266 100644 --- a/bookwyrm/views/search.py +++ b/bookwyrm/views/search.py @@ -64,7 +64,7 @@ class Search(View): data["results"] = paginated data["remote"] = search_remote - return TemplateResponse(request, "search/{:s}.html".format(search_type), data) + return TemplateResponse(request, f"search/{search_type}.html", data) def book_search(query, _, min_confidence, search_remote=False): diff --git a/bookwyrm/views/shelf.py b/bookwyrm/views/shelf.py index ba9f6a3c..35f660b5 100644 --- a/bookwyrm/views/shelf.py +++ b/bookwyrm/views/shelf.py @@ -1,11 +1,11 @@ -""" shelf views""" +""" shelf views """ from collections import namedtuple -from django.db import IntegrityError +from django.db import IntegrityError, transaction from django.db.models import OuterRef, Subquery, F from django.contrib.auth.decorators import login_required from django.core.paginator import Paginator -from django.http import HttpResponseBadRequest, HttpResponseNotFound +from django.http import HttpResponseBadRequest from django.shortcuts import get_object_or_404, redirect from django.template.response import TemplateResponse from django.utils.decorators import method_decorator @@ -16,7 +16,7 @@ from django.views.decorators.http import require_POST from bookwyrm import forms, models from bookwyrm.activitypub import ActivitypubResponse from bookwyrm.settings import PAGE_LENGTH -from .helpers import is_api_request, get_edition, get_user_from_username +from .helpers import is_api_request, get_user_from_username from .helpers import privacy_filter @@ -31,28 +31,28 @@ class Shelf(View): is_self = user == request.user if is_self: - shelves = user.shelf_set + shelves = user.shelf_set.all() else: - shelves = privacy_filter(request.user, user.shelf_set) + shelves = privacy_filter(request.user, user.shelf_set).all() # get the shelf and make sure the logged in user should be able to see it if shelf_identifier: - try: - shelf = user.shelf_set.get(identifier=shelf_identifier) - except models.Shelf.DoesNotExist: - return HttpResponseNotFound() - if not shelf.visible_to_user(request.user): - return HttpResponseNotFound() + shelf = get_object_or_404(user.shelf_set, identifier=shelf_identifier) + shelf.raise_visible_to_user(request.user) books = shelf.books - # this is a constructed "all books" view, with a fake "shelf" obj else: + # this is a constructed "all books" view, with a fake "shelf" obj FakeShelf = namedtuple( "Shelf", ("identifier", "name", "user", "books", "privacy") ) - books = models.Edition.objects.filter( - # privacy is ensured because the shelves are already filtered above - shelfbook__shelf__in=shelves.all() - ).distinct() + books = ( + models.Edition.viewer_aware_objects(request.user) + .filter( + # privacy is ensured because the shelves are already filtered above + shelfbook__shelf__in=shelves + ) + .distinct() + ) shelf = FakeShelf("all", _("All books"), user, books, "public") if is_api_request(request): @@ -82,27 +82,27 @@ class Shelf(View): data = { "user": user, "is_self": is_self, - "shelves": shelves.all(), + "shelves": shelves, "shelf": shelf, "books": page, + "edit_form": forms.ShelfForm(instance=shelf if shelf_identifier else None), + "create_form": forms.ShelfForm(), "page_range": paginated.get_elided_page_range( page.number, on_each_side=2, on_ends=1 ), } - return TemplateResponse(request, "user/shelf/shelf.html", data) + return TemplateResponse(request, "shelf/shelf.html", data) @method_decorator(login_required, name="dispatch") # pylint: disable=unused-argument def post(self, request, username, shelf_identifier): """edit a shelf""" - try: - shelf = request.user.shelf_set.get(identifier=shelf_identifier) - except models.Shelf.DoesNotExist: - return HttpResponseNotFound() + user = get_user_from_username(request.user, username) + shelf = get_object_or_404(user.shelf_set, identifier=shelf_identifier) + shelf.raise_not_editable(request.user) - if request.user != shelf.user: - return HttpResponseBadRequest() + # you can't change the name of the default shelves if not shelf.editable and request.POST.get("name") != shelf.name: return HttpResponseBadRequest() @@ -130,8 +130,7 @@ def create_shelf(request): def delete_shelf(request, shelf_id): """user generated shelves""" shelf = get_object_or_404(models.Shelf, id=shelf_id) - if request.user != shelf.user or not shelf.editable: - return HttpResponseBadRequest() + shelf.raise_not_deletable(request.user) shelf.delete() return redirect("user-shelves", request.user.localname) @@ -139,25 +138,28 @@ def delete_shelf(request, shelf_id): @login_required @require_POST +@transaction.atomic def shelve(request): """put a book on a user's shelf""" - book = get_edition(request.POST.get("book")) - - desired_shelf = models.Shelf.objects.filter( - identifier=request.POST.get("shelf"), user=request.user - ).first() - if not desired_shelf: - return HttpResponseNotFound() + book = get_object_or_404(models.Edition, id=request.POST.get("book")) + desired_shelf = get_object_or_404( + request.user.shelf_set, identifier=request.POST.get("shelf") + ) + # first we need to remove from the specified shelf change_from_current_identifier = request.POST.get("change-shelf-from") - if change_from_current_identifier is not None: - current_shelf = models.Shelf.objects.get( - user=request.user, identifier=change_from_current_identifier - ) - handle_unshelve(book, current_shelf) + if change_from_current_identifier: + # find the shelfbook obj and delete it + get_object_or_404( + models.ShelfBook, + book=book, + user=request.user, + shelf__identifier=change_from_current_identifier, + ).delete() # A book can be on multiple shelves, but only on one read status shelf at a time if desired_shelf.identifier in models.Shelf.READ_STATUS_IDENTIFIERS: + # figure out where state shelf it's currently on (if any) current_read_status_shelfbook = ( models.ShelfBook.objects.select_related("shelf") .filter( @@ -172,14 +174,16 @@ def shelve(request): current_read_status_shelfbook.shelf.identifier != desired_shelf.identifier ): - handle_unshelve(book, current_read_status_shelfbook.shelf) + current_read_status_shelfbook.delete() else: # It is already on the shelf return redirect(request.headers.get("Referer", "/")) + # create the new shelf-book entry models.ShelfBook.objects.create( book=book, shelf=desired_shelf, user=request.user ) else: + # we're putting it on a custom shelf try: models.ShelfBook.objects.create( book=book, shelf=desired_shelf, user=request.user @@ -194,15 +198,12 @@ def shelve(request): @login_required @require_POST def unshelve(request): - """put a on a user's shelf""" - book = models.Edition.objects.get(id=request.POST["book"]) - current_shelf = models.Shelf.objects.get(id=request.POST["shelf"]) + """put a on a user's shelf""" + book = get_object_or_404(models.Edition, id=request.POST.get("book")) + shelf_book = get_object_or_404( + models.ShelfBook, book=book, shelf__id=request.POST["shelf"] + ) + shelf_book.raise_not_deletable(request.user) - handle_unshelve(book, current_shelf) + shelf_book.delete() return redirect(request.headers.get("Referer", "/")) - - -def handle_unshelve(book, shelf): - """unshelve a book""" - row = models.ShelfBook.objects.get(book=book, shelf=shelf) - row.delete() diff --git a/bookwyrm/views/status.py b/bookwyrm/views/status.py index 0ead2d01..58d31aaa 100644 --- a/bookwyrm/views/status.py +++ b/bookwyrm/views/status.py @@ -5,11 +5,12 @@ from urllib.parse import urlparse from django.contrib.auth.decorators import login_required from django.core.validators import URLValidator from django.core.exceptions import ValidationError -from django.http import HttpResponse, HttpResponseBadRequest +from django.http import HttpResponse, HttpResponseBadRequest, Http404 from django.shortcuts import get_object_or_404, redirect from django.template.response import TemplateResponse from django.utils.decorators import method_decorator from django.views import View +from django.views.decorators.http import require_POST from markdown import markdown from bookwyrm import forms, models @@ -36,7 +37,7 @@ class CreateStatus(View): status_type = status_type[0].upper() + status_type[1:] try: - form = getattr(forms, "%sForm" % status_type)(request.POST) + form = getattr(forms, f"{status_type}Form")(request.POST) except AttributeError: return HttpResponseBadRequest() if not form.is_valid(): @@ -58,8 +59,8 @@ class CreateStatus(View): # turn the mention into a link content = re.sub( - r"%s([^@]|$)" % mention_text, - r'%s\g<1>' % (mention_user.remote_id, mention_text), + rf"{mention_text}([^@]|$)", + rf'{mention_text}\g<1>', content, ) # add reply parent to mentions @@ -79,7 +80,10 @@ class CreateStatus(View): status.save(created=True) # update a readthorugh, if needed - edit_readthrough(request) + try: + edit_readthrough(request) + except Http404: + pass if is_api_request(request): return HttpResponse() @@ -95,8 +99,7 @@ class DeleteStatus(View): status = get_object_or_404(models.Status, id=status_id) # don't let people delete other people's statuses - if status.user != request.user and not request.user.has_perm("moderate_post"): - return HttpResponseBadRequest() + status.raise_not_deletable(request.user) # perform deletion status.delete() @@ -112,12 +115,8 @@ class DeleteAndRedraft(View): status = get_object_or_404( models.Status.objects.select_subclasses(), id=status_id ) - if isinstance(status, (models.GeneratedNote, models.ReviewRating)): - return HttpResponseBadRequest() - # don't let people redraft other people's statuses - if status.user != request.user: - return HttpResponseBadRequest() + status.raise_not_editable(request.user) status_type = status.status_type.lower() if status.reply_parent: @@ -137,6 +136,15 @@ class DeleteAndRedraft(View): return TemplateResponse(request, "compose.html", data) +@login_required +@require_POST +def update_progress(request, book_id): # pylint: disable=unused-argument + """Either it's just a progress update, or it's a comment with a progress update""" + if request.POST.get("post-status"): + return CreateStatus.as_view()(request, "comment") + return edit_readthrough(request) + + def find_mentions(content): """detect @mentions in raw status content""" if not content: @@ -182,7 +190,7 @@ def format_links(content): if url.fragment != "": link += "#" + url.fragment - formatted_content += '%s' % (potential_link, link) + formatted_content += f'{link}' except (ValidationError, UnicodeError): formatted_content += potential_link diff --git a/bookwyrm/views/user.py b/bookwyrm/views/user.py index e335b02c..fb553228 100644 --- a/bookwyrm/views/user.py +++ b/bookwyrm/views/user.py @@ -1,6 +1,7 @@ """ non-interactive pages """ from django.contrib.auth.decorators import login_required from django.core.paginator import Paginator +from django.http import Http404 from django.shortcuts import redirect from django.template.response import TemplateResponse from django.utils import timezone @@ -59,16 +60,30 @@ class User(View): request.user, user.status_set.select_subclasses(), ) - .select_related("reply_parent") - .prefetch_related("mention_books", "mention_users") + .select_related( + "user", + "reply_parent", + "review__book", + "comment__book", + "quotation__book", + ) + .prefetch_related( + "mention_books", + "mention_users", + "attachments", + ) ) paginated = Paginator(activities, PAGE_LENGTH) goal = models.AnnualGoal.objects.filter( user=user, year=timezone.now().year ).first() - if goal and not goal.visible_to_user(request.user): - goal = None + if goal: + try: + goal.raise_visible_to_user(request.user) + except Http404: + goal = None + data = { "user": user, "is_self": is_self, diff --git a/bookwyrm/views/wellknown.py b/bookwyrm/views/wellknown.py index c981eb69..0f860441 100644 --- a/bookwyrm/views/wellknown.py +++ b/bookwyrm/views/wellknown.py @@ -3,6 +3,7 @@ from dateutil.relativedelta import relativedelta from django.http import HttpResponseNotFound from django.http import JsonResponse +from django.shortcuts import get_object_or_404 from django.template.response import TemplateResponse from django.utils import timezone from django.views.decorators.http import require_GET @@ -19,14 +20,11 @@ def webfinger(request): return HttpResponseNotFound() username = resource.replace("acct:", "") - try: - user = models.User.objects.get(username__iexact=username) - except models.User.DoesNotExist: - return HttpResponseNotFound("No account found") + user = get_object_or_404(models.User, username__iexact=username) return JsonResponse( { - "subject": "acct:%s" % (user.username), + "subject": f"acct:{user.username}", "links": [ { "rel": "self", @@ -46,7 +44,7 @@ def nodeinfo_pointer(_): "links": [ { "rel": "http://nodeinfo.diaspora.software/ns/schema/2.0", - "href": "https://%s/nodeinfo/2.0" % DOMAIN, + "href": f"https://{DOMAIN}/nodeinfo/2.0", } ] } @@ -130,3 +128,14 @@ def peers(_): def host_meta(request): """meta of the host""" return TemplateResponse(request, "host_meta.xml", {"DOMAIN": DOMAIN}) + + +@require_GET +def opensearch(request): + """Open Search xml spec""" + site = models.SiteSettings.get() + logo_path = site.favicon or "images/favicon.png" + logo = f"{MEDIA_FULL_URL}{logo_path}" + return TemplateResponse( + request, "opensearch.xml", {"image": logo, "DOMAIN": DOMAIN} + ) diff --git a/docker-compose.yml b/docker-compose.yml index 5d24a4b7..afa40b05 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -20,8 +20,6 @@ services: - pgdata:/var/lib/postgresql/data networks: - main - ports: - - 5432:5432 web: build: . env_file: .env diff --git a/locale/de_DE/LC_MESSAGES/django.mo b/locale/de_DE/LC_MESSAGES/django.mo index 7bf45424..62c8d07f 100644 Binary files a/locale/de_DE/LC_MESSAGES/django.mo and b/locale/de_DE/LC_MESSAGES/django.mo differ diff --git a/locale/de_DE/LC_MESSAGES/django.po b/locale/de_DE/LC_MESSAGES/django.po index 2eda8665..569330fa 100644 --- a/locale/de_DE/LC_MESSAGES/django.po +++ b/locale/de_DE/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-12 17:16+0000\n" +"POT-Creation-Date: 2021-09-29 18:32+0000\n" "PO-Revision-Date: 2021-03-02 17:19-0800\n" "Last-Translator: Mouse Reeve \n" "Language-Team: English \n" @@ -18,67 +18,67 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: bookwyrm/forms.py:242 +#: bookwyrm/forms.py:241 #, fuzzy #| msgid "A user with that username already exists." msgid "A user with this email already exists." msgstr "Dieser Benutzename ist bereits vergeben." -#: bookwyrm/forms.py:256 +#: bookwyrm/forms.py:255 msgid "One Day" msgstr "Ein Tag" -#: bookwyrm/forms.py:257 +#: bookwyrm/forms.py:256 msgid "One Week" msgstr "Eine Woche" -#: bookwyrm/forms.py:258 +#: bookwyrm/forms.py:257 msgid "One Month" msgstr "Ein Monat" -#: bookwyrm/forms.py:259 +#: bookwyrm/forms.py:258 msgid "Does Not Expire" msgstr "Läuft nicht aus" -#: bookwyrm/forms.py:264 -#, python-format -msgid "%(count)d uses" -msgstr "%(count)d Benutzungen" +#: bookwyrm/forms.py:262 +#, fuzzy, python-brace-format +#| msgid "Max uses" +msgid "{i} uses" +msgstr "Maximale Benutzungen" -#: bookwyrm/forms.py:267 +#: bookwyrm/forms.py:263 #, fuzzy #| msgid "Unlisted" msgid "Unlimited" msgstr "Ungelistet" -#: bookwyrm/forms.py:323 +#: bookwyrm/forms.py:325 msgid "List Order" msgstr "Reihenfolge der Liste" -#: bookwyrm/forms.py:324 +#: bookwyrm/forms.py:326 #, fuzzy #| msgid "Title" msgid "Book Title" msgstr "Titel" -#: bookwyrm/forms.py:325 +#: bookwyrm/forms.py:327 bookwyrm/templates/shelf/shelf.html:134 +#: bookwyrm/templates/shelf/shelf.html:165 #: bookwyrm/templates/snippets/create_status/review.html:33 -#: bookwyrm/templates/user/shelf/shelf.html:117 -#: bookwyrm/templates/user/shelf/shelf.html:148 msgid "Rating" msgstr "" -#: bookwyrm/forms.py:327 bookwyrm/templates/lists/list.html:107 +#: bookwyrm/forms.py:329 bookwyrm/templates/lists/list.html:109 msgid "Sort By" msgstr "Sortieren nach" -#: bookwyrm/forms.py:331 +#: bookwyrm/forms.py:333 #, fuzzy #| msgid "Started reading" msgid "Ascending" msgstr "Zu lesen angefangen" -#: bookwyrm/forms.py:332 +#: bookwyrm/forms.py:334 #, fuzzy #| msgid "Started reading" msgid "Descending" @@ -92,42 +92,68 @@ msgstr "" msgid "Could not find a match for book" msgstr "" -#: bookwyrm/models/base_model.py:13 +#: bookwyrm/models/base_model.py:16 #, fuzzy #| msgid "Started reading" msgid "Pending" msgstr "Zu lesen angefangen" -#: bookwyrm/models/base_model.py:14 +#: bookwyrm/models/base_model.py:17 msgid "Self deletion" msgstr "" -#: bookwyrm/models/base_model.py:15 +#: bookwyrm/models/base_model.py:18 #, fuzzy #| msgid "Moderator Comments" msgid "Moderator suspension" msgstr "Moderator:innenkommentare" -#: bookwyrm/models/base_model.py:16 +#: bookwyrm/models/base_model.py:19 #, fuzzy #| msgid "List curation:" msgid "Moderator deletion" msgstr "Listenkuratierung:" -#: bookwyrm/models/base_model.py:17 +#: bookwyrm/models/base_model.py:20 msgid "Domain block" msgstr "" +#: bookwyrm/models/book.py:232 +#, fuzzy +#| msgid "Add Books" +msgid "Audiobook" +msgstr "Bücher hinzufügen" + +#: bookwyrm/models/book.py:233 +#, fuzzy +#| msgid "Book" +msgid "eBook" +msgstr "Buch" + +#: bookwyrm/models/book.py:234 +msgid "Graphic novel" +msgstr "" + +#: bookwyrm/models/book.py:235 +#, fuzzy +#| msgid "Add cover" +msgid "Hardcover" +msgstr "Cover hinzufügen" + +#: bookwyrm/models/book.py:236 +msgid "Paperback" +msgstr "" + #: bookwyrm/models/federated_server.py:11 -#: bookwyrm/templates/settings/edit_server.html:40 -#: bookwyrm/templates/settings/federation.html:19 +#: bookwyrm/templates/settings/federation/edit_instance.html:42 +#: bookwyrm/templates/settings/federation/instance_list.html:19 msgid "Federated" msgstr "Föderiert" #: bookwyrm/models/federated_server.py:12 -#: bookwyrm/templates/settings/edit_server.html:41 -#: bookwyrm/templates/settings/federated_server.html:10 -#: bookwyrm/templates/settings/federation.html:23 +#: bookwyrm/templates/settings/federation/edit_instance.html:43 +#: bookwyrm/templates/settings/federation/instance.html:10 +#: bookwyrm/templates/settings/federation/instance_list.html:23 #, fuzzy #| msgid "Blocked Users" msgid "Blocked" @@ -143,7 +169,7 @@ msgstr "%(value)s ist keine gültige remote_id" msgid "%(value)s is not a valid username" msgstr "%(value)s ist kein gültiger Username" -#: bookwyrm/models/fields.py:181 bookwyrm/templates/layout.html:164 +#: bookwyrm/models/fields.py:181 bookwyrm/templates/layout.html:171 msgid "username" msgstr "Username" @@ -151,21 +177,21 @@ msgstr "Username" msgid "A user with that username already exists." msgstr "Dieser Benutzename ist bereits vergeben." -#: bookwyrm/settings.py:115 +#: bookwyrm/settings.py:116 msgid "Home Timeline" msgstr "" -#: bookwyrm/settings.py:115 +#: bookwyrm/settings.py:116 msgid "Home" msgstr "" -#: bookwyrm/settings.py:116 +#: bookwyrm/settings.py:117 #, fuzzy #| msgid "Title" msgid "Books Timeline" msgstr "Titel" -#: bookwyrm/settings.py:116 bookwyrm/templates/search/layout.html:21 +#: bookwyrm/settings.py:117 bookwyrm/templates/search/layout.html:21 #: bookwyrm/templates/search/layout.html:42 #: bookwyrm/templates/user/layout.html:81 #, fuzzy @@ -173,27 +199,27 @@ msgstr "Titel" msgid "Books" msgstr "Buch" -#: bookwyrm/settings.py:162 +#: bookwyrm/settings.py:163 msgid "English" msgstr "Englisch" -#: bookwyrm/settings.py:163 +#: bookwyrm/settings.py:164 msgid "German" msgstr "Deutsch" -#: bookwyrm/settings.py:164 +#: bookwyrm/settings.py:165 msgid "Spanish" msgstr "Spanisch" -#: bookwyrm/settings.py:165 +#: bookwyrm/settings.py:166 msgid "French" msgstr "Französisch" -#: bookwyrm/settings.py:166 +#: bookwyrm/settings.py:167 msgid "Simplified Chinese" msgstr "Vereinfachtes Chinesisch" -#: bookwyrm/settings.py:167 +#: bookwyrm/settings.py:168 msgid "Traditional Chinese" msgstr "" @@ -293,9 +319,7 @@ msgid "Metadata" msgstr "Metadaten" #: bookwyrm/templates/author/edit_author.html:33 -#: bookwyrm/templates/lists/form.html:8 -#: bookwyrm/templates/user/shelf/create_shelf_form.html:13 -#: bookwyrm/templates/user/shelf/edit_shelf_form.html:14 +#: bookwyrm/templates/lists/form.html:8 bookwyrm/templates/shelf/form.html:9 msgid "Name:" msgstr "" @@ -333,7 +357,7 @@ msgid "Openlibrary key:" msgstr "" #: bookwyrm/templates/author/edit_author.html:89 -#: bookwyrm/templates/book/edit_book.html:300 +#: bookwyrm/templates/book/edit_book.html:313 #, fuzzy #| msgid "View on OpenLibrary" msgid "Inventaire ID:" @@ -349,32 +373,30 @@ msgstr "" #: bookwyrm/templates/author/edit_author.html:116 #: bookwyrm/templates/book/book.html:140 -#: bookwyrm/templates/book/edit_book.html:328 +#: bookwyrm/templates/book/edit_book.html:341 #: bookwyrm/templates/book/readthrough.html:76 #: bookwyrm/templates/lists/bookmark_button.html:15 #: bookwyrm/templates/lists/form.html:44 -#: bookwyrm/templates/preferences/edit_user.html:80 -#: bookwyrm/templates/settings/announcement_form.html:69 -#: bookwyrm/templates/settings/edit_server.html:68 -#: bookwyrm/templates/settings/federated_server.html:98 -#: bookwyrm/templates/settings/site.html:113 -#: bookwyrm/templates/snippets/reading_modals/layout.html:16 -#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:42 -#: bookwyrm/templates/user_admin/user_moderation_actions.html:64 +#: bookwyrm/templates/preferences/edit_user.html:118 +#: bookwyrm/templates/settings/announcements/announcement_form.html:69 +#: bookwyrm/templates/settings/federation/edit_instance.html:74 +#: bookwyrm/templates/settings/federation/instance.html:87 +#: bookwyrm/templates/settings/site.html:134 +#: bookwyrm/templates/settings/users/user_moderation_actions.html:64 +#: bookwyrm/templates/shelf/form.html:25 +#: bookwyrm/templates/snippets/reading_modals/layout.html:18 msgid "Save" msgstr "Speichern" #: bookwyrm/templates/author/edit_author.html:117 #: bookwyrm/templates/book/book.html:141 bookwyrm/templates/book/book.html:190 #: bookwyrm/templates/book/cover_modal.html:32 -#: bookwyrm/templates/book/edit_book.html:329 +#: bookwyrm/templates/book/edit_book.html:342 #: bookwyrm/templates/book/readthrough.html:77 #: bookwyrm/templates/lists/delete_list_modal.html:17 -#: bookwyrm/templates/moderation/report_modal.html:34 -#: bookwyrm/templates/settings/federated_server.html:99 +#: bookwyrm/templates/settings/federation/instance.html:88 #: bookwyrm/templates/snippets/delete_readthrough_modal.html:17 -#: bookwyrm/templates/snippets/goal_form.html:32 -#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:43 +#: bookwyrm/templates/snippets/report_modal.html:34 msgid "Cancel" msgstr "Abbrechen" @@ -413,7 +435,7 @@ msgstr "Beschreibung hinzufügen" #: bookwyrm/templates/book/book.html:136 #: bookwyrm/templates/book/edit_book.html:143 -#: bookwyrm/templates/lists/form.html:12 +#: bookwyrm/templates/lists/form.html:12 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "Beschreibung:" @@ -483,7 +505,7 @@ msgstr "Themen" msgid "Places" msgstr "Orte" -#: bookwyrm/templates/book/book.html:292 bookwyrm/templates/layout.html:68 +#: bookwyrm/templates/book/book.html:292 bookwyrm/templates/layout.html:75 #: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12 #: bookwyrm/templates/search/layout.html:25 #: bookwyrm/templates/search/layout.html:50 @@ -499,8 +521,9 @@ msgstr "Zur Liste" #: bookwyrm/templates/book/book.html:313 #: bookwyrm/templates/book/cover_modal.html:31 -#: bookwyrm/templates/lists/list.html:179 -#: bookwyrm/templates/settings/domain_form.html:26 +#: bookwyrm/templates/lists/list.html:181 +#: bookwyrm/templates/settings/email_blocklist/domain_form.html:26 +#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:32 msgid "Add" msgstr "Hinzufügen" @@ -509,12 +532,12 @@ msgid "ISBN:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:14 -#: bookwyrm/templates/book/edit_book.html:308 +#: bookwyrm/templates/book/edit_book.html:321 msgid "OCLC Number:" msgstr "OCLC Nummer:" #: bookwyrm/templates/book/book_identifiers.html:21 -#: bookwyrm/templates/book/edit_book.html:316 +#: bookwyrm/templates/book/edit_book.html:329 msgid "ASIN:" msgstr "" @@ -526,7 +549,7 @@ msgid "Upload cover:" msgstr "Cover hinzufügen" #: bookwyrm/templates/book/cover_modal.html:23 -#: bookwyrm/templates/book/edit_book.html:242 +#: bookwyrm/templates/book/edit_book.html:241 msgid "Load cover from url:" msgstr "Cover von URL laden:" @@ -652,11 +675,11 @@ msgid "John Doe, Jane Smith" msgstr "Max Mustermann, Maria Musterfrau" #: bookwyrm/templates/book/edit_book.html:227 -#: bookwyrm/templates/user/shelf/shelf.html:110 +#: bookwyrm/templates/shelf/shelf.html:127 msgid "Cover" msgstr "" -#: bookwyrm/templates/book/edit_book.html:255 +#: bookwyrm/templates/book/edit_book.html:253 msgid "Physical Properties" msgstr "Physikalische Eigenschaften" @@ -665,23 +688,27 @@ msgstr "Physikalische Eigenschaften" msgid "Format:" msgstr "" -#: bookwyrm/templates/book/edit_book.html:265 +#: bookwyrm/templates/book/edit_book.html:268 +msgid "Format details:" +msgstr "" + +#: bookwyrm/templates/book/edit_book.html:278 msgid "Pages:" msgstr "Seiten:" -#: bookwyrm/templates/book/edit_book.html:274 +#: bookwyrm/templates/book/edit_book.html:287 msgid "Book Identifiers" msgstr "Buchidentifikatoren" -#: bookwyrm/templates/book/edit_book.html:276 +#: bookwyrm/templates/book/edit_book.html:289 msgid "ISBN 13:" msgstr "" -#: bookwyrm/templates/book/edit_book.html:284 +#: bookwyrm/templates/book/edit_book.html:297 msgid "ISBN 10:" msgstr "" -#: bookwyrm/templates/book/edit_book.html:292 +#: bookwyrm/templates/book/edit_book.html:305 msgid "Openlibrary ID:" msgstr "" @@ -822,16 +849,16 @@ msgid "Sorry! We couldn't find that code." msgstr "Sorry! Dieser Code ist uns nicht bekannt." #: bookwyrm/templates/confirm_email/confirm_email.html:19 -#: bookwyrm/templates/user_admin/user_info.html:100 +#: bookwyrm/templates/settings/users/user_info.html:85 #, fuzzy #| msgid "Confirm password:" msgid "Confirmation code:" msgstr "Passwort bestätigen:" #: bookwyrm/templates/confirm_email/confirm_email.html:25 -#: bookwyrm/templates/landing/landing_layout.html:70 -#: bookwyrm/templates/moderation/report_modal.html:33 -#: bookwyrm/templates/settings/dashboard.html:93 +#: bookwyrm/templates/landing/layout.html:73 +#: bookwyrm/templates/settings/dashboard/dashboard.html:93 +#: bookwyrm/templates/snippets/report_modal.html:33 msgid "Submit" msgstr "Absenden" @@ -844,9 +871,9 @@ msgid "Resend confirmation link" msgstr "Bestätigungslink erneut senden" #: bookwyrm/templates/confirm_email/resend_form.html:11 -#: bookwyrm/templates/landing/landing_layout.html:64 +#: bookwyrm/templates/landing/layout.html:67 #: bookwyrm/templates/password_reset_request.html:18 -#: bookwyrm/templates/preferences/edit_user.html:38 +#: bookwyrm/templates/preferences/edit_user.html:56 #: bookwyrm/templates/snippets/register_form.html:13 msgid "Email address:" msgstr "E-Mail Adresse" @@ -875,7 +902,7 @@ msgstr "Föderiert" #: bookwyrm/templates/directory/directory.html:4 #: bookwyrm/templates/directory/directory.html:9 -#: bookwyrm/templates/layout.html:94 +#: bookwyrm/templates/layout.html:101 msgid "Directory" msgstr "Vereichnis" @@ -890,8 +917,8 @@ msgid "You can opt-out at any time in your profile settings msgstr "Du kannst dein Leseziel jederzeit auf deiner Profilseite setzen oder ändern." #: bookwyrm/templates/directory/directory.html:29 +#: bookwyrm/templates/feed/goal_card.html:17 #: bookwyrm/templates/snippets/announcement.html:34 -#: bookwyrm/templates/snippets/goal_card.html:22 msgid "Dismiss message" msgstr "Nachricht verwerfen" @@ -900,15 +927,15 @@ msgid "Order by" msgstr "Sortieren nach" #: bookwyrm/templates/directory/sort_filter.html:8 +msgid "Recently active" +msgstr "Zuletzt aktiv" + +#: bookwyrm/templates/directory/sort_filter.html:9 #, fuzzy #| msgid "Suggest" msgid "Suggested" msgstr "Vorschlagen" -#: bookwyrm/templates/directory/sort_filter.html:9 -msgid "Recently active" -msgstr "Zuletzt aktiv" - #: bookwyrm/templates/directory/user_card.html:17 #: bookwyrm/templates/directory/user_card.html:18 #: bookwyrm/templates/user/user_preview.html:16 @@ -958,7 +985,7 @@ msgstr "Alle bekannten Nutzer*innen" #: bookwyrm/templates/discover/discover.html:4 #: bookwyrm/templates/discover/discover.html:10 -#: bookwyrm/templates/layout.html:71 +#: bookwyrm/templates/layout.html:78 #, fuzzy #| msgid "Discard" msgid "Discover" @@ -1094,7 +1121,7 @@ msgid "Direct Messages with %(username)s" msgstr "Direktnachrichten mit %(username)s" #: bookwyrm/templates/feed/direct_messages.html:10 -#: bookwyrm/templates/layout.html:104 +#: bookwyrm/templates/layout.html:111 msgid "Direct Messages" msgstr "Direktnachrichten" @@ -1115,12 +1142,24 @@ msgstr "lese 0 ungelesene Status" msgid "There aren't any activities right now! Try following a user to get started" msgstr "Hier sind noch keine Aktivitäten! Folge anderen, um loszulegen" +#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/layout.html:90 +#: bookwyrm/templates/user/goal_form.html:6 +#, python-format +msgid "%(year)s Reading Goal" +msgstr "%(year)s Leseziel" + +#: bookwyrm/templates/feed/goal_card.html:18 +#, python-format +msgid "You can set or change your reading goal any time from your profile page" +msgstr "Du kannst dein Leseziel jederzeit auf deiner Profilseite setzen oder ändern." + #: bookwyrm/templates/feed/layout.html:5 msgid "Updates" msgstr "" #: bookwyrm/templates/feed/layout.html:12 -#: bookwyrm/templates/user/shelf/books_header.html:3 +#: bookwyrm/templates/user/books_header.html:3 msgid "Your books" msgstr "Deine Bücher" @@ -1129,32 +1168,26 @@ msgid "There are no books here right now! Try searching for a book to get starte msgstr "Hier sind noch keine Bücher! Versuche nach Büchern zu suchen um loszulegen" #: bookwyrm/templates/feed/layout.html:25 -#: bookwyrm/templates/user/shelf/shelf.html:38 +#: bookwyrm/templates/shelf/shelf.html:38 #, fuzzy #| msgid "Read" msgid "To Read" msgstr "Auf der Leseliste" #: bookwyrm/templates/feed/layout.html:26 -#: bookwyrm/templates/user/shelf/shelf.html:40 +#: bookwyrm/templates/shelf/shelf.html:40 #, fuzzy #| msgid "Start reading" msgid "Currently Reading" msgstr "Gerade lesend" #: bookwyrm/templates/feed/layout.html:27 +#: bookwyrm/templates/shelf/shelf.html:42 #: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:23 #: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12 -#: bookwyrm/templates/user/shelf/shelf.html:42 msgid "Read" msgstr "Gelesen" -#: bookwyrm/templates/feed/layout.html:90 bookwyrm/templates/goal.html:26 -#: bookwyrm/templates/snippets/goal_card.html:6 -#, python-format -msgid "%(year)s Reading Goal" -msgstr "%(year)s Leseziel" - #: bookwyrm/templates/feed/suggested_users.html:5 #: bookwyrm/templates/get_started/users.html:6 msgid "Who to follow" @@ -1181,7 +1214,7 @@ msgid "What are you reading?" msgstr "Zu lesen angefangen" #: bookwyrm/templates/get_started/books.html:9 -#: bookwyrm/templates/lists/list.html:135 +#: bookwyrm/templates/layout.html:45 bookwyrm/templates/lists/list.html:137 msgid "Search for a book" msgstr "Nach einem Buch suchen" @@ -1199,8 +1232,8 @@ msgstr "Du kannst Bücher hinzufügen, wenn du %(site_name)s benutzt." #: bookwyrm/templates/get_started/books.html:17 #: bookwyrm/templates/get_started/users.html:18 #: bookwyrm/templates/get_started/users.html:19 -#: bookwyrm/templates/layout.html:44 bookwyrm/templates/layout.html:45 -#: bookwyrm/templates/lists/list.html:139 +#: bookwyrm/templates/layout.html:51 bookwyrm/templates/layout.html:52 +#: bookwyrm/templates/lists/list.html:141 #: bookwyrm/templates/search/layout.html:4 #: bookwyrm/templates/search/layout.html:9 msgid "Search" @@ -1219,7 +1252,7 @@ msgid "Popular on %(site_name)s" msgstr "Über %(site_name)s" #: bookwyrm/templates/get_started/books.html:58 -#: bookwyrm/templates/lists/list.html:152 +#: bookwyrm/templates/lists/list.html:154 msgid "No books found" msgstr "Keine Bücher gefunden" @@ -1229,7 +1262,7 @@ msgid "Save & continue" msgstr "" #: bookwyrm/templates/get_started/layout.html:5 -#: bookwyrm/templates/landing/landing_layout.html:5 +#: bookwyrm/templates/landing/layout.html:5 msgid "Welcome" msgstr "Willkommen" @@ -1273,12 +1306,12 @@ msgid "Finish" msgstr "Abgeschlossen" #: bookwyrm/templates/get_started/profile.html:15 -#: bookwyrm/templates/preferences/edit_user.html:24 +#: bookwyrm/templates/preferences/edit_user.html:42 msgid "Display name:" msgstr "Displayname:" #: bookwyrm/templates/get_started/profile.html:22 -#: bookwyrm/templates/preferences/edit_user.html:31 +#: bookwyrm/templates/preferences/edit_user.html:49 msgid "Summary:" msgstr "Bio:" @@ -1287,17 +1320,17 @@ msgid "A little bit about you" msgstr "Etwas über dich" #: bookwyrm/templates/get_started/profile.html:32 -#: bookwyrm/templates/preferences/edit_user.html:17 +#: bookwyrm/templates/preferences/edit_user.html:27 msgid "Avatar:" msgstr "" #: bookwyrm/templates/get_started/profile.html:42 -#: bookwyrm/templates/preferences/edit_user.html:62 +#: bookwyrm/templates/preferences/edit_user.html:104 msgid "Manually approve followers:" msgstr "Folgende manuell bestätigen" #: bookwyrm/templates/get_started/profile.html:48 -#: bookwyrm/templates/preferences/edit_user.html:54 +#: bookwyrm/templates/preferences/edit_user.html:80 msgid "Show this account in suggested users:" msgstr "Diesen Account in vorgeschlagenen Usern zeigen" @@ -1316,39 +1349,9 @@ msgstr "Suche nach Buch oder Benutzer*in" msgid "No users found for \"%(query)s\"" msgstr "Keine Nutzer*innen für \"%(query)s\" gefunden" -#: bookwyrm/templates/goal.html:7 -#, python-format -msgid "%(year)s Reading Progress" -msgstr "%(year)s Lesefortschritt" - -#: bookwyrm/templates/goal.html:11 -msgid "Edit Goal" -msgstr "Ziel bearbeiten" - -#: bookwyrm/templates/goal.html:30 -#: bookwyrm/templates/snippets/goal_card.html:13 -#, python-format -msgid "Set a goal for how many books you'll finish reading in %(year)s, and track your progress throughout the year." -msgstr "Setze dir ein Ziel, wie viele Bücher du %(year)s lesen wirst und behalte deinen Fortschritt über's Jahr im Auge." - -#: bookwyrm/templates/goal.html:39 -#, python-format -msgid "%(name)s hasn't set a reading goal for %(year)s." -msgstr "%(name)s hat sich für %(year)s kein Leseziel gesetzt." - -#: bookwyrm/templates/goal.html:51 -#, python-format -msgid "Your %(year)s Books" -msgstr "Deine Bücher %(year)s" - -#: bookwyrm/templates/goal.html:53 -#, python-format -msgid "%(username)s's %(year)s Books" -msgstr "%(username)ss %(year)s Bücher" - #: bookwyrm/templates/import/import.html:5 #: bookwyrm/templates/import/import.html:9 -#: bookwyrm/templates/user/shelf/shelf.html:57 +#: bookwyrm/templates/shelf/shelf.html:57 msgid "Import Books" msgstr "Bücher importieren" @@ -1371,7 +1374,7 @@ msgid "Privacy setting for imported reviews:" msgstr "Datenschutzeinstellung für importierte Bewertungen" #: bookwyrm/templates/import/import.html:56 -#: bookwyrm/templates/settings/server_blocklist.html:64 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:64 msgid "Import" msgstr "Importieren" @@ -1451,14 +1454,14 @@ msgid "Book" msgstr "Buch" #: bookwyrm/templates/import/import_status.html:122 -#: bookwyrm/templates/user/shelf/shelf.html:111 -#: bookwyrm/templates/user/shelf/shelf.html:131 +#: bookwyrm/templates/shelf/shelf.html:128 +#: bookwyrm/templates/shelf/shelf.html:148 msgid "Title" msgstr "Titel" #: bookwyrm/templates/import/import_status.html:125 -#: bookwyrm/templates/user/shelf/shelf.html:112 -#: bookwyrm/templates/user/shelf/shelf.html:134 +#: bookwyrm/templates/shelf/shelf.html:129 +#: bookwyrm/templates/shelf/shelf.html:151 msgid "Author" msgstr "Autor*in" @@ -1470,8 +1473,8 @@ msgstr "Importiert" msgid "You can download your GoodReads data from the Import/Export page of your GoodReads account." msgstr "Du kannst dir deine GoodReads Daten von Import/Export page in deinem GoodReads Account runterladen." -#: bookwyrm/templates/invite.html:4 bookwyrm/templates/invite.html:12 -#: bookwyrm/templates/login.html:51 +#: bookwyrm/templates/invite.html:4 bookwyrm/templates/invite.html:8 +#: bookwyrm/templates/login.html:49 msgid "Create an Account" msgstr "Erstelle einen Account" @@ -1502,141 +1505,150 @@ msgstr "Datenschutzerklärung" msgid "Recent Books" msgstr "Aktive Bücher" -#: bookwyrm/templates/landing/landing_layout.html:17 +#: bookwyrm/templates/landing/layout.html:17 msgid "Decentralized" msgstr "Dezentral" -#: bookwyrm/templates/landing/landing_layout.html:23 +#: bookwyrm/templates/landing/layout.html:23 msgid "Friendly" msgstr "Freundlich" -#: bookwyrm/templates/landing/landing_layout.html:29 +#: bookwyrm/templates/landing/layout.html:29 msgid "Anti-Corporate" msgstr "" -#: bookwyrm/templates/landing/landing_layout.html:44 +#: bookwyrm/templates/landing/layout.html:45 #, python-format msgid "Join %(name)s" msgstr "Tritt %(name)s bei" -#: bookwyrm/templates/landing/landing_layout.html:51 -#: bookwyrm/templates/login.html:56 -msgid "This instance is closed" -msgstr "Diese Instanz ist geschlossen" - -#: bookwyrm/templates/landing/landing_layout.html:57 -msgid "Thank you! Your request has been received." -msgstr "Danke! Deine Anfrage ist eingegangen." - -#: bookwyrm/templates/landing/landing_layout.html:60 +#: bookwyrm/templates/landing/layout.html:47 msgid "Request an Invitation" msgstr "Einladung beantragen" -#: bookwyrm/templates/landing/landing_layout.html:79 +#: bookwyrm/templates/landing/layout.html:49 +#, fuzzy, python-format +#| msgid "(Recommended if registration is open)" +msgid "%(name)s registration is closed" +msgstr "(Vorschlagen falls die Registrierung offen ist)" + +#: bookwyrm/templates/landing/layout.html:60 +msgid "Thank you! Your request has been received." +msgstr "Danke! Deine Anfrage ist eingegangen." + +#: bookwyrm/templates/landing/layout.html:82 msgid "Your Account" msgstr "Dein Account" -#: bookwyrm/templates/layout.html:40 -msgid "Search for a book or user" +#: bookwyrm/templates/layout.html:13 +#, fuzzy, python-format +#| msgid "About %(site_name)s" +msgid "%(site_name)s search" +msgstr "Über %(site_name)s" + +#: bookwyrm/templates/layout.html:43 +#, fuzzy +#| msgid "Search for a book or user" +msgid "Search for a book, user, or list" msgstr "Suche nach Buch oder Benutzer*in" -#: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/layout.html:61 bookwyrm/templates/layout.html:62 msgid "Main navigation menu" msgstr "Navigationshauptmenü" -#: bookwyrm/templates/layout.html:65 +#: bookwyrm/templates/layout.html:72 msgid "Feed" msgstr "" -#: bookwyrm/templates/layout.html:99 +#: bookwyrm/templates/layout.html:106 #, fuzzy #| msgid "Your books" msgid "Your Books" msgstr "Deine Bücher" -#: bookwyrm/templates/layout.html:109 +#: bookwyrm/templates/layout.html:116 msgid "Settings" msgstr "Einstellungen" -#: bookwyrm/templates/layout.html:118 +#: bookwyrm/templates/layout.html:125 +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:15 +#: bookwyrm/templates/settings/invites/manage_invites.html:3 +#: bookwyrm/templates/settings/invites/manage_invites.html:15 #: bookwyrm/templates/settings/layout.html:40 -#: bookwyrm/templates/settings/manage_invite_requests.html:15 -#: bookwyrm/templates/settings/manage_invites.html:3 -#: bookwyrm/templates/settings/manage_invites.html:15 msgid "Invites" msgstr "Einladungen" -#: bookwyrm/templates/layout.html:125 +#: bookwyrm/templates/layout.html:132 msgid "Admin" msgstr "" -#: bookwyrm/templates/layout.html:132 +#: bookwyrm/templates/layout.html:139 msgid "Log out" msgstr "Abmelden" -#: bookwyrm/templates/layout.html:140 bookwyrm/templates/layout.html:141 +#: bookwyrm/templates/layout.html:147 bookwyrm/templates/layout.html:148 #: bookwyrm/templates/notifications.html:6 #: bookwyrm/templates/notifications.html:11 msgid "Notifications" msgstr "Benachrichtigungen" -#: bookwyrm/templates/layout.html:163 bookwyrm/templates/layout.html:167 -#: bookwyrm/templates/login.html:22 +#: bookwyrm/templates/layout.html:170 bookwyrm/templates/layout.html:174 +#: bookwyrm/templates/login.html:21 #: bookwyrm/templates/snippets/register_form.html:4 msgid "Username:" msgstr "" -#: bookwyrm/templates/layout.html:168 +#: bookwyrm/templates/layout.html:175 msgid "password" msgstr "Passwort" -#: bookwyrm/templates/layout.html:169 bookwyrm/templates/login.html:41 +#: bookwyrm/templates/layout.html:176 bookwyrm/templates/login.html:40 msgid "Forgot your password?" msgstr "Passwort vergessen?" -#: bookwyrm/templates/layout.html:172 bookwyrm/templates/login.html:10 -#: bookwyrm/templates/login.html:38 +#: bookwyrm/templates/layout.html:179 bookwyrm/templates/login.html:7 +#: bookwyrm/templates/login.html:37 msgid "Log in" msgstr "Anmelden" -#: bookwyrm/templates/layout.html:180 +#: bookwyrm/templates/layout.html:187 msgid "Join" msgstr "" -#: bookwyrm/templates/layout.html:214 +#: bookwyrm/templates/layout.html:221 #, fuzzy #| msgid "Successfully imported" msgid "Successfully posted status" msgstr "Erfolgreich importiert" -#: bookwyrm/templates/layout.html:215 +#: bookwyrm/templates/layout.html:222 #, fuzzy #| msgid "Boost status" msgid "Error posting status" msgstr "Status teilen" -#: bookwyrm/templates/layout.html:223 +#: bookwyrm/templates/layout.html:230 #, fuzzy #| msgid "About this server" msgid "About this instance" msgstr "Über diesen Server" -#: bookwyrm/templates/layout.html:227 +#: bookwyrm/templates/layout.html:234 msgid "Contact site admin" msgstr "Admin kontaktieren" -#: bookwyrm/templates/layout.html:231 +#: bookwyrm/templates/layout.html:238 #, fuzzy #| msgid "List curation:" msgid "Documentation" msgstr "Listenkuratierung:" -#: bookwyrm/templates/layout.html:238 +#: bookwyrm/templates/layout.html:245 #, python-format msgid "Support %(site_name)s on %(support_title)s" msgstr "%(site_name)s auf %(support_title)s unterstützen" -#: bookwyrm/templates/layout.html:242 +#: bookwyrm/templates/layout.html:249 msgid "BookWyrm's source code is freely available. You can contribute or report issues on GitHub." msgstr "BookWyrm ist open source Software. Du kannst dich auf GitHub beteiligen oder etwas melden." @@ -1698,8 +1710,9 @@ msgid "This action cannot be un-done" msgstr "Dieses Regal ist leer." #: bookwyrm/templates/lists/delete_list_modal.html:15 -#: bookwyrm/templates/settings/announcement.html:20 -#: bookwyrm/templates/settings/email_blocklist.html:49 +#: bookwyrm/templates/settings/announcements/announcement.html:20 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49 +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:36 #: bookwyrm/templates/snippets/delete_readthrough_modal.html:15 #: bookwyrm/templates/snippets/follow_request_buttons.html:12 msgid "Delete" @@ -1730,9 +1743,8 @@ msgstr "Kuratiert" msgid "Anyone can suggest books, subject to your approval" msgstr "Alle können Bücher vorschlagen, du kannst diese bestätigen" -#: bookwyrm/templates/lists/form.html:31 -#: bookwyrm/templates/moderation/reports.html:25 -#: bookwyrm/templates/search/book.html:30 +#: bookwyrm/templates/lists/form.html:31 bookwyrm/templates/search/book.html:30 +#: bookwyrm/templates/settings/reports/reports.html:25 #: bookwyrm/templates/snippets/announcement.html:16 msgid "Open" msgstr "Offen" @@ -1741,7 +1753,7 @@ msgstr "Offen" msgid "Anyone can add books to this list" msgstr "Alle können Bücher hinzufügen" -#: bookwyrm/templates/lists/form.html:49 +#: bookwyrm/templates/lists/form.html:50 #, fuzzy #| msgid "Delete status" msgid "Delete list" @@ -1767,7 +1779,7 @@ msgstr "Diese Liste ist momentan leer" msgid "Added by %(username)s" msgstr "Direktnachrichten mit %(username)s" -#: bookwyrm/templates/lists/list.html:74 +#: bookwyrm/templates/lists/list.html:75 #, fuzzy #| msgid "List curation:" msgid "List position" @@ -1779,46 +1791,46 @@ msgstr "Listenkuratierung:" msgid "Set" msgstr "Gestartet" -#: bookwyrm/templates/lists/list.html:89 +#: bookwyrm/templates/lists/list.html:91 #: bookwyrm/templates/snippets/shelf_selector.html:26 msgid "Remove" msgstr "Entfernen" -#: bookwyrm/templates/lists/list.html:103 -#: bookwyrm/templates/lists/list.html:120 +#: bookwyrm/templates/lists/list.html:105 +#: bookwyrm/templates/lists/list.html:122 #, fuzzy #| msgid "Your Lists" msgid "Sort List" msgstr "Deine Listen" -#: bookwyrm/templates/lists/list.html:113 +#: bookwyrm/templates/lists/list.html:115 #, fuzzy #| msgid "List curation:" msgid "Direction" msgstr "Listenkuratierung:" -#: bookwyrm/templates/lists/list.html:127 +#: bookwyrm/templates/lists/list.html:129 msgid "Add Books" msgstr "Bücher hinzufügen" -#: bookwyrm/templates/lists/list.html:129 +#: bookwyrm/templates/lists/list.html:131 msgid "Suggest Books" msgstr "Bücher vorschlagen" -#: bookwyrm/templates/lists/list.html:140 +#: bookwyrm/templates/lists/list.html:142 msgid "search" msgstr "suchen" -#: bookwyrm/templates/lists/list.html:146 +#: bookwyrm/templates/lists/list.html:148 msgid "Clear search" msgstr "Suche leeren" -#: bookwyrm/templates/lists/list.html:151 +#: bookwyrm/templates/lists/list.html:153 #, python-format msgid "No books found matching the query \"%(query)s\"" msgstr "Keine passenden Bücher zu \"%(query)s\" gefunden" -#: bookwyrm/templates/lists/list.html:179 +#: bookwyrm/templates/lists/list.html:181 msgid "Suggest" msgstr "Vorschlagen" @@ -1848,126 +1860,19 @@ msgstr "Liste erstellen" msgid "Login" msgstr "" -#: bookwyrm/templates/login.html:16 +#: bookwyrm/templates/login.html:15 msgid "Success! Email address confirmed." msgstr "Alles klar! E-Mai- Adresse bestätigt." -#: bookwyrm/templates/login.html:28 bookwyrm/templates/password_reset.html:17 +#: bookwyrm/templates/login.html:27 bookwyrm/templates/password_reset.html:17 #: bookwyrm/templates/snippets/register_form.html:22 msgid "Password:" msgstr "Passwort:" -#: bookwyrm/templates/login.html:57 -msgid "Contact an administrator to get an invite" -msgstr "Kontaktiere für eine Einladung eine*n Admin" - -#: bookwyrm/templates/login.html:68 +#: bookwyrm/templates/login.html:62 msgid "More about this site" msgstr "Mehr über diese Seite" -#: bookwyrm/templates/moderation/report.html:5 -#: bookwyrm/templates/moderation/report.html:6 -#: bookwyrm/templates/moderation/report_preview.html:6 -#, python-format -msgid "Report #%(report_id)s: %(username)s" -msgstr "Meldung #%(report_id)s: %(username)s" - -#: bookwyrm/templates/moderation/report.html:10 -msgid "Back to reports" -msgstr "Zurück zu den Meldungen" - -#: bookwyrm/templates/moderation/report.html:22 -msgid "Moderator Comments" -msgstr "Moderator:innenkommentare" - -#: bookwyrm/templates/moderation/report.html:40 -#: bookwyrm/templates/snippets/create_status.html:28 -msgid "Comment" -msgstr "Kommentieren" - -#: bookwyrm/templates/moderation/report.html:45 -#, fuzzy -#| msgid "Delete status" -msgid "Reported statuses" -msgstr "Post löschen" - -#: bookwyrm/templates/moderation/report.html:47 -msgid "No statuses reported" -msgstr "Keine Beiträge gemeldet" - -#: bookwyrm/templates/moderation/report.html:53 -#, fuzzy -#| msgid "Statuses has been deleted" -msgid "Status has been deleted" -msgstr "Beiträge wurden gelöscht" - -#: bookwyrm/templates/moderation/report_modal.html:6 -#, fuzzy, python-format -#| msgid "Lists: %(username)s" -msgid "Report @%(username)s" -msgstr "Listen: %(username)s" - -#: bookwyrm/templates/moderation/report_modal.html:23 -#, python-format -msgid "This report will be sent to %(site_name)s's moderators for review." -msgstr "Diese Meldung wird an die Moderator:innen von %(site_name)s weitergeletiet." - -#: bookwyrm/templates/moderation/report_modal.html:24 -#, fuzzy -#| msgid "More about this site" -msgid "More info about this report:" -msgstr "Mehr über diese Seite" - -#: bookwyrm/templates/moderation/report_preview.html:13 -msgid "No notes provided" -msgstr "Keine Notizen angegeben." - -#: bookwyrm/templates/moderation/report_preview.html:20 -#, fuzzy, python-format -#| msgid "Direct Messages with %(username)s" -msgid "Reported by %(username)s" -msgstr "Direktnachrichten mit %(username)s" - -#: bookwyrm/templates/moderation/report_preview.html:30 -msgid "Re-open" -msgstr "Wiedereröffnen" - -#: bookwyrm/templates/moderation/report_preview.html:32 -msgid "Resolve" -msgstr "Lösen" - -#: bookwyrm/templates/moderation/reports.html:6 -#, fuzzy, python-format -#| msgid "Lists: %(username)s" -msgid "Reports: %(instance_name)s" -msgstr "Listen: %(username)s" - -#: bookwyrm/templates/moderation/reports.html:8 -#: bookwyrm/templates/moderation/reports.html:17 -#: bookwyrm/templates/settings/layout.html:55 -#, fuzzy -#| msgid "Recent Imports" -msgid "Reports" -msgstr "Aktuelle Importe" - -#: bookwyrm/templates/moderation/reports.html:14 -#, fuzzy, python-format -#| msgid "Lists: %(username)s" -msgid "Reports: %(instance_name)s" -msgstr "Listen: %(username)s" - -#: bookwyrm/templates/moderation/reports.html:28 -#, fuzzy -#| msgid "Shelved" -msgid "Resolved" -msgstr "Ins Regal gestellt" - -#: bookwyrm/templates/moderation/reports.html:37 -#, fuzzy -#| msgid "No books found" -msgid "No reports found." -msgstr "Keine Bücher gefunden" - #: bookwyrm/templates/notifications.html:16 msgid "Delete notifications" msgstr "Benachrichtigungen löschen" @@ -2111,7 +2016,7 @@ msgstr "Passwort zurücksetzen" #: bookwyrm/templates/preferences/blocks.html:4 #: bookwyrm/templates/preferences/blocks.html:7 -#: bookwyrm/templates/preferences/layout.html:30 +#: bookwyrm/templates/preferences/layout.html:31 msgid "Blocked Users" msgstr "Blockierte Nutzer*innen" @@ -2122,7 +2027,7 @@ msgstr "Momentan keine Nutzer*innen blockiert." #: bookwyrm/templates/preferences/change_password.html:4 #: bookwyrm/templates/preferences/change_password.html:7 #: bookwyrm/templates/preferences/change_password.html:21 -#: bookwyrm/templates/preferences/layout.html:19 +#: bookwyrm/templates/preferences/layout.html:20 msgid "Change Password" msgstr "Passwort ändern" @@ -2133,8 +2038,8 @@ msgstr "Neues Passwort:" #: bookwyrm/templates/preferences/delete_user.html:4 #: bookwyrm/templates/preferences/delete_user.html:7 #: bookwyrm/templates/preferences/delete_user.html:26 -#: bookwyrm/templates/preferences/layout.html:23 -#: bookwyrm/templates/user_admin/delete_user_form.html:23 +#: bookwyrm/templates/preferences/layout.html:24 +#: bookwyrm/templates/settings/users/delete_user_form.html:23 #, fuzzy #| msgid "Create an Account" msgid "Delete Account" @@ -2150,46 +2055,62 @@ msgstr "Das Löschen des Accounts kann nicht rückgängig gemacht werden. Der Us #: bookwyrm/templates/preferences/edit_user.html:4 #: bookwyrm/templates/preferences/edit_user.html:7 +#: bookwyrm/templates/preferences/layout.html:15 msgid "Edit Profile" msgstr "Profil bearbeiten:" -#: bookwyrm/templates/preferences/edit_user.html:46 +#: bookwyrm/templates/preferences/edit_user.html:12 +#: bookwyrm/templates/preferences/edit_user.html:25 +#: bookwyrm/templates/settings/users/user_info.html:7 +msgid "Profile" +msgstr "Profil" + +#: bookwyrm/templates/preferences/edit_user.html:13 +#: bookwyrm/templates/preferences/edit_user.html:68 +#, fuzzy +#| msgid "Email preference" +msgid "Display preferences" +msgstr "E-Mail Einstellungen" + +#: bookwyrm/templates/preferences/edit_user.html:14 +#: bookwyrm/templates/preferences/edit_user.html:100 +#, fuzzy +#| msgid "Private" +msgid "Privacy" +msgstr "Privat" + +#: bookwyrm/templates/preferences/edit_user.html:72 #, fuzzy #| msgid "Show set reading goal prompt in feed:" msgid "Show reading goal prompt in feed:" msgstr "Angegebenes Leseziel im Feed anzeigen." -#: bookwyrm/templates/preferences/edit_user.html:50 +#: bookwyrm/templates/preferences/edit_user.html:76 #, fuzzy #| msgid "Suggest Books" msgid "Show suggested users:" msgstr "Bücher vorschlagen" -#: bookwyrm/templates/preferences/edit_user.html:58 +#: bookwyrm/templates/preferences/edit_user.html:85 #, python-format msgid "Your account will show up in the directory, and may be recommended to other BookWyrm users." msgstr "Dein Account wird im directory angezeigt und eventuell anderen Usern empfohlen." -#: bookwyrm/templates/preferences/edit_user.html:68 +#: bookwyrm/templates/preferences/edit_user.html:89 +msgid "Preferred Timezone: " +msgstr "Bevorzugte Zeitzone:" + +#: bookwyrm/templates/preferences/edit_user.html:110 #, fuzzy #| msgid "Goal privacy:" msgid "Default post privacy:" msgstr "Sichtbarkeit des Ziels" -#: bookwyrm/templates/preferences/edit_user.html:75 -msgid "Preferred Timezone: " -msgstr "Bevorzugte Zeitzone:" - #: bookwyrm/templates/preferences/layout.html:11 msgid "Account" msgstr "" -#: bookwyrm/templates/preferences/layout.html:15 -#: bookwyrm/templates/user_admin/user_info.html:7 -msgid "Profile" -msgstr "Profil" - -#: bookwyrm/templates/preferences/layout.html:26 +#: bookwyrm/templates/preferences/layout.html:27 msgid "Relationships" msgstr "Beziehungen" @@ -2239,11 +2160,11 @@ msgstr "Suche" #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:46 -#: bookwyrm/templates/settings/email_blocklist.html:27 -#: bookwyrm/templates/settings/federation.html:44 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:27 +#: bookwyrm/templates/settings/federation/instance_list.html:44 #: bookwyrm/templates/settings/layout.html:34 -#: bookwyrm/templates/user_admin/user_admin.html:3 -#: bookwyrm/templates/user_admin/user_admin.html:10 +#: bookwyrm/templates/settings/users/user_admin.html:3 +#: bookwyrm/templates/settings/users/user_admin.html:10 msgid "Users" msgstr "" @@ -2253,173 +2174,173 @@ msgstr "" msgid "No results found for \"%(query)s\"" msgstr "Keine Liste für \"%(query)s\" gefunden" -#: bookwyrm/templates/settings/announcement.html:3 -#: bookwyrm/templates/settings/announcement.html:6 +#: bookwyrm/templates/settings/announcements/announcement.html:3 +#: bookwyrm/templates/settings/announcements/announcement.html:6 #, fuzzy #| msgid "Announcements" msgid "Announcement" msgstr "Ankündigungen" -#: bookwyrm/templates/settings/announcement.html:7 -#: bookwyrm/templates/settings/federated_server.html:13 +#: bookwyrm/templates/settings/announcements/announcement.html:7 +#: bookwyrm/templates/settings/federation/instance.html:13 #, fuzzy #| msgid "Back to reports" msgid "Back to list" msgstr "Zurück zu den Meldungen" -#: bookwyrm/templates/settings/announcement.html:11 -#: bookwyrm/templates/settings/announcement_form.html:6 +#: bookwyrm/templates/settings/announcements/announcement.html:11 +#: bookwyrm/templates/settings/announcements/announcement_form.html:6 #, fuzzy #| msgid "Announcements" msgid "Edit Announcement" msgstr "Ankündigungen" -#: bookwyrm/templates/settings/announcement.html:35 +#: bookwyrm/templates/settings/announcements/announcement.html:35 msgid "Visible:" msgstr "Sichtbar" -#: bookwyrm/templates/settings/announcement.html:38 +#: bookwyrm/templates/settings/announcements/announcement.html:38 msgid "True" msgstr "Ja" -#: bookwyrm/templates/settings/announcement.html:40 +#: bookwyrm/templates/settings/announcements/announcement.html:40 msgid "False" msgstr "Nein" -#: bookwyrm/templates/settings/announcement.html:47 -#: bookwyrm/templates/settings/announcement_form.html:40 -#: bookwyrm/templates/settings/dashboard.html:71 +#: bookwyrm/templates/settings/announcements/announcement.html:47 +#: bookwyrm/templates/settings/announcements/announcement_form.html:40 +#: bookwyrm/templates/settings/dashboard/dashboard.html:71 #, fuzzy #| msgid "Birth date:" msgid "Start date:" msgstr "Geburtsdatum:" -#: bookwyrm/templates/settings/announcement.html:54 -#: bookwyrm/templates/settings/announcement_form.html:49 -#: bookwyrm/templates/settings/dashboard.html:77 +#: bookwyrm/templates/settings/announcements/announcement.html:54 +#: bookwyrm/templates/settings/announcements/announcement_form.html:49 +#: bookwyrm/templates/settings/dashboard/dashboard.html:77 #, fuzzy #| msgid "Birth date:" msgid "End date:" msgstr "Geburtsdatum:" -#: bookwyrm/templates/settings/announcement.html:60 -#: bookwyrm/templates/settings/announcement_form.html:58 +#: bookwyrm/templates/settings/announcements/announcement.html:60 +#: bookwyrm/templates/settings/announcements/announcement_form.html:58 #, fuzzy #| msgid "Activity" msgid "Active:" msgstr "Aktivität" -#: bookwyrm/templates/settings/announcement_form.html:8 -#: bookwyrm/templates/settings/announcements.html:8 +#: bookwyrm/templates/settings/announcements/announcement_form.html:8 +#: bookwyrm/templates/settings/announcements/announcements.html:8 #, fuzzy #| msgid "Announcements" msgid "Create Announcement" msgstr "Ankündigungen" -#: bookwyrm/templates/settings/announcement_form.html:16 +#: bookwyrm/templates/settings/announcements/announcement_form.html:16 #, fuzzy #| msgid "reviewed" msgid "Preview:" msgstr "bewertete" -#: bookwyrm/templates/settings/announcement_form.html:23 +#: bookwyrm/templates/settings/announcements/announcement_form.html:23 #, fuzzy #| msgid "Footer Content" msgid "Content:" msgstr "Inhalt des Footers" -#: bookwyrm/templates/settings/announcement_form.html:30 +#: bookwyrm/templates/settings/announcements/announcement_form.html:30 #, fuzzy #| msgid "Birth date:" msgid "Event date:" msgstr "Geburtsdatum:" -#: bookwyrm/templates/settings/announcements.html:3 -#: bookwyrm/templates/settings/announcements.html:5 -#: bookwyrm/templates/settings/layout.html:68 +#: bookwyrm/templates/settings/announcements/announcements.html:3 +#: bookwyrm/templates/settings/announcements/announcements.html:5 +#: bookwyrm/templates/settings/layout.html:72 msgid "Announcements" msgstr "Ankündigungen" -#: bookwyrm/templates/settings/announcements.html:22 -#: bookwyrm/templates/settings/federation.html:36 +#: bookwyrm/templates/settings/announcements/announcements.html:22 +#: bookwyrm/templates/settings/federation/instance_list.html:36 #, fuzzy #| msgid "Added:" msgid "Date added" msgstr "Hinzugefügt:" -#: bookwyrm/templates/settings/announcements.html:26 +#: bookwyrm/templates/settings/announcements/announcements.html:26 #, fuzzy #| msgid "reviewed" msgid "Preview" msgstr "bewertete" -#: bookwyrm/templates/settings/announcements.html:30 +#: bookwyrm/templates/settings/announcements/announcements.html:30 #, fuzzy #| msgid "Started" msgid "Start date" msgstr "Gestartet" -#: bookwyrm/templates/settings/announcements.html:34 +#: bookwyrm/templates/settings/announcements/announcements.html:34 #, fuzzy #| msgid "Edit read dates" msgid "End date" msgstr "Lesedaten bearbeiten" -#: bookwyrm/templates/settings/announcements.html:38 -#: bookwyrm/templates/settings/federation.html:46 -#: bookwyrm/templates/settings/manage_invite_requests.html:44 -#: bookwyrm/templates/settings/status_filter.html:5 -#: bookwyrm/templates/user_admin/user_admin.html:34 -#: bookwyrm/templates/user_admin/user_info.html:20 +#: bookwyrm/templates/settings/announcements/announcements.html:38 +#: bookwyrm/templates/settings/federation/instance_list.html:46 +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:44 +#: bookwyrm/templates/settings/invites/status_filter.html:5 +#: bookwyrm/templates/settings/users/user_admin.html:34 +#: bookwyrm/templates/settings/users/user_info.html:20 msgid "Status" msgstr "" -#: bookwyrm/templates/settings/announcements.html:48 +#: bookwyrm/templates/settings/announcements/announcements.html:48 #, fuzzy #| msgid "Activity" msgid "active" msgstr "Aktivität" -#: bookwyrm/templates/settings/announcements.html:48 +#: bookwyrm/templates/settings/announcements/announcements.html:48 #, fuzzy #| msgid "Activity" msgid "inactive" msgstr "Aktivität" -#: bookwyrm/templates/settings/announcements.html:54 +#: bookwyrm/templates/settings/announcements/announcements.html:52 #, fuzzy #| msgid "Announcements" -msgid "No announcements found." +msgid "No announcements found" msgstr "Ankündigungen" -#: bookwyrm/templates/settings/dashboard.html:6 -#: bookwyrm/templates/settings/dashboard.html:8 +#: bookwyrm/templates/settings/dashboard/dashboard.html:6 +#: bookwyrm/templates/settings/dashboard/dashboard.html:8 #: bookwyrm/templates/settings/layout.html:26 msgid "Dashboard" msgstr "" -#: bookwyrm/templates/settings/dashboard.html:15 +#: bookwyrm/templates/settings/dashboard/dashboard.html:15 #, fuzzy #| msgid "Max uses" msgid "Total users" msgstr "Maximale Benutzungen" -#: bookwyrm/templates/settings/dashboard.html:21 -#: bookwyrm/templates/settings/dashboard_user_chart.html:12 +#: bookwyrm/templates/settings/dashboard/dashboard.html:21 +#: bookwyrm/templates/settings/dashboard/dashboard_user_chart.html:12 msgid "Active this month" msgstr "" -#: bookwyrm/templates/settings/dashboard.html:27 +#: bookwyrm/templates/settings/dashboard/dashboard.html:27 #, fuzzy #| msgid "Import Status" msgid "Statuses" msgstr "Importstatus" -#: bookwyrm/templates/settings/dashboard.html:33 +#: bookwyrm/templates/settings/dashboard/dashboard.html:33 msgid "Works" msgstr "" -#: bookwyrm/templates/settings/dashboard.html:43 +#: bookwyrm/templates/settings/dashboard/dashboard.html:43 #, fuzzy, python-format #| msgid "%(count)d uses" msgid "%(display_count)s open report" @@ -2427,7 +2348,7 @@ msgid_plural "%(display_count)s open reports" msgstr[0] "%(count)d Benutzungen" msgstr[1] "%(count)d Benutzungen" -#: bookwyrm/templates/settings/dashboard.html:54 +#: bookwyrm/templates/settings/dashboard/dashboard.html:54 #, fuzzy, python-format #| msgid "%(count)d uses" msgid "%(display_count)s invite request" @@ -2435,138 +2356,81 @@ msgid_plural "%(display_count)s invite requests" msgstr[0] "%(count)d Benutzungen" msgstr[1] "%(count)d Benutzungen" -#: bookwyrm/templates/settings/dashboard.html:65 +#: bookwyrm/templates/settings/dashboard/dashboard.html:65 #, fuzzy #| msgid "User Activity" msgid "Instance Activity" msgstr "Nutzer*innenaktivität" -#: bookwyrm/templates/settings/dashboard.html:83 +#: bookwyrm/templates/settings/dashboard/dashboard.html:83 msgid "Interval:" msgstr "" -#: bookwyrm/templates/settings/dashboard.html:86 +#: bookwyrm/templates/settings/dashboard/dashboard.html:87 msgid "Days" msgstr "" -#: bookwyrm/templates/settings/dashboard.html:87 +#: bookwyrm/templates/settings/dashboard/dashboard.html:88 #, fuzzy #| msgid "One Week" msgid "Weeks" msgstr "Eine Woche" -#: bookwyrm/templates/settings/dashboard.html:100 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 #, fuzzy #| msgid "User Activity" msgid "User signup activity" msgstr "Nutzer*innenaktivität" -#: bookwyrm/templates/settings/dashboard.html:106 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #, fuzzy #| msgid "User Activity" msgid "Status activity" msgstr "Nutzer*innenaktivität" -#: bookwyrm/templates/settings/dashboard_status_chart.html:7 +#: bookwyrm/templates/settings/dashboard/dashboard_status_chart.html:7 #, fuzzy #| msgid "No statuses reported" msgid "Statuses posted" msgstr "Keine Beiträge gemeldet" -#: bookwyrm/templates/settings/dashboard_user_chart.html:7 +#: bookwyrm/templates/settings/dashboard/dashboard_user_chart.html:7 msgid "Total" msgstr "" -#: bookwyrm/templates/settings/domain_form.html:5 -#: bookwyrm/templates/settings/email_blocklist.html:10 +#: bookwyrm/templates/settings/email_blocklist/domain_form.html:5 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:10 msgid "Add domain" msgstr "Domain hinzufügen" -#: bookwyrm/templates/settings/domain_form.html:11 +#: bookwyrm/templates/settings/email_blocklist/domain_form.html:11 msgid "Domain:" msgstr "" -#: bookwyrm/templates/settings/edit_server.html:3 -#: bookwyrm/templates/settings/edit_server.html:6 -#: bookwyrm/templates/settings/edit_server.html:20 -#: bookwyrm/templates/settings/federation.html:9 -#: bookwyrm/templates/settings/federation.html:10 -#: bookwyrm/templates/settings/server_blocklist.html:3 -#: bookwyrm/templates/settings/server_blocklist.html:20 -#, fuzzy -#| msgid "Instance Name:" -msgid "Add instance" -msgstr "Instanzname" - -#: bookwyrm/templates/settings/edit_server.html:7 -#: bookwyrm/templates/settings/server_blocklist.html:7 -#, fuzzy -#| msgid "Back to reports" -msgid "Back to instance list" -msgstr "Zurück zu den Meldungen" - -#: bookwyrm/templates/settings/edit_server.html:16 -#: bookwyrm/templates/settings/server_blocklist.html:16 -#, fuzzy -#| msgid "Import book" -msgid "Import block list" -msgstr "Buch importieren" - -#: bookwyrm/templates/settings/edit_server.html:30 -#, fuzzy -#| msgid "Instance Name:" -msgid "Instance:" -msgstr "Instanzname" - -#: bookwyrm/templates/settings/edit_server.html:37 -#: bookwyrm/templates/settings/federated_server.html:31 -#: bookwyrm/templates/user_admin/user_info.html:125 -#, fuzzy -#| msgid "Import Status" -msgid "Status:" -msgstr "Importstatus" - -#: bookwyrm/templates/settings/edit_server.html:48 -#: bookwyrm/templates/settings/federated_server.html:23 -#: bookwyrm/templates/user_admin/user_info.html:117 -msgid "Software:" -msgstr "" - -#: bookwyrm/templates/settings/edit_server.html:55 -#: bookwyrm/templates/settings/federated_server.html:27 -#: bookwyrm/templates/user_admin/user_info.html:121 -#, fuzzy -#| msgid "Description:" -msgid "Version:" -msgstr "Beschreibung:" - -#: bookwyrm/templates/settings/edit_server.html:64 -msgid "Notes:" -msgstr "" - -#: bookwyrm/templates/settings/email_blocklist.html:5 -#: bookwyrm/templates/settings/email_blocklist.html:7 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:5 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:7 #: bookwyrm/templates/settings/layout.html:59 #, fuzzy #| msgid "Import Books" msgid "Email Blocklist" msgstr "Bücher importieren" -#: bookwyrm/templates/settings/email_blocklist.html:18 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:18 msgid "When someone tries to register with an email from this domain, no account will be created. The registration process will appear to have worked." msgstr "Wenn sich jemand mit einer E-Mail-Adresse von dieser Domain zu registrieren versucht, wird kein Account erstellt. Die Registrierung wird so aussehen als hätte sie funktioniert." -#: bookwyrm/templates/settings/email_blocklist.html:25 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:25 msgid "Domain" msgstr "" -#: bookwyrm/templates/settings/email_blocklist.html:29 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:29 +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:27 #, fuzzy #| msgid "Notifications" msgid "Options" msgstr "Benachrichtigungen" -#: bookwyrm/templates/settings/email_blocklist.html:38 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:38 #, fuzzy, python-format #| msgid "%(count)d uses" msgid "%(display_count)s user" @@ -2574,104 +2438,364 @@ msgid_plural "%(display_count)s users" msgstr[0] "%(count)d Benutzungen" msgstr[1] "%(count)d Benutzungen" -#: bookwyrm/templates/settings/federated_server.html:19 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:59 +#, fuzzy +#| msgid "No users currently blocked." +msgid "No email domains currently blocked" +msgstr "Momentan keine Nutzer*innen blockiert." + +#: bookwyrm/templates/settings/federation/edit_instance.html:3 +#: bookwyrm/templates/settings/federation/edit_instance.html:6 +#: bookwyrm/templates/settings/federation/edit_instance.html:20 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:3 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:20 +#: bookwyrm/templates/settings/federation/instance_list.html:9 +#: bookwyrm/templates/settings/federation/instance_list.html:10 +#, fuzzy +#| msgid "Instance Name:" +msgid "Add instance" +msgstr "Instanzname" + +#: bookwyrm/templates/settings/federation/edit_instance.html:7 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:7 +#, fuzzy +#| msgid "Back to reports" +msgid "Back to instance list" +msgstr "Zurück zu den Meldungen" + +#: bookwyrm/templates/settings/federation/edit_instance.html:16 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:16 +#, fuzzy +#| msgid "Import book" +msgid "Import block list" +msgstr "Buch importieren" + +#: bookwyrm/templates/settings/federation/edit_instance.html:30 +#, fuzzy +#| msgid "Instance Name:" +msgid "Instance:" +msgstr "Instanzname" + +#: bookwyrm/templates/settings/federation/edit_instance.html:39 +#: bookwyrm/templates/settings/federation/instance.html:28 +#: bookwyrm/templates/settings/users/user_info.html:106 +#, fuzzy +#| msgid "Import Status" +msgid "Status:" +msgstr "Importstatus" + +#: bookwyrm/templates/settings/federation/edit_instance.html:52 +#: bookwyrm/templates/settings/federation/instance.html:22 +#: bookwyrm/templates/settings/users/user_info.html:100 +msgid "Software:" +msgstr "" + +#: bookwyrm/templates/settings/federation/edit_instance.html:61 +#: bookwyrm/templates/settings/federation/instance.html:25 +#: bookwyrm/templates/settings/users/user_info.html:103 +#, fuzzy +#| msgid "Description:" +msgid "Version:" +msgstr "Beschreibung:" + +#: bookwyrm/templates/settings/federation/edit_instance.html:70 +msgid "Notes:" +msgstr "" + +#: bookwyrm/templates/settings/federation/instance.html:19 msgid "Details" msgstr "" -#: bookwyrm/templates/settings/federated_server.html:39 +#: bookwyrm/templates/settings/federation/instance.html:35 #: bookwyrm/templates/user/layout.html:63 msgid "Activity" msgstr "Aktivität" -#: bookwyrm/templates/settings/federated_server.html:43 +#: bookwyrm/templates/settings/federation/instance.html:38 msgid "Users:" msgstr "" -#: bookwyrm/templates/settings/federated_server.html:46 -#: bookwyrm/templates/settings/federated_server.html:53 +#: bookwyrm/templates/settings/federation/instance.html:41 +#: bookwyrm/templates/settings/federation/instance.html:47 msgid "View all" msgstr "Alle anzeigen" -#: bookwyrm/templates/settings/federated_server.html:50 -#: bookwyrm/templates/user_admin/user_info.html:59 +#: bookwyrm/templates/settings/federation/instance.html:44 +#: bookwyrm/templates/settings/users/user_info.html:56 #, fuzzy #| msgid "Recent Imports" msgid "Reports:" msgstr "Aktuelle Importe" -#: bookwyrm/templates/settings/federated_server.html:57 +#: bookwyrm/templates/settings/federation/instance.html:50 #, fuzzy #| msgid "followed you" msgid "Followed by us:" msgstr "folgt dir" -#: bookwyrm/templates/settings/federated_server.html:63 +#: bookwyrm/templates/settings/federation/instance.html:55 #, fuzzy #| msgid "followed you" msgid "Followed by them:" msgstr "folgt dir" -#: bookwyrm/templates/settings/federated_server.html:69 +#: bookwyrm/templates/settings/federation/instance.html:60 #, fuzzy #| msgid "Blocked Users" msgid "Blocked by us:" msgstr "Blockierte Nutzer*innen" -#: bookwyrm/templates/settings/federated_server.html:82 -#: bookwyrm/templates/user_admin/user_info.html:130 +#: bookwyrm/templates/settings/federation/instance.html:72 +#: bookwyrm/templates/settings/users/user_info.html:110 msgid "Notes" msgstr "" -#: bookwyrm/templates/settings/federated_server.html:85 +#: bookwyrm/templates/settings/federation/instance.html:75 #, fuzzy #| msgid "Edit Book" msgid "Edit" msgstr "Buch editieren" -#: bookwyrm/templates/settings/federated_server.html:105 -#: bookwyrm/templates/user_admin/user_moderation_actions.html:8 +#: bookwyrm/templates/settings/federation/instance.html:79 +msgid "No notes" +msgstr "" + +#: bookwyrm/templates/settings/federation/instance.html:94 +#: bookwyrm/templates/settings/users/user_moderation_actions.html:8 #, fuzzy #| msgid "Notifications" msgid "Actions" msgstr "Benachrichtigungen" -#: bookwyrm/templates/settings/federated_server.html:109 +#: bookwyrm/templates/settings/federation/instance.html:98 #: bookwyrm/templates/snippets/block_button.html:5 msgid "Block" msgstr "" -#: bookwyrm/templates/settings/federated_server.html:110 +#: bookwyrm/templates/settings/federation/instance.html:99 msgid "All users from this instance will be deactivated." msgstr "" -#: bookwyrm/templates/settings/federated_server.html:115 +#: bookwyrm/templates/settings/federation/instance.html:104 #: bookwyrm/templates/snippets/block_button.html:10 msgid "Un-block" msgstr "" -#: bookwyrm/templates/settings/federated_server.html:116 +#: bookwyrm/templates/settings/federation/instance.html:105 msgid "All users from this instance will be re-activated." msgstr "" -#: bookwyrm/templates/settings/federation.html:3 -#: bookwyrm/templates/settings/federation.html:5 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:6 +#, fuzzy +#| msgid "Import Books" +msgid "Import Blocklist" +msgstr "Bücher importieren" + +#: bookwyrm/templates/settings/federation/instance_blocklist.html:26 +#: bookwyrm/templates/snippets/goal_progress.html:7 +msgid "Success!" +msgstr "Erfolg!" + +#: bookwyrm/templates/settings/federation/instance_blocklist.html:30 +#, fuzzy +#| msgid "Successfully imported" +msgid "Successfully blocked:" +msgstr "Erfolgreich importiert" + +#: bookwyrm/templates/settings/federation/instance_blocklist.html:32 +msgid "Failed:" +msgstr "Fehlgeschlagen" + +#: bookwyrm/templates/settings/federation/instance_list.html:3 +#: bookwyrm/templates/settings/federation/instance_list.html:5 #: bookwyrm/templates/settings/layout.html:45 #, fuzzy #| msgid "Federated Servers" msgid "Federated Instances" msgstr "Föderierende Server" -#: bookwyrm/templates/settings/federation.html:32 -#: bookwyrm/templates/user_admin/server_filter.html:5 +#: bookwyrm/templates/settings/federation/instance_list.html:32 +#: bookwyrm/templates/settings/users/server_filter.html:5 #, fuzzy #| msgid "Instance Name:" msgid "Instance name" msgstr "Instanzname" -#: bookwyrm/templates/settings/federation.html:40 +#: bookwyrm/templates/settings/federation/instance_list.html:40 msgid "Software" msgstr "" +#: bookwyrm/templates/settings/federation/instance_list.html:63 +#, fuzzy +#| msgid "Announcements" +msgid "No instances found" +msgstr "Ankündigungen" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:4 +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:11 +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:25 +#: bookwyrm/templates/settings/invites/manage_invites.html:11 +#, fuzzy +#| msgid "Invites" +msgid "Invite Requests" +msgstr "Einladungen" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:23 +msgid "Ignored Invite Requests" +msgstr "Ignorierte Einladungsanfragen" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:35 +#, fuzzy +#| msgid "Federated" +msgid "Date requested" +msgstr "Föderiert" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:39 +#, fuzzy +#| msgid "Accept" +msgid "Date accepted" +msgstr "Annehmen" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:42 +msgid "Email" +msgstr "" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:47 +#, fuzzy +#| msgid "Notifications" +msgid "Action" +msgstr "Benachrichtigungen" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:50 +#, fuzzy +#| msgid "Follow Requests" +msgid "No requests" +msgstr "Folgeanfragen" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:59 +#: bookwyrm/templates/settings/invites/status_filter.html:16 +#, fuzzy +#| msgid "Accept" +msgid "Accepted" +msgstr "Annehmen" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:61 +#: bookwyrm/templates/settings/invites/status_filter.html:12 +msgid "Sent" +msgstr "Gesendet" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:63 +#: bookwyrm/templates/settings/invites/status_filter.html:8 +msgid "Requested" +msgstr "Angefragt" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:73 +msgid "Send invite" +msgstr "Einladung senden" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:75 +msgid "Re-send invite" +msgstr "Einladung erneut senden" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:95 +msgid "Ignore" +msgstr "Ignorieren" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:97 +msgid "Un-ignore" +msgstr "Un-ignorieren" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:108 +#, fuzzy +#| msgid "Back to reports" +msgid "Back to pending requests" +msgstr "Zurück zu den Meldungen" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:110 +msgid "View ignored requests" +msgstr "Zeige ignorierte Anfragen" + +#: bookwyrm/templates/settings/invites/manage_invites.html:21 +msgid "Generate New Invite" +msgstr "Neue Einladung erzeugen" + +#: bookwyrm/templates/settings/invites/manage_invites.html:27 +msgid "Expiry:" +msgstr "Ablaufen:" + +#: bookwyrm/templates/settings/invites/manage_invites.html:33 +msgid "Use limit:" +msgstr "Begrenzte Benutzung" + +#: bookwyrm/templates/settings/invites/manage_invites.html:40 +msgid "Create Invite" +msgstr "Einladung erstellen" + +#: bookwyrm/templates/settings/invites/manage_invites.html:47 +msgid "Link" +msgstr "" + +#: bookwyrm/templates/settings/invites/manage_invites.html:48 +msgid "Expires" +msgstr "Läuft aus" + +#: bookwyrm/templates/settings/invites/manage_invites.html:49 +msgid "Max uses" +msgstr "Maximale Benutzungen" + +#: bookwyrm/templates/settings/invites/manage_invites.html:50 +msgid "Times used" +msgstr "Mal benutzt" + +#: bookwyrm/templates/settings/invites/manage_invites.html:53 +msgid "No active invites" +msgstr "Keine aktiven Einladungen" + +#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:5 +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:10 +#, fuzzy +#| msgid "Email address:" +msgid "Add IP address" +msgstr "E-Mail Adresse" + +#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:11 +msgid "Use IP address blocks with caution, and consider using blocks only temporarily, as IP addresses are often shared or change hands. If you block your own IP, you will not be able to access this page." +msgstr "" + +#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:18 +#, fuzzy +#| msgid "Email address:" +msgid "IP Address:" +msgstr "E-Mail Adresse" + +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:5 +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:7 +#: bookwyrm/templates/settings/layout.html:63 +#, fuzzy +#| msgid "Import Books" +msgid "IP Address Blocklist" +msgstr "Bücher importieren" + +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:18 +msgid "Any traffic from this IP address will get a 404 response when trying to access any part of the application." +msgstr "" + +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:24 +#, fuzzy +#| msgid "Email address:" +msgid "Address" +msgstr "E-Mail Adresse" + +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:46 +#, fuzzy +#| msgid "No users currently blocked." +msgid "No IP addresses currently blocked" +msgstr "Momentan keine Nutzer*innen blockiert." + +#: bookwyrm/templates/settings/ip_blocklist/ip_tooltip.html:6 +msgid "You can block IP ranges using CIDR syntax." +msgstr "" + #: bookwyrm/templates/settings/layout.html:4 msgid "Administration" msgstr "" @@ -2686,259 +2810,427 @@ msgstr "Nutzer*innen verwalten" msgid "Moderation" msgstr "Listenkuratierung:" -#: bookwyrm/templates/settings/layout.html:64 +#: bookwyrm/templates/settings/layout.html:55 +#: bookwyrm/templates/settings/reports/reports.html:8 +#: bookwyrm/templates/settings/reports/reports.html:17 +#, fuzzy +#| msgid "Recent Imports" +msgid "Reports" +msgstr "Aktuelle Importe" + +#: bookwyrm/templates/settings/layout.html:68 msgid "Instance Settings" msgstr "Instanzeinstellungen" -#: bookwyrm/templates/settings/layout.html:72 +#: bookwyrm/templates/settings/layout.html:76 #: bookwyrm/templates/settings/site.html:4 #: bookwyrm/templates/settings/site.html:6 msgid "Site Settings" msgstr "Seiteneinstellungen" -#: bookwyrm/templates/settings/layout.html:75 -#: bookwyrm/templates/settings/site.html:13 +#: bookwyrm/templates/settings/reports/report.html:5 +#: bookwyrm/templates/settings/reports/report.html:8 +#: bookwyrm/templates/settings/reports/report_preview.html:6 +#, python-format +msgid "Report #%(report_id)s: %(username)s" +msgstr "Meldung #%(report_id)s: %(username)s" + +#: bookwyrm/templates/settings/reports/report.html:9 +msgid "Back to reports" +msgstr "Zurück zu den Meldungen" + +#: bookwyrm/templates/settings/reports/report.html:23 +msgid "Moderator Comments" +msgstr "Moderator:innenkommentare" + +#: bookwyrm/templates/settings/reports/report.html:41 +#: bookwyrm/templates/snippets/create_status.html:28 +msgid "Comment" +msgstr "Kommentieren" + +#: bookwyrm/templates/settings/reports/report.html:46 +#, fuzzy +#| msgid "Delete status" +msgid "Reported statuses" +msgstr "Post löschen" + +#: bookwyrm/templates/settings/reports/report.html:48 +msgid "No statuses reported" +msgstr "Keine Beiträge gemeldet" + +#: bookwyrm/templates/settings/reports/report.html:54 +#, fuzzy +#| msgid "Statuses has been deleted" +msgid "Status has been deleted" +msgstr "Beiträge wurden gelöscht" + +#: bookwyrm/templates/settings/reports/report_preview.html:13 +msgid "No notes provided" +msgstr "Keine Notizen angegeben." + +#: bookwyrm/templates/settings/reports/report_preview.html:20 +#, fuzzy, python-format +#| msgid "Direct Messages with %(username)s" +msgid "Reported by %(username)s" +msgstr "Direktnachrichten mit %(username)s" + +#: bookwyrm/templates/settings/reports/report_preview.html:30 +msgid "Re-open" +msgstr "Wiedereröffnen" + +#: bookwyrm/templates/settings/reports/report_preview.html:32 +msgid "Resolve" +msgstr "Lösen" + +#: bookwyrm/templates/settings/reports/reports.html:6 +#, fuzzy, python-format +#| msgid "Lists: %(username)s" +msgid "Reports: %(instance_name)s" +msgstr "Listen: %(username)s" + +#: bookwyrm/templates/settings/reports/reports.html:14 +#, fuzzy, python-format +#| msgid "Lists: %(username)s" +msgid "Reports: %(instance_name)s" +msgstr "Listen: %(username)s" + +#: bookwyrm/templates/settings/reports/reports.html:28 +#, fuzzy +#| msgid "Shelved" +msgid "Resolved" +msgstr "Ins Regal gestellt" + +#: bookwyrm/templates/settings/reports/reports.html:37 +#, fuzzy +#| msgid "No books found" +msgid "No reports found." +msgstr "Keine Bücher gefunden" + +#: bookwyrm/templates/settings/site.html:10 +#: bookwyrm/templates/settings/site.html:21 msgid "Instance Info" msgstr "Instanzinformationen" -#: bookwyrm/templates/settings/layout.html:76 -#: bookwyrm/templates/settings/site.html:44 +#: bookwyrm/templates/settings/site.html:11 +#: bookwyrm/templates/settings/site.html:54 msgid "Images" msgstr "Bilder" -#: bookwyrm/templates/settings/layout.html:77 -#: bookwyrm/templates/settings/site.html:64 +#: bookwyrm/templates/settings/site.html:12 +#: bookwyrm/templates/settings/site.html:74 msgid "Footer Content" msgstr "Inhalt des Footers" -#: bookwyrm/templates/settings/layout.html:78 -#: bookwyrm/templates/settings/site.html:86 +#: bookwyrm/templates/settings/site.html:13 +#: bookwyrm/templates/settings/site.html:98 msgid "Registration" msgstr "Registrierung" -#: bookwyrm/templates/settings/manage_invite_requests.html:4 -#: bookwyrm/templates/settings/manage_invite_requests.html:11 -#: bookwyrm/templates/settings/manage_invite_requests.html:25 -#: bookwyrm/templates/settings/manage_invites.html:11 -#, fuzzy -#| msgid "Invites" -msgid "Invite Requests" -msgstr "Einladungen" - -#: bookwyrm/templates/settings/manage_invite_requests.html:23 -msgid "Ignored Invite Requests" -msgstr "Ignorierte Einladungsanfragen" - -#: bookwyrm/templates/settings/manage_invite_requests.html:35 -#, fuzzy -#| msgid "Federated" -msgid "Date requested" -msgstr "Föderiert" - -#: bookwyrm/templates/settings/manage_invite_requests.html:39 -#, fuzzy -#| msgid "Accept" -msgid "Date accepted" -msgstr "Annehmen" - -#: bookwyrm/templates/settings/manage_invite_requests.html:42 -msgid "Email" -msgstr "" - -#: bookwyrm/templates/settings/manage_invite_requests.html:47 -#, fuzzy -#| msgid "Notifications" -msgid "Action" -msgstr "Benachrichtigungen" - -#: bookwyrm/templates/settings/manage_invite_requests.html:50 -#, fuzzy -#| msgid "Follow Requests" -msgid "No requests" -msgstr "Folgeanfragen" - -#: bookwyrm/templates/settings/manage_invite_requests.html:59 -#: bookwyrm/templates/settings/status_filter.html:16 -#, fuzzy -#| msgid "Accept" -msgid "Accepted" -msgstr "Annehmen" - -#: bookwyrm/templates/settings/manage_invite_requests.html:61 -#: bookwyrm/templates/settings/status_filter.html:12 -msgid "Sent" -msgstr "Gesendet" - -#: bookwyrm/templates/settings/manage_invite_requests.html:63 -#: bookwyrm/templates/settings/status_filter.html:8 -msgid "Requested" -msgstr "Angefragt" - -#: bookwyrm/templates/settings/manage_invite_requests.html:73 -msgid "Send invite" -msgstr "Einladung senden" - -#: bookwyrm/templates/settings/manage_invite_requests.html:75 -msgid "Re-send invite" -msgstr "Einladung erneut senden" - -#: bookwyrm/templates/settings/manage_invite_requests.html:95 -msgid "Ignore" -msgstr "Ignorieren" - -#: bookwyrm/templates/settings/manage_invite_requests.html:97 -msgid "Un-ignore" -msgstr "Un-ignorieren" - -#: bookwyrm/templates/settings/manage_invite_requests.html:108 -#, fuzzy -#| msgid "Back to reports" -msgid "Back to pending requests" -msgstr "Zurück zu den Meldungen" - -#: bookwyrm/templates/settings/manage_invite_requests.html:110 -msgid "View ignored requests" -msgstr "Zeige ignorierte Anfragen" - -#: bookwyrm/templates/settings/manage_invites.html:21 -msgid "Generate New Invite" -msgstr "Neue Einladung erzeugen" - -#: bookwyrm/templates/settings/manage_invites.html:27 -msgid "Expiry:" -msgstr "Ablaufen:" - -#: bookwyrm/templates/settings/manage_invites.html:33 -msgid "Use limit:" -msgstr "Begrenzte Benutzung" - -#: bookwyrm/templates/settings/manage_invites.html:40 -msgid "Create Invite" -msgstr "Einladung erstellen" - -#: bookwyrm/templates/settings/manage_invites.html:47 -msgid "Link" -msgstr "" - -#: bookwyrm/templates/settings/manage_invites.html:48 -msgid "Expires" -msgstr "Läuft aus" - -#: bookwyrm/templates/settings/manage_invites.html:49 -msgid "Max uses" -msgstr "Maximale Benutzungen" - -#: bookwyrm/templates/settings/manage_invites.html:50 -msgid "Times used" -msgstr "Mal benutzt" - -#: bookwyrm/templates/settings/manage_invites.html:53 -msgid "No active invites" -msgstr "Keine aktiven Einladungen" - -#: bookwyrm/templates/settings/server_blocklist.html:6 -#, fuzzy -#| msgid "Import Books" -msgid "Import Blocklist" -msgstr "Bücher importieren" - -#: bookwyrm/templates/settings/server_blocklist.html:26 -#: bookwyrm/templates/snippets/goal_progress.html:7 -msgid "Success!" -msgstr "Erfolg!" - -#: bookwyrm/templates/settings/server_blocklist.html:30 -#, fuzzy -#| msgid "Successfully imported" -msgid "Successfully blocked:" -msgstr "Erfolgreich importiert" - -#: bookwyrm/templates/settings/server_blocklist.html:32 -msgid "Failed:" -msgstr "Fehlgeschlagen" - -#: bookwyrm/templates/settings/site.html:15 +#: bookwyrm/templates/settings/site.html:24 msgid "Instance Name:" msgstr "Instanzname" -#: bookwyrm/templates/settings/site.html:19 +#: bookwyrm/templates/settings/site.html:28 msgid "Tagline:" msgstr "" -#: bookwyrm/templates/settings/site.html:23 +#: bookwyrm/templates/settings/site.html:32 msgid "Instance description:" msgstr "Instanzbeschreibung" -#: bookwyrm/templates/settings/site.html:27 +#: bookwyrm/templates/settings/site.html:36 #, fuzzy #| msgid "Description:" msgid "Short description:" msgstr "Beschreibung:" -#: bookwyrm/templates/settings/site.html:28 +#: bookwyrm/templates/settings/site.html:37 msgid "Used when the instance is previewed on joinbookwyrm.com. Does not support html or markdown." msgstr "" -#: bookwyrm/templates/settings/site.html:32 +#: bookwyrm/templates/settings/site.html:41 msgid "Code of conduct:" msgstr "" -#: bookwyrm/templates/settings/site.html:36 +#: bookwyrm/templates/settings/site.html:45 msgid "Privacy Policy:" msgstr "Datenschutzerklärung" -#: bookwyrm/templates/settings/site.html:47 +#: bookwyrm/templates/settings/site.html:57 msgid "Logo:" msgstr "" -#: bookwyrm/templates/settings/site.html:51 +#: bookwyrm/templates/settings/site.html:61 msgid "Logo small:" msgstr "Logo klein" -#: bookwyrm/templates/settings/site.html:55 +#: bookwyrm/templates/settings/site.html:65 msgid "Favicon:" msgstr "" -#: bookwyrm/templates/settings/site.html:66 +#: bookwyrm/templates/settings/site.html:77 msgid "Support link:" msgstr "Unterstützungslink" -#: bookwyrm/templates/settings/site.html:70 +#: bookwyrm/templates/settings/site.html:81 msgid "Support title:" msgstr "Unterstützungstitel" -#: bookwyrm/templates/settings/site.html:74 +#: bookwyrm/templates/settings/site.html:85 msgid "Admin email:" msgstr "" -#: bookwyrm/templates/settings/site.html:78 +#: bookwyrm/templates/settings/site.html:89 msgid "Additional info:" msgstr "Zusätzliche Info:" -#: bookwyrm/templates/settings/site.html:90 +#: bookwyrm/templates/settings/site.html:103 #, fuzzy #| msgid "Allow registration:" msgid "Allow registration" msgstr "Registrierungen erlauben" -#: bookwyrm/templates/settings/site.html:96 +#: bookwyrm/templates/settings/site.html:109 #, fuzzy #| msgid "Follow Requests" msgid "Allow invite requests" msgstr "Folgeanfragen" -#: bookwyrm/templates/settings/site.html:102 +#: bookwyrm/templates/settings/site.html:115 msgid "Require users to confirm email address" msgstr "User müssen ihre E-Mail-Adresse bestätigen" -#: bookwyrm/templates/settings/site.html:104 +#: bookwyrm/templates/settings/site.html:117 msgid "(Recommended if registration is open)" msgstr "(Vorschlagen falls die Registrierung offen ist)" -#: bookwyrm/templates/settings/site.html:107 +#: bookwyrm/templates/settings/site.html:120 msgid "Registration closed text:" msgstr "Registrierungen geschlossen text" +#: bookwyrm/templates/settings/site.html:124 +#, fuzzy +#| msgid "Invites" +msgid "Invite request text:" +msgstr "Einladungen" + +#: bookwyrm/templates/settings/users/delete_user_form.html:5 +#: bookwyrm/templates/settings/users/user_moderation_actions.html:31 +msgid "Permanently delete user" +msgstr "User permanent löschen" + +#: bookwyrm/templates/settings/users/delete_user_form.html:12 +#, python-format +msgid "Are you sure you want to delete %(username)s's account? This action cannot be undone. To proceed, please enter your password to confirm deletion." +msgstr "Bist du sicher, dass du %(username)ss Account löschen möchtest? Diese Aktion kann nicht rückgängig gemacht werden. Zur Bestätigung gib bitte dein Passwort ein." + +#: bookwyrm/templates/settings/users/delete_user_form.html:17 +#, fuzzy +#| msgid "Confirm password:" +msgid "Your password:" +msgstr "Passwort bestätigen:" + +#: bookwyrm/templates/settings/users/user.html:7 +#, fuzzy +#| msgid "Back to reports" +msgid "Back to users" +msgstr "Zurück zu den Meldungen" + +#: bookwyrm/templates/settings/users/user_admin.html:7 +#, fuzzy, python-format +#| msgid "Lists: %(username)s" +msgid "Users: %(instance_name)s" +msgstr "Listen: %(username)s" + +#: bookwyrm/templates/settings/users/user_admin.html:22 +#: bookwyrm/templates/settings/users/username_filter.html:5 +#, fuzzy +#| msgid "username" +msgid "Username" +msgstr "Username" + +#: bookwyrm/templates/settings/users/user_admin.html:26 +#, fuzzy +#| msgid "Added:" +msgid "Date Added" +msgstr "Hinzugefügt:" + +#: bookwyrm/templates/settings/users/user_admin.html:30 +msgid "Last Active" +msgstr "Zuletzt aktiv" + +#: bookwyrm/templates/settings/users/user_admin.html:38 +#, fuzzy +#| msgid "Instance Name:" +msgid "Remote instance" +msgstr "Instanzname" + +#: bookwyrm/templates/settings/users/user_admin.html:47 +#: bookwyrm/templates/settings/users/user_info.html:24 +#, fuzzy +#| msgid "Activity" +msgid "Active" +msgstr "Aktivität" + +#: bookwyrm/templates/settings/users/user_admin.html:47 +#: bookwyrm/templates/settings/users/user_info.html:28 +msgid "Inactive" +msgstr "Inaktiv" + +#: bookwyrm/templates/settings/users/user_admin.html:52 +#: bookwyrm/templates/settings/users/user_info.html:120 +msgid "Not set" +msgstr "Nicht gesetzt" + +#: bookwyrm/templates/settings/users/user_info.html:16 +#, fuzzy +#| msgid "User Profile" +msgid "View user profile" +msgstr "Benutzerprofil" + +#: bookwyrm/templates/settings/users/user_info.html:36 +msgid "Local" +msgstr "Lokal" + +#: bookwyrm/templates/settings/users/user_info.html:38 +#, fuzzy +#| msgid "Remove" +msgid "Remote" +msgstr "Entfernen" + +#: bookwyrm/templates/settings/users/user_info.html:47 +msgid "User details" +msgstr "" + +#: bookwyrm/templates/settings/users/user_info.html:51 +#, fuzzy +#| msgid "Email address:" +msgid "Email:" +msgstr "E-Mail Adresse" + +#: bookwyrm/templates/settings/users/user_info.html:61 +msgid "(View reports)" +msgstr "" + +#: bookwyrm/templates/settings/users/user_info.html:67 +#, fuzzy +#| msgid "Blocked Users" +msgid "Blocked by count:" +msgstr "Blockierte Nutzer*innen" + +#: bookwyrm/templates/settings/users/user_info.html:70 +#, fuzzy +#| msgid "Birth date:" +msgid "Last active date:" +msgstr "Geburtsdatum:" + +#: bookwyrm/templates/settings/users/user_info.html:73 +#, fuzzy +#| msgid "Manually approve followers:" +msgid "Manually approved followers:" +msgstr "Folgende manuell bestätigen" + +#: bookwyrm/templates/settings/users/user_info.html:76 +#, fuzzy +#| msgid "Discard" +msgid "Discoverable:" +msgstr "Ablehnen" + +#: bookwyrm/templates/settings/users/user_info.html:80 +#, fuzzy +#| msgid "Deactivate user" +msgid "Deactivation reason:" +msgstr "Nutzer:in deaktivieren" + +#: bookwyrm/templates/settings/users/user_info.html:95 +#, fuzzy +#| msgid "Instance Settings" +msgid "Instance details" +msgstr "Instanzeinstellungen" + +#: bookwyrm/templates/settings/users/user_info.html:117 +msgid "View instance" +msgstr "" + +#: bookwyrm/templates/settings/users/user_moderation_actions.html:5 +msgid "Permanently deleted" +msgstr "Permanent gelöscht" + +#: bookwyrm/templates/settings/users/user_moderation_actions.html:13 +#: bookwyrm/templates/snippets/status/status_options.html:35 +#: bookwyrm/templates/snippets/user_options.html:13 +msgid "Send direct message" +msgstr "Direktnachricht senden" + +#: bookwyrm/templates/settings/users/user_moderation_actions.html:20 +msgid "Suspend user" +msgstr "" + +#: bookwyrm/templates/settings/users/user_moderation_actions.html:25 +msgid "Un-suspend user" +msgstr "" + +#: bookwyrm/templates/settings/users/user_moderation_actions.html:47 +msgid "Access level:" +msgstr "" + +#: bookwyrm/templates/shelf/create_shelf_form.html:5 +msgid "Create Shelf" +msgstr "Regal erstellen" + +#: bookwyrm/templates/shelf/edit_shelf_form.html:5 +msgid "Edit Shelf" +msgstr "Regal bearbeiten" + +#: bookwyrm/templates/shelf/shelf.html:28 bookwyrm/views/shelf.py:56 +#, fuzzy +#| msgid "books" +msgid "All books" +msgstr "Bücher" + +#: bookwyrm/templates/shelf/shelf.html:55 +msgid "Create shelf" +msgstr "Regal erstellen" + +#: bookwyrm/templates/shelf/shelf.html:77 +#, python-format +msgid "%(formatted_count)s book" +msgid_plural "%(formatted_count)s books" +msgstr[0] "" +msgstr[1] "" + +#: bookwyrm/templates/shelf/shelf.html:84 +#, python-format +msgid "(showing %(start)s-%(end)s)" +msgstr "(zeige %(start)s-%(end)s)" + +#: bookwyrm/templates/shelf/shelf.html:96 +msgid "Edit shelf" +msgstr "Regal bearbeiten" + +#: bookwyrm/templates/shelf/shelf.html:104 +msgid "Delete shelf" +msgstr "Regal löschen" + +#: bookwyrm/templates/shelf/shelf.html:130 +#: bookwyrm/templates/shelf/shelf.html:154 +msgid "Shelved" +msgstr "Ins Regal gestellt" + +#: bookwyrm/templates/shelf/shelf.html:131 +#: bookwyrm/templates/shelf/shelf.html:158 +msgid "Started" +msgstr "Gestartet" + +#: bookwyrm/templates/shelf/shelf.html:132 +#: bookwyrm/templates/shelf/shelf.html:161 +msgid "Finished" +msgstr "Abgeschlossen" + +#: bookwyrm/templates/shelf/shelf.html:187 +msgid "This shelf is empty." +msgstr "Dieses Regal ist leer." + #: bookwyrm/templates/snippets/announcement.html:31 #, fuzzy, python-format #| msgid "Direct Messages with %(username)s" @@ -2991,24 +3283,21 @@ msgid "Some thoughts on the book" msgstr "Ein paar Gedanken zum Buch" #: bookwyrm/templates/snippets/create_status/comment.html:26 -#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:16 +#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:15 msgid "Progress:" msgstr "Fortschritt:" #: bookwyrm/templates/snippets/create_status/comment.html:52 -#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:30 -#: bookwyrm/templates/snippets/readthrough_form.html:22 +#: bookwyrm/templates/snippets/progress_field.html:18 msgid "pages" msgstr "Seiten" #: bookwyrm/templates/snippets/create_status/comment.html:58 -#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:31 -#: bookwyrm/templates/snippets/readthrough_form.html:23 +#: bookwyrm/templates/snippets/progress_field.html:23 msgid "percent" msgstr "Prozent" #: bookwyrm/templates/snippets/create_status/comment.html:65 -#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:36 #, python-format msgid "of %(pages)s pages" msgstr "von %(pages)s Seiten" @@ -3026,11 +3315,13 @@ msgstr "Antwort" msgid "Content" msgstr "Inhalt des Footers" -#: bookwyrm/templates/snippets/create_status/content_warning_field.html:3 -msgid "Spoiler alert:" -msgstr "Spoileralarm:" - #: bookwyrm/templates/snippets/create_status/content_warning_field.html:10 +#, fuzzy +#| msgid "Footer Content" +msgid "Content warning:" +msgstr "Inhalt des Footers" + +#: bookwyrm/templates/snippets/create_status/content_warning_field.html:18 msgid "Spoilers ahead!" msgstr "Spoileralarm!" @@ -3038,7 +3329,7 @@ msgstr "Spoileralarm!" msgid "Include spoiler alert" msgstr "Spoileralarm aktivieren" -#: bookwyrm/templates/snippets/create_status/layout.html:38 +#: bookwyrm/templates/snippets/create_status/layout.html:41 #: bookwyrm/templates/snippets/reading_modals/form.html:7 #, fuzzy #| msgid "Comment" @@ -3216,29 +3507,29 @@ msgstr[1] "" msgid "Review of \"%(book_title)s\": %(review_title)s" msgstr "Review von \"%(book_title)s\": %(review_title)s" -#: bookwyrm/templates/snippets/goal_card.html:23 +#: bookwyrm/templates/snippets/goal_form.html:3 #, python-format -msgid "You can set or change your reading goal any time from your profile page" -msgstr "Du kannst dein Leseziel jederzeit auf deiner Profilseite setzen oder ändern." +msgid "Set a goal for how many books you'll finish reading in %(year)s, and track your progress throughout the year." +msgstr "Setze dir ein Ziel, wie viele Bücher du %(year)s lesen wirst und behalte deinen Fortschritt über's Jahr im Auge." -#: bookwyrm/templates/snippets/goal_form.html:9 +#: bookwyrm/templates/snippets/goal_form.html:12 msgid "Reading goal:" msgstr "Leseziel:" -#: bookwyrm/templates/snippets/goal_form.html:14 +#: bookwyrm/templates/snippets/goal_form.html:17 msgid "books" msgstr "Bücher" -#: bookwyrm/templates/snippets/goal_form.html:19 +#: bookwyrm/templates/snippets/goal_form.html:22 msgid "Goal privacy:" msgstr "Sichtbarkeit des Ziels" -#: bookwyrm/templates/snippets/goal_form.html:26 +#: bookwyrm/templates/snippets/goal_form.html:29 #: bookwyrm/templates/snippets/reading_modals/layout.html:13 msgid "Post to feed" msgstr "Posten" -#: bookwyrm/templates/snippets/goal_form.html:30 +#: bookwyrm/templates/snippets/goal_form.html:33 msgid "Set goal" msgstr "Ziel setzen" @@ -3316,18 +3607,18 @@ msgstr "" msgid "Finish \"%(book_title)s\"" msgstr "\"%(book_title)s\" abschließen" -#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:22 +#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:23 #: bookwyrm/templates/snippets/reading_modals/start_reading_modal.html:20 #: bookwyrm/templates/snippets/readthrough_form.html:7 msgid "Started reading" msgstr "Zu lesen angefangen" -#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:30 -#: bookwyrm/templates/snippets/readthrough_form.html:30 +#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:31 +#: bookwyrm/templates/snippets/readthrough_form.html:20 msgid "Finished reading" msgstr "Zu Ende gelesen" -#: bookwyrm/templates/snippets/reading_modals/form.html:8 +#: bookwyrm/templates/snippets/reading_modals/form.html:9 msgid "(Optional)" msgstr "" @@ -3362,6 +3653,23 @@ msgstr "Registrieren" msgid "Report" msgstr "Importieren" +#: bookwyrm/templates/snippets/report_modal.html:6 +#, fuzzy, python-format +#| msgid "Lists: %(username)s" +msgid "Report @%(username)s" +msgstr "Listen: %(username)s" + +#: bookwyrm/templates/snippets/report_modal.html:23 +#, python-format +msgid "This report will be sent to %(site_name)s's moderators for review." +msgstr "Diese Meldung wird an die Moderator:innen von %(site_name)s weitergeletiet." + +#: bookwyrm/templates/snippets/report_modal.html:24 +#, fuzzy +#| msgid "More about this site" +msgid "More info about this report:" +msgstr "Mehr über diese Seite" + #: bookwyrm/templates/snippets/search_result_text.html:36 msgid "Import book" msgstr "Buch importieren" @@ -3396,32 +3704,40 @@ msgstr "Listen: %(username)s" msgid "Finish reading" msgstr "Lesen abschließen" -#: bookwyrm/templates/snippets/status/content_status.html:73 -#: bookwyrm/templates/snippets/trimmed_text.html:17 -msgid "Show more" -msgstr "Mehr anzeigen" +#: bookwyrm/templates/snippets/status/content_status.html:72 +#, fuzzy +#| msgid "Footer Content" +msgid "Content warning" +msgstr "Inhalt des Footers" -#: bookwyrm/templates/snippets/status/content_status.html:88 -#: bookwyrm/templates/snippets/trimmed_text.html:34 -msgid "Show less" -msgstr "Weniger anzeigen" +#: bookwyrm/templates/snippets/status/content_status.html:79 +#, fuzzy +#| msgid "Like status" +msgid "Show status" +msgstr "Status favorisieren" -#: bookwyrm/templates/snippets/status/content_status.html:103 +#: bookwyrm/templates/snippets/status/content_status.html:101 #, fuzzy, python-format #| msgid "%(pages)s pages" msgid "(Page %(page)s)" msgstr "%(pages)s Seiten" -#: bookwyrm/templates/snippets/status/content_status.html:105 +#: bookwyrm/templates/snippets/status/content_status.html:103 #, fuzzy, python-format #| msgid "%(percent)s%% complete!" msgid "(%(percent)s%%)" msgstr "%(percent)s%% komplett!" -#: bookwyrm/templates/snippets/status/content_status.html:127 +#: bookwyrm/templates/snippets/status/content_status.html:125 msgid "Open image in new window" msgstr "Bild in neuem Fenster öffnen" +#: bookwyrm/templates/snippets/status/content_status.html:144 +#, fuzzy +#| msgid "Like status" +msgid "Hide status" +msgstr "Status favorisieren" + #: bookwyrm/templates/snippets/status/headers/comment.html:2 #, fuzzy, python-format #| msgid "Editions of \"%(work_title)s\"" @@ -3500,12 +3816,6 @@ msgstr "Mehr Optionen" msgid "Delete & re-draft" msgstr "Diese Lesedaten löschen" -#: bookwyrm/templates/snippets/status/status_options.html:35 -#: bookwyrm/templates/snippets/user_options.html:13 -#: bookwyrm/templates/user_admin/user_moderation_actions.html:13 -msgid "Send direct message" -msgstr "Direktnachricht senden" - #: bookwyrm/templates/snippets/suggested_users.html:16 #, python-format msgid "%(mutuals)s follower you follow" @@ -3543,6 +3853,44 @@ msgstr "Zu lesen angefangen" msgid "Sorted descending" msgstr "Zu lesen angefangen" +#: bookwyrm/templates/snippets/trimmed_text.html:17 +msgid "Show more" +msgstr "Mehr anzeigen" + +#: bookwyrm/templates/snippets/trimmed_text.html:35 +msgid "Show less" +msgstr "Weniger anzeigen" + +#: bookwyrm/templates/user/books_header.html:5 +#, fuzzy, python-format +#| msgid "%(username)s's %(year)s Books" +msgid "%(username)s's books" +msgstr "%(username)ss %(year)s Bücher" + +#: bookwyrm/templates/user/goal.html:8 +#, python-format +msgid "%(year)s Reading Progress" +msgstr "%(year)s Lesefortschritt" + +#: bookwyrm/templates/user/goal.html:12 +msgid "Edit Goal" +msgstr "Ziel bearbeiten" + +#: bookwyrm/templates/user/goal.html:28 +#, python-format +msgid "%(name)s hasn't set a reading goal for %(year)s." +msgstr "%(name)s hat sich für %(year)s kein Leseziel gesetzt." + +#: bookwyrm/templates/user/goal.html:40 +#, python-format +msgid "Your %(year)s Books" +msgstr "Deine Bücher %(year)s" + +#: bookwyrm/templates/user/goal.html:42 +#, python-format +msgid "%(username)s's %(year)s Books" +msgstr "%(username)ss %(year)s Bücher" + #: bookwyrm/templates/user/layout.html:18 bookwyrm/templates/user/user.html:10 msgid "User Profile" msgstr "Benutzerprofil" @@ -3579,74 +3927,6 @@ msgstr "Folgend" msgid "%(username)s isn't following any users" msgstr "%(username)s folgt niemandem" -#: bookwyrm/templates/user/shelf/books_header.html:5 -#, fuzzy, python-format -#| msgid "%(username)s's %(year)s Books" -msgid "%(username)s's books" -msgstr "%(username)ss %(year)s Bücher" - -#: bookwyrm/templates/user/shelf/create_shelf_form.html:5 -#: bookwyrm/templates/user/shelf/create_shelf_form.html:22 -msgid "Create Shelf" -msgstr "Regal erstellen" - -#: bookwyrm/templates/user/shelf/edit_shelf_form.html:5 -msgid "Edit Shelf" -msgstr "Regal bearbeiten" - -#: bookwyrm/templates/user/shelf/edit_shelf_form.html:26 -msgid "Update shelf" -msgstr "Regal aktualisieren" - -#: bookwyrm/templates/user/shelf/shelf.html:28 bookwyrm/views/shelf.py:56 -#, fuzzy -#| msgid "books" -msgid "All books" -msgstr "Bücher" - -#: bookwyrm/templates/user/shelf/shelf.html:55 -msgid "Create shelf" -msgstr "Regal erstellen" - -#: bookwyrm/templates/user/shelf/shelf.html:76 -#, python-format -msgid "%(formatted_count)s book" -msgid_plural "%(formatted_count)s books" -msgstr[0] "" -msgstr[1] "" - -#: bookwyrm/templates/user/shelf/shelf.html:83 -#, python-format -msgid "(showing %(start)s-%(end)s)" -msgstr "(zeige %(start)s-%(end)s)" - -#: bookwyrm/templates/user/shelf/shelf.html:94 -msgid "Edit shelf" -msgstr "Regal bearbeiten" - -#: bookwyrm/templates/user/shelf/shelf.html:113 -#: bookwyrm/templates/user/shelf/shelf.html:137 -msgid "Shelved" -msgstr "Ins Regal gestellt" - -#: bookwyrm/templates/user/shelf/shelf.html:114 -#: bookwyrm/templates/user/shelf/shelf.html:141 -msgid "Started" -msgstr "Gestartet" - -#: bookwyrm/templates/user/shelf/shelf.html:115 -#: bookwyrm/templates/user/shelf/shelf.html:144 -msgid "Finished" -msgstr "Abgeschlossen" - -#: bookwyrm/templates/user/shelf/shelf.html:170 -msgid "This shelf is empty." -msgstr "Dieses Regal ist leer." - -#: bookwyrm/templates/user/shelf/shelf.html:176 -msgid "Delete shelf" -msgstr "Regal löschen" - #: bookwyrm/templates/user/user.html:16 msgid "Edit profile" msgstr "Profil bearbeiten" @@ -3704,160 +3984,6 @@ msgstr[1] "folgt dir" msgid "No followers you follow" msgstr "folgt dir" -#: bookwyrm/templates/user_admin/delete_user_form.html:5 -#: bookwyrm/templates/user_admin/user_moderation_actions.html:31 -msgid "Permanently delete user" -msgstr "User permanent löschen" - -#: bookwyrm/templates/user_admin/delete_user_form.html:12 -#, python-format -msgid "Are you sure you want to delete %(username)s's account? This action cannot be undone. To proceed, please enter your password to confirm deletion." -msgstr "Bist du sicher, dass du %(username)ss Account löschen möchtest? Diese Aktion kann nicht rückgängig gemacht werden. Zur Bestätigung gib bitte dein Passwort ein." - -#: bookwyrm/templates/user_admin/delete_user_form.html:17 -#, fuzzy -#| msgid "Confirm password:" -msgid "Your password:" -msgstr "Passwort bestätigen:" - -#: bookwyrm/templates/user_admin/user.html:8 -#, fuzzy -#| msgid "Back to reports" -msgid "Back to users" -msgstr "Zurück zu den Meldungen" - -#: bookwyrm/templates/user_admin/user_admin.html:7 -#, fuzzy, python-format -#| msgid "Lists: %(username)s" -msgid "Users: %(instance_name)s" -msgstr "Listen: %(username)s" - -#: bookwyrm/templates/user_admin/user_admin.html:22 -#: bookwyrm/templates/user_admin/username_filter.html:5 -#, fuzzy -#| msgid "username" -msgid "Username" -msgstr "Username" - -#: bookwyrm/templates/user_admin/user_admin.html:26 -#, fuzzy -#| msgid "Added:" -msgid "Date Added" -msgstr "Hinzugefügt:" - -#: bookwyrm/templates/user_admin/user_admin.html:30 -msgid "Last Active" -msgstr "Zuletzt aktiv" - -#: bookwyrm/templates/user_admin/user_admin.html:38 -#, fuzzy -#| msgid "Instance Name:" -msgid "Remote instance" -msgstr "Instanzname" - -#: bookwyrm/templates/user_admin/user_admin.html:47 -#: bookwyrm/templates/user_admin/user_info.html:24 -#, fuzzy -#| msgid "Activity" -msgid "Active" -msgstr "Aktivität" - -#: bookwyrm/templates/user_admin/user_admin.html:47 -#: bookwyrm/templates/user_admin/user_info.html:28 -msgid "Inactive" -msgstr "Inaktiv" - -#: bookwyrm/templates/user_admin/user_admin.html:52 -#: bookwyrm/templates/user_admin/user_info.html:140 -msgid "Not set" -msgstr "Nicht gesetzt" - -#: bookwyrm/templates/user_admin/user_info.html:16 -#, fuzzy -#| msgid "User Profile" -msgid "View user profile" -msgstr "Benutzerprofil" - -#: bookwyrm/templates/user_admin/user_info.html:36 -msgid "Local" -msgstr "Lokal" - -#: bookwyrm/templates/user_admin/user_info.html:38 -#, fuzzy -#| msgid "Remove" -msgid "Remote" -msgstr "Entfernen" - -#: bookwyrm/templates/user_admin/user_info.html:47 -msgid "User details" -msgstr "" - -#: bookwyrm/templates/user_admin/user_info.html:52 -#, fuzzy -#| msgid "Email address:" -msgid "Email:" -msgstr "E-Mail Adresse" - -#: bookwyrm/templates/user_admin/user_info.html:64 -msgid "(View reports)" -msgstr "" - -#: bookwyrm/templates/user_admin/user_info.html:72 -#, fuzzy -#| msgid "Blocked Users" -msgid "Blocked by count:" -msgstr "Blockierte Nutzer*innen" - -#: bookwyrm/templates/user_admin/user_info.html:77 -#, fuzzy -#| msgid "Birth date:" -msgid "Last active date:" -msgstr "Geburtsdatum:" - -#: bookwyrm/templates/user_admin/user_info.html:82 -#, fuzzy -#| msgid "Manually approve followers:" -msgid "Manually approved followers:" -msgstr "Folgende manuell bestätigen" - -#: bookwyrm/templates/user_admin/user_info.html:87 -#, fuzzy -#| msgid "Discard" -msgid "Discoverable:" -msgstr "Ablehnen" - -#: bookwyrm/templates/user_admin/user_info.html:93 -#, fuzzy -#| msgid "Deactivate user" -msgid "Deactivation reason:" -msgstr "Nutzer:in deaktivieren" - -#: bookwyrm/templates/user_admin/user_info.html:111 -#, fuzzy -#| msgid "Instance Settings" -msgid "Instance details" -msgstr "Instanzeinstellungen" - -#: bookwyrm/templates/user_admin/user_info.html:137 -msgid "View instance" -msgstr "" - -#: bookwyrm/templates/user_admin/user_moderation_actions.html:5 -msgid "Permanently deleted" -msgstr "Permanent gelöscht" - -#: bookwyrm/templates/user_admin/user_moderation_actions.html:20 -msgid "Suspend user" -msgstr "" - -#: bookwyrm/templates/user_admin/user_moderation_actions.html:25 -msgid "Un-suspend user" -msgstr "" - -#: bookwyrm/templates/user_admin/user_moderation_actions.html:47 -msgid "Access level:" -msgstr "" - #: bookwyrm/templates/widgets/clearable_file_input_with_warning.html:28 msgid "File exceeds maximum size: 10MB" msgstr "" @@ -3873,7 +3999,7 @@ msgstr "" msgid "Not a valid csv file" msgstr "E-Mail Adresse" -#: bookwyrm/views/login.py:70 +#: bookwyrm/views/login.py:68 msgid "Username or password are incorrect" msgstr "Username oder Passwort sind falsch" @@ -3884,8 +4010,9 @@ msgid "No user with that email address was found." msgstr "Dieser Benutzename ist bereits vergeben." #: bookwyrm/views/password.py:41 -#, python-format -msgid "A password reset link sent to %s" +#, fuzzy, python-brace-format +#| msgid "A password reset link sent to %s" +msgid "A password reset link sent to {email}" msgstr "Ein Passwortwiederherstellungslinl wurde zu %s gesendet" #: bookwyrm/views/rss_feed.py:34 @@ -3893,6 +4020,21 @@ msgstr "Ein Passwortwiederherstellungslinl wurde zu %s gesendet" msgid "Status updates from {obj.display_name}" msgstr "Status updates von {obj.display_name}" +#~ msgid "Update shelf" +#~ msgstr "Regal aktualisieren" + +#~ msgid "%(count)d uses" +#~ msgstr "%(count)d Benutzungen" + +#~ msgid "This instance is closed" +#~ msgstr "Diese Instanz ist geschlossen" + +#~ msgid "Contact an administrator to get an invite" +#~ msgstr "Kontaktiere für eine Einladung eine*n Admin" + +#~ msgid "Spoiler alert:" +#~ msgstr "Spoileralarm:" + #, fuzzy #~| msgid "Federated" #~ msgid "Date federated" @@ -4025,11 +4167,6 @@ msgstr "Status updates von {obj.display_name}" #~ msgid "IPv4 address" #~ msgstr "E-Mail Adresse" -#, fuzzy -#~| msgid "Email address:" -#~ msgid "IP address" -#~ msgstr "E-Mail Adresse" - #, fuzzy #~| msgid "No active invites" #~ msgid "Positive integer" diff --git a/locale/en_US/LC_MESSAGES/django.po b/locale/en_US/LC_MESSAGES/django.po index 8cd8a7f7..5a9a88b0 100644 --- a/locale/en_US/LC_MESSAGES/django.po +++ b/locale/en_US/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-12 17:16+0000\n" +"POT-Creation-Date: 2021-09-29 18:32+0000\n" "PO-Revision-Date: 2021-02-28 17:19-0800\n" "Last-Translator: Mouse Reeve \n" "Language-Team: English \n" @@ -18,59 +18,58 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: bookwyrm/forms.py:242 +#: bookwyrm/forms.py:241 msgid "A user with this email already exists." msgstr "" -#: bookwyrm/forms.py:256 +#: bookwyrm/forms.py:255 msgid "One Day" msgstr "" -#: bookwyrm/forms.py:257 +#: bookwyrm/forms.py:256 msgid "One Week" msgstr "" -#: bookwyrm/forms.py:258 +#: bookwyrm/forms.py:257 msgid "One Month" msgstr "" -#: bookwyrm/forms.py:259 +#: bookwyrm/forms.py:258 msgid "Does Not Expire" msgstr "" -#: bookwyrm/forms.py:264 -#, python-format -msgid "%(count)d uses" +#: bookwyrm/forms.py:262 +#, python-brace-format +msgid "{i} uses" msgstr "" -#: bookwyrm/forms.py:267 +#: bookwyrm/forms.py:263 msgid "Unlimited" msgstr "" -#: bookwyrm/forms.py:323 +#: bookwyrm/forms.py:325 msgid "List Order" msgstr "" -#: bookwyrm/forms.py:324 +#: bookwyrm/forms.py:326 msgid "Book Title" msgstr "" -#: bookwyrm/forms.py:325 +#: bookwyrm/forms.py:327 bookwyrm/templates/shelf/shelf.html:134 +#: bookwyrm/templates/shelf/shelf.html:165 #: bookwyrm/templates/snippets/create_status/review.html:33 -#: bookwyrm/templates/user/shelf/shelf.html:117 -#: bookwyrm/templates/user/shelf/shelf.html:148 msgid "Rating" msgstr "" -#: bookwyrm/forms.py:327 bookwyrm/templates/lists/list.html:107 +#: bookwyrm/forms.py:329 bookwyrm/templates/lists/list.html:109 msgid "Sort By" msgstr "" -#: bookwyrm/forms.py:331 +#: bookwyrm/forms.py:333 msgid "Ascending" msgstr "" -#: bookwyrm/forms.py:332 +#: bookwyrm/forms.py:334 msgid "Descending" msgstr "" @@ -82,36 +81,56 @@ msgstr "" msgid "Could not find a match for book" msgstr "" -#: bookwyrm/models/base_model.py:13 +#: bookwyrm/models/base_model.py:16 msgid "Pending" msgstr "" -#: bookwyrm/models/base_model.py:14 +#: bookwyrm/models/base_model.py:17 msgid "Self deletion" msgstr "" -#: bookwyrm/models/base_model.py:15 +#: bookwyrm/models/base_model.py:18 msgid "Moderator suspension" msgstr "" -#: bookwyrm/models/base_model.py:16 +#: bookwyrm/models/base_model.py:19 msgid "Moderator deletion" msgstr "" -#: bookwyrm/models/base_model.py:17 +#: bookwyrm/models/base_model.py:20 msgid "Domain block" msgstr "" +#: bookwyrm/models/book.py:232 +msgid "Audiobook" +msgstr "" + +#: bookwyrm/models/book.py:233 +msgid "eBook" +msgstr "" + +#: bookwyrm/models/book.py:234 +msgid "Graphic novel" +msgstr "" + +#: bookwyrm/models/book.py:235 +msgid "Hardcover" +msgstr "" + +#: bookwyrm/models/book.py:236 +msgid "Paperback" +msgstr "" + #: bookwyrm/models/federated_server.py:11 -#: bookwyrm/templates/settings/edit_server.html:40 -#: bookwyrm/templates/settings/federation.html:19 +#: bookwyrm/templates/settings/federation/edit_instance.html:42 +#: bookwyrm/templates/settings/federation/instance_list.html:19 msgid "Federated" msgstr "" #: bookwyrm/models/federated_server.py:12 -#: bookwyrm/templates/settings/edit_server.html:41 -#: bookwyrm/templates/settings/federated_server.html:10 -#: bookwyrm/templates/settings/federation.html:23 +#: bookwyrm/templates/settings/federation/edit_instance.html:43 +#: bookwyrm/templates/settings/federation/instance.html:10 +#: bookwyrm/templates/settings/federation/instance_list.html:23 msgid "Blocked" msgstr "" @@ -125,7 +144,7 @@ msgstr "" msgid "%(value)s is not a valid username" msgstr "" -#: bookwyrm/models/fields.py:181 bookwyrm/templates/layout.html:164 +#: bookwyrm/models/fields.py:181 bookwyrm/templates/layout.html:171 msgid "username" msgstr "" @@ -133,45 +152,45 @@ msgstr "" msgid "A user with that username already exists." msgstr "" -#: bookwyrm/settings.py:115 +#: bookwyrm/settings.py:116 msgid "Home Timeline" msgstr "" -#: bookwyrm/settings.py:115 +#: bookwyrm/settings.py:116 msgid "Home" msgstr "" -#: bookwyrm/settings.py:116 +#: bookwyrm/settings.py:117 msgid "Books Timeline" msgstr "" -#: bookwyrm/settings.py:116 bookwyrm/templates/search/layout.html:21 +#: bookwyrm/settings.py:117 bookwyrm/templates/search/layout.html:21 #: bookwyrm/templates/search/layout.html:42 #: bookwyrm/templates/user/layout.html:81 msgid "Books" msgstr "" -#: bookwyrm/settings.py:162 +#: bookwyrm/settings.py:163 msgid "English" msgstr "" -#: bookwyrm/settings.py:163 +#: bookwyrm/settings.py:164 msgid "German" msgstr "" -#: bookwyrm/settings.py:164 +#: bookwyrm/settings.py:165 msgid "Spanish" msgstr "" -#: bookwyrm/settings.py:165 +#: bookwyrm/settings.py:166 msgid "French" msgstr "" -#: bookwyrm/settings.py:166 +#: bookwyrm/settings.py:167 msgid "Simplified Chinese" msgstr "" -#: bookwyrm/settings.py:167 +#: bookwyrm/settings.py:168 msgid "Traditional Chinese" msgstr "" @@ -265,9 +284,7 @@ msgid "Metadata" msgstr "" #: bookwyrm/templates/author/edit_author.html:33 -#: bookwyrm/templates/lists/form.html:8 -#: bookwyrm/templates/user/shelf/create_shelf_form.html:13 -#: bookwyrm/templates/user/shelf/edit_shelf_form.html:14 +#: bookwyrm/templates/lists/form.html:8 bookwyrm/templates/shelf/form.html:9 msgid "Name:" msgstr "" @@ -303,7 +320,7 @@ msgid "Openlibrary key:" msgstr "" #: bookwyrm/templates/author/edit_author.html:89 -#: bookwyrm/templates/book/edit_book.html:300 +#: bookwyrm/templates/book/edit_book.html:313 msgid "Inventaire ID:" msgstr "" @@ -317,32 +334,30 @@ msgstr "" #: bookwyrm/templates/author/edit_author.html:116 #: bookwyrm/templates/book/book.html:140 -#: bookwyrm/templates/book/edit_book.html:328 +#: bookwyrm/templates/book/edit_book.html:341 #: bookwyrm/templates/book/readthrough.html:76 #: bookwyrm/templates/lists/bookmark_button.html:15 #: bookwyrm/templates/lists/form.html:44 -#: bookwyrm/templates/preferences/edit_user.html:80 -#: bookwyrm/templates/settings/announcement_form.html:69 -#: bookwyrm/templates/settings/edit_server.html:68 -#: bookwyrm/templates/settings/federated_server.html:98 -#: bookwyrm/templates/settings/site.html:113 -#: bookwyrm/templates/snippets/reading_modals/layout.html:16 -#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:42 -#: bookwyrm/templates/user_admin/user_moderation_actions.html:64 +#: bookwyrm/templates/preferences/edit_user.html:118 +#: bookwyrm/templates/settings/announcements/announcement_form.html:69 +#: bookwyrm/templates/settings/federation/edit_instance.html:74 +#: bookwyrm/templates/settings/federation/instance.html:87 +#: bookwyrm/templates/settings/site.html:134 +#: bookwyrm/templates/settings/users/user_moderation_actions.html:64 +#: bookwyrm/templates/shelf/form.html:25 +#: bookwyrm/templates/snippets/reading_modals/layout.html:18 msgid "Save" msgstr "" #: bookwyrm/templates/author/edit_author.html:117 #: bookwyrm/templates/book/book.html:141 bookwyrm/templates/book/book.html:190 #: bookwyrm/templates/book/cover_modal.html:32 -#: bookwyrm/templates/book/edit_book.html:329 +#: bookwyrm/templates/book/edit_book.html:342 #: bookwyrm/templates/book/readthrough.html:77 #: bookwyrm/templates/lists/delete_list_modal.html:17 -#: bookwyrm/templates/moderation/report_modal.html:34 -#: bookwyrm/templates/settings/federated_server.html:99 +#: bookwyrm/templates/settings/federation/instance.html:88 #: bookwyrm/templates/snippets/delete_readthrough_modal.html:17 -#: bookwyrm/templates/snippets/goal_form.html:32 -#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:43 +#: bookwyrm/templates/snippets/report_modal.html:34 msgid "Cancel" msgstr "" @@ -379,7 +394,7 @@ msgstr "" #: bookwyrm/templates/book/book.html:136 #: bookwyrm/templates/book/edit_book.html:143 -#: bookwyrm/templates/lists/form.html:12 +#: bookwyrm/templates/lists/form.html:12 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "" @@ -438,7 +453,7 @@ msgstr "" msgid "Places" msgstr "" -#: bookwyrm/templates/book/book.html:292 bookwyrm/templates/layout.html:68 +#: bookwyrm/templates/book/book.html:292 bookwyrm/templates/layout.html:75 #: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12 #: bookwyrm/templates/search/layout.html:25 #: bookwyrm/templates/search/layout.html:50 @@ -452,8 +467,9 @@ msgstr "" #: bookwyrm/templates/book/book.html:313 #: bookwyrm/templates/book/cover_modal.html:31 -#: bookwyrm/templates/lists/list.html:179 -#: bookwyrm/templates/settings/domain_form.html:26 +#: bookwyrm/templates/lists/list.html:181 +#: bookwyrm/templates/settings/email_blocklist/domain_form.html:26 +#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:32 msgid "Add" msgstr "" @@ -462,12 +478,12 @@ msgid "ISBN:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:14 -#: bookwyrm/templates/book/edit_book.html:308 +#: bookwyrm/templates/book/edit_book.html:321 msgid "OCLC Number:" msgstr "" #: bookwyrm/templates/book/book_identifiers.html:21 -#: bookwyrm/templates/book/edit_book.html:316 +#: bookwyrm/templates/book/edit_book.html:329 msgid "ASIN:" msgstr "" @@ -477,7 +493,7 @@ msgid "Upload cover:" msgstr "" #: bookwyrm/templates/book/cover_modal.html:23 -#: bookwyrm/templates/book/edit_book.html:242 +#: bookwyrm/templates/book/edit_book.html:241 msgid "Load cover from url:" msgstr "" @@ -589,11 +605,11 @@ msgid "John Doe, Jane Smith" msgstr "" #: bookwyrm/templates/book/edit_book.html:227 -#: bookwyrm/templates/user/shelf/shelf.html:110 +#: bookwyrm/templates/shelf/shelf.html:127 msgid "Cover" msgstr "" -#: bookwyrm/templates/book/edit_book.html:255 +#: bookwyrm/templates/book/edit_book.html:253 msgid "Physical Properties" msgstr "" @@ -602,23 +618,27 @@ msgstr "" msgid "Format:" msgstr "" -#: bookwyrm/templates/book/edit_book.html:265 +#: bookwyrm/templates/book/edit_book.html:268 +msgid "Format details:" +msgstr "" + +#: bookwyrm/templates/book/edit_book.html:278 msgid "Pages:" msgstr "" -#: bookwyrm/templates/book/edit_book.html:274 +#: bookwyrm/templates/book/edit_book.html:287 msgid "Book Identifiers" msgstr "" -#: bookwyrm/templates/book/edit_book.html:276 +#: bookwyrm/templates/book/edit_book.html:289 msgid "ISBN 13:" msgstr "" -#: bookwyrm/templates/book/edit_book.html:284 +#: bookwyrm/templates/book/edit_book.html:297 msgid "ISBN 10:" msgstr "" -#: bookwyrm/templates/book/edit_book.html:292 +#: bookwyrm/templates/book/edit_book.html:305 msgid "Openlibrary ID:" msgstr "" @@ -749,14 +769,14 @@ msgid "Sorry! We couldn't find that code." msgstr "" #: bookwyrm/templates/confirm_email/confirm_email.html:19 -#: bookwyrm/templates/user_admin/user_info.html:100 +#: bookwyrm/templates/settings/users/user_info.html:85 msgid "Confirmation code:" msgstr "" #: bookwyrm/templates/confirm_email/confirm_email.html:25 -#: bookwyrm/templates/landing/landing_layout.html:70 -#: bookwyrm/templates/moderation/report_modal.html:33 -#: bookwyrm/templates/settings/dashboard.html:93 +#: bookwyrm/templates/landing/layout.html:73 +#: bookwyrm/templates/settings/dashboard/dashboard.html:93 +#: bookwyrm/templates/snippets/report_modal.html:33 msgid "Submit" msgstr "" @@ -769,9 +789,9 @@ msgid "Resend confirmation link" msgstr "" #: bookwyrm/templates/confirm_email/resend_form.html:11 -#: bookwyrm/templates/landing/landing_layout.html:64 +#: bookwyrm/templates/landing/layout.html:67 #: bookwyrm/templates/password_reset_request.html:18 -#: bookwyrm/templates/preferences/edit_user.html:38 +#: bookwyrm/templates/preferences/edit_user.html:56 #: bookwyrm/templates/snippets/register_form.html:13 msgid "Email address:" msgstr "" @@ -794,7 +814,7 @@ msgstr "" #: bookwyrm/templates/directory/directory.html:4 #: bookwyrm/templates/directory/directory.html:9 -#: bookwyrm/templates/layout.html:94 +#: bookwyrm/templates/layout.html:101 msgid "Directory" msgstr "" @@ -808,8 +828,8 @@ msgid "You can opt-out at any time in your profile settings msgstr "" #: bookwyrm/templates/directory/directory.html:29 +#: bookwyrm/templates/feed/goal_card.html:17 #: bookwyrm/templates/snippets/announcement.html:34 -#: bookwyrm/templates/snippets/goal_card.html:22 msgid "Dismiss message" msgstr "" @@ -818,11 +838,11 @@ msgid "Order by" msgstr "" #: bookwyrm/templates/directory/sort_filter.html:8 -msgid "Suggested" +msgid "Recently active" msgstr "" #: bookwyrm/templates/directory/sort_filter.html:9 -msgid "Recently active" +msgid "Suggested" msgstr "" #: bookwyrm/templates/directory/user_card.html:17 @@ -866,7 +886,7 @@ msgstr "" #: bookwyrm/templates/discover/discover.html:4 #: bookwyrm/templates/discover/discover.html:10 -#: bookwyrm/templates/layout.html:71 +#: bookwyrm/templates/layout.html:78 msgid "Discover" msgstr "" @@ -992,7 +1012,7 @@ msgid "Direct Messages with %(username)s" msgstr "" #: bookwyrm/templates/feed/direct_messages.html:10 -#: bookwyrm/templates/layout.html:104 +#: bookwyrm/templates/layout.html:111 msgid "Direct Messages" msgstr "" @@ -1013,12 +1033,24 @@ msgstr "" msgid "There aren't any activities right now! Try following a user to get started" msgstr "" +#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/layout.html:90 +#: bookwyrm/templates/user/goal_form.html:6 +#, python-format +msgid "%(year)s Reading Goal" +msgstr "" + +#: bookwyrm/templates/feed/goal_card.html:18 +#, python-format +msgid "You can set or change your reading goal any time from your profile page" +msgstr "" + #: bookwyrm/templates/feed/layout.html:5 msgid "Updates" msgstr "" #: bookwyrm/templates/feed/layout.html:12 -#: bookwyrm/templates/user/shelf/books_header.html:3 +#: bookwyrm/templates/user/books_header.html:3 msgid "Your books" msgstr "" @@ -1027,28 +1059,22 @@ msgid "There are no books here right now! Try searching for a book to get starte msgstr "" #: bookwyrm/templates/feed/layout.html:25 -#: bookwyrm/templates/user/shelf/shelf.html:38 +#: bookwyrm/templates/shelf/shelf.html:38 msgid "To Read" msgstr "" #: bookwyrm/templates/feed/layout.html:26 -#: bookwyrm/templates/user/shelf/shelf.html:40 +#: bookwyrm/templates/shelf/shelf.html:40 msgid "Currently Reading" msgstr "" #: bookwyrm/templates/feed/layout.html:27 +#: bookwyrm/templates/shelf/shelf.html:42 #: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:23 #: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12 -#: bookwyrm/templates/user/shelf/shelf.html:42 msgid "Read" msgstr "" -#: bookwyrm/templates/feed/layout.html:90 bookwyrm/templates/goal.html:26 -#: bookwyrm/templates/snippets/goal_card.html:6 -#, python-format -msgid "%(year)s Reading Goal" -msgstr "" - #: bookwyrm/templates/feed/suggested_users.html:5 #: bookwyrm/templates/get_started/users.html:6 msgid "Who to follow" @@ -1072,7 +1098,7 @@ msgid "What are you reading?" msgstr "" #: bookwyrm/templates/get_started/books.html:9 -#: bookwyrm/templates/lists/list.html:135 +#: bookwyrm/templates/layout.html:45 bookwyrm/templates/lists/list.html:137 msgid "Search for a book" msgstr "" @@ -1090,8 +1116,8 @@ msgstr "" #: bookwyrm/templates/get_started/books.html:17 #: bookwyrm/templates/get_started/users.html:18 #: bookwyrm/templates/get_started/users.html:19 -#: bookwyrm/templates/layout.html:44 bookwyrm/templates/layout.html:45 -#: bookwyrm/templates/lists/list.html:139 +#: bookwyrm/templates/layout.html:51 bookwyrm/templates/layout.html:52 +#: bookwyrm/templates/lists/list.html:141 #: bookwyrm/templates/search/layout.html:4 #: bookwyrm/templates/search/layout.html:9 msgid "Search" @@ -1107,7 +1133,7 @@ msgid "Popular on %(site_name)s" msgstr "" #: bookwyrm/templates/get_started/books.html:58 -#: bookwyrm/templates/lists/list.html:152 +#: bookwyrm/templates/lists/list.html:154 msgid "No books found" msgstr "" @@ -1117,7 +1143,7 @@ msgid "Save & continue" msgstr "" #: bookwyrm/templates/get_started/layout.html:5 -#: bookwyrm/templates/landing/landing_layout.html:5 +#: bookwyrm/templates/landing/layout.html:5 msgid "Welcome" msgstr "" @@ -1152,12 +1178,12 @@ msgid "Finish" msgstr "" #: bookwyrm/templates/get_started/profile.html:15 -#: bookwyrm/templates/preferences/edit_user.html:24 +#: bookwyrm/templates/preferences/edit_user.html:42 msgid "Display name:" msgstr "" #: bookwyrm/templates/get_started/profile.html:22 -#: bookwyrm/templates/preferences/edit_user.html:31 +#: bookwyrm/templates/preferences/edit_user.html:49 msgid "Summary:" msgstr "" @@ -1166,17 +1192,17 @@ msgid "A little bit about you" msgstr "" #: bookwyrm/templates/get_started/profile.html:32 -#: bookwyrm/templates/preferences/edit_user.html:17 +#: bookwyrm/templates/preferences/edit_user.html:27 msgid "Avatar:" msgstr "" #: bookwyrm/templates/get_started/profile.html:42 -#: bookwyrm/templates/preferences/edit_user.html:62 +#: bookwyrm/templates/preferences/edit_user.html:104 msgid "Manually approve followers:" msgstr "" #: bookwyrm/templates/get_started/profile.html:48 -#: bookwyrm/templates/preferences/edit_user.html:54 +#: bookwyrm/templates/preferences/edit_user.html:80 msgid "Show this account in suggested users:" msgstr "" @@ -1193,39 +1219,9 @@ msgstr "" msgid "No users found for \"%(query)s\"" msgstr "" -#: bookwyrm/templates/goal.html:7 -#, python-format -msgid "%(year)s Reading Progress" -msgstr "" - -#: bookwyrm/templates/goal.html:11 -msgid "Edit Goal" -msgstr "" - -#: bookwyrm/templates/goal.html:30 -#: bookwyrm/templates/snippets/goal_card.html:13 -#, python-format -msgid "Set a goal for how many books you'll finish reading in %(year)s, and track your progress throughout the year." -msgstr "" - -#: bookwyrm/templates/goal.html:39 -#, python-format -msgid "%(name)s hasn't set a reading goal for %(year)s." -msgstr "" - -#: bookwyrm/templates/goal.html:51 -#, python-format -msgid "Your %(year)s Books" -msgstr "" - -#: bookwyrm/templates/goal.html:53 -#, python-format -msgid "%(username)s's %(year)s Books" -msgstr "" - #: bookwyrm/templates/import/import.html:5 #: bookwyrm/templates/import/import.html:9 -#: bookwyrm/templates/user/shelf/shelf.html:57 +#: bookwyrm/templates/shelf/shelf.html:57 msgid "Import Books" msgstr "" @@ -1246,7 +1242,7 @@ msgid "Privacy setting for imported reviews:" msgstr "" #: bookwyrm/templates/import/import.html:56 -#: bookwyrm/templates/settings/server_blocklist.html:64 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:64 msgid "Import" msgstr "" @@ -1322,14 +1318,14 @@ msgid "Book" msgstr "" #: bookwyrm/templates/import/import_status.html:122 -#: bookwyrm/templates/user/shelf/shelf.html:111 -#: bookwyrm/templates/user/shelf/shelf.html:131 +#: bookwyrm/templates/shelf/shelf.html:128 +#: bookwyrm/templates/shelf/shelf.html:148 msgid "Title" msgstr "" #: bookwyrm/templates/import/import_status.html:125 -#: bookwyrm/templates/user/shelf/shelf.html:112 -#: bookwyrm/templates/user/shelf/shelf.html:134 +#: bookwyrm/templates/shelf/shelf.html:129 +#: bookwyrm/templates/shelf/shelf.html:151 msgid "Author" msgstr "" @@ -1341,8 +1337,8 @@ msgstr "" msgid "You can download your GoodReads data from the Import/Export page of your GoodReads account." msgstr "" -#: bookwyrm/templates/invite.html:4 bookwyrm/templates/invite.html:12 -#: bookwyrm/templates/login.html:51 +#: bookwyrm/templates/invite.html:4 bookwyrm/templates/invite.html:8 +#: bookwyrm/templates/login.html:49 msgid "Create an Account" msgstr "" @@ -1373,131 +1369,136 @@ msgstr "" msgid "Recent Books" msgstr "" -#: bookwyrm/templates/landing/landing_layout.html:17 +#: bookwyrm/templates/landing/layout.html:17 msgid "Decentralized" msgstr "" -#: bookwyrm/templates/landing/landing_layout.html:23 +#: bookwyrm/templates/landing/layout.html:23 msgid "Friendly" msgstr "" -#: bookwyrm/templates/landing/landing_layout.html:29 +#: bookwyrm/templates/landing/layout.html:29 msgid "Anti-Corporate" msgstr "" -#: bookwyrm/templates/landing/landing_layout.html:44 +#: bookwyrm/templates/landing/layout.html:45 #, python-format msgid "Join %(name)s" msgstr "" -#: bookwyrm/templates/landing/landing_layout.html:51 -#: bookwyrm/templates/login.html:56 -msgid "This instance is closed" -msgstr "" - -#: bookwyrm/templates/landing/landing_layout.html:57 -msgid "Thank you! Your request has been received." -msgstr "" - -#: bookwyrm/templates/landing/landing_layout.html:60 +#: bookwyrm/templates/landing/layout.html:47 msgid "Request an Invitation" msgstr "" -#: bookwyrm/templates/landing/landing_layout.html:79 +#: bookwyrm/templates/landing/layout.html:49 +#, python-format +msgid "%(name)s registration is closed" +msgstr "" + +#: bookwyrm/templates/landing/layout.html:60 +msgid "Thank you! Your request has been received." +msgstr "" + +#: bookwyrm/templates/landing/layout.html:82 msgid "Your Account" msgstr "" -#: bookwyrm/templates/layout.html:40 -msgid "Search for a book or user" +#: bookwyrm/templates/layout.html:13 +#, python-format +msgid "%(site_name)s search" msgstr "" -#: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/layout.html:43 +msgid "Search for a book, user, or list" +msgstr "" + +#: bookwyrm/templates/layout.html:61 bookwyrm/templates/layout.html:62 msgid "Main navigation menu" msgstr "" -#: bookwyrm/templates/layout.html:65 +#: bookwyrm/templates/layout.html:72 msgid "Feed" msgstr "" -#: bookwyrm/templates/layout.html:99 +#: bookwyrm/templates/layout.html:106 msgid "Your Books" msgstr "" -#: bookwyrm/templates/layout.html:109 +#: bookwyrm/templates/layout.html:116 msgid "Settings" msgstr "" -#: bookwyrm/templates/layout.html:118 +#: bookwyrm/templates/layout.html:125 +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:15 +#: bookwyrm/templates/settings/invites/manage_invites.html:3 +#: bookwyrm/templates/settings/invites/manage_invites.html:15 #: bookwyrm/templates/settings/layout.html:40 -#: bookwyrm/templates/settings/manage_invite_requests.html:15 -#: bookwyrm/templates/settings/manage_invites.html:3 -#: bookwyrm/templates/settings/manage_invites.html:15 msgid "Invites" msgstr "" -#: bookwyrm/templates/layout.html:125 +#: bookwyrm/templates/layout.html:132 msgid "Admin" msgstr "" -#: bookwyrm/templates/layout.html:132 +#: bookwyrm/templates/layout.html:139 msgid "Log out" msgstr "" -#: bookwyrm/templates/layout.html:140 bookwyrm/templates/layout.html:141 +#: bookwyrm/templates/layout.html:147 bookwyrm/templates/layout.html:148 #: bookwyrm/templates/notifications.html:6 #: bookwyrm/templates/notifications.html:11 msgid "Notifications" msgstr "" -#: bookwyrm/templates/layout.html:163 bookwyrm/templates/layout.html:167 -#: bookwyrm/templates/login.html:22 +#: bookwyrm/templates/layout.html:170 bookwyrm/templates/layout.html:174 +#: bookwyrm/templates/login.html:21 #: bookwyrm/templates/snippets/register_form.html:4 msgid "Username:" msgstr "" -#: bookwyrm/templates/layout.html:168 +#: bookwyrm/templates/layout.html:175 msgid "password" msgstr "" -#: bookwyrm/templates/layout.html:169 bookwyrm/templates/login.html:41 +#: bookwyrm/templates/layout.html:176 bookwyrm/templates/login.html:40 msgid "Forgot your password?" msgstr "" -#: bookwyrm/templates/layout.html:172 bookwyrm/templates/login.html:10 -#: bookwyrm/templates/login.html:38 +#: bookwyrm/templates/layout.html:179 bookwyrm/templates/login.html:7 +#: bookwyrm/templates/login.html:37 msgid "Log in" msgstr "" -#: bookwyrm/templates/layout.html:180 +#: bookwyrm/templates/layout.html:187 msgid "Join" msgstr "" -#: bookwyrm/templates/layout.html:214 +#: bookwyrm/templates/layout.html:221 msgid "Successfully posted status" msgstr "" -#: bookwyrm/templates/layout.html:215 +#: bookwyrm/templates/layout.html:222 msgid "Error posting status" msgstr "" -#: bookwyrm/templates/layout.html:223 +#: bookwyrm/templates/layout.html:230 msgid "About this instance" msgstr "" -#: bookwyrm/templates/layout.html:227 +#: bookwyrm/templates/layout.html:234 msgid "Contact site admin" msgstr "" -#: bookwyrm/templates/layout.html:231 +#: bookwyrm/templates/layout.html:238 msgid "Documentation" msgstr "" -#: bookwyrm/templates/layout.html:238 +#: bookwyrm/templates/layout.html:245 #, python-format msgid "Support %(site_name)s on %(support_title)s" msgstr "" -#: bookwyrm/templates/layout.html:242 +#: bookwyrm/templates/layout.html:249 msgid "BookWyrm's source code is freely available. You can contribute or report issues on GitHub." msgstr "" @@ -1553,8 +1554,9 @@ msgid "This action cannot be un-done" msgstr "" #: bookwyrm/templates/lists/delete_list_modal.html:15 -#: bookwyrm/templates/settings/announcement.html:20 -#: bookwyrm/templates/settings/email_blocklist.html:49 +#: bookwyrm/templates/settings/announcements/announcement.html:20 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49 +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:36 #: bookwyrm/templates/snippets/delete_readthrough_modal.html:15 #: bookwyrm/templates/snippets/follow_request_buttons.html:12 msgid "Delete" @@ -1585,9 +1587,8 @@ msgstr "" msgid "Anyone can suggest books, subject to your approval" msgstr "" -#: bookwyrm/templates/lists/form.html:31 -#: bookwyrm/templates/moderation/reports.html:25 -#: bookwyrm/templates/search/book.html:30 +#: bookwyrm/templates/lists/form.html:31 bookwyrm/templates/search/book.html:30 +#: bookwyrm/templates/settings/reports/reports.html:25 #: bookwyrm/templates/snippets/announcement.html:16 msgid "Open" msgstr "" @@ -1596,7 +1597,7 @@ msgstr "" msgid "Anyone can add books to this list" msgstr "" -#: bookwyrm/templates/lists/form.html:49 +#: bookwyrm/templates/lists/form.html:50 msgid "Delete list" msgstr "" @@ -1617,7 +1618,7 @@ msgstr "" msgid "Added by %(username)s" msgstr "" -#: bookwyrm/templates/lists/list.html:74 +#: bookwyrm/templates/lists/list.html:75 msgid "List position" msgstr "" @@ -1625,42 +1626,42 @@ msgstr "" msgid "Set" msgstr "" -#: bookwyrm/templates/lists/list.html:89 +#: bookwyrm/templates/lists/list.html:91 #: bookwyrm/templates/snippets/shelf_selector.html:26 msgid "Remove" msgstr "" -#: bookwyrm/templates/lists/list.html:103 -#: bookwyrm/templates/lists/list.html:120 +#: bookwyrm/templates/lists/list.html:105 +#: bookwyrm/templates/lists/list.html:122 msgid "Sort List" msgstr "" -#: bookwyrm/templates/lists/list.html:113 +#: bookwyrm/templates/lists/list.html:115 msgid "Direction" msgstr "" -#: bookwyrm/templates/lists/list.html:127 +#: bookwyrm/templates/lists/list.html:129 msgid "Add Books" msgstr "" -#: bookwyrm/templates/lists/list.html:129 +#: bookwyrm/templates/lists/list.html:131 msgid "Suggest Books" msgstr "" -#: bookwyrm/templates/lists/list.html:140 +#: bookwyrm/templates/lists/list.html:142 msgid "search" msgstr "" -#: bookwyrm/templates/lists/list.html:146 +#: bookwyrm/templates/lists/list.html:148 msgid "Clear search" msgstr "" -#: bookwyrm/templates/lists/list.html:151 +#: bookwyrm/templates/lists/list.html:153 #, python-format msgid "No books found matching the query \"%(query)s\"" msgstr "" -#: bookwyrm/templates/lists/list.html:179 +#: bookwyrm/templates/lists/list.html:181 msgid "Suggest" msgstr "" @@ -1684,110 +1685,19 @@ msgstr "" msgid "Login" msgstr "" -#: bookwyrm/templates/login.html:16 +#: bookwyrm/templates/login.html:15 msgid "Success! Email address confirmed." msgstr "" -#: bookwyrm/templates/login.html:28 bookwyrm/templates/password_reset.html:17 +#: bookwyrm/templates/login.html:27 bookwyrm/templates/password_reset.html:17 #: bookwyrm/templates/snippets/register_form.html:22 msgid "Password:" msgstr "" -#: bookwyrm/templates/login.html:57 -msgid "Contact an administrator to get an invite" -msgstr "" - -#: bookwyrm/templates/login.html:68 +#: bookwyrm/templates/login.html:62 msgid "More about this site" msgstr "" -#: bookwyrm/templates/moderation/report.html:5 -#: bookwyrm/templates/moderation/report.html:6 -#: bookwyrm/templates/moderation/report_preview.html:6 -#, python-format -msgid "Report #%(report_id)s: %(username)s" -msgstr "" - -#: bookwyrm/templates/moderation/report.html:10 -msgid "Back to reports" -msgstr "" - -#: bookwyrm/templates/moderation/report.html:22 -msgid "Moderator Comments" -msgstr "" - -#: bookwyrm/templates/moderation/report.html:40 -#: bookwyrm/templates/snippets/create_status.html:28 -msgid "Comment" -msgstr "" - -#: bookwyrm/templates/moderation/report.html:45 -msgid "Reported statuses" -msgstr "" - -#: bookwyrm/templates/moderation/report.html:47 -msgid "No statuses reported" -msgstr "" - -#: bookwyrm/templates/moderation/report.html:53 -msgid "Status has been deleted" -msgstr "" - -#: bookwyrm/templates/moderation/report_modal.html:6 -#, python-format -msgid "Report @%(username)s" -msgstr "" - -#: bookwyrm/templates/moderation/report_modal.html:23 -#, python-format -msgid "This report will be sent to %(site_name)s's moderators for review." -msgstr "" - -#: bookwyrm/templates/moderation/report_modal.html:24 -msgid "More info about this report:" -msgstr "" - -#: bookwyrm/templates/moderation/report_preview.html:13 -msgid "No notes provided" -msgstr "" - -#: bookwyrm/templates/moderation/report_preview.html:20 -#, python-format -msgid "Reported by %(username)s" -msgstr "" - -#: bookwyrm/templates/moderation/report_preview.html:30 -msgid "Re-open" -msgstr "" - -#: bookwyrm/templates/moderation/report_preview.html:32 -msgid "Resolve" -msgstr "" - -#: bookwyrm/templates/moderation/reports.html:6 -#, python-format -msgid "Reports: %(instance_name)s" -msgstr "" - -#: bookwyrm/templates/moderation/reports.html:8 -#: bookwyrm/templates/moderation/reports.html:17 -#: bookwyrm/templates/settings/layout.html:55 -msgid "Reports" -msgstr "" - -#: bookwyrm/templates/moderation/reports.html:14 -#, python-format -msgid "Reports: %(instance_name)s" -msgstr "" - -#: bookwyrm/templates/moderation/reports.html:28 -msgid "Resolved" -msgstr "" - -#: bookwyrm/templates/moderation/reports.html:37 -msgid "No reports found." -msgstr "" - #: bookwyrm/templates/notifications.html:16 msgid "Delete notifications" msgstr "" @@ -1928,7 +1838,7 @@ msgstr "" #: bookwyrm/templates/preferences/blocks.html:4 #: bookwyrm/templates/preferences/blocks.html:7 -#: bookwyrm/templates/preferences/layout.html:30 +#: bookwyrm/templates/preferences/layout.html:31 msgid "Blocked Users" msgstr "" @@ -1939,7 +1849,7 @@ msgstr "" #: bookwyrm/templates/preferences/change_password.html:4 #: bookwyrm/templates/preferences/change_password.html:7 #: bookwyrm/templates/preferences/change_password.html:21 -#: bookwyrm/templates/preferences/layout.html:19 +#: bookwyrm/templates/preferences/layout.html:20 msgid "Change Password" msgstr "" @@ -1950,8 +1860,8 @@ msgstr "" #: bookwyrm/templates/preferences/delete_user.html:4 #: bookwyrm/templates/preferences/delete_user.html:7 #: bookwyrm/templates/preferences/delete_user.html:26 -#: bookwyrm/templates/preferences/layout.html:23 -#: bookwyrm/templates/user_admin/delete_user_form.html:23 +#: bookwyrm/templates/preferences/layout.html:24 +#: bookwyrm/templates/settings/users/delete_user_form.html:23 msgid "Delete Account" msgstr "" @@ -1965,40 +1875,52 @@ msgstr "" #: bookwyrm/templates/preferences/edit_user.html:4 #: bookwyrm/templates/preferences/edit_user.html:7 +#: bookwyrm/templates/preferences/layout.html:15 msgid "Edit Profile" msgstr "" -#: bookwyrm/templates/preferences/edit_user.html:46 +#: bookwyrm/templates/preferences/edit_user.html:12 +#: bookwyrm/templates/preferences/edit_user.html:25 +#: bookwyrm/templates/settings/users/user_info.html:7 +msgid "Profile" +msgstr "" + +#: bookwyrm/templates/preferences/edit_user.html:13 +#: bookwyrm/templates/preferences/edit_user.html:68 +msgid "Display preferences" +msgstr "" + +#: bookwyrm/templates/preferences/edit_user.html:14 +#: bookwyrm/templates/preferences/edit_user.html:100 +msgid "Privacy" +msgstr "" + +#: bookwyrm/templates/preferences/edit_user.html:72 msgid "Show reading goal prompt in feed:" msgstr "" -#: bookwyrm/templates/preferences/edit_user.html:50 +#: bookwyrm/templates/preferences/edit_user.html:76 msgid "Show suggested users:" msgstr "" -#: bookwyrm/templates/preferences/edit_user.html:58 +#: bookwyrm/templates/preferences/edit_user.html:85 #, python-format msgid "Your account will show up in the directory, and may be recommended to other BookWyrm users." msgstr "" -#: bookwyrm/templates/preferences/edit_user.html:68 -msgid "Default post privacy:" +#: bookwyrm/templates/preferences/edit_user.html:89 +msgid "Preferred Timezone: " msgstr "" -#: bookwyrm/templates/preferences/edit_user.html:75 -msgid "Preferred Timezone: " +#: bookwyrm/templates/preferences/edit_user.html:110 +msgid "Default post privacy:" msgstr "" #: bookwyrm/templates/preferences/layout.html:11 msgid "Account" msgstr "" -#: bookwyrm/templates/preferences/layout.html:15 -#: bookwyrm/templates/user_admin/user_info.html:7 -msgid "Profile" -msgstr "" - -#: bookwyrm/templates/preferences/layout.html:26 +#: bookwyrm/templates/preferences/layout.html:27 msgid "Relationships" msgstr "" @@ -2039,11 +1961,11 @@ msgstr "" #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:46 -#: bookwyrm/templates/settings/email_blocklist.html:27 -#: bookwyrm/templates/settings/federation.html:44 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:27 +#: bookwyrm/templates/settings/federation/instance_list.html:44 #: bookwyrm/templates/settings/layout.html:34 -#: bookwyrm/templates/user_admin/user_admin.html:3 -#: bookwyrm/templates/user_admin/user_admin.html:10 +#: bookwyrm/templates/settings/users/user_admin.html:3 +#: bookwyrm/templates/settings/users/user_admin.html:10 msgid "Users" msgstr "" @@ -2052,342 +1974,513 @@ msgstr "" msgid "No results found for \"%(query)s\"" msgstr "" -#: bookwyrm/templates/settings/announcement.html:3 -#: bookwyrm/templates/settings/announcement.html:6 +#: bookwyrm/templates/settings/announcements/announcement.html:3 +#: bookwyrm/templates/settings/announcements/announcement.html:6 msgid "Announcement" msgstr "" -#: bookwyrm/templates/settings/announcement.html:7 -#: bookwyrm/templates/settings/federated_server.html:13 +#: bookwyrm/templates/settings/announcements/announcement.html:7 +#: bookwyrm/templates/settings/federation/instance.html:13 msgid "Back to list" msgstr "" -#: bookwyrm/templates/settings/announcement.html:11 -#: bookwyrm/templates/settings/announcement_form.html:6 +#: bookwyrm/templates/settings/announcements/announcement.html:11 +#: bookwyrm/templates/settings/announcements/announcement_form.html:6 msgid "Edit Announcement" msgstr "" -#: bookwyrm/templates/settings/announcement.html:35 +#: bookwyrm/templates/settings/announcements/announcement.html:35 msgid "Visible:" msgstr "" -#: bookwyrm/templates/settings/announcement.html:38 +#: bookwyrm/templates/settings/announcements/announcement.html:38 msgid "True" msgstr "" -#: bookwyrm/templates/settings/announcement.html:40 +#: bookwyrm/templates/settings/announcements/announcement.html:40 msgid "False" msgstr "" -#: bookwyrm/templates/settings/announcement.html:47 -#: bookwyrm/templates/settings/announcement_form.html:40 -#: bookwyrm/templates/settings/dashboard.html:71 +#: bookwyrm/templates/settings/announcements/announcement.html:47 +#: bookwyrm/templates/settings/announcements/announcement_form.html:40 +#: bookwyrm/templates/settings/dashboard/dashboard.html:71 msgid "Start date:" msgstr "" -#: bookwyrm/templates/settings/announcement.html:54 -#: bookwyrm/templates/settings/announcement_form.html:49 -#: bookwyrm/templates/settings/dashboard.html:77 +#: bookwyrm/templates/settings/announcements/announcement.html:54 +#: bookwyrm/templates/settings/announcements/announcement_form.html:49 +#: bookwyrm/templates/settings/dashboard/dashboard.html:77 msgid "End date:" msgstr "" -#: bookwyrm/templates/settings/announcement.html:60 -#: bookwyrm/templates/settings/announcement_form.html:58 +#: bookwyrm/templates/settings/announcements/announcement.html:60 +#: bookwyrm/templates/settings/announcements/announcement_form.html:58 msgid "Active:" msgstr "" -#: bookwyrm/templates/settings/announcement_form.html:8 -#: bookwyrm/templates/settings/announcements.html:8 +#: bookwyrm/templates/settings/announcements/announcement_form.html:8 +#: bookwyrm/templates/settings/announcements/announcements.html:8 msgid "Create Announcement" msgstr "" -#: bookwyrm/templates/settings/announcement_form.html:16 +#: bookwyrm/templates/settings/announcements/announcement_form.html:16 msgid "Preview:" msgstr "" -#: bookwyrm/templates/settings/announcement_form.html:23 +#: bookwyrm/templates/settings/announcements/announcement_form.html:23 msgid "Content:" msgstr "" -#: bookwyrm/templates/settings/announcement_form.html:30 +#: bookwyrm/templates/settings/announcements/announcement_form.html:30 msgid "Event date:" msgstr "" -#: bookwyrm/templates/settings/announcements.html:3 -#: bookwyrm/templates/settings/announcements.html:5 -#: bookwyrm/templates/settings/layout.html:68 +#: bookwyrm/templates/settings/announcements/announcements.html:3 +#: bookwyrm/templates/settings/announcements/announcements.html:5 +#: bookwyrm/templates/settings/layout.html:72 msgid "Announcements" msgstr "" -#: bookwyrm/templates/settings/announcements.html:22 -#: bookwyrm/templates/settings/federation.html:36 +#: bookwyrm/templates/settings/announcements/announcements.html:22 +#: bookwyrm/templates/settings/federation/instance_list.html:36 msgid "Date added" msgstr "" -#: bookwyrm/templates/settings/announcements.html:26 +#: bookwyrm/templates/settings/announcements/announcements.html:26 msgid "Preview" msgstr "" -#: bookwyrm/templates/settings/announcements.html:30 +#: bookwyrm/templates/settings/announcements/announcements.html:30 msgid "Start date" msgstr "" -#: bookwyrm/templates/settings/announcements.html:34 +#: bookwyrm/templates/settings/announcements/announcements.html:34 msgid "End date" msgstr "" -#: bookwyrm/templates/settings/announcements.html:38 -#: bookwyrm/templates/settings/federation.html:46 -#: bookwyrm/templates/settings/manage_invite_requests.html:44 -#: bookwyrm/templates/settings/status_filter.html:5 -#: bookwyrm/templates/user_admin/user_admin.html:34 -#: bookwyrm/templates/user_admin/user_info.html:20 +#: bookwyrm/templates/settings/announcements/announcements.html:38 +#: bookwyrm/templates/settings/federation/instance_list.html:46 +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:44 +#: bookwyrm/templates/settings/invites/status_filter.html:5 +#: bookwyrm/templates/settings/users/user_admin.html:34 +#: bookwyrm/templates/settings/users/user_info.html:20 msgid "Status" msgstr "" -#: bookwyrm/templates/settings/announcements.html:48 +#: bookwyrm/templates/settings/announcements/announcements.html:48 msgid "active" msgstr "" -#: bookwyrm/templates/settings/announcements.html:48 +#: bookwyrm/templates/settings/announcements/announcements.html:48 msgid "inactive" msgstr "" -#: bookwyrm/templates/settings/announcements.html:54 -msgid "No announcements found." +#: bookwyrm/templates/settings/announcements/announcements.html:52 +msgid "No announcements found" msgstr "" -#: bookwyrm/templates/settings/dashboard.html:6 -#: bookwyrm/templates/settings/dashboard.html:8 +#: bookwyrm/templates/settings/dashboard/dashboard.html:6 +#: bookwyrm/templates/settings/dashboard/dashboard.html:8 #: bookwyrm/templates/settings/layout.html:26 msgid "Dashboard" msgstr "" -#: bookwyrm/templates/settings/dashboard.html:15 +#: bookwyrm/templates/settings/dashboard/dashboard.html:15 msgid "Total users" msgstr "" -#: bookwyrm/templates/settings/dashboard.html:21 -#: bookwyrm/templates/settings/dashboard_user_chart.html:12 +#: bookwyrm/templates/settings/dashboard/dashboard.html:21 +#: bookwyrm/templates/settings/dashboard/dashboard_user_chart.html:12 msgid "Active this month" msgstr "" -#: bookwyrm/templates/settings/dashboard.html:27 +#: bookwyrm/templates/settings/dashboard/dashboard.html:27 msgid "Statuses" msgstr "" -#: bookwyrm/templates/settings/dashboard.html:33 +#: bookwyrm/templates/settings/dashboard/dashboard.html:33 msgid "Works" msgstr "" -#: bookwyrm/templates/settings/dashboard.html:43 +#: bookwyrm/templates/settings/dashboard/dashboard.html:43 #, python-format msgid "%(display_count)s open report" msgid_plural "%(display_count)s open reports" msgstr[0] "" msgstr[1] "" -#: bookwyrm/templates/settings/dashboard.html:54 +#: bookwyrm/templates/settings/dashboard/dashboard.html:54 #, python-format msgid "%(display_count)s invite request" msgid_plural "%(display_count)s invite requests" msgstr[0] "" msgstr[1] "" -#: bookwyrm/templates/settings/dashboard.html:65 +#: bookwyrm/templates/settings/dashboard/dashboard.html:65 msgid "Instance Activity" msgstr "" -#: bookwyrm/templates/settings/dashboard.html:83 +#: bookwyrm/templates/settings/dashboard/dashboard.html:83 msgid "Interval:" msgstr "" -#: bookwyrm/templates/settings/dashboard.html:86 +#: bookwyrm/templates/settings/dashboard/dashboard.html:87 msgid "Days" msgstr "" -#: bookwyrm/templates/settings/dashboard.html:87 +#: bookwyrm/templates/settings/dashboard/dashboard.html:88 msgid "Weeks" msgstr "" -#: bookwyrm/templates/settings/dashboard.html:100 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "User signup activity" msgstr "" -#: bookwyrm/templates/settings/dashboard.html:106 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 msgid "Status activity" msgstr "" -#: bookwyrm/templates/settings/dashboard_status_chart.html:7 +#: bookwyrm/templates/settings/dashboard/dashboard_status_chart.html:7 msgid "Statuses posted" msgstr "" -#: bookwyrm/templates/settings/dashboard_user_chart.html:7 +#: bookwyrm/templates/settings/dashboard/dashboard_user_chart.html:7 msgid "Total" msgstr "" -#: bookwyrm/templates/settings/domain_form.html:5 -#: bookwyrm/templates/settings/email_blocklist.html:10 +#: bookwyrm/templates/settings/email_blocklist/domain_form.html:5 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:10 msgid "Add domain" msgstr "" -#: bookwyrm/templates/settings/domain_form.html:11 +#: bookwyrm/templates/settings/email_blocklist/domain_form.html:11 msgid "Domain:" msgstr "" -#: bookwyrm/templates/settings/edit_server.html:3 -#: bookwyrm/templates/settings/edit_server.html:6 -#: bookwyrm/templates/settings/edit_server.html:20 -#: bookwyrm/templates/settings/federation.html:9 -#: bookwyrm/templates/settings/federation.html:10 -#: bookwyrm/templates/settings/server_blocklist.html:3 -#: bookwyrm/templates/settings/server_blocklist.html:20 -msgid "Add instance" -msgstr "" - -#: bookwyrm/templates/settings/edit_server.html:7 -#: bookwyrm/templates/settings/server_blocklist.html:7 -msgid "Back to instance list" -msgstr "" - -#: bookwyrm/templates/settings/edit_server.html:16 -#: bookwyrm/templates/settings/server_blocklist.html:16 -msgid "Import block list" -msgstr "" - -#: bookwyrm/templates/settings/edit_server.html:30 -msgid "Instance:" -msgstr "" - -#: bookwyrm/templates/settings/edit_server.html:37 -#: bookwyrm/templates/settings/federated_server.html:31 -#: bookwyrm/templates/user_admin/user_info.html:125 -msgid "Status:" -msgstr "" - -#: bookwyrm/templates/settings/edit_server.html:48 -#: bookwyrm/templates/settings/federated_server.html:23 -#: bookwyrm/templates/user_admin/user_info.html:117 -msgid "Software:" -msgstr "" - -#: bookwyrm/templates/settings/edit_server.html:55 -#: bookwyrm/templates/settings/federated_server.html:27 -#: bookwyrm/templates/user_admin/user_info.html:121 -msgid "Version:" -msgstr "" - -#: bookwyrm/templates/settings/edit_server.html:64 -msgid "Notes:" -msgstr "" - -#: bookwyrm/templates/settings/email_blocklist.html:5 -#: bookwyrm/templates/settings/email_blocklist.html:7 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:5 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:7 #: bookwyrm/templates/settings/layout.html:59 msgid "Email Blocklist" msgstr "" -#: bookwyrm/templates/settings/email_blocklist.html:18 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:18 msgid "When someone tries to register with an email from this domain, no account will be created. The registration process will appear to have worked." msgstr "" -#: bookwyrm/templates/settings/email_blocklist.html:25 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:25 msgid "Domain" msgstr "" -#: bookwyrm/templates/settings/email_blocklist.html:29 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:29 +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:27 msgid "Options" msgstr "" -#: bookwyrm/templates/settings/email_blocklist.html:38 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:38 #, python-format msgid "%(display_count)s user" msgid_plural "%(display_count)s users" msgstr[0] "" msgstr[1] "" -#: bookwyrm/templates/settings/federated_server.html:19 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:59 +msgid "No email domains currently blocked" +msgstr "" + +#: bookwyrm/templates/settings/federation/edit_instance.html:3 +#: bookwyrm/templates/settings/federation/edit_instance.html:6 +#: bookwyrm/templates/settings/federation/edit_instance.html:20 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:3 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:20 +#: bookwyrm/templates/settings/federation/instance_list.html:9 +#: bookwyrm/templates/settings/federation/instance_list.html:10 +msgid "Add instance" +msgstr "" + +#: bookwyrm/templates/settings/federation/edit_instance.html:7 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:7 +msgid "Back to instance list" +msgstr "" + +#: bookwyrm/templates/settings/federation/edit_instance.html:16 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:16 +msgid "Import block list" +msgstr "" + +#: bookwyrm/templates/settings/federation/edit_instance.html:30 +msgid "Instance:" +msgstr "" + +#: bookwyrm/templates/settings/federation/edit_instance.html:39 +#: bookwyrm/templates/settings/federation/instance.html:28 +#: bookwyrm/templates/settings/users/user_info.html:106 +msgid "Status:" +msgstr "" + +#: bookwyrm/templates/settings/federation/edit_instance.html:52 +#: bookwyrm/templates/settings/federation/instance.html:22 +#: bookwyrm/templates/settings/users/user_info.html:100 +msgid "Software:" +msgstr "" + +#: bookwyrm/templates/settings/federation/edit_instance.html:61 +#: bookwyrm/templates/settings/federation/instance.html:25 +#: bookwyrm/templates/settings/users/user_info.html:103 +msgid "Version:" +msgstr "" + +#: bookwyrm/templates/settings/federation/edit_instance.html:70 +msgid "Notes:" +msgstr "" + +#: bookwyrm/templates/settings/federation/instance.html:19 msgid "Details" msgstr "" -#: bookwyrm/templates/settings/federated_server.html:39 +#: bookwyrm/templates/settings/federation/instance.html:35 #: bookwyrm/templates/user/layout.html:63 msgid "Activity" msgstr "" -#: bookwyrm/templates/settings/federated_server.html:43 +#: bookwyrm/templates/settings/federation/instance.html:38 msgid "Users:" msgstr "" -#: bookwyrm/templates/settings/federated_server.html:46 -#: bookwyrm/templates/settings/federated_server.html:53 +#: bookwyrm/templates/settings/federation/instance.html:41 +#: bookwyrm/templates/settings/federation/instance.html:47 msgid "View all" msgstr "" -#: bookwyrm/templates/settings/federated_server.html:50 -#: bookwyrm/templates/user_admin/user_info.html:59 +#: bookwyrm/templates/settings/federation/instance.html:44 +#: bookwyrm/templates/settings/users/user_info.html:56 msgid "Reports:" msgstr "" -#: bookwyrm/templates/settings/federated_server.html:57 +#: bookwyrm/templates/settings/federation/instance.html:50 msgid "Followed by us:" msgstr "" -#: bookwyrm/templates/settings/federated_server.html:63 +#: bookwyrm/templates/settings/federation/instance.html:55 msgid "Followed by them:" msgstr "" -#: bookwyrm/templates/settings/federated_server.html:69 +#: bookwyrm/templates/settings/federation/instance.html:60 msgid "Blocked by us:" msgstr "" -#: bookwyrm/templates/settings/federated_server.html:82 -#: bookwyrm/templates/user_admin/user_info.html:130 +#: bookwyrm/templates/settings/federation/instance.html:72 +#: bookwyrm/templates/settings/users/user_info.html:110 msgid "Notes" msgstr "" -#: bookwyrm/templates/settings/federated_server.html:85 +#: bookwyrm/templates/settings/federation/instance.html:75 msgid "Edit" msgstr "" -#: bookwyrm/templates/settings/federated_server.html:105 -#: bookwyrm/templates/user_admin/user_moderation_actions.html:8 +#: bookwyrm/templates/settings/federation/instance.html:79 +msgid "No notes" +msgstr "" + +#: bookwyrm/templates/settings/federation/instance.html:94 +#: bookwyrm/templates/settings/users/user_moderation_actions.html:8 msgid "Actions" msgstr "" -#: bookwyrm/templates/settings/federated_server.html:109 +#: bookwyrm/templates/settings/federation/instance.html:98 #: bookwyrm/templates/snippets/block_button.html:5 msgid "Block" msgstr "" -#: bookwyrm/templates/settings/federated_server.html:110 +#: bookwyrm/templates/settings/federation/instance.html:99 msgid "All users from this instance will be deactivated." msgstr "" -#: bookwyrm/templates/settings/federated_server.html:115 +#: bookwyrm/templates/settings/federation/instance.html:104 #: bookwyrm/templates/snippets/block_button.html:10 msgid "Un-block" msgstr "" -#: bookwyrm/templates/settings/federated_server.html:116 +#: bookwyrm/templates/settings/federation/instance.html:105 msgid "All users from this instance will be re-activated." msgstr "" -#: bookwyrm/templates/settings/federation.html:3 -#: bookwyrm/templates/settings/federation.html:5 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:6 +msgid "Import Blocklist" +msgstr "" + +#: bookwyrm/templates/settings/federation/instance_blocklist.html:26 +#: bookwyrm/templates/snippets/goal_progress.html:7 +msgid "Success!" +msgstr "" + +#: bookwyrm/templates/settings/federation/instance_blocklist.html:30 +msgid "Successfully blocked:" +msgstr "" + +#: bookwyrm/templates/settings/federation/instance_blocklist.html:32 +msgid "Failed:" +msgstr "" + +#: bookwyrm/templates/settings/federation/instance_list.html:3 +#: bookwyrm/templates/settings/federation/instance_list.html:5 #: bookwyrm/templates/settings/layout.html:45 msgid "Federated Instances" msgstr "" -#: bookwyrm/templates/settings/federation.html:32 -#: bookwyrm/templates/user_admin/server_filter.html:5 +#: bookwyrm/templates/settings/federation/instance_list.html:32 +#: bookwyrm/templates/settings/users/server_filter.html:5 msgid "Instance name" msgstr "" -#: bookwyrm/templates/settings/federation.html:40 +#: bookwyrm/templates/settings/federation/instance_list.html:40 msgid "Software" msgstr "" +#: bookwyrm/templates/settings/federation/instance_list.html:63 +msgid "No instances found" +msgstr "" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:4 +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:11 +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:25 +#: bookwyrm/templates/settings/invites/manage_invites.html:11 +msgid "Invite Requests" +msgstr "" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:23 +msgid "Ignored Invite Requests" +msgstr "" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:35 +msgid "Date requested" +msgstr "" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:39 +msgid "Date accepted" +msgstr "" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:42 +msgid "Email" +msgstr "" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:47 +msgid "Action" +msgstr "" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:50 +msgid "No requests" +msgstr "" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:59 +#: bookwyrm/templates/settings/invites/status_filter.html:16 +msgid "Accepted" +msgstr "" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:61 +#: bookwyrm/templates/settings/invites/status_filter.html:12 +msgid "Sent" +msgstr "" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:63 +#: bookwyrm/templates/settings/invites/status_filter.html:8 +msgid "Requested" +msgstr "" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:73 +msgid "Send invite" +msgstr "" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:75 +msgid "Re-send invite" +msgstr "" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:95 +msgid "Ignore" +msgstr "" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:97 +msgid "Un-ignore" +msgstr "" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:108 +msgid "Back to pending requests" +msgstr "" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:110 +msgid "View ignored requests" +msgstr "" + +#: bookwyrm/templates/settings/invites/manage_invites.html:21 +msgid "Generate New Invite" +msgstr "" + +#: bookwyrm/templates/settings/invites/manage_invites.html:27 +msgid "Expiry:" +msgstr "" + +#: bookwyrm/templates/settings/invites/manage_invites.html:33 +msgid "Use limit:" +msgstr "" + +#: bookwyrm/templates/settings/invites/manage_invites.html:40 +msgid "Create Invite" +msgstr "" + +#: bookwyrm/templates/settings/invites/manage_invites.html:47 +msgid "Link" +msgstr "" + +#: bookwyrm/templates/settings/invites/manage_invites.html:48 +msgid "Expires" +msgstr "" + +#: bookwyrm/templates/settings/invites/manage_invites.html:49 +msgid "Max uses" +msgstr "" + +#: bookwyrm/templates/settings/invites/manage_invites.html:50 +msgid "Times used" +msgstr "" + +#: bookwyrm/templates/settings/invites/manage_invites.html:53 +msgid "No active invites" +msgstr "" + +#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:5 +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:10 +msgid "Add IP address" +msgstr "" + +#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:11 +msgid "Use IP address blocks with caution, and consider using blocks only temporarily, as IP addresses are often shared or change hands. If you block your own IP, you will not be able to access this page." +msgstr "" + +#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:18 +msgid "IP Address:" +msgstr "" + +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:5 +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:7 +#: bookwyrm/templates/settings/layout.html:63 +msgid "IP Address Blocklist" +msgstr "" + +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:18 +msgid "Any traffic from this IP address will get a 404 response when trying to access any part of the application." +msgstr "" + +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:24 +msgid "Address" +msgstr "" + +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:46 +msgid "No IP addresses currently blocked" +msgstr "" + +#: bookwyrm/templates/settings/ip_blocklist/ip_tooltip.html:6 +msgid "You can block IP ranges using CIDR syntax." +msgstr "" + #: bookwyrm/templates/settings/layout.html:4 msgid "Administration" msgstr "" @@ -2400,235 +2493,373 @@ msgstr "" msgid "Moderation" msgstr "" -#: bookwyrm/templates/settings/layout.html:64 +#: bookwyrm/templates/settings/layout.html:55 +#: bookwyrm/templates/settings/reports/reports.html:8 +#: bookwyrm/templates/settings/reports/reports.html:17 +msgid "Reports" +msgstr "" + +#: bookwyrm/templates/settings/layout.html:68 msgid "Instance Settings" msgstr "" -#: bookwyrm/templates/settings/layout.html:72 +#: bookwyrm/templates/settings/layout.html:76 #: bookwyrm/templates/settings/site.html:4 #: bookwyrm/templates/settings/site.html:6 msgid "Site Settings" msgstr "" -#: bookwyrm/templates/settings/layout.html:75 -#: bookwyrm/templates/settings/site.html:13 +#: bookwyrm/templates/settings/reports/report.html:5 +#: bookwyrm/templates/settings/reports/report.html:8 +#: bookwyrm/templates/settings/reports/report_preview.html:6 +#, python-format +msgid "Report #%(report_id)s: %(username)s" +msgstr "" + +#: bookwyrm/templates/settings/reports/report.html:9 +msgid "Back to reports" +msgstr "" + +#: bookwyrm/templates/settings/reports/report.html:23 +msgid "Moderator Comments" +msgstr "" + +#: bookwyrm/templates/settings/reports/report.html:41 +#: bookwyrm/templates/snippets/create_status.html:28 +msgid "Comment" +msgstr "" + +#: bookwyrm/templates/settings/reports/report.html:46 +msgid "Reported statuses" +msgstr "" + +#: bookwyrm/templates/settings/reports/report.html:48 +msgid "No statuses reported" +msgstr "" + +#: bookwyrm/templates/settings/reports/report.html:54 +msgid "Status has been deleted" +msgstr "" + +#: bookwyrm/templates/settings/reports/report_preview.html:13 +msgid "No notes provided" +msgstr "" + +#: bookwyrm/templates/settings/reports/report_preview.html:20 +#, python-format +msgid "Reported by %(username)s" +msgstr "" + +#: bookwyrm/templates/settings/reports/report_preview.html:30 +msgid "Re-open" +msgstr "" + +#: bookwyrm/templates/settings/reports/report_preview.html:32 +msgid "Resolve" +msgstr "" + +#: bookwyrm/templates/settings/reports/reports.html:6 +#, python-format +msgid "Reports: %(instance_name)s" +msgstr "" + +#: bookwyrm/templates/settings/reports/reports.html:14 +#, python-format +msgid "Reports: %(instance_name)s" +msgstr "" + +#: bookwyrm/templates/settings/reports/reports.html:28 +msgid "Resolved" +msgstr "" + +#: bookwyrm/templates/settings/reports/reports.html:37 +msgid "No reports found." +msgstr "" + +#: bookwyrm/templates/settings/site.html:10 +#: bookwyrm/templates/settings/site.html:21 msgid "Instance Info" msgstr "" -#: bookwyrm/templates/settings/layout.html:76 -#: bookwyrm/templates/settings/site.html:44 +#: bookwyrm/templates/settings/site.html:11 +#: bookwyrm/templates/settings/site.html:54 msgid "Images" msgstr "" -#: bookwyrm/templates/settings/layout.html:77 -#: bookwyrm/templates/settings/site.html:64 +#: bookwyrm/templates/settings/site.html:12 +#: bookwyrm/templates/settings/site.html:74 msgid "Footer Content" msgstr "" -#: bookwyrm/templates/settings/layout.html:78 -#: bookwyrm/templates/settings/site.html:86 +#: bookwyrm/templates/settings/site.html:13 +#: bookwyrm/templates/settings/site.html:98 msgid "Registration" msgstr "" -#: bookwyrm/templates/settings/manage_invite_requests.html:4 -#: bookwyrm/templates/settings/manage_invite_requests.html:11 -#: bookwyrm/templates/settings/manage_invite_requests.html:25 -#: bookwyrm/templates/settings/manage_invites.html:11 -msgid "Invite Requests" -msgstr "" - -#: bookwyrm/templates/settings/manage_invite_requests.html:23 -msgid "Ignored Invite Requests" -msgstr "" - -#: bookwyrm/templates/settings/manage_invite_requests.html:35 -msgid "Date requested" -msgstr "" - -#: bookwyrm/templates/settings/manage_invite_requests.html:39 -msgid "Date accepted" -msgstr "" - -#: bookwyrm/templates/settings/manage_invite_requests.html:42 -msgid "Email" -msgstr "" - -#: bookwyrm/templates/settings/manage_invite_requests.html:47 -msgid "Action" -msgstr "" - -#: bookwyrm/templates/settings/manage_invite_requests.html:50 -msgid "No requests" -msgstr "" - -#: bookwyrm/templates/settings/manage_invite_requests.html:59 -#: bookwyrm/templates/settings/status_filter.html:16 -msgid "Accepted" -msgstr "" - -#: bookwyrm/templates/settings/manage_invite_requests.html:61 -#: bookwyrm/templates/settings/status_filter.html:12 -msgid "Sent" -msgstr "" - -#: bookwyrm/templates/settings/manage_invite_requests.html:63 -#: bookwyrm/templates/settings/status_filter.html:8 -msgid "Requested" -msgstr "" - -#: bookwyrm/templates/settings/manage_invite_requests.html:73 -msgid "Send invite" -msgstr "" - -#: bookwyrm/templates/settings/manage_invite_requests.html:75 -msgid "Re-send invite" -msgstr "" - -#: bookwyrm/templates/settings/manage_invite_requests.html:95 -msgid "Ignore" -msgstr "" - -#: bookwyrm/templates/settings/manage_invite_requests.html:97 -msgid "Un-ignore" -msgstr "" - -#: bookwyrm/templates/settings/manage_invite_requests.html:108 -msgid "Back to pending requests" -msgstr "" - -#: bookwyrm/templates/settings/manage_invite_requests.html:110 -msgid "View ignored requests" -msgstr "" - -#: bookwyrm/templates/settings/manage_invites.html:21 -msgid "Generate New Invite" -msgstr "" - -#: bookwyrm/templates/settings/manage_invites.html:27 -msgid "Expiry:" -msgstr "" - -#: bookwyrm/templates/settings/manage_invites.html:33 -msgid "Use limit:" -msgstr "" - -#: bookwyrm/templates/settings/manage_invites.html:40 -msgid "Create Invite" -msgstr "" - -#: bookwyrm/templates/settings/manage_invites.html:47 -msgid "Link" -msgstr "" - -#: bookwyrm/templates/settings/manage_invites.html:48 -msgid "Expires" -msgstr "" - -#: bookwyrm/templates/settings/manage_invites.html:49 -msgid "Max uses" -msgstr "" - -#: bookwyrm/templates/settings/manage_invites.html:50 -msgid "Times used" -msgstr "" - -#: bookwyrm/templates/settings/manage_invites.html:53 -msgid "No active invites" -msgstr "" - -#: bookwyrm/templates/settings/server_blocklist.html:6 -msgid "Import Blocklist" -msgstr "" - -#: bookwyrm/templates/settings/server_blocklist.html:26 -#: bookwyrm/templates/snippets/goal_progress.html:7 -msgid "Success!" -msgstr "" - -#: bookwyrm/templates/settings/server_blocklist.html:30 -msgid "Successfully blocked:" -msgstr "" - -#: bookwyrm/templates/settings/server_blocklist.html:32 -msgid "Failed:" -msgstr "" - -#: bookwyrm/templates/settings/site.html:15 +#: bookwyrm/templates/settings/site.html:24 msgid "Instance Name:" msgstr "" -#: bookwyrm/templates/settings/site.html:19 +#: bookwyrm/templates/settings/site.html:28 msgid "Tagline:" msgstr "" -#: bookwyrm/templates/settings/site.html:23 +#: bookwyrm/templates/settings/site.html:32 msgid "Instance description:" msgstr "" -#: bookwyrm/templates/settings/site.html:27 +#: bookwyrm/templates/settings/site.html:36 msgid "Short description:" msgstr "" -#: bookwyrm/templates/settings/site.html:28 +#: bookwyrm/templates/settings/site.html:37 msgid "Used when the instance is previewed on joinbookwyrm.com. Does not support html or markdown." msgstr "" -#: bookwyrm/templates/settings/site.html:32 +#: bookwyrm/templates/settings/site.html:41 msgid "Code of conduct:" msgstr "" -#: bookwyrm/templates/settings/site.html:36 +#: bookwyrm/templates/settings/site.html:45 msgid "Privacy Policy:" msgstr "" -#: bookwyrm/templates/settings/site.html:47 +#: bookwyrm/templates/settings/site.html:57 msgid "Logo:" msgstr "" -#: bookwyrm/templates/settings/site.html:51 +#: bookwyrm/templates/settings/site.html:61 msgid "Logo small:" msgstr "" -#: bookwyrm/templates/settings/site.html:55 +#: bookwyrm/templates/settings/site.html:65 msgid "Favicon:" msgstr "" -#: bookwyrm/templates/settings/site.html:66 +#: bookwyrm/templates/settings/site.html:77 msgid "Support link:" msgstr "" -#: bookwyrm/templates/settings/site.html:70 +#: bookwyrm/templates/settings/site.html:81 msgid "Support title:" msgstr "" -#: bookwyrm/templates/settings/site.html:74 +#: bookwyrm/templates/settings/site.html:85 msgid "Admin email:" msgstr "" -#: bookwyrm/templates/settings/site.html:78 +#: bookwyrm/templates/settings/site.html:89 msgid "Additional info:" msgstr "" -#: bookwyrm/templates/settings/site.html:90 +#: bookwyrm/templates/settings/site.html:103 msgid "Allow registration" msgstr "" -#: bookwyrm/templates/settings/site.html:96 +#: bookwyrm/templates/settings/site.html:109 msgid "Allow invite requests" msgstr "" -#: bookwyrm/templates/settings/site.html:102 +#: bookwyrm/templates/settings/site.html:115 msgid "Require users to confirm email address" msgstr "" -#: bookwyrm/templates/settings/site.html:104 +#: bookwyrm/templates/settings/site.html:117 msgid "(Recommended if registration is open)" msgstr "" -#: bookwyrm/templates/settings/site.html:107 +#: bookwyrm/templates/settings/site.html:120 msgid "Registration closed text:" msgstr "" +#: bookwyrm/templates/settings/site.html:124 +msgid "Invite request text:" +msgstr "" + +#: bookwyrm/templates/settings/users/delete_user_form.html:5 +#: bookwyrm/templates/settings/users/user_moderation_actions.html:31 +msgid "Permanently delete user" +msgstr "" + +#: bookwyrm/templates/settings/users/delete_user_form.html:12 +#, python-format +msgid "Are you sure you want to delete %(username)s's account? This action cannot be undone. To proceed, please enter your password to confirm deletion." +msgstr "" + +#: bookwyrm/templates/settings/users/delete_user_form.html:17 +msgid "Your password:" +msgstr "" + +#: bookwyrm/templates/settings/users/user.html:7 +msgid "Back to users" +msgstr "" + +#: bookwyrm/templates/settings/users/user_admin.html:7 +#, python-format +msgid "Users: %(instance_name)s" +msgstr "" + +#: bookwyrm/templates/settings/users/user_admin.html:22 +#: bookwyrm/templates/settings/users/username_filter.html:5 +msgid "Username" +msgstr "" + +#: bookwyrm/templates/settings/users/user_admin.html:26 +msgid "Date Added" +msgstr "" + +#: bookwyrm/templates/settings/users/user_admin.html:30 +msgid "Last Active" +msgstr "" + +#: bookwyrm/templates/settings/users/user_admin.html:38 +msgid "Remote instance" +msgstr "" + +#: bookwyrm/templates/settings/users/user_admin.html:47 +#: bookwyrm/templates/settings/users/user_info.html:24 +msgid "Active" +msgstr "" + +#: bookwyrm/templates/settings/users/user_admin.html:47 +#: bookwyrm/templates/settings/users/user_info.html:28 +msgid "Inactive" +msgstr "" + +#: bookwyrm/templates/settings/users/user_admin.html:52 +#: bookwyrm/templates/settings/users/user_info.html:120 +msgid "Not set" +msgstr "" + +#: bookwyrm/templates/settings/users/user_info.html:16 +msgid "View user profile" +msgstr "" + +#: bookwyrm/templates/settings/users/user_info.html:36 +msgid "Local" +msgstr "" + +#: bookwyrm/templates/settings/users/user_info.html:38 +msgid "Remote" +msgstr "" + +#: bookwyrm/templates/settings/users/user_info.html:47 +msgid "User details" +msgstr "" + +#: bookwyrm/templates/settings/users/user_info.html:51 +msgid "Email:" +msgstr "" + +#: bookwyrm/templates/settings/users/user_info.html:61 +msgid "(View reports)" +msgstr "" + +#: bookwyrm/templates/settings/users/user_info.html:67 +msgid "Blocked by count:" +msgstr "" + +#: bookwyrm/templates/settings/users/user_info.html:70 +msgid "Last active date:" +msgstr "" + +#: bookwyrm/templates/settings/users/user_info.html:73 +msgid "Manually approved followers:" +msgstr "" + +#: bookwyrm/templates/settings/users/user_info.html:76 +msgid "Discoverable:" +msgstr "" + +#: bookwyrm/templates/settings/users/user_info.html:80 +msgid "Deactivation reason:" +msgstr "" + +#: bookwyrm/templates/settings/users/user_info.html:95 +msgid "Instance details" +msgstr "" + +#: bookwyrm/templates/settings/users/user_info.html:117 +msgid "View instance" +msgstr "" + +#: bookwyrm/templates/settings/users/user_moderation_actions.html:5 +msgid "Permanently deleted" +msgstr "" + +#: bookwyrm/templates/settings/users/user_moderation_actions.html:13 +#: bookwyrm/templates/snippets/status/status_options.html:35 +#: bookwyrm/templates/snippets/user_options.html:13 +msgid "Send direct message" +msgstr "" + +#: bookwyrm/templates/settings/users/user_moderation_actions.html:20 +msgid "Suspend user" +msgstr "" + +#: bookwyrm/templates/settings/users/user_moderation_actions.html:25 +msgid "Un-suspend user" +msgstr "" + +#: bookwyrm/templates/settings/users/user_moderation_actions.html:47 +msgid "Access level:" +msgstr "" + +#: bookwyrm/templates/shelf/create_shelf_form.html:5 +msgid "Create Shelf" +msgstr "" + +#: bookwyrm/templates/shelf/edit_shelf_form.html:5 +msgid "Edit Shelf" +msgstr "" + +#: bookwyrm/templates/shelf/shelf.html:28 bookwyrm/views/shelf.py:56 +msgid "All books" +msgstr "" + +#: bookwyrm/templates/shelf/shelf.html:55 +msgid "Create shelf" +msgstr "" + +#: bookwyrm/templates/shelf/shelf.html:77 +#, python-format +msgid "%(formatted_count)s book" +msgid_plural "%(formatted_count)s books" +msgstr[0] "" +msgstr[1] "" + +#: bookwyrm/templates/shelf/shelf.html:84 +#, python-format +msgid "(showing %(start)s-%(end)s)" +msgstr "" + +#: bookwyrm/templates/shelf/shelf.html:96 +msgid "Edit shelf" +msgstr "" + +#: bookwyrm/templates/shelf/shelf.html:104 +msgid "Delete shelf" +msgstr "" + +#: bookwyrm/templates/shelf/shelf.html:130 +#: bookwyrm/templates/shelf/shelf.html:154 +msgid "Shelved" +msgstr "" + +#: bookwyrm/templates/shelf/shelf.html:131 +#: bookwyrm/templates/shelf/shelf.html:158 +msgid "Started" +msgstr "" + +#: bookwyrm/templates/shelf/shelf.html:132 +#: bookwyrm/templates/shelf/shelf.html:161 +msgid "Finished" +msgstr "" + +#: bookwyrm/templates/shelf/shelf.html:187 +msgid "This shelf is empty." +msgstr "" + #: bookwyrm/templates/snippets/announcement.html:31 #, python-format msgid "Posted by %(username)s" @@ -2673,24 +2904,21 @@ msgid "Some thoughts on the book" msgstr "" #: bookwyrm/templates/snippets/create_status/comment.html:26 -#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:16 +#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:15 msgid "Progress:" msgstr "" #: bookwyrm/templates/snippets/create_status/comment.html:52 -#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:30 -#: bookwyrm/templates/snippets/readthrough_form.html:22 +#: bookwyrm/templates/snippets/progress_field.html:18 msgid "pages" msgstr "" #: bookwyrm/templates/snippets/create_status/comment.html:58 -#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:31 -#: bookwyrm/templates/snippets/readthrough_form.html:23 +#: bookwyrm/templates/snippets/progress_field.html:23 msgid "percent" msgstr "" #: bookwyrm/templates/snippets/create_status/comment.html:65 -#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:36 #, python-format msgid "of %(pages)s pages" msgstr "" @@ -2706,11 +2934,11 @@ msgstr "" msgid "Content" msgstr "" -#: bookwyrm/templates/snippets/create_status/content_warning_field.html:3 -msgid "Spoiler alert:" +#: bookwyrm/templates/snippets/create_status/content_warning_field.html:10 +msgid "Content warning:" msgstr "" -#: bookwyrm/templates/snippets/create_status/content_warning_field.html:10 +#: bookwyrm/templates/snippets/create_status/content_warning_field.html:18 msgid "Spoilers ahead!" msgstr "" @@ -2718,7 +2946,7 @@ msgstr "" msgid "Include spoiler alert" msgstr "" -#: bookwyrm/templates/snippets/create_status/layout.html:38 +#: bookwyrm/templates/snippets/create_status/layout.html:41 #: bookwyrm/templates/snippets/reading_modals/form.html:7 msgid "Comment:" msgstr "" @@ -2871,29 +3099,29 @@ msgstr[1] "" msgid "Review of \"%(book_title)s\": %(review_title)s" msgstr "" -#: bookwyrm/templates/snippets/goal_card.html:23 +#: bookwyrm/templates/snippets/goal_form.html:3 #, python-format -msgid "You can set or change your reading goal any time from your profile page" +msgid "Set a goal for how many books you'll finish reading in %(year)s, and track your progress throughout the year." msgstr "" -#: bookwyrm/templates/snippets/goal_form.html:9 +#: bookwyrm/templates/snippets/goal_form.html:12 msgid "Reading goal:" msgstr "" -#: bookwyrm/templates/snippets/goal_form.html:14 +#: bookwyrm/templates/snippets/goal_form.html:17 msgid "books" msgstr "" -#: bookwyrm/templates/snippets/goal_form.html:19 +#: bookwyrm/templates/snippets/goal_form.html:22 msgid "Goal privacy:" msgstr "" -#: bookwyrm/templates/snippets/goal_form.html:26 +#: bookwyrm/templates/snippets/goal_form.html:29 #: bookwyrm/templates/snippets/reading_modals/layout.html:13 msgid "Post to feed" msgstr "" -#: bookwyrm/templates/snippets/goal_form.html:30 +#: bookwyrm/templates/snippets/goal_form.html:33 msgid "Set goal" msgstr "" @@ -2969,18 +3197,18 @@ msgstr "" msgid "Finish \"%(book_title)s\"" msgstr "" -#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:22 +#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:23 #: bookwyrm/templates/snippets/reading_modals/start_reading_modal.html:20 #: bookwyrm/templates/snippets/readthrough_form.html:7 msgid "Started reading" msgstr "" -#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:30 -#: bookwyrm/templates/snippets/readthrough_form.html:30 +#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:31 +#: bookwyrm/templates/snippets/readthrough_form.html:20 msgid "Finished reading" msgstr "" -#: bookwyrm/templates/snippets/reading_modals/form.html:8 +#: bookwyrm/templates/snippets/reading_modals/form.html:9 msgid "(Optional)" msgstr "" @@ -3011,6 +3239,20 @@ msgstr "" msgid "Report" msgstr "" +#: bookwyrm/templates/snippets/report_modal.html:6 +#, python-format +msgid "Report @%(username)s" +msgstr "" + +#: bookwyrm/templates/snippets/report_modal.html:23 +#, python-format +msgid "This report will be sent to %(site_name)s's moderators for review." +msgstr "" + +#: bookwyrm/templates/snippets/report_modal.html:24 +msgid "More info about this report:" +msgstr "" + #: bookwyrm/templates/snippets/search_result_text.html:36 msgid "Import book" msgstr "" @@ -3042,30 +3284,32 @@ msgstr "" msgid "Finish reading" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:73 -#: bookwyrm/templates/snippets/trimmed_text.html:17 -msgid "Show more" +#: bookwyrm/templates/snippets/status/content_status.html:72 +msgid "Content warning" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:88 -#: bookwyrm/templates/snippets/trimmed_text.html:34 -msgid "Show less" +#: bookwyrm/templates/snippets/status/content_status.html:79 +msgid "Show status" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:103 +#: bookwyrm/templates/snippets/status/content_status.html:101 #, python-format msgid "(Page %(page)s)" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:105 +#: bookwyrm/templates/snippets/status/content_status.html:103 #, python-format msgid "(%(percent)s%%)" msgstr "" -#: bookwyrm/templates/snippets/status/content_status.html:127 +#: bookwyrm/templates/snippets/status/content_status.html:125 msgid "Open image in new window" msgstr "" +#: bookwyrm/templates/snippets/status/content_status.html:144 +msgid "Hide status" +msgstr "" + #: bookwyrm/templates/snippets/status/headers/comment.html:2 #, python-format msgid "commented on %(book)s" @@ -3134,12 +3378,6 @@ msgstr "" msgid "Delete & re-draft" msgstr "" -#: bookwyrm/templates/snippets/status/status_options.html:35 -#: bookwyrm/templates/snippets/user_options.html:13 -#: bookwyrm/templates/user_admin/user_moderation_actions.html:13 -msgid "Send direct message" -msgstr "" - #: bookwyrm/templates/snippets/suggested_users.html:16 #, python-format msgid "%(mutuals)s follower you follow" @@ -3171,6 +3409,43 @@ msgstr "" msgid "Sorted descending" msgstr "" +#: bookwyrm/templates/snippets/trimmed_text.html:17 +msgid "Show more" +msgstr "" + +#: bookwyrm/templates/snippets/trimmed_text.html:35 +msgid "Show less" +msgstr "" + +#: bookwyrm/templates/user/books_header.html:5 +#, python-format +msgid "%(username)s's books" +msgstr "" + +#: bookwyrm/templates/user/goal.html:8 +#, python-format +msgid "%(year)s Reading Progress" +msgstr "" + +#: bookwyrm/templates/user/goal.html:12 +msgid "Edit Goal" +msgstr "" + +#: bookwyrm/templates/user/goal.html:28 +#, python-format +msgid "%(name)s hasn't set a reading goal for %(year)s." +msgstr "" + +#: bookwyrm/templates/user/goal.html:40 +#, python-format +msgid "Your %(year)s Books" +msgstr "" + +#: bookwyrm/templates/user/goal.html:42 +#, python-format +msgid "%(username)s's %(year)s Books" +msgstr "" + #: bookwyrm/templates/user/layout.html:18 bookwyrm/templates/user/user.html:10 msgid "User Profile" msgstr "" @@ -3207,71 +3482,6 @@ msgstr "" msgid "%(username)s isn't following any users" msgstr "" -#: bookwyrm/templates/user/shelf/books_header.html:5 -#, python-format -msgid "%(username)s's books" -msgstr "" - -#: bookwyrm/templates/user/shelf/create_shelf_form.html:5 -#: bookwyrm/templates/user/shelf/create_shelf_form.html:22 -msgid "Create Shelf" -msgstr "" - -#: bookwyrm/templates/user/shelf/edit_shelf_form.html:5 -msgid "Edit Shelf" -msgstr "" - -#: bookwyrm/templates/user/shelf/edit_shelf_form.html:26 -msgid "Update shelf" -msgstr "" - -#: bookwyrm/templates/user/shelf/shelf.html:28 bookwyrm/views/shelf.py:56 -msgid "All books" -msgstr "" - -#: bookwyrm/templates/user/shelf/shelf.html:55 -msgid "Create shelf" -msgstr "" - -#: bookwyrm/templates/user/shelf/shelf.html:76 -#, python-format -msgid "%(formatted_count)s book" -msgid_plural "%(formatted_count)s books" -msgstr[0] "" -msgstr[1] "" - -#: bookwyrm/templates/user/shelf/shelf.html:83 -#, python-format -msgid "(showing %(start)s-%(end)s)" -msgstr "" - -#: bookwyrm/templates/user/shelf/shelf.html:94 -msgid "Edit shelf" -msgstr "" - -#: bookwyrm/templates/user/shelf/shelf.html:113 -#: bookwyrm/templates/user/shelf/shelf.html:137 -msgid "Shelved" -msgstr "" - -#: bookwyrm/templates/user/shelf/shelf.html:114 -#: bookwyrm/templates/user/shelf/shelf.html:141 -msgid "Started" -msgstr "" - -#: bookwyrm/templates/user/shelf/shelf.html:115 -#: bookwyrm/templates/user/shelf/shelf.html:144 -msgid "Finished" -msgstr "" - -#: bookwyrm/templates/user/shelf/shelf.html:170 -msgid "This shelf is empty." -msgstr "" - -#: bookwyrm/templates/user/shelf/shelf.html:176 -msgid "Delete shelf" -msgstr "" - #: bookwyrm/templates/user/user.html:16 msgid "Edit profile" msgstr "" @@ -3325,129 +3535,6 @@ msgstr[1] "" msgid "No followers you follow" msgstr "" -#: bookwyrm/templates/user_admin/delete_user_form.html:5 -#: bookwyrm/templates/user_admin/user_moderation_actions.html:31 -msgid "Permanently delete user" -msgstr "" - -#: bookwyrm/templates/user_admin/delete_user_form.html:12 -#, python-format -msgid "Are you sure you want to delete %(username)s's account? This action cannot be undone. To proceed, please enter your password to confirm deletion." -msgstr "" - -#: bookwyrm/templates/user_admin/delete_user_form.html:17 -msgid "Your password:" -msgstr "" - -#: bookwyrm/templates/user_admin/user.html:8 -msgid "Back to users" -msgstr "" - -#: bookwyrm/templates/user_admin/user_admin.html:7 -#, python-format -msgid "Users: %(instance_name)s" -msgstr "" - -#: bookwyrm/templates/user_admin/user_admin.html:22 -#: bookwyrm/templates/user_admin/username_filter.html:5 -msgid "Username" -msgstr "" - -#: bookwyrm/templates/user_admin/user_admin.html:26 -msgid "Date Added" -msgstr "" - -#: bookwyrm/templates/user_admin/user_admin.html:30 -msgid "Last Active" -msgstr "" - -#: bookwyrm/templates/user_admin/user_admin.html:38 -msgid "Remote instance" -msgstr "" - -#: bookwyrm/templates/user_admin/user_admin.html:47 -#: bookwyrm/templates/user_admin/user_info.html:24 -msgid "Active" -msgstr "" - -#: bookwyrm/templates/user_admin/user_admin.html:47 -#: bookwyrm/templates/user_admin/user_info.html:28 -msgid "Inactive" -msgstr "" - -#: bookwyrm/templates/user_admin/user_admin.html:52 -#: bookwyrm/templates/user_admin/user_info.html:140 -msgid "Not set" -msgstr "" - -#: bookwyrm/templates/user_admin/user_info.html:16 -msgid "View user profile" -msgstr "" - -#: bookwyrm/templates/user_admin/user_info.html:36 -msgid "Local" -msgstr "" - -#: bookwyrm/templates/user_admin/user_info.html:38 -msgid "Remote" -msgstr "" - -#: bookwyrm/templates/user_admin/user_info.html:47 -msgid "User details" -msgstr "" - -#: bookwyrm/templates/user_admin/user_info.html:52 -msgid "Email:" -msgstr "" - -#: bookwyrm/templates/user_admin/user_info.html:64 -msgid "(View reports)" -msgstr "" - -#: bookwyrm/templates/user_admin/user_info.html:72 -msgid "Blocked by count:" -msgstr "" - -#: bookwyrm/templates/user_admin/user_info.html:77 -msgid "Last active date:" -msgstr "" - -#: bookwyrm/templates/user_admin/user_info.html:82 -msgid "Manually approved followers:" -msgstr "" - -#: bookwyrm/templates/user_admin/user_info.html:87 -msgid "Discoverable:" -msgstr "" - -#: bookwyrm/templates/user_admin/user_info.html:93 -msgid "Deactivation reason:" -msgstr "" - -#: bookwyrm/templates/user_admin/user_info.html:111 -msgid "Instance details" -msgstr "" - -#: bookwyrm/templates/user_admin/user_info.html:137 -msgid "View instance" -msgstr "" - -#: bookwyrm/templates/user_admin/user_moderation_actions.html:5 -msgid "Permanently deleted" -msgstr "" - -#: bookwyrm/templates/user_admin/user_moderation_actions.html:20 -msgid "Suspend user" -msgstr "" - -#: bookwyrm/templates/user_admin/user_moderation_actions.html:25 -msgid "Un-suspend user" -msgstr "" - -#: bookwyrm/templates/user_admin/user_moderation_actions.html:47 -msgid "Access level:" -msgstr "" - #: bookwyrm/templates/widgets/clearable_file_input_with_warning.html:28 msgid "File exceeds maximum size: 10MB" msgstr "" @@ -3461,7 +3548,7 @@ msgstr "" msgid "Not a valid csv file" msgstr "" -#: bookwyrm/views/login.py:70 +#: bookwyrm/views/login.py:68 msgid "Username or password are incorrect" msgstr "" @@ -3470,8 +3557,8 @@ msgid "No user with that email address was found." msgstr "" #: bookwyrm/views/password.py:41 -#, python-format -msgid "A password reset link sent to %s" +#, python-brace-format +msgid "A password reset link sent to {email}" msgstr "" #: bookwyrm/views/rss_feed.py:34 diff --git a/locale/es/LC_MESSAGES/django.mo b/locale/es/LC_MESSAGES/django.mo index d1f81bfc..b8464243 100644 Binary files a/locale/es/LC_MESSAGES/django.mo and b/locale/es/LC_MESSAGES/django.mo differ diff --git a/locale/es/LC_MESSAGES/django.po b/locale/es/LC_MESSAGES/django.po index c57ed162..8148658a 100644 --- a/locale/es/LC_MESSAGES/django.po +++ b/locale/es/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-12 17:16+0000\n" +"POT-Creation-Date: 2021-09-29 18:32+0000\n" "PO-Revision-Date: 2021-03-19 11:49+0800\n" "Last-Translator: Reese Porter \n" "Language-Team: LANGUAGE \n" @@ -18,108 +18,126 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: bookwyrm/forms.py:242 +#: bookwyrm/forms.py:241 msgid "A user with this email already exists." msgstr "Ya existe un usuario con ese correo electrónico." -#: bookwyrm/forms.py:256 +#: bookwyrm/forms.py:255 msgid "One Day" msgstr "Un día" -#: bookwyrm/forms.py:257 +#: bookwyrm/forms.py:256 msgid "One Week" msgstr "Una semana" -#: bookwyrm/forms.py:258 +#: bookwyrm/forms.py:257 msgid "One Month" msgstr "Un mes" -#: bookwyrm/forms.py:259 +#: bookwyrm/forms.py:258 msgid "Does Not Expire" msgstr "Nunca se vence" -#: bookwyrm/forms.py:264 -#, python-format -msgid "%(count)d uses" -msgstr "%(count)d usos" +#: bookwyrm/forms.py:262 +#, fuzzy, python-brace-format +#| msgid "Max uses" +msgid "{i} uses" +msgstr "Número máximo de usos" -#: bookwyrm/forms.py:267 +#: bookwyrm/forms.py:263 msgid "Unlimited" msgstr "Sin límite" -#: bookwyrm/forms.py:323 +#: bookwyrm/forms.py:325 msgid "List Order" msgstr "Orden de la lista" -#: bookwyrm/forms.py:324 +#: bookwyrm/forms.py:326 msgid "Book Title" msgstr "Título" -#: bookwyrm/forms.py:325 +#: bookwyrm/forms.py:327 bookwyrm/templates/shelf/shelf.html:134 +#: bookwyrm/templates/shelf/shelf.html:165 #: bookwyrm/templates/snippets/create_status/review.html:33 -#: bookwyrm/templates/user/shelf/shelf.html:117 -#: bookwyrm/templates/user/shelf/shelf.html:148 msgid "Rating" msgstr "Calificación" -#: bookwyrm/forms.py:327 bookwyrm/templates/lists/list.html:107 +#: bookwyrm/forms.py:329 bookwyrm/templates/lists/list.html:109 msgid "Sort By" msgstr "Ordenar por" -#: bookwyrm/forms.py:331 +#: bookwyrm/forms.py:333 msgid "Ascending" msgstr "Ascendente" -#: bookwyrm/forms.py:332 +#: bookwyrm/forms.py:334 msgid "Descending" msgstr "Descendente" #: bookwyrm/importers/importer.py:75 msgid "Error loading book" -msgstr "" +msgstr "Error en cargar libro" #: bookwyrm/importers/importer.py:88 msgid "Could not find a match for book" -msgstr "" - -#: bookwyrm/models/base_model.py:13 -#, fuzzy -#| msgid "Ascending" -msgid "Pending" -msgstr "Ascendente" - -#: bookwyrm/models/base_model.py:14 -msgid "Self deletion" -msgstr "" - -#: bookwyrm/models/base_model.py:15 -#, fuzzy -#| msgid "Moderator Comments" -msgid "Moderator suspension" -msgstr "Comentarios de moderador" +msgstr "No se pudo encontrar el libro" #: bookwyrm/models/base_model.py:16 -#, fuzzy -#| msgid "Duration" -msgid "Moderator deletion" -msgstr "Duración" +msgid "Pending" +msgstr "Pendiente" #: bookwyrm/models/base_model.py:17 -#, fuzzy -#| msgid "Un-block" +msgid "Self deletion" +msgstr "Auto-eliminación" + +#: bookwyrm/models/base_model.py:18 +msgid "Moderator suspension" +msgstr "Suspensión de moderador" + +#: bookwyrm/models/base_model.py:19 +msgid "Moderator deletion" +msgstr "Eliminación de moderador" + +#: bookwyrm/models/base_model.py:20 msgid "Domain block" -msgstr "Desbloquear" +msgstr "Bloqueo de dominio" + +#: bookwyrm/models/book.py:232 +#, fuzzy +#| msgid "Add books" +msgid "Audiobook" +msgstr "Agregar libros" + +#: bookwyrm/models/book.py:233 +#, fuzzy +#| msgid "Book" +msgid "eBook" +msgstr "Libro" + +#: bookwyrm/models/book.py:234 +msgid "Graphic novel" +msgstr "" + +#: bookwyrm/models/book.py:235 +#, fuzzy +#| msgid "Add cover" +msgid "Hardcover" +msgstr "Agregar portada" + +#: bookwyrm/models/book.py:236 +msgid "Paperback" +msgstr "" #: bookwyrm/models/federated_server.py:11 -#: bookwyrm/templates/settings/edit_server.html:40 -#: bookwyrm/templates/settings/federation.html:19 +#: bookwyrm/templates/settings/federation/edit_instance.html:42 +#: bookwyrm/templates/settings/federation/instance_list.html:19 msgid "Federated" msgstr "Federalizado" #: bookwyrm/models/federated_server.py:12 -#: bookwyrm/templates/settings/edit_server.html:41 -#: bookwyrm/templates/settings/federated_server.html:10 -#: bookwyrm/templates/settings/federation.html:23 +#: bookwyrm/templates/settings/federation/edit_instance.html:43 +#: bookwyrm/templates/settings/federation/instance.html:10 +#: bookwyrm/templates/settings/federation/instance_list.html:23 msgid "Blocked" msgstr "Bloqueado" @@ -133,7 +151,7 @@ msgstr "%(value)s no es un remote_id válido" msgid "%(value)s is not a valid username" msgstr "%(value)s no es un usuario válido" -#: bookwyrm/models/fields.py:181 bookwyrm/templates/layout.html:164 +#: bookwyrm/models/fields.py:181 bookwyrm/templates/layout.html:171 msgid "username" msgstr "nombre de usuario" @@ -141,45 +159,45 @@ msgstr "nombre de usuario" msgid "A user with that username already exists." msgstr "Ya existe un usuario con ese nombre." -#: bookwyrm/settings.py:115 +#: bookwyrm/settings.py:116 msgid "Home Timeline" msgstr "Línea temporal de hogar" -#: bookwyrm/settings.py:115 +#: bookwyrm/settings.py:116 msgid "Home" msgstr "Hogar" -#: bookwyrm/settings.py:116 +#: bookwyrm/settings.py:117 msgid "Books Timeline" msgstr "Línea temporal de libros" -#: bookwyrm/settings.py:116 bookwyrm/templates/search/layout.html:21 +#: bookwyrm/settings.py:117 bookwyrm/templates/search/layout.html:21 #: bookwyrm/templates/search/layout.html:42 #: bookwyrm/templates/user/layout.html:81 msgid "Books" msgstr "Libros" -#: bookwyrm/settings.py:162 +#: bookwyrm/settings.py:163 msgid "English" msgstr "Inglés" -#: bookwyrm/settings.py:163 +#: bookwyrm/settings.py:164 msgid "German" msgstr "Aléman" -#: bookwyrm/settings.py:164 +#: bookwyrm/settings.py:165 msgid "Spanish" msgstr "Español" -#: bookwyrm/settings.py:165 +#: bookwyrm/settings.py:166 msgid "French" msgstr "Francés" -#: bookwyrm/settings.py:166 +#: bookwyrm/settings.py:167 msgid "Simplified Chinese" msgstr "Chino simplificado" -#: bookwyrm/settings.py:167 +#: bookwyrm/settings.py:168 msgid "Traditional Chinese" msgstr "Chino tradicional" @@ -273,9 +291,7 @@ msgid "Metadata" msgstr "Metadatos" #: bookwyrm/templates/author/edit_author.html:33 -#: bookwyrm/templates/lists/form.html:8 -#: bookwyrm/templates/user/shelf/create_shelf_form.html:13 -#: bookwyrm/templates/user/shelf/edit_shelf_form.html:14 +#: bookwyrm/templates/lists/form.html:8 bookwyrm/templates/shelf/form.html:9 msgid "Name:" msgstr "Nombre:" @@ -311,7 +327,7 @@ msgid "Openlibrary key:" msgstr "Clave OpenLibrary:" #: bookwyrm/templates/author/edit_author.html:89 -#: bookwyrm/templates/book/edit_book.html:300 +#: bookwyrm/templates/book/edit_book.html:313 msgid "Inventaire ID:" msgstr "ID Inventaire:" @@ -325,32 +341,30 @@ msgstr "Clave Goodreads:" #: bookwyrm/templates/author/edit_author.html:116 #: bookwyrm/templates/book/book.html:140 -#: bookwyrm/templates/book/edit_book.html:328 +#: bookwyrm/templates/book/edit_book.html:341 #: bookwyrm/templates/book/readthrough.html:76 #: bookwyrm/templates/lists/bookmark_button.html:15 #: bookwyrm/templates/lists/form.html:44 -#: bookwyrm/templates/preferences/edit_user.html:80 -#: bookwyrm/templates/settings/announcement_form.html:69 -#: bookwyrm/templates/settings/edit_server.html:68 -#: bookwyrm/templates/settings/federated_server.html:98 -#: bookwyrm/templates/settings/site.html:113 -#: bookwyrm/templates/snippets/reading_modals/layout.html:16 -#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:42 -#: bookwyrm/templates/user_admin/user_moderation_actions.html:64 +#: bookwyrm/templates/preferences/edit_user.html:118 +#: bookwyrm/templates/settings/announcements/announcement_form.html:69 +#: bookwyrm/templates/settings/federation/edit_instance.html:74 +#: bookwyrm/templates/settings/federation/instance.html:87 +#: bookwyrm/templates/settings/site.html:134 +#: bookwyrm/templates/settings/users/user_moderation_actions.html:64 +#: bookwyrm/templates/shelf/form.html:25 +#: bookwyrm/templates/snippets/reading_modals/layout.html:18 msgid "Save" msgstr "Guardar" #: bookwyrm/templates/author/edit_author.html:117 #: bookwyrm/templates/book/book.html:141 bookwyrm/templates/book/book.html:190 #: bookwyrm/templates/book/cover_modal.html:32 -#: bookwyrm/templates/book/edit_book.html:329 +#: bookwyrm/templates/book/edit_book.html:342 #: bookwyrm/templates/book/readthrough.html:77 #: bookwyrm/templates/lists/delete_list_modal.html:17 -#: bookwyrm/templates/moderation/report_modal.html:34 -#: bookwyrm/templates/settings/federated_server.html:99 +#: bookwyrm/templates/settings/federation/instance.html:88 #: bookwyrm/templates/snippets/delete_readthrough_modal.html:17 -#: bookwyrm/templates/snippets/goal_form.html:32 -#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:43 +#: bookwyrm/templates/snippets/report_modal.html:34 msgid "Cancel" msgstr "Cancelar" @@ -387,7 +401,7 @@ msgstr "Agregar descripción" #: bookwyrm/templates/book/book.html:136 #: bookwyrm/templates/book/edit_book.html:143 -#: bookwyrm/templates/lists/form.html:12 +#: bookwyrm/templates/lists/form.html:12 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "Descripción:" @@ -446,7 +460,7 @@ msgstr "Sujetos" msgid "Places" msgstr "Lugares" -#: bookwyrm/templates/book/book.html:292 bookwyrm/templates/layout.html:68 +#: bookwyrm/templates/book/book.html:292 bookwyrm/templates/layout.html:75 #: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12 #: bookwyrm/templates/search/layout.html:25 #: bookwyrm/templates/search/layout.html:50 @@ -460,8 +474,9 @@ msgstr "Agregar a lista" #: bookwyrm/templates/book/book.html:313 #: bookwyrm/templates/book/cover_modal.html:31 -#: bookwyrm/templates/lists/list.html:179 -#: bookwyrm/templates/settings/domain_form.html:26 +#: bookwyrm/templates/lists/list.html:181 +#: bookwyrm/templates/settings/email_blocklist/domain_form.html:26 +#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:32 msgid "Add" msgstr "Agregar" @@ -470,12 +485,12 @@ msgid "ISBN:" msgstr "ISBN:" #: bookwyrm/templates/book/book_identifiers.html:14 -#: bookwyrm/templates/book/edit_book.html:308 +#: bookwyrm/templates/book/edit_book.html:321 msgid "OCLC Number:" msgstr "Número OCLC:" #: bookwyrm/templates/book/book_identifiers.html:21 -#: bookwyrm/templates/book/edit_book.html:316 +#: bookwyrm/templates/book/edit_book.html:329 msgid "ASIN:" msgstr "ASIN:" @@ -485,7 +500,7 @@ msgid "Upload cover:" msgstr "Subir portada:" #: bookwyrm/templates/book/cover_modal.html:23 -#: bookwyrm/templates/book/edit_book.html:242 +#: bookwyrm/templates/book/edit_book.html:241 msgid "Load cover from url:" msgstr "Agregar portada de url:" @@ -597,11 +612,11 @@ msgid "John Doe, Jane Smith" msgstr "Juan Nadie, Natalia Natalia" #: bookwyrm/templates/book/edit_book.html:227 -#: bookwyrm/templates/user/shelf/shelf.html:110 +#: bookwyrm/templates/shelf/shelf.html:127 msgid "Cover" msgstr "Portada:" -#: bookwyrm/templates/book/edit_book.html:255 +#: bookwyrm/templates/book/edit_book.html:253 msgid "Physical Properties" msgstr "Propiedades físicas:" @@ -610,23 +625,29 @@ msgstr "Propiedades físicas:" msgid "Format:" msgstr "Formato:" -#: bookwyrm/templates/book/edit_book.html:265 +#: bookwyrm/templates/book/edit_book.html:268 +#, fuzzy +#| msgid "User details" +msgid "Format details:" +msgstr "Detalles" + +#: bookwyrm/templates/book/edit_book.html:278 msgid "Pages:" msgstr "Páginas:" -#: bookwyrm/templates/book/edit_book.html:274 +#: bookwyrm/templates/book/edit_book.html:287 msgid "Book Identifiers" msgstr "Identificadores de libro" -#: bookwyrm/templates/book/edit_book.html:276 +#: bookwyrm/templates/book/edit_book.html:289 msgid "ISBN 13:" msgstr "ISBN 13:" -#: bookwyrm/templates/book/edit_book.html:284 +#: bookwyrm/templates/book/edit_book.html:297 msgid "ISBN 10:" msgstr "ISBN 10:" -#: bookwyrm/templates/book/edit_book.html:292 +#: bookwyrm/templates/book/edit_book.html:305 msgid "Openlibrary ID:" msgstr "ID OpenLibrary:" @@ -734,7 +755,7 @@ msgstr "Cerrar" #: bookwyrm/templates/components/tooltip.html:3 msgid "Help" -msgstr "" +msgstr "Ayuda" #: bookwyrm/templates/compose.html:5 bookwyrm/templates/compose.html:8 msgid "Compose status" @@ -757,14 +778,14 @@ msgid "Sorry! We couldn't find that code." msgstr "Sentimos que no pudimos encontrar ese código" #: bookwyrm/templates/confirm_email/confirm_email.html:19 -#: bookwyrm/templates/user_admin/user_info.html:100 +#: bookwyrm/templates/settings/users/user_info.html:85 msgid "Confirmation code:" msgstr "Código de confirmación:" #: bookwyrm/templates/confirm_email/confirm_email.html:25 -#: bookwyrm/templates/landing/landing_layout.html:70 -#: bookwyrm/templates/moderation/report_modal.html:33 -#: bookwyrm/templates/settings/dashboard.html:93 +#: bookwyrm/templates/landing/layout.html:73 +#: bookwyrm/templates/settings/dashboard/dashboard.html:93 +#: bookwyrm/templates/snippets/report_modal.html:33 msgid "Submit" msgstr "Enviar" @@ -777,9 +798,9 @@ msgid "Resend confirmation link" msgstr "Reenviar enlace de confirmación" #: bookwyrm/templates/confirm_email/resend_form.html:11 -#: bookwyrm/templates/landing/landing_layout.html:64 +#: bookwyrm/templates/landing/layout.html:67 #: bookwyrm/templates/password_reset_request.html:18 -#: bookwyrm/templates/preferences/edit_user.html:38 +#: bookwyrm/templates/preferences/edit_user.html:56 #: bookwyrm/templates/snippets/register_form.html:13 msgid "Email address:" msgstr "Dirección de correo electrónico:" @@ -802,7 +823,7 @@ msgstr "Comunidad federalizada" #: bookwyrm/templates/directory/directory.html:4 #: bookwyrm/templates/directory/directory.html:9 -#: bookwyrm/templates/layout.html:94 +#: bookwyrm/templates/layout.html:101 msgid "Directory" msgstr "Directorio" @@ -816,8 +837,8 @@ msgid "You can opt-out at any time in your profile settings msgstr "Puedes optar por no en cualquier hora en tus configuraciones de perfil." #: bookwyrm/templates/directory/directory.html:29 +#: bookwyrm/templates/feed/goal_card.html:17 #: bookwyrm/templates/snippets/announcement.html:34 -#: bookwyrm/templates/snippets/goal_card.html:22 msgid "Dismiss message" msgstr "Desechar mensaje" @@ -826,13 +847,13 @@ msgid "Order by" msgstr "Ordenar por" #: bookwyrm/templates/directory/sort_filter.html:8 -msgid "Suggested" -msgstr "Sugerido" - -#: bookwyrm/templates/directory/sort_filter.html:9 msgid "Recently active" msgstr "Activ@ recientemente" +#: bookwyrm/templates/directory/sort_filter.html:9 +msgid "Suggested" +msgstr "Sugerido" + #: bookwyrm/templates/directory/user_card.html:17 #: bookwyrm/templates/directory/user_card.html:18 #: bookwyrm/templates/user/user_preview.html:16 @@ -874,7 +895,7 @@ msgstr "Todos los usuarios conocidos" #: bookwyrm/templates/discover/discover.html:4 #: bookwyrm/templates/discover/discover.html:10 -#: bookwyrm/templates/layout.html:71 +#: bookwyrm/templates/layout.html:78 msgid "Discover" msgstr "Descubrir" @@ -1000,7 +1021,7 @@ msgid "Direct Messages with %(username)s" msgstr "Mensajes directos con %(username)s" #: bookwyrm/templates/feed/direct_messages.html:10 -#: bookwyrm/templates/layout.html:104 +#: bookwyrm/templates/layout.html:111 msgid "Direct Messages" msgstr "Mensajes directos" @@ -1021,12 +1042,24 @@ msgstr "cargar 0 status(es) no le msgid "There aren't any activities right now! Try following a user to get started" msgstr "¡No hay actividad ahora mismo! Sigue a otro usuario para empezar" +#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/layout.html:90 +#: bookwyrm/templates/user/goal_form.html:6 +#, python-format +msgid "%(year)s Reading Goal" +msgstr "%(year)s Meta de lectura" + +#: bookwyrm/templates/feed/goal_card.html:18 +#, python-format +msgid "You can set or change your reading goal any time from your profile page" +msgstr "Puedes establecer o cambiar tu meta de lectura en cualquier momento que desees desde tu perfil" + #: bookwyrm/templates/feed/layout.html:5 msgid "Updates" msgstr "Actualizaciones" #: bookwyrm/templates/feed/layout.html:12 -#: bookwyrm/templates/user/shelf/books_header.html:3 +#: bookwyrm/templates/user/books_header.html:3 msgid "Your books" msgstr "Tus libros" @@ -1035,38 +1068,30 @@ msgid "There are no books here right now! Try searching for a book to get starte msgstr "¡No hay ningún libro aqui ahorita! Busca a un libro para empezar" #: bookwyrm/templates/feed/layout.html:25 -#: bookwyrm/templates/user/shelf/shelf.html:38 +#: bookwyrm/templates/shelf/shelf.html:38 msgid "To Read" msgstr "Para leer" #: bookwyrm/templates/feed/layout.html:26 -#: bookwyrm/templates/user/shelf/shelf.html:40 +#: bookwyrm/templates/shelf/shelf.html:40 msgid "Currently Reading" msgstr "Leyendo actualmente" #: bookwyrm/templates/feed/layout.html:27 +#: bookwyrm/templates/shelf/shelf.html:42 #: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:23 #: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12 -#: bookwyrm/templates/user/shelf/shelf.html:42 msgid "Read" msgstr "Leido" -#: bookwyrm/templates/feed/layout.html:90 bookwyrm/templates/goal.html:26 -#: bookwyrm/templates/snippets/goal_card.html:6 -#, python-format -msgid "%(year)s Reading Goal" -msgstr "%(year)s Meta de lectura" - #: bookwyrm/templates/feed/suggested_users.html:5 #: bookwyrm/templates/get_started/users.html:6 msgid "Who to follow" msgstr "A quién seguir" #: bookwyrm/templates/feed/suggested_users.html:9 -#, fuzzy -#| msgid "Show this account in suggested users:" msgid "Don't show suggested users" -msgstr "Mostrar esta cuenta en los usuarios sugeridos:" +msgstr "No mostrar usuarios sugeridos" #: bookwyrm/templates/feed/suggested_users.html:14 msgid "View directory" @@ -1082,7 +1107,7 @@ msgid "What are you reading?" msgstr "¿Qué estás leyendo?" #: bookwyrm/templates/get_started/books.html:9 -#: bookwyrm/templates/lists/list.html:135 +#: bookwyrm/templates/layout.html:45 bookwyrm/templates/lists/list.html:137 msgid "Search for a book" msgstr "Buscar libros" @@ -1100,8 +1125,8 @@ msgstr "Puedes agregar libros cuando comiences a usar %(site_name)s." #: bookwyrm/templates/get_started/books.html:17 #: bookwyrm/templates/get_started/users.html:18 #: bookwyrm/templates/get_started/users.html:19 -#: bookwyrm/templates/layout.html:44 bookwyrm/templates/layout.html:45 -#: bookwyrm/templates/lists/list.html:139 +#: bookwyrm/templates/layout.html:51 bookwyrm/templates/layout.html:52 +#: bookwyrm/templates/lists/list.html:141 #: bookwyrm/templates/search/layout.html:4 #: bookwyrm/templates/search/layout.html:9 msgid "Search" @@ -1117,7 +1142,7 @@ msgid "Popular on %(site_name)s" msgstr "Popular en %(site_name)s" #: bookwyrm/templates/get_started/books.html:58 -#: bookwyrm/templates/lists/list.html:152 +#: bookwyrm/templates/lists/list.html:154 msgid "No books found" msgstr "No se encontró ningún libro" @@ -1127,7 +1152,7 @@ msgid "Save & continue" msgstr "Guardar & continuar" #: bookwyrm/templates/get_started/layout.html:5 -#: bookwyrm/templates/landing/landing_layout.html:5 +#: bookwyrm/templates/landing/layout.html:5 msgid "Welcome" msgstr "Bienvenidos" @@ -1162,12 +1187,12 @@ msgid "Finish" msgstr "Terminar" #: bookwyrm/templates/get_started/profile.html:15 -#: bookwyrm/templates/preferences/edit_user.html:24 +#: bookwyrm/templates/preferences/edit_user.html:42 msgid "Display name:" msgstr "Nombre de visualización:" #: bookwyrm/templates/get_started/profile.html:22 -#: bookwyrm/templates/preferences/edit_user.html:31 +#: bookwyrm/templates/preferences/edit_user.html:49 msgid "Summary:" msgstr "Resumen:" @@ -1176,17 +1201,17 @@ msgid "A little bit about you" msgstr "Un poco sobre ti" #: bookwyrm/templates/get_started/profile.html:32 -#: bookwyrm/templates/preferences/edit_user.html:17 +#: bookwyrm/templates/preferences/edit_user.html:27 msgid "Avatar:" msgstr "Avatar:" #: bookwyrm/templates/get_started/profile.html:42 -#: bookwyrm/templates/preferences/edit_user.html:62 +#: bookwyrm/templates/preferences/edit_user.html:104 msgid "Manually approve followers:" msgstr "Aprobar seguidores a mano:" #: bookwyrm/templates/get_started/profile.html:48 -#: bookwyrm/templates/preferences/edit_user.html:54 +#: bookwyrm/templates/preferences/edit_user.html:80 msgid "Show this account in suggested users:" msgstr "Mostrar esta cuenta en los usuarios sugeridos:" @@ -1203,39 +1228,9 @@ msgstr "Buscar un usuario" msgid "No users found for \"%(query)s\"" msgstr "No se encontró ningún usuario correspondiente a \"%(query)s\"" -#: bookwyrm/templates/goal.html:7 -#, python-format -msgid "%(year)s Reading Progress" -msgstr "%(year)s Progreso de la meta de lectura" - -#: bookwyrm/templates/goal.html:11 -msgid "Edit Goal" -msgstr "Editar meta" - -#: bookwyrm/templates/goal.html:30 -#: bookwyrm/templates/snippets/goal_card.html:13 -#, python-format -msgid "Set a goal for how many books you'll finish reading in %(year)s, and track your progress throughout the year." -msgstr "Establece una meta para cuantos libros leerás en %(year)s, y seguir tu progreso durante el año." - -#: bookwyrm/templates/goal.html:39 -#, python-format -msgid "%(name)s hasn't set a reading goal for %(year)s." -msgstr "%(name)s no ha establecido una meta de lectura para %(year)s." - -#: bookwyrm/templates/goal.html:51 -#, python-format -msgid "Your %(year)s Books" -msgstr "Tus libros de %(year)s" - -#: bookwyrm/templates/goal.html:53 -#, python-format -msgid "%(username)s's %(year)s Books" -msgstr "Los libros de %(username)s para %(year)s" - #: bookwyrm/templates/import/import.html:5 #: bookwyrm/templates/import/import.html:9 -#: bookwyrm/templates/user/shelf/shelf.html:57 +#: bookwyrm/templates/shelf/shelf.html:57 msgid "Import Books" msgstr "Importar libros" @@ -1256,7 +1251,7 @@ msgid "Privacy setting for imported reviews:" msgstr "Configuración de privacidad para las reseñas importadas:" #: bookwyrm/templates/import/import.html:56 -#: bookwyrm/templates/settings/server_blocklist.html:64 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:64 msgid "Import" msgstr "Importar" @@ -1332,14 +1327,14 @@ msgid "Book" msgstr "Libro" #: bookwyrm/templates/import/import_status.html:122 -#: bookwyrm/templates/user/shelf/shelf.html:111 -#: bookwyrm/templates/user/shelf/shelf.html:131 +#: bookwyrm/templates/shelf/shelf.html:128 +#: bookwyrm/templates/shelf/shelf.html:148 msgid "Title" msgstr "Título" #: bookwyrm/templates/import/import_status.html:125 -#: bookwyrm/templates/user/shelf/shelf.html:112 -#: bookwyrm/templates/user/shelf/shelf.html:134 +#: bookwyrm/templates/shelf/shelf.html:129 +#: bookwyrm/templates/shelf/shelf.html:151 msgid "Author" msgstr "Autor/Autora" @@ -1349,10 +1344,10 @@ msgstr "Importado" #: bookwyrm/templates/import/tooltip.html:6 msgid "You can download your GoodReads data from the Import/Export page of your GoodReads account." -msgstr "" +msgstr "Puedes descargar tus datos de GoodReads de la Página de Exportación/Importación de tu cuenta de GoodReads" -#: bookwyrm/templates/invite.html:4 bookwyrm/templates/invite.html:12 -#: bookwyrm/templates/login.html:51 +#: bookwyrm/templates/invite.html:4 bookwyrm/templates/invite.html:8 +#: bookwyrm/templates/login.html:49 msgid "Create an Account" msgstr "Crear una cuenta" @@ -1383,135 +1378,140 @@ msgstr "Política de privacidad" msgid "Recent Books" msgstr "Libros recientes" -#: bookwyrm/templates/landing/landing_layout.html:17 +#: bookwyrm/templates/landing/layout.html:17 msgid "Decentralized" msgstr "Descentralizado" -#: bookwyrm/templates/landing/landing_layout.html:23 +#: bookwyrm/templates/landing/layout.html:23 msgid "Friendly" msgstr "Amigable" -#: bookwyrm/templates/landing/landing_layout.html:29 +#: bookwyrm/templates/landing/layout.html:29 msgid "Anti-Corporate" msgstr "Anti-corporativo" -#: bookwyrm/templates/landing/landing_layout.html:44 +#: bookwyrm/templates/landing/layout.html:45 #, python-format msgid "Join %(name)s" msgstr "Unirse con %(name)s" -#: bookwyrm/templates/landing/landing_layout.html:51 -#: bookwyrm/templates/login.html:56 -msgid "This instance is closed" -msgstr "Esta instancia está cerrada." - -#: bookwyrm/templates/landing/landing_layout.html:57 -msgid "Thank you! Your request has been received." -msgstr "¡Gracias! Tu solicitud ha sido recibido." - -#: bookwyrm/templates/landing/landing_layout.html:60 +#: bookwyrm/templates/landing/layout.html:47 msgid "Request an Invitation" msgstr "Solicitar una invitación" -#: bookwyrm/templates/landing/landing_layout.html:79 +#: bookwyrm/templates/landing/layout.html:49 +#, fuzzy, python-format +#| msgid "(Recommended if registration is open)" +msgid "%(name)s registration is closed" +msgstr "(Recomendado si la registración es abierta)" + +#: bookwyrm/templates/landing/layout.html:60 +msgid "Thank you! Your request has been received." +msgstr "¡Gracias! Tu solicitud ha sido recibido." + +#: bookwyrm/templates/landing/layout.html:82 msgid "Your Account" msgstr "Tu cuenta" -#: bookwyrm/templates/layout.html:40 -msgid "Search for a book or user" +#: bookwyrm/templates/layout.html:13 +#, fuzzy, python-format +#| msgid "About %(site_name)s" +msgid "%(site_name)s search" +msgstr "Sobre %(site_name)s" + +#: bookwyrm/templates/layout.html:43 +#, fuzzy +#| msgid "Search for a book or user" +msgid "Search for a book, user, or list" msgstr "Buscar un libro o un usuario" -#: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/layout.html:61 bookwyrm/templates/layout.html:62 msgid "Main navigation menu" msgstr "Menú de navigación central" -#: bookwyrm/templates/layout.html:65 +#: bookwyrm/templates/layout.html:72 msgid "Feed" msgstr "Actividad" -#: bookwyrm/templates/layout.html:99 +#: bookwyrm/templates/layout.html:106 msgid "Your Books" msgstr "Tus libros" -#: bookwyrm/templates/layout.html:109 +#: bookwyrm/templates/layout.html:116 msgid "Settings" msgstr "Configuración" -#: bookwyrm/templates/layout.html:118 +#: bookwyrm/templates/layout.html:125 +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:15 +#: bookwyrm/templates/settings/invites/manage_invites.html:3 +#: bookwyrm/templates/settings/invites/manage_invites.html:15 #: bookwyrm/templates/settings/layout.html:40 -#: bookwyrm/templates/settings/manage_invite_requests.html:15 -#: bookwyrm/templates/settings/manage_invites.html:3 -#: bookwyrm/templates/settings/manage_invites.html:15 msgid "Invites" msgstr "Invitaciones" -#: bookwyrm/templates/layout.html:125 +#: bookwyrm/templates/layout.html:132 msgid "Admin" msgstr "Admin" -#: bookwyrm/templates/layout.html:132 +#: bookwyrm/templates/layout.html:139 msgid "Log out" msgstr "Cerrar sesión" -#: bookwyrm/templates/layout.html:140 bookwyrm/templates/layout.html:141 +#: bookwyrm/templates/layout.html:147 bookwyrm/templates/layout.html:148 #: bookwyrm/templates/notifications.html:6 #: bookwyrm/templates/notifications.html:11 msgid "Notifications" msgstr "Notificaciones" -#: bookwyrm/templates/layout.html:163 bookwyrm/templates/layout.html:167 -#: bookwyrm/templates/login.html:22 +#: bookwyrm/templates/layout.html:170 bookwyrm/templates/layout.html:174 +#: bookwyrm/templates/login.html:21 #: bookwyrm/templates/snippets/register_form.html:4 msgid "Username:" msgstr "Nombre de usuario:" -#: bookwyrm/templates/layout.html:168 +#: bookwyrm/templates/layout.html:175 msgid "password" msgstr "contraseña" -#: bookwyrm/templates/layout.html:169 bookwyrm/templates/login.html:41 +#: bookwyrm/templates/layout.html:176 bookwyrm/templates/login.html:40 msgid "Forgot your password?" msgstr "¿Olvidaste tu contraseña?" -#: bookwyrm/templates/layout.html:172 bookwyrm/templates/login.html:10 -#: bookwyrm/templates/login.html:38 +#: bookwyrm/templates/layout.html:179 bookwyrm/templates/login.html:7 +#: bookwyrm/templates/login.html:37 msgid "Log in" msgstr "Iniciar sesión" -#: bookwyrm/templates/layout.html:180 +#: bookwyrm/templates/layout.html:187 msgid "Join" msgstr "Unirse" -#: bookwyrm/templates/layout.html:214 -#, fuzzy -#| msgid "Successfully imported" +#: bookwyrm/templates/layout.html:221 msgid "Successfully posted status" -msgstr "Importado exitosamente" +msgstr "Status publicado exitosamente" -#: bookwyrm/templates/layout.html:215 -#, fuzzy -#| msgid "Boost status" +#: bookwyrm/templates/layout.html:222 msgid "Error posting status" -msgstr "Respaldar status" +msgstr "Error en publicar status" -#: bookwyrm/templates/layout.html:223 +#: bookwyrm/templates/layout.html:230 msgid "About this instance" msgstr "Sobre esta instancia" -#: bookwyrm/templates/layout.html:227 +#: bookwyrm/templates/layout.html:234 msgid "Contact site admin" msgstr "Contactarse con administradores del sitio" -#: bookwyrm/templates/layout.html:231 +#: bookwyrm/templates/layout.html:238 msgid "Documentation" msgstr "Documentación de Django" -#: bookwyrm/templates/layout.html:238 +#: bookwyrm/templates/layout.html:245 #, python-format msgid "Support %(site_name)s on %(support_title)s" msgstr "Apoyar %(site_name)s en %(support_title)s" -#: bookwyrm/templates/layout.html:242 +#: bookwyrm/templates/layout.html:249 msgid "BookWyrm's source code is freely available. You can contribute or report issues on GitHub." msgstr "BookWyrm es software de código abierto. Puedes contribuir o reportar problemas en GitHub." @@ -1559,20 +1559,17 @@ msgid "Discard" msgstr "Desechar" #: bookwyrm/templates/lists/delete_list_modal.html:4 -#, fuzzy -#| msgid "Delete this progress update" msgid "Delete this list?" -msgstr "Eliminar esta actualización de progreso" +msgstr "¿Eliminar esta lista?" #: bookwyrm/templates/lists/delete_list_modal.html:7 -#, fuzzy -#| msgid "This field cannot be null." msgid "This action cannot be un-done" -msgstr "Este campo no puede ser nulo." +msgstr "Esta acción no se puede deshacer" #: bookwyrm/templates/lists/delete_list_modal.html:15 -#: bookwyrm/templates/settings/announcement.html:20 -#: bookwyrm/templates/settings/email_blocklist.html:49 +#: bookwyrm/templates/settings/announcements/announcement.html:20 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49 +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:36 #: bookwyrm/templates/snippets/delete_readthrough_modal.html:15 #: bookwyrm/templates/snippets/follow_request_buttons.html:12 msgid "Delete" @@ -1603,9 +1600,8 @@ msgstr "De comisariado" msgid "Anyone can suggest books, subject to your approval" msgstr "Cualquier usuario puede sugerir libros, en cuanto lo hayas aprobado" -#: bookwyrm/templates/lists/form.html:31 -#: bookwyrm/templates/moderation/reports.html:25 -#: bookwyrm/templates/search/book.html:30 +#: bookwyrm/templates/lists/form.html:31 bookwyrm/templates/search/book.html:30 +#: bookwyrm/templates/settings/reports/reports.html:25 #: bookwyrm/templates/snippets/announcement.html:16 msgid "Open" msgstr "Abierto" @@ -1614,11 +1610,9 @@ msgstr "Abierto" msgid "Anyone can add books to this list" msgstr "Cualquer usuario puede agregar libros a esta lista" -#: bookwyrm/templates/lists/form.html:49 -#, fuzzy -#| msgid "Delete status" +#: bookwyrm/templates/lists/form.html:50 msgid "Delete list" -msgstr "Eliminar status" +msgstr "Eliminar lista" #: bookwyrm/templates/lists/list.html:20 msgid "You successfully suggested a book for this list!" @@ -1637,7 +1631,7 @@ msgstr "Esta lista está vacia" msgid "Added by %(username)s" msgstr "Agregado por %(username)s" -#: bookwyrm/templates/lists/list.html:74 +#: bookwyrm/templates/lists/list.html:75 msgid "List position" msgstr "Posición" @@ -1645,42 +1639,42 @@ msgstr "Posición" msgid "Set" msgstr "Establecido" -#: bookwyrm/templates/lists/list.html:89 +#: bookwyrm/templates/lists/list.html:91 #: bookwyrm/templates/snippets/shelf_selector.html:26 msgid "Remove" msgstr "Quitar" -#: bookwyrm/templates/lists/list.html:103 -#: bookwyrm/templates/lists/list.html:120 +#: bookwyrm/templates/lists/list.html:105 +#: bookwyrm/templates/lists/list.html:122 msgid "Sort List" msgstr "Ordena la lista" -#: bookwyrm/templates/lists/list.html:113 +#: bookwyrm/templates/lists/list.html:115 msgid "Direction" msgstr "Dirección" -#: bookwyrm/templates/lists/list.html:127 +#: bookwyrm/templates/lists/list.html:129 msgid "Add Books" msgstr "Agregar libros" -#: bookwyrm/templates/lists/list.html:129 +#: bookwyrm/templates/lists/list.html:131 msgid "Suggest Books" msgstr "Sugerir libros" -#: bookwyrm/templates/lists/list.html:140 +#: bookwyrm/templates/lists/list.html:142 msgid "search" msgstr "buscar" -#: bookwyrm/templates/lists/list.html:146 +#: bookwyrm/templates/lists/list.html:148 msgid "Clear search" msgstr "Borrar búsqueda" -#: bookwyrm/templates/lists/list.html:151 +#: bookwyrm/templates/lists/list.html:153 #, python-format msgid "No books found matching the query \"%(query)s\"" msgstr "No se encontró ningún libro correspondiente a la búsqueda: \"%(query)s\"" -#: bookwyrm/templates/lists/list.html:179 +#: bookwyrm/templates/lists/list.html:181 msgid "Suggest" msgstr "Sugerir" @@ -1704,110 +1698,19 @@ msgstr "Listas guardadas" msgid "Login" msgstr "Iniciar sesión" -#: bookwyrm/templates/login.html:16 +#: bookwyrm/templates/login.html:15 msgid "Success! Email address confirmed." msgstr "¡Éxito! Dirección de correo electrónico confirmada." -#: bookwyrm/templates/login.html:28 bookwyrm/templates/password_reset.html:17 +#: bookwyrm/templates/login.html:27 bookwyrm/templates/password_reset.html:17 #: bookwyrm/templates/snippets/register_form.html:22 msgid "Password:" msgstr "Contraseña:" -#: bookwyrm/templates/login.html:57 -msgid "Contact an administrator to get an invite" -msgstr "Contactar a unx administradorx para recibir una invitación" - -#: bookwyrm/templates/login.html:68 +#: bookwyrm/templates/login.html:62 msgid "More about this site" msgstr "Más sobre este sitio" -#: bookwyrm/templates/moderation/report.html:5 -#: bookwyrm/templates/moderation/report.html:6 -#: bookwyrm/templates/moderation/report_preview.html:6 -#, python-format -msgid "Report #%(report_id)s: %(username)s" -msgstr "Reportar #%(report_id)s: %(username)s" - -#: bookwyrm/templates/moderation/report.html:10 -msgid "Back to reports" -msgstr "Volver a los informes" - -#: bookwyrm/templates/moderation/report.html:22 -msgid "Moderator Comments" -msgstr "Comentarios de moderador" - -#: bookwyrm/templates/moderation/report.html:40 -#: bookwyrm/templates/snippets/create_status.html:28 -msgid "Comment" -msgstr "Comentario" - -#: bookwyrm/templates/moderation/report.html:45 -msgid "Reported statuses" -msgstr "Statuses reportados" - -#: bookwyrm/templates/moderation/report.html:47 -msgid "No statuses reported" -msgstr "Ningún estatus reportado" - -#: bookwyrm/templates/moderation/report.html:53 -msgid "Status has been deleted" -msgstr "Status ha sido eliminado" - -#: bookwyrm/templates/moderation/report_modal.html:6 -#, python-format -msgid "Report @%(username)s" -msgstr "Reportar @%(username)s" - -#: bookwyrm/templates/moderation/report_modal.html:23 -#, python-format -msgid "This report will be sent to %(site_name)s's moderators for review." -msgstr "Este informe se enviará a los moderadores de %(site_name)s para la revisión." - -#: bookwyrm/templates/moderation/report_modal.html:24 -msgid "More info about this report:" -msgstr "Más información sobre este informe:" - -#: bookwyrm/templates/moderation/report_preview.html:13 -msgid "No notes provided" -msgstr "No se proporcionó notas" - -#: bookwyrm/templates/moderation/report_preview.html:20 -#, python-format -msgid "Reported by %(username)s" -msgstr "Reportado por %(username)s" - -#: bookwyrm/templates/moderation/report_preview.html:30 -msgid "Re-open" -msgstr "Reabrir" - -#: bookwyrm/templates/moderation/report_preview.html:32 -msgid "Resolve" -msgstr "Resolver" - -#: bookwyrm/templates/moderation/reports.html:6 -#, python-format -msgid "Reports: %(instance_name)s" -msgstr "Informes: %(instance_name)s" - -#: bookwyrm/templates/moderation/reports.html:8 -#: bookwyrm/templates/moderation/reports.html:17 -#: bookwyrm/templates/settings/layout.html:55 -msgid "Reports" -msgstr "Informes" - -#: bookwyrm/templates/moderation/reports.html:14 -#, python-format -msgid "Reports: %(instance_name)s" -msgstr "Informes: %(instance_name)s" - -#: bookwyrm/templates/moderation/reports.html:28 -msgid "Resolved" -msgstr "Resuelto" - -#: bookwyrm/templates/moderation/reports.html:37 -msgid "No reports found." -msgstr "No se encontró ningún informe." - #: bookwyrm/templates/notifications.html:16 msgid "Delete notifications" msgstr "Borrar notificaciones" @@ -1948,7 +1851,7 @@ msgstr "Restablecer contraseña" #: bookwyrm/templates/preferences/blocks.html:4 #: bookwyrm/templates/preferences/blocks.html:7 -#: bookwyrm/templates/preferences/layout.html:30 +#: bookwyrm/templates/preferences/layout.html:31 msgid "Blocked Users" msgstr "Usuarios bloqueados" @@ -1959,7 +1862,7 @@ msgstr "No hay ningún usuario bloqueado actualmente." #: bookwyrm/templates/preferences/change_password.html:4 #: bookwyrm/templates/preferences/change_password.html:7 #: bookwyrm/templates/preferences/change_password.html:21 -#: bookwyrm/templates/preferences/layout.html:19 +#: bookwyrm/templates/preferences/layout.html:20 msgid "Change Password" msgstr "Cambiar contraseña" @@ -1970,8 +1873,8 @@ msgstr "Nueva contraseña:" #: bookwyrm/templates/preferences/delete_user.html:4 #: bookwyrm/templates/preferences/delete_user.html:7 #: bookwyrm/templates/preferences/delete_user.html:26 -#: bookwyrm/templates/preferences/layout.html:23 -#: bookwyrm/templates/user_admin/delete_user_form.html:23 +#: bookwyrm/templates/preferences/layout.html:24 +#: bookwyrm/templates/settings/users/delete_user_form.html:23 msgid "Delete Account" msgstr "Quitar cuenta" @@ -1985,44 +1888,56 @@ msgstr "Eliminar tu cuenta no puede ser deshecho. El nombre de usuario no será #: bookwyrm/templates/preferences/edit_user.html:4 #: bookwyrm/templates/preferences/edit_user.html:7 +#: bookwyrm/templates/preferences/layout.html:15 msgid "Edit Profile" msgstr "Editar perfil" -#: bookwyrm/templates/preferences/edit_user.html:46 +#: bookwyrm/templates/preferences/edit_user.html:12 +#: bookwyrm/templates/preferences/edit_user.html:25 +#: bookwyrm/templates/settings/users/user_info.html:7 +msgid "Profile" +msgstr "Perfil" + +#: bookwyrm/templates/preferences/edit_user.html:13 +#: bookwyrm/templates/preferences/edit_user.html:68 #, fuzzy -#| msgid "Show set reading goal prompt in feed:" +#| msgid "Email preference" +msgid "Display preferences" +msgstr "Preferencia de correo electrónico" + +#: bookwyrm/templates/preferences/edit_user.html:14 +#: bookwyrm/templates/preferences/edit_user.html:100 +#, fuzzy +#| msgid "Post privacy" +msgid "Privacy" +msgstr "Privacidad de publicación" + +#: bookwyrm/templates/preferences/edit_user.html:72 msgid "Show reading goal prompt in feed:" -msgstr "Mostrar meta de lectura en el feed:" +msgstr "Mostrar sugerencia de meta de lectura en el feed:" -#: bookwyrm/templates/preferences/edit_user.html:50 -#, fuzzy -#| msgid "Show this account in suggested users:" +#: bookwyrm/templates/preferences/edit_user.html:76 msgid "Show suggested users:" -msgstr "Mostrar esta cuenta en los usuarios sugeridos:" +msgstr "Mostrar usuarios sugeridos:" -#: bookwyrm/templates/preferences/edit_user.html:58 +#: bookwyrm/templates/preferences/edit_user.html:85 #, python-format msgid "Your account will show up in the directory, and may be recommended to other BookWyrm users." msgstr "Tu cuenta se aparecerá en el directorio, y puede ser recomendado a otros usuarios de BookWyrm." -#: bookwyrm/templates/preferences/edit_user.html:68 -msgid "Default post privacy:" -msgstr "Privacidad de publicación por defecto:" - -#: bookwyrm/templates/preferences/edit_user.html:75 +#: bookwyrm/templates/preferences/edit_user.html:89 msgid "Preferred Timezone: " msgstr "Huso horario preferido" +#: bookwyrm/templates/preferences/edit_user.html:110 +msgid "Default post privacy:" +msgstr "Privacidad de publicación por defecto:" + #: bookwyrm/templates/preferences/layout.html:11 msgid "Account" msgstr "Cuenta" -#: bookwyrm/templates/preferences/layout.html:15 -#: bookwyrm/templates/user_admin/user_info.html:7 -msgid "Profile" -msgstr "Perfil" - -#: bookwyrm/templates/preferences/layout.html:26 +#: bookwyrm/templates/preferences/layout.html:27 msgid "Relationships" msgstr "Relaciones" @@ -2063,11 +1978,11 @@ msgstr "Tipo de búsqueda" #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:46 -#: bookwyrm/templates/settings/email_blocklist.html:27 -#: bookwyrm/templates/settings/federation.html:44 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:27 +#: bookwyrm/templates/settings/federation/instance_list.html:44 #: bookwyrm/templates/settings/layout.html:34 -#: bookwyrm/templates/user_admin/user_admin.html:3 -#: bookwyrm/templates/user_admin/user_admin.html:10 +#: bookwyrm/templates/settings/users/user_admin.html:3 +#: bookwyrm/templates/settings/users/user_admin.html:10 msgid "Users" msgstr "Usuarios" @@ -2076,373 +1991,529 @@ msgstr "Usuarios" msgid "No results found for \"%(query)s\"" msgstr "No se encontró ningún resultado correspondiente a \"%(query)s\"" -#: bookwyrm/templates/settings/announcement.html:3 -#: bookwyrm/templates/settings/announcement.html:6 +#: bookwyrm/templates/settings/announcements/announcement.html:3 +#: bookwyrm/templates/settings/announcements/announcement.html:6 msgid "Announcement" msgstr "Anuncio" -#: bookwyrm/templates/settings/announcement.html:7 -#: bookwyrm/templates/settings/federated_server.html:13 +#: bookwyrm/templates/settings/announcements/announcement.html:7 +#: bookwyrm/templates/settings/federation/instance.html:13 msgid "Back to list" msgstr "Volver a la lista de servidores" -#: bookwyrm/templates/settings/announcement.html:11 -#: bookwyrm/templates/settings/announcement_form.html:6 +#: bookwyrm/templates/settings/announcements/announcement.html:11 +#: bookwyrm/templates/settings/announcements/announcement_form.html:6 msgid "Edit Announcement" msgstr "Editar anuncio" -#: bookwyrm/templates/settings/announcement.html:35 +#: bookwyrm/templates/settings/announcements/announcement.html:35 msgid "Visible:" msgstr "Visible:" -#: bookwyrm/templates/settings/announcement.html:38 +#: bookwyrm/templates/settings/announcements/announcement.html:38 msgid "True" msgstr "Verdadero" -#: bookwyrm/templates/settings/announcement.html:40 +#: bookwyrm/templates/settings/announcements/announcement.html:40 msgid "False" msgstr "Falso" -#: bookwyrm/templates/settings/announcement.html:47 -#: bookwyrm/templates/settings/announcement_form.html:40 -#: bookwyrm/templates/settings/dashboard.html:71 +#: bookwyrm/templates/settings/announcements/announcement.html:47 +#: bookwyrm/templates/settings/announcements/announcement_form.html:40 +#: bookwyrm/templates/settings/dashboard/dashboard.html:71 msgid "Start date:" msgstr "Fecha de inicio:" -#: bookwyrm/templates/settings/announcement.html:54 -#: bookwyrm/templates/settings/announcement_form.html:49 -#: bookwyrm/templates/settings/dashboard.html:77 +#: bookwyrm/templates/settings/announcements/announcement.html:54 +#: bookwyrm/templates/settings/announcements/announcement_form.html:49 +#: bookwyrm/templates/settings/dashboard/dashboard.html:77 msgid "End date:" msgstr "Fecha final:" -#: bookwyrm/templates/settings/announcement.html:60 -#: bookwyrm/templates/settings/announcement_form.html:58 +#: bookwyrm/templates/settings/announcements/announcement.html:60 +#: bookwyrm/templates/settings/announcements/announcement_form.html:58 msgid "Active:" msgstr "Activ@:" -#: bookwyrm/templates/settings/announcement_form.html:8 -#: bookwyrm/templates/settings/announcements.html:8 +#: bookwyrm/templates/settings/announcements/announcement_form.html:8 +#: bookwyrm/templates/settings/announcements/announcements.html:8 msgid "Create Announcement" msgstr "Crear anuncio" -#: bookwyrm/templates/settings/announcement_form.html:16 -#, fuzzy -#| msgid "Preview" +#: bookwyrm/templates/settings/announcements/announcement_form.html:16 msgid "Preview:" -msgstr "Vista preliminar" +msgstr "Vista preliminar:" -#: bookwyrm/templates/settings/announcement_form.html:23 -#, fuzzy -#| msgid "Content" +#: bookwyrm/templates/settings/announcements/announcement_form.html:23 msgid "Content:" -msgstr "Contenido" +msgstr "Contenido:" -#: bookwyrm/templates/settings/announcement_form.html:30 -#, fuzzy -#| msgid "End date:" +#: bookwyrm/templates/settings/announcements/announcement_form.html:30 msgid "Event date:" -msgstr "Fecha final:" +msgstr "Fecha de evento:" -#: bookwyrm/templates/settings/announcements.html:3 -#: bookwyrm/templates/settings/announcements.html:5 -#: bookwyrm/templates/settings/layout.html:68 +#: bookwyrm/templates/settings/announcements/announcements.html:3 +#: bookwyrm/templates/settings/announcements/announcements.html:5 +#: bookwyrm/templates/settings/layout.html:72 msgid "Announcements" msgstr "Anuncios" -#: bookwyrm/templates/settings/announcements.html:22 -#: bookwyrm/templates/settings/federation.html:36 +#: bookwyrm/templates/settings/announcements/announcements.html:22 +#: bookwyrm/templates/settings/federation/instance_list.html:36 msgid "Date added" msgstr "Fecha agregada" -#: bookwyrm/templates/settings/announcements.html:26 +#: bookwyrm/templates/settings/announcements/announcements.html:26 msgid "Preview" msgstr "Vista preliminar" -#: bookwyrm/templates/settings/announcements.html:30 +#: bookwyrm/templates/settings/announcements/announcements.html:30 msgid "Start date" msgstr "Fecha de inicio" -#: bookwyrm/templates/settings/announcements.html:34 +#: bookwyrm/templates/settings/announcements/announcements.html:34 msgid "End date" msgstr "Fecha final" -#: bookwyrm/templates/settings/announcements.html:38 -#: bookwyrm/templates/settings/federation.html:46 -#: bookwyrm/templates/settings/manage_invite_requests.html:44 -#: bookwyrm/templates/settings/status_filter.html:5 -#: bookwyrm/templates/user_admin/user_admin.html:34 -#: bookwyrm/templates/user_admin/user_info.html:20 +#: bookwyrm/templates/settings/announcements/announcements.html:38 +#: bookwyrm/templates/settings/federation/instance_list.html:46 +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:44 +#: bookwyrm/templates/settings/invites/status_filter.html:5 +#: bookwyrm/templates/settings/users/user_admin.html:34 +#: bookwyrm/templates/settings/users/user_info.html:20 msgid "Status" msgstr "Status" -#: bookwyrm/templates/settings/announcements.html:48 +#: bookwyrm/templates/settings/announcements/announcements.html:48 msgid "active" msgstr "activo" -#: bookwyrm/templates/settings/announcements.html:48 +#: bookwyrm/templates/settings/announcements/announcements.html:48 msgid "inactive" msgstr "inactivo" -#: bookwyrm/templates/settings/announcements.html:54 +#: bookwyrm/templates/settings/announcements/announcements.html:52 #, fuzzy -#| msgid "Announcements" -msgid "No announcements found." -msgstr "Anuncios" +#| msgid "No announcements found." +msgid "No announcements found" +msgstr "No se encontró ningun anuncio." -#: bookwyrm/templates/settings/dashboard.html:6 -#: bookwyrm/templates/settings/dashboard.html:8 +#: bookwyrm/templates/settings/dashboard/dashboard.html:6 +#: bookwyrm/templates/settings/dashboard/dashboard.html:8 #: bookwyrm/templates/settings/layout.html:26 msgid "Dashboard" -msgstr "" +msgstr "Tablero" -#: bookwyrm/templates/settings/dashboard.html:15 -#, fuzzy -#| msgid "Local users" +#: bookwyrm/templates/settings/dashboard/dashboard.html:15 msgid "Total users" -msgstr "Usuarios locales" +msgstr "Número de usuarios" -#: bookwyrm/templates/settings/dashboard.html:21 -#: bookwyrm/templates/settings/dashboard_user_chart.html:12 +#: bookwyrm/templates/settings/dashboard/dashboard.html:21 +#: bookwyrm/templates/settings/dashboard/dashboard_user_chart.html:12 msgid "Active this month" -msgstr "" +msgstr "Activos este mes" -#: bookwyrm/templates/settings/dashboard.html:27 -#, fuzzy -#| msgid "Status" +#: bookwyrm/templates/settings/dashboard/dashboard.html:27 msgid "Statuses" -msgstr "Status" +msgstr "Statuses" -#: bookwyrm/templates/settings/dashboard.html:33 +#: bookwyrm/templates/settings/dashboard/dashboard.html:33 msgid "Works" -msgstr "" +msgstr "Obras" -#: bookwyrm/templates/settings/dashboard.html:43 -#, fuzzy, python-format -#| msgid "%(count)d uses" +#: bookwyrm/templates/settings/dashboard/dashboard.html:43 +#, python-format msgid "%(display_count)s open report" msgid_plural "%(display_count)s open reports" -msgstr[0] "%(count)d usos" -msgstr[1] "%(count)d usos" +msgstr[0] "%(display_count)s informe abierto" +msgstr[1] "%(display_count)s informes abiertos" -#: bookwyrm/templates/settings/dashboard.html:54 -#, fuzzy, python-format -#| msgid "%(count)d uses" +#: bookwyrm/templates/settings/dashboard/dashboard.html:54 +#, python-format msgid "%(display_count)s invite request" msgid_plural "%(display_count)s invite requests" -msgstr[0] "%(count)d usos" -msgstr[1] "%(count)d usos" +msgstr[0] "%(display_count)s solicitación de invitado" +msgstr[1] "%(display_count)s solicitaciones de invitado" -#: bookwyrm/templates/settings/dashboard.html:65 -#, fuzzy -#| msgid "User Activity" +#: bookwyrm/templates/settings/dashboard/dashboard.html:65 msgid "Instance Activity" -msgstr "Actividad de usuario" +msgstr "Actividad de instancia" -#: bookwyrm/templates/settings/dashboard.html:83 -#, fuzzy -#| msgid "Integer" +#: bookwyrm/templates/settings/dashboard/dashboard.html:83 msgid "Interval:" -msgstr "Entero" +msgstr "Intervalo:" -#: bookwyrm/templates/settings/dashboard.html:86 +#: bookwyrm/templates/settings/dashboard/dashboard.html:87 msgid "Days" -msgstr "" +msgstr "Dias" -#: bookwyrm/templates/settings/dashboard.html:87 -#, fuzzy -#| msgid "One Week" +#: bookwyrm/templates/settings/dashboard/dashboard.html:88 msgid "Weeks" -msgstr "Una semana" +msgstr "Semanas" -#: bookwyrm/templates/settings/dashboard.html:100 -#, fuzzy -#| msgid "User Activity" +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 msgid "User signup activity" -msgstr "Actividad de usuario" +msgstr "Actividad de inscripciones de usuarios" -#: bookwyrm/templates/settings/dashboard.html:106 -#, fuzzy -#| msgid "User Activity" +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 msgid "Status activity" -msgstr "Actividad de usuario" +msgstr "Actividad de status" -#: bookwyrm/templates/settings/dashboard_status_chart.html:7 -#, fuzzy -#| msgid "No statuses reported" +#: bookwyrm/templates/settings/dashboard/dashboard_status_chart.html:7 msgid "Statuses posted" -msgstr "Ningún estatus reportado" +msgstr "Statuses publicados" -#: bookwyrm/templates/settings/dashboard_user_chart.html:7 +#: bookwyrm/templates/settings/dashboard/dashboard_user_chart.html:7 msgid "Total" -msgstr "" +msgstr "Suma" -#: bookwyrm/templates/settings/domain_form.html:5 -#: bookwyrm/templates/settings/email_blocklist.html:10 +#: bookwyrm/templates/settings/email_blocklist/domain_form.html:5 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:10 msgid "Add domain" -msgstr "" +msgstr "Agregar dominio" -#: bookwyrm/templates/settings/domain_form.html:11 +#: bookwyrm/templates/settings/email_blocklist/domain_form.html:11 msgid "Domain:" -msgstr "" +msgstr "Dominio:" -#: bookwyrm/templates/settings/edit_server.html:3 -#: bookwyrm/templates/settings/edit_server.html:6 -#: bookwyrm/templates/settings/edit_server.html:20 -#: bookwyrm/templates/settings/federation.html:9 -#: bookwyrm/templates/settings/federation.html:10 -#: bookwyrm/templates/settings/server_blocklist.html:3 -#: bookwyrm/templates/settings/server_blocklist.html:20 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:5 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:7 +#: bookwyrm/templates/settings/layout.html:59 +msgid "Email Blocklist" +msgstr "Lista de bloqueo de correos electrónicos" + +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:18 +msgid "When someone tries to register with an email from this domain, no account will be created. The registration process will appear to have worked." +msgstr "Cuando alguien intenta registrarse con un correo electrónico de este dominio, ningun cuenta se creerá. El proceso de registración se parecerá a funcionado." + +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:25 +msgid "Domain" +msgstr "Dominio" + +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:29 +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:27 +msgid "Options" +msgstr "Opciones" + +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:38 +#, python-format +msgid "%(display_count)s user" +msgid_plural "%(display_count)s users" +msgstr[0] "%(display_count)s usuario" +msgstr[1] "%(display_count)s usuarios" + +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:59 +#, fuzzy +#| msgid "No users currently blocked." +msgid "No email domains currently blocked" +msgstr "No hay ningún usuario bloqueado actualmente." + +#: bookwyrm/templates/settings/federation/edit_instance.html:3 +#: bookwyrm/templates/settings/federation/edit_instance.html:6 +#: bookwyrm/templates/settings/federation/edit_instance.html:20 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:3 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:20 +#: bookwyrm/templates/settings/federation/instance_list.html:9 +#: bookwyrm/templates/settings/federation/instance_list.html:10 msgid "Add instance" msgstr "Agregar instancia" -#: bookwyrm/templates/settings/edit_server.html:7 -#: bookwyrm/templates/settings/server_blocklist.html:7 +#: bookwyrm/templates/settings/federation/edit_instance.html:7 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:7 msgid "Back to instance list" msgstr "Volver a la lista de instancias" -#: bookwyrm/templates/settings/edit_server.html:16 -#: bookwyrm/templates/settings/server_blocklist.html:16 +#: bookwyrm/templates/settings/federation/edit_instance.html:16 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:16 msgid "Import block list" msgstr "Importar lista de bloqueo" -#: bookwyrm/templates/settings/edit_server.html:30 +#: bookwyrm/templates/settings/federation/edit_instance.html:30 msgid "Instance:" msgstr "Instancia:" -#: bookwyrm/templates/settings/edit_server.html:37 -#: bookwyrm/templates/settings/federated_server.html:31 -#: bookwyrm/templates/user_admin/user_info.html:125 +#: bookwyrm/templates/settings/federation/edit_instance.html:39 +#: bookwyrm/templates/settings/federation/instance.html:28 +#: bookwyrm/templates/settings/users/user_info.html:106 msgid "Status:" msgstr "Status:" -#: bookwyrm/templates/settings/edit_server.html:48 -#: bookwyrm/templates/settings/federated_server.html:23 -#: bookwyrm/templates/user_admin/user_info.html:117 +#: bookwyrm/templates/settings/federation/edit_instance.html:52 +#: bookwyrm/templates/settings/federation/instance.html:22 +#: bookwyrm/templates/settings/users/user_info.html:100 msgid "Software:" msgstr "Software:" -#: bookwyrm/templates/settings/edit_server.html:55 -#: bookwyrm/templates/settings/federated_server.html:27 -#: bookwyrm/templates/user_admin/user_info.html:121 +#: bookwyrm/templates/settings/federation/edit_instance.html:61 +#: bookwyrm/templates/settings/federation/instance.html:25 +#: bookwyrm/templates/settings/users/user_info.html:103 msgid "Version:" msgstr "Versión:" -#: bookwyrm/templates/settings/edit_server.html:64 +#: bookwyrm/templates/settings/federation/edit_instance.html:70 msgid "Notes:" msgstr "Notas:" -#: bookwyrm/templates/settings/email_blocklist.html:5 -#: bookwyrm/templates/settings/email_blocklist.html:7 -#: bookwyrm/templates/settings/layout.html:59 -#, fuzzy -#| msgid "Import Blocklist" -msgid "Email Blocklist" -msgstr "Importar lista de bloqueo" - -#: bookwyrm/templates/settings/email_blocklist.html:18 -msgid "When someone tries to register with an email from this domain, no account will be created. The registration process will appear to have worked." -msgstr "" - -#: bookwyrm/templates/settings/email_blocklist.html:25 -msgid "Domain" -msgstr "" - -#: bookwyrm/templates/settings/email_blocklist.html:29 -#, fuzzy -#| msgid "Actions" -msgid "Options" -msgstr "Acciones" - -#: bookwyrm/templates/settings/email_blocklist.html:38 -#, fuzzy, python-format -#| msgid "%(count)d uses" -msgid "%(display_count)s user" -msgid_plural "%(display_count)s users" -msgstr[0] "%(count)d usos" -msgstr[1] "%(count)d usos" - -#: bookwyrm/templates/settings/federated_server.html:19 +#: bookwyrm/templates/settings/federation/instance.html:19 msgid "Details" msgstr "Detalles" -#: bookwyrm/templates/settings/federated_server.html:39 +#: bookwyrm/templates/settings/federation/instance.html:35 #: bookwyrm/templates/user/layout.html:63 msgid "Activity" msgstr "Actividad" -#: bookwyrm/templates/settings/federated_server.html:43 +#: bookwyrm/templates/settings/federation/instance.html:38 msgid "Users:" msgstr "Usuarios:" -#: bookwyrm/templates/settings/federated_server.html:46 -#: bookwyrm/templates/settings/federated_server.html:53 +#: bookwyrm/templates/settings/federation/instance.html:41 +#: bookwyrm/templates/settings/federation/instance.html:47 msgid "View all" msgstr "Ver todos" -#: bookwyrm/templates/settings/federated_server.html:50 -#: bookwyrm/templates/user_admin/user_info.html:59 +#: bookwyrm/templates/settings/federation/instance.html:44 +#: bookwyrm/templates/settings/users/user_info.html:56 msgid "Reports:" msgstr "Informes:" -#: bookwyrm/templates/settings/federated_server.html:57 +#: bookwyrm/templates/settings/federation/instance.html:50 msgid "Followed by us:" msgstr "Seguido por nosotros:" -#: bookwyrm/templates/settings/federated_server.html:63 +#: bookwyrm/templates/settings/federation/instance.html:55 msgid "Followed by them:" msgstr "Seguido por ellos:" -#: bookwyrm/templates/settings/federated_server.html:69 +#: bookwyrm/templates/settings/federation/instance.html:60 msgid "Blocked by us:" msgstr "Bloqueado por nosotros:" -#: bookwyrm/templates/settings/federated_server.html:82 -#: bookwyrm/templates/user_admin/user_info.html:130 +#: bookwyrm/templates/settings/federation/instance.html:72 +#: bookwyrm/templates/settings/users/user_info.html:110 msgid "Notes" msgstr "Notas" -#: bookwyrm/templates/settings/federated_server.html:85 +#: bookwyrm/templates/settings/federation/instance.html:75 msgid "Edit" msgstr "Editar" -#: bookwyrm/templates/settings/federated_server.html:105 -#: bookwyrm/templates/user_admin/user_moderation_actions.html:8 +#: bookwyrm/templates/settings/federation/instance.html:79 +msgid "No notes" +msgstr "" + +#: bookwyrm/templates/settings/federation/instance.html:94 +#: bookwyrm/templates/settings/users/user_moderation_actions.html:8 msgid "Actions" msgstr "Acciones" -#: bookwyrm/templates/settings/federated_server.html:109 +#: bookwyrm/templates/settings/federation/instance.html:98 #: bookwyrm/templates/snippets/block_button.html:5 msgid "Block" msgstr "Bloquear" -#: bookwyrm/templates/settings/federated_server.html:110 +#: bookwyrm/templates/settings/federation/instance.html:99 msgid "All users from this instance will be deactivated." msgstr "Todos los usuarios en esta instancia serán desactivados." -#: bookwyrm/templates/settings/federated_server.html:115 +#: bookwyrm/templates/settings/federation/instance.html:104 #: bookwyrm/templates/snippets/block_button.html:10 msgid "Un-block" msgstr "Desbloquear" -#: bookwyrm/templates/settings/federated_server.html:116 +#: bookwyrm/templates/settings/federation/instance.html:105 msgid "All users from this instance will be re-activated." msgstr "Todos los usuarios en esta instancia serán re-activados." -#: bookwyrm/templates/settings/federation.html:3 -#: bookwyrm/templates/settings/federation.html:5 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:6 +msgid "Import Blocklist" +msgstr "Importar lista de bloqueo" + +#: bookwyrm/templates/settings/federation/instance_blocklist.html:26 +#: bookwyrm/templates/snippets/goal_progress.html:7 +msgid "Success!" +msgstr "¡Meta logrado!" + +#: bookwyrm/templates/settings/federation/instance_blocklist.html:30 +msgid "Successfully blocked:" +msgstr "Se bloqueó exitosamente:" + +#: bookwyrm/templates/settings/federation/instance_blocklist.html:32 +msgid "Failed:" +msgstr "Falló:" + +#: bookwyrm/templates/settings/federation/instance_list.html:3 +#: bookwyrm/templates/settings/federation/instance_list.html:5 #: bookwyrm/templates/settings/layout.html:45 msgid "Federated Instances" msgstr "Instancias federalizadas" -#: bookwyrm/templates/settings/federation.html:32 -#: bookwyrm/templates/user_admin/server_filter.html:5 +#: bookwyrm/templates/settings/federation/instance_list.html:32 +#: bookwyrm/templates/settings/users/server_filter.html:5 msgid "Instance name" msgstr "Nombre de instancia" -#: bookwyrm/templates/settings/federation.html:40 +#: bookwyrm/templates/settings/federation/instance_list.html:40 msgid "Software" msgstr "Software" +#: bookwyrm/templates/settings/federation/instance_list.html:63 +#, fuzzy +#| msgid "No announcements found." +msgid "No instances found" +msgstr "No se encontró ningun anuncio." + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:4 +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:11 +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:25 +#: bookwyrm/templates/settings/invites/manage_invites.html:11 +msgid "Invite Requests" +msgstr "Solicitudes de invitación" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:23 +msgid "Ignored Invite Requests" +msgstr "Solicitudes de invitación ignoradas" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:35 +msgid "Date requested" +msgstr "Fecha solicitada" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:39 +msgid "Date accepted" +msgstr "Fecha de aceptación" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:42 +msgid "Email" +msgstr "Correo electronico" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:47 +msgid "Action" +msgstr "Acción" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:50 +msgid "No requests" +msgstr "No solicitudes" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:59 +#: bookwyrm/templates/settings/invites/status_filter.html:16 +msgid "Accepted" +msgstr "Aceptado" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:61 +#: bookwyrm/templates/settings/invites/status_filter.html:12 +msgid "Sent" +msgstr "Enviado" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:63 +#: bookwyrm/templates/settings/invites/status_filter.html:8 +msgid "Requested" +msgstr "Solicitado" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:73 +msgid "Send invite" +msgstr "Enviar invitación" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:75 +msgid "Re-send invite" +msgstr "Re-enviar invitación" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:95 +msgid "Ignore" +msgstr "Ignorar" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:97 +msgid "Un-ignore" +msgstr "Des-ignorar" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:108 +msgid "Back to pending requests" +msgstr "Volver a las solicitudes pendientes" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:110 +msgid "View ignored requests" +msgstr "Ver solicitudes ignoradas" + +#: bookwyrm/templates/settings/invites/manage_invites.html:21 +msgid "Generate New Invite" +msgstr "Generar nuevo invitación" + +#: bookwyrm/templates/settings/invites/manage_invites.html:27 +msgid "Expiry:" +msgstr "Vencimiento:" + +#: bookwyrm/templates/settings/invites/manage_invites.html:33 +msgid "Use limit:" +msgstr "Límite de uso:" + +#: bookwyrm/templates/settings/invites/manage_invites.html:40 +msgid "Create Invite" +msgstr "Crear invitación" + +#: bookwyrm/templates/settings/invites/manage_invites.html:47 +msgid "Link" +msgstr "Enlace" + +#: bookwyrm/templates/settings/invites/manage_invites.html:48 +msgid "Expires" +msgstr "Vence" + +#: bookwyrm/templates/settings/invites/manage_invites.html:49 +msgid "Max uses" +msgstr "Número máximo de usos" + +#: bookwyrm/templates/settings/invites/manage_invites.html:50 +msgid "Times used" +msgstr "Número de usos" + +#: bookwyrm/templates/settings/invites/manage_invites.html:53 +msgid "No active invites" +msgstr "No invitaciónes activas" + +#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:5 +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:10 +#, fuzzy +#| msgid "IP address" +msgid "Add IP address" +msgstr "Dirección IP" + +#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:11 +msgid "Use IP address blocks with caution, and consider using blocks only temporarily, as IP addresses are often shared or change hands. If you block your own IP, you will not be able to access this page." +msgstr "" + +#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:18 +#, fuzzy +#| msgid "IP address" +msgid "IP Address:" +msgstr "Dirección IP" + +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:5 +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:7 +#: bookwyrm/templates/settings/layout.html:63 +#, fuzzy +#| msgid "Import Blocklist" +msgid "IP Address Blocklist" +msgstr "Importar lista de bloqueo" + +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:18 +msgid "Any traffic from this IP address will get a 404 response when trying to access any part of the application." +msgstr "" + +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:24 +#, fuzzy +#| msgid "IP address" +msgid "Address" +msgstr "Dirección IP" + +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:46 +#, fuzzy +#| msgid "No users currently blocked." +msgid "No IP addresses currently blocked" +msgstr "No hay ningún usuario bloqueado actualmente." + +#: bookwyrm/templates/settings/ip_blocklist/ip_tooltip.html:6 +msgid "You can block IP ranges using CIDR syntax." +msgstr "" + #: bookwyrm/templates/settings/layout.html:4 msgid "Administration" msgstr "Adminstración" @@ -2452,242 +2523,378 @@ msgid "Manage Users" msgstr "Administrar usuarios" #: bookwyrm/templates/settings/layout.html:51 -#, fuzzy -#| msgid "Duration" msgid "Moderation" -msgstr "Duración" +msgstr "Moderación" -#: bookwyrm/templates/settings/layout.html:64 +#: bookwyrm/templates/settings/layout.html:55 +#: bookwyrm/templates/settings/reports/reports.html:8 +#: bookwyrm/templates/settings/reports/reports.html:17 +msgid "Reports" +msgstr "Informes" + +#: bookwyrm/templates/settings/layout.html:68 msgid "Instance Settings" msgstr "Configuración de instancia" -#: bookwyrm/templates/settings/layout.html:72 +#: bookwyrm/templates/settings/layout.html:76 #: bookwyrm/templates/settings/site.html:4 #: bookwyrm/templates/settings/site.html:6 msgid "Site Settings" msgstr "Configuración de sitio" -#: bookwyrm/templates/settings/layout.html:75 -#: bookwyrm/templates/settings/site.html:13 +#: bookwyrm/templates/settings/reports/report.html:5 +#: bookwyrm/templates/settings/reports/report.html:8 +#: bookwyrm/templates/settings/reports/report_preview.html:6 +#, python-format +msgid "Report #%(report_id)s: %(username)s" +msgstr "Reportar #%(report_id)s: %(username)s" + +#: bookwyrm/templates/settings/reports/report.html:9 +msgid "Back to reports" +msgstr "Volver a los informes" + +#: bookwyrm/templates/settings/reports/report.html:23 +msgid "Moderator Comments" +msgstr "Comentarios de moderador" + +#: bookwyrm/templates/settings/reports/report.html:41 +#: bookwyrm/templates/snippets/create_status.html:28 +msgid "Comment" +msgstr "Comentario" + +#: bookwyrm/templates/settings/reports/report.html:46 +msgid "Reported statuses" +msgstr "Statuses reportados" + +#: bookwyrm/templates/settings/reports/report.html:48 +msgid "No statuses reported" +msgstr "Ningún estatus reportado" + +#: bookwyrm/templates/settings/reports/report.html:54 +msgid "Status has been deleted" +msgstr "Status ha sido eliminado" + +#: bookwyrm/templates/settings/reports/report_preview.html:13 +msgid "No notes provided" +msgstr "No se proporcionó notas" + +#: bookwyrm/templates/settings/reports/report_preview.html:20 +#, python-format +msgid "Reported by %(username)s" +msgstr "Reportado por %(username)s" + +#: bookwyrm/templates/settings/reports/report_preview.html:30 +msgid "Re-open" +msgstr "Reabrir" + +#: bookwyrm/templates/settings/reports/report_preview.html:32 +msgid "Resolve" +msgstr "Resolver" + +#: bookwyrm/templates/settings/reports/reports.html:6 +#, python-format +msgid "Reports: %(instance_name)s" +msgstr "Informes: %(instance_name)s" + +#: bookwyrm/templates/settings/reports/reports.html:14 +#, python-format +msgid "Reports: %(instance_name)s" +msgstr "Informes: %(instance_name)s" + +#: bookwyrm/templates/settings/reports/reports.html:28 +msgid "Resolved" +msgstr "Resuelto" + +#: bookwyrm/templates/settings/reports/reports.html:37 +msgid "No reports found." +msgstr "No se encontró ningún informe." + +#: bookwyrm/templates/settings/site.html:10 +#: bookwyrm/templates/settings/site.html:21 msgid "Instance Info" msgstr "Información de instancia" -#: bookwyrm/templates/settings/layout.html:76 -#: bookwyrm/templates/settings/site.html:44 +#: bookwyrm/templates/settings/site.html:11 +#: bookwyrm/templates/settings/site.html:54 msgid "Images" msgstr "Imagenes" -#: bookwyrm/templates/settings/layout.html:77 -#: bookwyrm/templates/settings/site.html:64 +#: bookwyrm/templates/settings/site.html:12 +#: bookwyrm/templates/settings/site.html:74 msgid "Footer Content" msgstr "Contenido del pie de página" -#: bookwyrm/templates/settings/layout.html:78 -#: bookwyrm/templates/settings/site.html:86 +#: bookwyrm/templates/settings/site.html:13 +#: bookwyrm/templates/settings/site.html:98 msgid "Registration" msgstr "Registración" -#: bookwyrm/templates/settings/manage_invite_requests.html:4 -#: bookwyrm/templates/settings/manage_invite_requests.html:11 -#: bookwyrm/templates/settings/manage_invite_requests.html:25 -#: bookwyrm/templates/settings/manage_invites.html:11 -msgid "Invite Requests" -msgstr "Solicitudes de invitación" - -#: bookwyrm/templates/settings/manage_invite_requests.html:23 -msgid "Ignored Invite Requests" -msgstr "Solicitudes de invitación ignoradas" - -#: bookwyrm/templates/settings/manage_invite_requests.html:35 -msgid "Date requested" -msgstr "Fecha solicitada" - -#: bookwyrm/templates/settings/manage_invite_requests.html:39 -msgid "Date accepted" -msgstr "Fecha de aceptación" - -#: bookwyrm/templates/settings/manage_invite_requests.html:42 -msgid "Email" -msgstr "Correo electronico" - -#: bookwyrm/templates/settings/manage_invite_requests.html:47 -msgid "Action" -msgstr "Acción" - -#: bookwyrm/templates/settings/manage_invite_requests.html:50 -msgid "No requests" -msgstr "No solicitudes" - -#: bookwyrm/templates/settings/manage_invite_requests.html:59 -#: bookwyrm/templates/settings/status_filter.html:16 -msgid "Accepted" -msgstr "Aceptado" - -#: bookwyrm/templates/settings/manage_invite_requests.html:61 -#: bookwyrm/templates/settings/status_filter.html:12 -msgid "Sent" -msgstr "Enviado" - -#: bookwyrm/templates/settings/manage_invite_requests.html:63 -#: bookwyrm/templates/settings/status_filter.html:8 -msgid "Requested" -msgstr "Solicitado" - -#: bookwyrm/templates/settings/manage_invite_requests.html:73 -msgid "Send invite" -msgstr "Enviar invitación" - -#: bookwyrm/templates/settings/manage_invite_requests.html:75 -msgid "Re-send invite" -msgstr "Re-enviar invitación" - -#: bookwyrm/templates/settings/manage_invite_requests.html:95 -msgid "Ignore" -msgstr "Ignorar" - -#: bookwyrm/templates/settings/manage_invite_requests.html:97 -msgid "Un-ignore" -msgstr "Des-ignorar" - -#: bookwyrm/templates/settings/manage_invite_requests.html:108 -msgid "Back to pending requests" -msgstr "Volver a las solicitudes pendientes" - -#: bookwyrm/templates/settings/manage_invite_requests.html:110 -msgid "View ignored requests" -msgstr "Ver solicitudes ignoradas" - -#: bookwyrm/templates/settings/manage_invites.html:21 -msgid "Generate New Invite" -msgstr "Generar nuevo invitación" - -#: bookwyrm/templates/settings/manage_invites.html:27 -msgid "Expiry:" -msgstr "Vencimiento:" - -#: bookwyrm/templates/settings/manage_invites.html:33 -msgid "Use limit:" -msgstr "Límite de uso:" - -#: bookwyrm/templates/settings/manage_invites.html:40 -msgid "Create Invite" -msgstr "Crear invitación" - -#: bookwyrm/templates/settings/manage_invites.html:47 -msgid "Link" -msgstr "Enlace" - -#: bookwyrm/templates/settings/manage_invites.html:48 -msgid "Expires" -msgstr "Vence" - -#: bookwyrm/templates/settings/manage_invites.html:49 -msgid "Max uses" -msgstr "Número máximo de usos" - -#: bookwyrm/templates/settings/manage_invites.html:50 -msgid "Times used" -msgstr "Número de usos" - -#: bookwyrm/templates/settings/manage_invites.html:53 -msgid "No active invites" -msgstr "No invitaciónes activas" - -#: bookwyrm/templates/settings/server_blocklist.html:6 -msgid "Import Blocklist" -msgstr "Importar lista de bloqueo" - -#: bookwyrm/templates/settings/server_blocklist.html:26 -#: bookwyrm/templates/snippets/goal_progress.html:7 -msgid "Success!" -msgstr "¡Meta logrado!" - -#: bookwyrm/templates/settings/server_blocklist.html:30 -msgid "Successfully blocked:" -msgstr "Se bloqueó exitosamente:" - -#: bookwyrm/templates/settings/server_blocklist.html:32 -msgid "Failed:" -msgstr "Falló:" - -#: bookwyrm/templates/settings/site.html:15 +#: bookwyrm/templates/settings/site.html:24 msgid "Instance Name:" msgstr "Nombre de instancia:" -#: bookwyrm/templates/settings/site.html:19 +#: bookwyrm/templates/settings/site.html:28 msgid "Tagline:" msgstr "Lema:" -#: bookwyrm/templates/settings/site.html:23 +#: bookwyrm/templates/settings/site.html:32 msgid "Instance description:" msgstr "Descripción de instancia:" -#: bookwyrm/templates/settings/site.html:27 -#, fuzzy -#| msgid "Description:" +#: bookwyrm/templates/settings/site.html:36 msgid "Short description:" -msgstr "Descripción:" +msgstr "Descripción corta:" -#: bookwyrm/templates/settings/site.html:28 +#: bookwyrm/templates/settings/site.html:37 msgid "Used when the instance is previewed on joinbookwyrm.com. Does not support html or markdown." -msgstr "" +msgstr "Utilizado cuando la instancia se ve de una vista previa en joinbookwyrm.com. No es compatible con html o markdown." -#: bookwyrm/templates/settings/site.html:32 +#: bookwyrm/templates/settings/site.html:41 msgid "Code of conduct:" msgstr "Código de conducta:" -#: bookwyrm/templates/settings/site.html:36 +#: bookwyrm/templates/settings/site.html:45 msgid "Privacy Policy:" msgstr "Política de privacidad:" -#: bookwyrm/templates/settings/site.html:47 +#: bookwyrm/templates/settings/site.html:57 msgid "Logo:" msgstr "Logo:" -#: bookwyrm/templates/settings/site.html:51 +#: bookwyrm/templates/settings/site.html:61 msgid "Logo small:" msgstr "Logo pequeño:" -#: bookwyrm/templates/settings/site.html:55 +#: bookwyrm/templates/settings/site.html:65 msgid "Favicon:" msgstr "Favicon:" -#: bookwyrm/templates/settings/site.html:66 +#: bookwyrm/templates/settings/site.html:77 msgid "Support link:" msgstr "Enlace de apoyo:" -#: bookwyrm/templates/settings/site.html:70 +#: bookwyrm/templates/settings/site.html:81 msgid "Support title:" msgstr "Título de apoyo:" -#: bookwyrm/templates/settings/site.html:74 +#: bookwyrm/templates/settings/site.html:85 msgid "Admin email:" msgstr "Correo electrónico de administradorx:" -#: bookwyrm/templates/settings/site.html:78 +#: bookwyrm/templates/settings/site.html:89 msgid "Additional info:" msgstr "Más informacion:" -#: bookwyrm/templates/settings/site.html:90 +#: bookwyrm/templates/settings/site.html:103 msgid "Allow registration" msgstr "Permitir registración" -#: bookwyrm/templates/settings/site.html:96 +#: bookwyrm/templates/settings/site.html:109 msgid "Allow invite requests" msgstr "Permitir solicitudes de invitación" -#: bookwyrm/templates/settings/site.html:102 +#: bookwyrm/templates/settings/site.html:115 msgid "Require users to confirm email address" msgstr "Requerir a usuarios a confirmar dirección de correo electrónico" -#: bookwyrm/templates/settings/site.html:104 +#: bookwyrm/templates/settings/site.html:117 msgid "(Recommended if registration is open)" msgstr "(Recomendado si la registración es abierta)" -#: bookwyrm/templates/settings/site.html:107 +#: bookwyrm/templates/settings/site.html:120 msgid "Registration closed text:" msgstr "Texto de registración cerrada:" +#: bookwyrm/templates/settings/site.html:124 +#, fuzzy +#| msgid "Invite Requests" +msgid "Invite request text:" +msgstr "Solicitudes de invitación" + +#: bookwyrm/templates/settings/users/delete_user_form.html:5 +#: bookwyrm/templates/settings/users/user_moderation_actions.html:31 +msgid "Permanently delete user" +msgstr "Eliminar usuario permanentemente" + +#: bookwyrm/templates/settings/users/delete_user_form.html:12 +#, python-format +msgid "Are you sure you want to delete %(username)s's account? This action cannot be undone. To proceed, please enter your password to confirm deletion." +msgstr "¿Estás seguro que quieres eliminar la cuenta de %(username)s's? Esta acción no se puede deshacer. Para continuar, por favor, ingrese tu contraseña para confirmar eliminación." + +#: bookwyrm/templates/settings/users/delete_user_form.html:17 +msgid "Your password:" +msgstr "Tu contraseña:" + +#: bookwyrm/templates/settings/users/user.html:7 +msgid "Back to users" +msgstr "Volver a usuarios" + +#: bookwyrm/templates/settings/users/user_admin.html:7 +#, python-format +msgid "Users: %(instance_name)s" +msgstr "Usuarios %(instance_name)s" + +#: bookwyrm/templates/settings/users/user_admin.html:22 +#: bookwyrm/templates/settings/users/username_filter.html:5 +msgid "Username" +msgstr "Nombre de usuario" + +#: bookwyrm/templates/settings/users/user_admin.html:26 +msgid "Date Added" +msgstr "Fecha agregada" + +#: bookwyrm/templates/settings/users/user_admin.html:30 +msgid "Last Active" +msgstr "Actividad reciente" + +#: bookwyrm/templates/settings/users/user_admin.html:38 +msgid "Remote instance" +msgstr "Instancia remota" + +#: bookwyrm/templates/settings/users/user_admin.html:47 +#: bookwyrm/templates/settings/users/user_info.html:24 +msgid "Active" +msgstr "Activ@" + +#: bookwyrm/templates/settings/users/user_admin.html:47 +#: bookwyrm/templates/settings/users/user_info.html:28 +msgid "Inactive" +msgstr "Inactiv@" + +#: bookwyrm/templates/settings/users/user_admin.html:52 +#: bookwyrm/templates/settings/users/user_info.html:120 +msgid "Not set" +msgstr "No establecido" + +#: bookwyrm/templates/settings/users/user_info.html:16 +msgid "View user profile" +msgstr "Ver perfil de usuario" + +#: bookwyrm/templates/settings/users/user_info.html:36 +msgid "Local" +msgstr "Local" + +#: bookwyrm/templates/settings/users/user_info.html:38 +msgid "Remote" +msgstr "Remoto" + +#: bookwyrm/templates/settings/users/user_info.html:47 +msgid "User details" +msgstr "Detalles" + +#: bookwyrm/templates/settings/users/user_info.html:51 +msgid "Email:" +msgstr "Correo electronico:" + +#: bookwyrm/templates/settings/users/user_info.html:61 +msgid "(View reports)" +msgstr "(Ver informes)" + +#: bookwyrm/templates/settings/users/user_info.html:67 +msgid "Blocked by count:" +msgstr "Recuento de usuarios que han bloqueado este usuario:" + +#: bookwyrm/templates/settings/users/user_info.html:70 +msgid "Last active date:" +msgstr "Fecha de actividad más reciente:" + +#: bookwyrm/templates/settings/users/user_info.html:73 +msgid "Manually approved followers:" +msgstr "Seguidores aprobados a mano:" + +#: bookwyrm/templates/settings/users/user_info.html:76 +msgid "Discoverable:" +msgstr "Reconocible:" + +#: bookwyrm/templates/settings/users/user_info.html:80 +msgid "Deactivation reason:" +msgstr "Razón de desactivación:" + +#: bookwyrm/templates/settings/users/user_info.html:95 +msgid "Instance details" +msgstr "Detalles de instancia" + +#: bookwyrm/templates/settings/users/user_info.html:117 +msgid "View instance" +msgstr "Ver instancia" + +#: bookwyrm/templates/settings/users/user_moderation_actions.html:5 +msgid "Permanently deleted" +msgstr "Eliminado permanentemente" + +#: bookwyrm/templates/settings/users/user_moderation_actions.html:13 +#: bookwyrm/templates/snippets/status/status_options.html:35 +#: bookwyrm/templates/snippets/user_options.html:13 +msgid "Send direct message" +msgstr "Enviar mensaje directo" + +#: bookwyrm/templates/settings/users/user_moderation_actions.html:20 +msgid "Suspend user" +msgstr "Suspender usuario" + +#: bookwyrm/templates/settings/users/user_moderation_actions.html:25 +msgid "Un-suspend user" +msgstr "Des-suspender usuario" + +#: bookwyrm/templates/settings/users/user_moderation_actions.html:47 +msgid "Access level:" +msgstr "Nivel de acceso:" + +#: bookwyrm/templates/shelf/create_shelf_form.html:5 +msgid "Create Shelf" +msgstr "Crear estante" + +#: bookwyrm/templates/shelf/edit_shelf_form.html:5 +msgid "Edit Shelf" +msgstr "Editar estante" + +#: bookwyrm/templates/shelf/shelf.html:28 bookwyrm/views/shelf.py:56 +msgid "All books" +msgstr "Todos los libros" + +#: bookwyrm/templates/shelf/shelf.html:55 +msgid "Create shelf" +msgstr "Crear estante" + +#: bookwyrm/templates/shelf/shelf.html:77 +#, python-format +msgid "%(formatted_count)s book" +msgid_plural "%(formatted_count)s books" +msgstr[0] "" +msgstr[1] "" + +#: bookwyrm/templates/shelf/shelf.html:84 +#, python-format +msgid "(showing %(start)s-%(end)s)" +msgstr "(mostrando %(start)s-%(end)s)" + +#: bookwyrm/templates/shelf/shelf.html:96 +msgid "Edit shelf" +msgstr "Editar estante" + +#: bookwyrm/templates/shelf/shelf.html:104 +msgid "Delete shelf" +msgstr "Eliminar estante" + +#: bookwyrm/templates/shelf/shelf.html:130 +#: bookwyrm/templates/shelf/shelf.html:154 +msgid "Shelved" +msgstr "Archivado" + +#: bookwyrm/templates/shelf/shelf.html:131 +#: bookwyrm/templates/shelf/shelf.html:158 +msgid "Started" +msgstr "Empezado" + +#: bookwyrm/templates/shelf/shelf.html:132 +#: bookwyrm/templates/shelf/shelf.html:161 +msgid "Finished" +msgstr "Terminado" + +#: bookwyrm/templates/shelf/shelf.html:187 +msgid "This shelf is empty." +msgstr "Este estante está vacio." + #: bookwyrm/templates/snippets/announcement.html:31 #, python-format msgid "Posted by %(username)s" @@ -2732,24 +2939,21 @@ msgid "Some thoughts on the book" msgstr "Algunos pensamientos sobre el libro" #: bookwyrm/templates/snippets/create_status/comment.html:26 -#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:16 +#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:15 msgid "Progress:" msgstr "Progreso:" #: bookwyrm/templates/snippets/create_status/comment.html:52 -#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:30 -#: bookwyrm/templates/snippets/readthrough_form.html:22 +#: bookwyrm/templates/snippets/progress_field.html:18 msgid "pages" msgstr "páginas" #: bookwyrm/templates/snippets/create_status/comment.html:58 -#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:31 -#: bookwyrm/templates/snippets/readthrough_form.html:23 +#: bookwyrm/templates/snippets/progress_field.html:23 msgid "percent" msgstr "por ciento" #: bookwyrm/templates/snippets/create_status/comment.html:65 -#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:36 #, python-format msgid "of %(pages)s pages" msgstr "de %(pages)s páginas" @@ -2765,11 +2969,13 @@ msgstr "Respuesta" msgid "Content" msgstr "Contenido" -#: bookwyrm/templates/snippets/create_status/content_warning_field.html:3 -msgid "Spoiler alert:" -msgstr "Alerta de spoiler:" - #: bookwyrm/templates/snippets/create_status/content_warning_field.html:10 +#, fuzzy +#| msgid "Content:" +msgid "Content warning:" +msgstr "Contenido:" + +#: bookwyrm/templates/snippets/create_status/content_warning_field.html:18 msgid "Spoilers ahead!" msgstr "¡Advertencia, ya vienen spoilers!" @@ -2777,7 +2983,7 @@ msgstr "¡Advertencia, ya vienen spoilers!" msgid "Include spoiler alert" msgstr "Incluir alerta de spoiler" -#: bookwyrm/templates/snippets/create_status/layout.html:38 +#: bookwyrm/templates/snippets/create_status/layout.html:41 #: bookwyrm/templates/snippets/reading_modals/form.html:7 msgid "Comment:" msgstr "Comentario:" @@ -2803,22 +3009,16 @@ msgid "An excerpt from '%(book_title)s'" msgstr "Un extracto de '%(book_title)s'" #: bookwyrm/templates/snippets/create_status/quotation.html:32 -#, fuzzy -#| msgid "Description:" msgid "Position:" -msgstr "Descripción:" +msgstr "Posición:" #: bookwyrm/templates/snippets/create_status/quotation.html:45 -#, fuzzy -#| msgid "pages" msgid "On page:" -msgstr "páginas" +msgstr "En la página:" #: bookwyrm/templates/snippets/create_status/quotation.html:51 -#, fuzzy -#| msgid "percent" msgid "At percent:" -msgstr "por ciento" +msgstr "Al por ciento:" #: bookwyrm/templates/snippets/create_status/review.html:25 #, python-format @@ -2896,13 +3096,11 @@ msgid "No rating" msgstr "No calificación" #: bookwyrm/templates/snippets/form_rate_stars.html:28 -#, fuzzy, python-format -#| msgid "%(rating)s star" -#| msgid_plural "%(rating)s stars" +#, python-format msgid "%(half_rating)s star" msgid_plural "%(half_rating)s stars" -msgstr[0] "%(rating)s estrella" -msgstr[1] "%(rating)s estrellas" +msgstr[0] "%(half_rating)s estrella" +msgstr[1] "%(half_rating)s estrellas" #: bookwyrm/templates/snippets/form_rate_stars.html:64 #: bookwyrm/templates/snippets/stars.html:7 @@ -2938,29 +3136,29 @@ msgstr[1] "Reseña de \"%(book_title)s\" (%(display_rating)s estrellas): %(revie msgid "Review of \"%(book_title)s\": %(review_title)s" msgstr "Reseña de \"%(book_title)s\": %(review_title)s" -#: bookwyrm/templates/snippets/goal_card.html:23 +#: bookwyrm/templates/snippets/goal_form.html:3 #, python-format -msgid "You can set or change your reading goal any time from your profile page" -msgstr "Puedes establecer o cambiar tu meta de lectura en cualquier momento que desees desde tu perfil" +msgid "Set a goal for how many books you'll finish reading in %(year)s, and track your progress throughout the year." +msgstr "Establece una meta para cuantos libros leerás en %(year)s, y seguir tu progreso durante el año." -#: bookwyrm/templates/snippets/goal_form.html:9 +#: bookwyrm/templates/snippets/goal_form.html:12 msgid "Reading goal:" msgstr "Meta de lectura:" -#: bookwyrm/templates/snippets/goal_form.html:14 +#: bookwyrm/templates/snippets/goal_form.html:17 msgid "books" msgstr "libros" -#: bookwyrm/templates/snippets/goal_form.html:19 +#: bookwyrm/templates/snippets/goal_form.html:22 msgid "Goal privacy:" msgstr "Privacidad de meta:" -#: bookwyrm/templates/snippets/goal_form.html:26 +#: bookwyrm/templates/snippets/goal_form.html:29 #: bookwyrm/templates/snippets/reading_modals/layout.html:13 msgid "Post to feed" msgstr "Compartir con tu feed" -#: bookwyrm/templates/snippets/goal_form.html:30 +#: bookwyrm/templates/snippets/goal_form.html:33 msgid "Set goal" msgstr "Establecer meta" @@ -3036,18 +3234,18 @@ msgstr "Calificar" msgid "Finish \"%(book_title)s\"" msgstr "Terminar \"%(book_title)s\"" -#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:22 +#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:23 #: bookwyrm/templates/snippets/reading_modals/start_reading_modal.html:20 #: bookwyrm/templates/snippets/readthrough_form.html:7 msgid "Started reading" msgstr "Lectura se empezó" -#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:30 -#: bookwyrm/templates/snippets/readthrough_form.html:30 +#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:31 +#: bookwyrm/templates/snippets/readthrough_form.html:20 msgid "Finished reading" msgstr "Lectura se terminó" -#: bookwyrm/templates/snippets/reading_modals/form.html:8 +#: bookwyrm/templates/snippets/reading_modals/form.html:9 msgid "(Optional)" msgstr "(Opcional)" @@ -3078,6 +3276,20 @@ msgstr "Inscribirse" msgid "Report" msgstr "Reportar" +#: bookwyrm/templates/snippets/report_modal.html:6 +#, python-format +msgid "Report @%(username)s" +msgstr "Reportar @%(username)s" + +#: bookwyrm/templates/snippets/report_modal.html:23 +#, python-format +msgid "This report will be sent to %(site_name)s's moderators for review." +msgstr "Este informe se enviará a los moderadores de %(site_name)s para la revisión." + +#: bookwyrm/templates/snippets/report_modal.html:24 +msgid "More info about this report:" +msgstr "Más información sobre este informe:" + #: bookwyrm/templates/snippets/search_result_text.html:36 msgid "Import book" msgstr "Importar libro" @@ -3109,32 +3321,38 @@ msgstr "Quitar de %(name)s" msgid "Finish reading" msgstr "Terminar de leer" -#: bookwyrm/templates/snippets/status/content_status.html:73 -#: bookwyrm/templates/snippets/trimmed_text.html:17 -msgid "Show more" -msgstr "Mostrar más" +#: bookwyrm/templates/snippets/status/content_status.html:72 +#, fuzzy +#| msgid "Content:" +msgid "Content warning" +msgstr "Contenido:" -#: bookwyrm/templates/snippets/status/content_status.html:88 -#: bookwyrm/templates/snippets/trimmed_text.html:34 -msgid "Show less" -msgstr "Mostrar menos" +#: bookwyrm/templates/snippets/status/content_status.html:79 +#, fuzzy +#| msgid "View status" +msgid "Show status" +msgstr "Ver status" + +#: bookwyrm/templates/snippets/status/content_status.html:101 +#, python-format +msgid "(Page %(page)s)" +msgstr "(Página %(page)s)" #: bookwyrm/templates/snippets/status/content_status.html:103 -#, fuzzy, python-format -#| msgid "page %(page)s" -msgid "(Page %(page)s)" -msgstr "página %(page)s" - -#: bookwyrm/templates/snippets/status/content_status.html:105 -#, fuzzy, python-format -#| msgid "%(percent)s%% complete!" +#, python-format msgid "(%(percent)s%%)" -msgstr "%(percent)s%% terminado!" +msgstr "(%(percent)s%%)" -#: bookwyrm/templates/snippets/status/content_status.html:127 +#: bookwyrm/templates/snippets/status/content_status.html:125 msgid "Open image in new window" msgstr "Abrir imagen en una nueva ventana" +#: bookwyrm/templates/snippets/status/content_status.html:144 +#, fuzzy +#| msgid "Like status" +msgid "Hide status" +msgstr "Me gusta status" + #: bookwyrm/templates/snippets/status/headers/comment.html:2 #, python-format msgid "commented on %(book)s" @@ -3203,12 +3421,6 @@ msgstr "Más opciones" msgid "Delete & re-draft" msgstr "Eliminar y recomponer" -#: bookwyrm/templates/snippets/status/status_options.html:35 -#: bookwyrm/templates/snippets/user_options.html:13 -#: bookwyrm/templates/user_admin/user_moderation_actions.html:13 -msgid "Send direct message" -msgstr "Enviar mensaje directo" - #: bookwyrm/templates/snippets/suggested_users.html:16 #, python-format msgid "%(mutuals)s follower you follow" @@ -3240,6 +3452,43 @@ msgstr "En orden ascendente" msgid "Sorted descending" msgstr "En orden descendente" +#: bookwyrm/templates/snippets/trimmed_text.html:17 +msgid "Show more" +msgstr "Mostrar más" + +#: bookwyrm/templates/snippets/trimmed_text.html:35 +msgid "Show less" +msgstr "Mostrar menos" + +#: bookwyrm/templates/user/books_header.html:5 +#, python-format +msgid "%(username)s's books" +msgstr "Los libros de %(username)s" + +#: bookwyrm/templates/user/goal.html:8 +#, python-format +msgid "%(year)s Reading Progress" +msgstr "%(year)s Progreso de la meta de lectura" + +#: bookwyrm/templates/user/goal.html:12 +msgid "Edit Goal" +msgstr "Editar meta" + +#: bookwyrm/templates/user/goal.html:28 +#, python-format +msgid "%(name)s hasn't set a reading goal for %(year)s." +msgstr "%(name)s no ha establecido una meta de lectura para %(year)s." + +#: bookwyrm/templates/user/goal.html:40 +#, python-format +msgid "Your %(year)s Books" +msgstr "Tus libros de %(year)s" + +#: bookwyrm/templates/user/goal.html:42 +#, python-format +msgid "%(username)s's %(year)s Books" +msgstr "Los libros de %(username)s para %(year)s" + #: bookwyrm/templates/user/layout.html:18 bookwyrm/templates/user/user.html:10 msgid "User Profile" msgstr "Perfil de usuario" @@ -3276,71 +3525,6 @@ msgstr "Siguiendo" msgid "%(username)s isn't following any users" msgstr "%(username)s no sigue a nadie" -#: bookwyrm/templates/user/shelf/books_header.html:5 -#, python-format -msgid "%(username)s's books" -msgstr "Los libros de %(username)s" - -#: bookwyrm/templates/user/shelf/create_shelf_form.html:5 -#: bookwyrm/templates/user/shelf/create_shelf_form.html:22 -msgid "Create Shelf" -msgstr "Crear estante" - -#: bookwyrm/templates/user/shelf/edit_shelf_form.html:5 -msgid "Edit Shelf" -msgstr "Editar estante" - -#: bookwyrm/templates/user/shelf/edit_shelf_form.html:26 -msgid "Update shelf" -msgstr "Actualizar estante" - -#: bookwyrm/templates/user/shelf/shelf.html:28 bookwyrm/views/shelf.py:56 -msgid "All books" -msgstr "Todos los libros" - -#: bookwyrm/templates/user/shelf/shelf.html:55 -msgid "Create shelf" -msgstr "Crear estante" - -#: bookwyrm/templates/user/shelf/shelf.html:76 -#, python-format -msgid "%(formatted_count)s book" -msgid_plural "%(formatted_count)s books" -msgstr[0] "" -msgstr[1] "" - -#: bookwyrm/templates/user/shelf/shelf.html:83 -#, python-format -msgid "(showing %(start)s-%(end)s)" -msgstr "" - -#: bookwyrm/templates/user/shelf/shelf.html:94 -msgid "Edit shelf" -msgstr "Editar estante" - -#: bookwyrm/templates/user/shelf/shelf.html:113 -#: bookwyrm/templates/user/shelf/shelf.html:137 -msgid "Shelved" -msgstr "Archivado" - -#: bookwyrm/templates/user/shelf/shelf.html:114 -#: bookwyrm/templates/user/shelf/shelf.html:141 -msgid "Started" -msgstr "Empezado" - -#: bookwyrm/templates/user/shelf/shelf.html:115 -#: bookwyrm/templates/user/shelf/shelf.html:144 -msgid "Finished" -msgstr "Terminado" - -#: bookwyrm/templates/user/shelf/shelf.html:170 -msgid "This shelf is empty." -msgstr "Este estante está vacio." - -#: bookwyrm/templates/user/shelf/shelf.html:176 -msgid "Delete shelf" -msgstr "Eliminar estante" - #: bookwyrm/templates/user/user.html:16 msgid "Edit profile" msgstr "Editar perfil" @@ -3394,149 +3578,6 @@ msgstr[1] "%(mutuals_display)s seguidores que sigues" msgid "No followers you follow" msgstr "Ningún seguidor que tu sigues" -#: bookwyrm/templates/user_admin/delete_user_form.html:5 -#: bookwyrm/templates/user_admin/user_moderation_actions.html:31 -#, fuzzy -#| msgid "Permanently deleted" -msgid "Permanently delete user" -msgstr "Eliminado permanentemente" - -#: bookwyrm/templates/user_admin/delete_user_form.html:12 -#, python-format -msgid "Are you sure you want to delete %(username)s's account? This action cannot be undone. To proceed, please enter your password to confirm deletion." -msgstr "" - -#: bookwyrm/templates/user_admin/delete_user_form.html:17 -#, fuzzy -#| msgid "Confirm password:" -msgid "Your password:" -msgstr "Confirmar contraseña:" - -#: bookwyrm/templates/user_admin/user.html:8 -msgid "Back to users" -msgstr "Volver a usuarios" - -#: bookwyrm/templates/user_admin/user_admin.html:7 -#, python-format -msgid "Users: %(instance_name)s" -msgstr "Usuarios %(instance_name)s" - -#: bookwyrm/templates/user_admin/user_admin.html:22 -#: bookwyrm/templates/user_admin/username_filter.html:5 -msgid "Username" -msgstr "Nombre de usuario" - -#: bookwyrm/templates/user_admin/user_admin.html:26 -msgid "Date Added" -msgstr "Fecha agregada" - -#: bookwyrm/templates/user_admin/user_admin.html:30 -msgid "Last Active" -msgstr "Actividad reciente" - -#: bookwyrm/templates/user_admin/user_admin.html:38 -msgid "Remote instance" -msgstr "Instancia remota" - -#: bookwyrm/templates/user_admin/user_admin.html:47 -#: bookwyrm/templates/user_admin/user_info.html:24 -msgid "Active" -msgstr "Activ@" - -#: bookwyrm/templates/user_admin/user_admin.html:47 -#: bookwyrm/templates/user_admin/user_info.html:28 -msgid "Inactive" -msgstr "Inactiv@" - -#: bookwyrm/templates/user_admin/user_admin.html:52 -#: bookwyrm/templates/user_admin/user_info.html:140 -msgid "Not set" -msgstr "No establecido" - -#: bookwyrm/templates/user_admin/user_info.html:16 -msgid "View user profile" -msgstr "Ver perfil de usuario" - -#: bookwyrm/templates/user_admin/user_info.html:36 -msgid "Local" -msgstr "Local" - -#: bookwyrm/templates/user_admin/user_info.html:38 -#, fuzzy -#| msgid "Remove" -msgid "Remote" -msgstr "Quitar" - -#: bookwyrm/templates/user_admin/user_info.html:47 -msgid "User details" -msgstr "Detalles" - -#: bookwyrm/templates/user_admin/user_info.html:52 -#, fuzzy -#| msgid "Email" -msgid "Email:" -msgstr "Correo electronico" - -#: bookwyrm/templates/user_admin/user_info.html:64 -#, fuzzy -#| msgid "View directory" -msgid "(View reports)" -msgstr "Ver directorio" - -#: bookwyrm/templates/user_admin/user_info.html:72 -#, fuzzy -#| msgid "Blocked by us:" -msgid "Blocked by count:" -msgstr "Bloqueado por nosotros:" - -#: bookwyrm/templates/user_admin/user_info.html:77 -#, fuzzy -#| msgid "last active" -msgid "Last active date:" -msgstr "actividad reciente" - -#: bookwyrm/templates/user_admin/user_info.html:82 -#, fuzzy -#| msgid "Manually approve followers:" -msgid "Manually approved followers:" -msgstr "Aprobar seguidores a mano:" - -#: bookwyrm/templates/user_admin/user_info.html:87 -#, fuzzy -#| msgid "Discover" -msgid "Discoverable:" -msgstr "Descubrir" - -#: bookwyrm/templates/user_admin/user_info.html:93 -#, fuzzy -#| msgid "Deactivate user" -msgid "Deactivation reason:" -msgstr "Desactivar usuario" - -#: bookwyrm/templates/user_admin/user_info.html:111 -msgid "Instance details" -msgstr "Detalles de instancia" - -#: bookwyrm/templates/user_admin/user_info.html:137 -msgid "View instance" -msgstr "Ver instancia" - -#: bookwyrm/templates/user_admin/user_moderation_actions.html:5 -msgid "Permanently deleted" -msgstr "Eliminado permanentemente" - -#: bookwyrm/templates/user_admin/user_moderation_actions.html:20 -msgid "Suspend user" -msgstr "Suspender usuario" - -#: bookwyrm/templates/user_admin/user_moderation_actions.html:25 -msgid "Un-suspend user" -msgstr "Des-suspender usuario" - -#: bookwyrm/templates/user_admin/user_moderation_actions.html:47 -msgid "Access level:" -msgstr "Nivel de acceso:" - #: bookwyrm/templates/widgets/clearable_file_input_with_warning.html:28 msgid "File exceeds maximum size: 10MB" msgstr "Archivo excede el tamaño máximo: 10MB" @@ -3550,7 +3591,7 @@ msgstr "%(title)s: %(subtitle)s" msgid "Not a valid csv file" msgstr "No un archivo csv válido" -#: bookwyrm/views/login.py:70 +#: bookwyrm/views/login.py:68 msgid "Username or password are incorrect" msgstr "Nombre de usuario o contraseña es incorrecta" @@ -3559,8 +3600,9 @@ msgid "No user with that email address was found." msgstr "No se pudo encontrar un usuario con esa dirección de correo electrónico." #: bookwyrm/views/password.py:41 -#, python-format -msgid "A password reset link sent to %s" +#, fuzzy, python-brace-format +#| msgid "A password reset link sent to %s" +msgid "A password reset link sent to {email}" msgstr "Un enlace para reestablecer tu contraseña se enviará a %s" #: bookwyrm/views/rss_feed.py:34 @@ -3568,6 +3610,21 @@ msgstr "Un enlace para reestablecer tu contraseña se enviará a %s" msgid "Status updates from {obj.display_name}" msgstr "Actualizaciones de status de {obj.display_name}" +#~ msgid "Update shelf" +#~ msgstr "Actualizar estante" + +#~ msgid "%(count)d uses" +#~ msgstr "%(count)d usos" + +#~ msgid "This instance is closed" +#~ msgstr "Esta instancia está cerrada." + +#~ msgid "Contact an administrator to get an invite" +#~ msgstr "Contactar a unx administradorx para recibir una invitación" + +#~ msgid "Spoiler alert:" +#~ msgstr "Alerta de spoiler:" + #~ msgid "Date federated" #~ msgstr "Fecha de federalización" @@ -3783,9 +3840,6 @@ msgstr "Actualizaciones de status de {obj.display_name}" #~ msgid "IPv4 address" #~ msgstr "Dirección IPv4" -#~ msgid "IP address" -#~ msgstr "Dirección IP" - #~ msgid "“%(value)s” value must be either None, True or False." #~ msgstr "Valor “%(value)s” debe ser o None, True, o False." diff --git a/locale/fr_FR/LC_MESSAGES/django.mo b/locale/fr_FR/LC_MESSAGES/django.mo index 0872a3e6..641b4843 100644 Binary files a/locale/fr_FR/LC_MESSAGES/django.mo and b/locale/fr_FR/LC_MESSAGES/django.mo differ diff --git a/locale/fr_FR/LC_MESSAGES/django.po b/locale/fr_FR/LC_MESSAGES/django.po index 2789cf74..52ccac2b 100644 --- a/locale/fr_FR/LC_MESSAGES/django.po +++ b/locale/fr_FR/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.1.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-12 17:16+0000\n" +"POT-Creation-Date: 2021-09-29 18:32+0000\n" "PO-Revision-Date: 2021-04-05 12:44+0100\n" "Last-Translator: Fabien Basmaison \n" "Language-Team: Mouse Reeve \n" @@ -18,59 +18,59 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -#: bookwyrm/forms.py:242 +#: bookwyrm/forms.py:241 msgid "A user with this email already exists." msgstr "Cet email est déjà associé à un compte." -#: bookwyrm/forms.py:256 +#: bookwyrm/forms.py:255 msgid "One Day" msgstr "Un jour" -#: bookwyrm/forms.py:257 +#: bookwyrm/forms.py:256 msgid "One Week" msgstr "Une semaine" -#: bookwyrm/forms.py:258 +#: bookwyrm/forms.py:257 msgid "One Month" msgstr "Un mois" -#: bookwyrm/forms.py:259 +#: bookwyrm/forms.py:258 msgid "Does Not Expire" msgstr "Sans expiration" -#: bookwyrm/forms.py:264 -#, python-format -msgid "%(count)d uses" -msgstr "%(count)d utilisations" +#: bookwyrm/forms.py:262 +#, fuzzy, python-brace-format +#| msgid "Max uses" +msgid "{i} uses" +msgstr "Nombre maximum d’utilisations" -#: bookwyrm/forms.py:267 +#: bookwyrm/forms.py:263 msgid "Unlimited" msgstr "Sans limite" -#: bookwyrm/forms.py:323 +#: bookwyrm/forms.py:325 msgid "List Order" msgstr "Ordre de la liste" -#: bookwyrm/forms.py:324 +#: bookwyrm/forms.py:326 msgid "Book Title" msgstr "Titre du livre" -#: bookwyrm/forms.py:325 +#: bookwyrm/forms.py:327 bookwyrm/templates/shelf/shelf.html:134 +#: bookwyrm/templates/shelf/shelf.html:165 #: bookwyrm/templates/snippets/create_status/review.html:33 -#: bookwyrm/templates/user/shelf/shelf.html:117 -#: bookwyrm/templates/user/shelf/shelf.html:148 msgid "Rating" msgstr "Note" -#: bookwyrm/forms.py:327 bookwyrm/templates/lists/list.html:107 +#: bookwyrm/forms.py:329 bookwyrm/templates/lists/list.html:109 msgid "Sort By" msgstr "Trier par" -#: bookwyrm/forms.py:331 +#: bookwyrm/forms.py:333 msgid "Ascending" msgstr "Ordre croissant" -#: bookwyrm/forms.py:332 +#: bookwyrm/forms.py:334 msgid "Descending" msgstr "Ordre décroissant" @@ -82,44 +82,70 @@ msgstr "" msgid "Could not find a match for book" msgstr "" -#: bookwyrm/models/base_model.py:13 +#: bookwyrm/models/base_model.py:16 #, fuzzy #| msgid "Ascending" msgid "Pending" msgstr "Ordre croissant" -#: bookwyrm/models/base_model.py:14 +#: bookwyrm/models/base_model.py:17 msgid "Self deletion" msgstr "" -#: bookwyrm/models/base_model.py:15 +#: bookwyrm/models/base_model.py:18 #, fuzzy #| msgid "Moderator Comments" msgid "Moderator suspension" msgstr "Commentaires de l’équipe de modération" -#: bookwyrm/models/base_model.py:16 +#: bookwyrm/models/base_model.py:19 #, fuzzy #| msgid "List curation:" msgid "Moderator deletion" msgstr "Modération de la liste :" -#: bookwyrm/models/base_model.py:17 +#: bookwyrm/models/base_model.py:20 #, fuzzy #| msgid "Un-block" msgid "Domain block" msgstr "Débloquer" +#: bookwyrm/models/book.py:232 +#, fuzzy +#| msgid "Add books" +msgid "Audiobook" +msgstr "Ajoutez des livres" + +#: bookwyrm/models/book.py:233 +#, fuzzy +#| msgid "Book" +msgid "eBook" +msgstr "Livre" + +#: bookwyrm/models/book.py:234 +msgid "Graphic novel" +msgstr "" + +#: bookwyrm/models/book.py:235 +#, fuzzy +#| msgid "Add cover" +msgid "Hardcover" +msgstr "Ajouter une couverture" + +#: bookwyrm/models/book.py:236 +msgid "Paperback" +msgstr "" + #: bookwyrm/models/federated_server.py:11 -#: bookwyrm/templates/settings/edit_server.html:40 -#: bookwyrm/templates/settings/federation.html:19 +#: bookwyrm/templates/settings/federation/edit_instance.html:42 +#: bookwyrm/templates/settings/federation/instance_list.html:19 msgid "Federated" msgstr "Fédéré" #: bookwyrm/models/federated_server.py:12 -#: bookwyrm/templates/settings/edit_server.html:41 -#: bookwyrm/templates/settings/federated_server.html:10 -#: bookwyrm/templates/settings/federation.html:23 +#: bookwyrm/templates/settings/federation/edit_instance.html:43 +#: bookwyrm/templates/settings/federation/instance.html:10 +#: bookwyrm/templates/settings/federation/instance_list.html:23 msgid "Blocked" msgstr "Bloqué" @@ -133,7 +159,7 @@ msgstr "%(value)s n’est pas une remote_id valide." msgid "%(value)s is not a valid username" msgstr "%(value)s n’est pas un nom de compte valide." -#: bookwyrm/models/fields.py:181 bookwyrm/templates/layout.html:164 +#: bookwyrm/models/fields.py:181 bookwyrm/templates/layout.html:171 msgid "username" msgstr "nom du compte :" @@ -141,47 +167,47 @@ msgstr "nom du compte :" msgid "A user with that username already exists." msgstr "Ce nom est déjà associé à un compte." -#: bookwyrm/settings.py:115 +#: bookwyrm/settings.py:116 msgid "Home Timeline" msgstr "Mon fil d’actualité" -#: bookwyrm/settings.py:115 +#: bookwyrm/settings.py:116 msgid "Home" msgstr "Accueil" -#: bookwyrm/settings.py:116 +#: bookwyrm/settings.py:117 #, fuzzy #| msgid "Book Title" msgid "Books Timeline" msgstr "Titre du livre" -#: bookwyrm/settings.py:116 bookwyrm/templates/search/layout.html:21 +#: bookwyrm/settings.py:117 bookwyrm/templates/search/layout.html:21 #: bookwyrm/templates/search/layout.html:42 #: bookwyrm/templates/user/layout.html:81 msgid "Books" msgstr "Livres" -#: bookwyrm/settings.py:162 +#: bookwyrm/settings.py:163 msgid "English" msgstr "English" -#: bookwyrm/settings.py:163 +#: bookwyrm/settings.py:164 msgid "German" msgstr "Deutsch" -#: bookwyrm/settings.py:164 +#: bookwyrm/settings.py:165 msgid "Spanish" msgstr "Español" -#: bookwyrm/settings.py:165 +#: bookwyrm/settings.py:166 msgid "French" msgstr "Français" -#: bookwyrm/settings.py:166 +#: bookwyrm/settings.py:167 msgid "Simplified Chinese" msgstr "简化字" -#: bookwyrm/settings.py:167 +#: bookwyrm/settings.py:168 #, fuzzy #| msgid "Additional info:" msgid "Traditional Chinese" @@ -277,9 +303,7 @@ msgid "Metadata" msgstr "Métadonnées" #: bookwyrm/templates/author/edit_author.html:33 -#: bookwyrm/templates/lists/form.html:8 -#: bookwyrm/templates/user/shelf/create_shelf_form.html:13 -#: bookwyrm/templates/user/shelf/edit_shelf_form.html:14 +#: bookwyrm/templates/lists/form.html:8 bookwyrm/templates/shelf/form.html:9 msgid "Name:" msgstr "Nom :" @@ -315,7 +339,7 @@ msgid "Openlibrary key:" msgstr "Clé Openlibrary :" #: bookwyrm/templates/author/edit_author.html:89 -#: bookwyrm/templates/book/edit_book.html:300 +#: bookwyrm/templates/book/edit_book.html:313 msgid "Inventaire ID:" msgstr "Identifiant Inventaire :" @@ -329,32 +353,30 @@ msgstr "Clé Goodreads :" #: bookwyrm/templates/author/edit_author.html:116 #: bookwyrm/templates/book/book.html:140 -#: bookwyrm/templates/book/edit_book.html:328 +#: bookwyrm/templates/book/edit_book.html:341 #: bookwyrm/templates/book/readthrough.html:76 #: bookwyrm/templates/lists/bookmark_button.html:15 #: bookwyrm/templates/lists/form.html:44 -#: bookwyrm/templates/preferences/edit_user.html:80 -#: bookwyrm/templates/settings/announcement_form.html:69 -#: bookwyrm/templates/settings/edit_server.html:68 -#: bookwyrm/templates/settings/federated_server.html:98 -#: bookwyrm/templates/settings/site.html:113 -#: bookwyrm/templates/snippets/reading_modals/layout.html:16 -#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:42 -#: bookwyrm/templates/user_admin/user_moderation_actions.html:64 +#: bookwyrm/templates/preferences/edit_user.html:118 +#: bookwyrm/templates/settings/announcements/announcement_form.html:69 +#: bookwyrm/templates/settings/federation/edit_instance.html:74 +#: bookwyrm/templates/settings/federation/instance.html:87 +#: bookwyrm/templates/settings/site.html:134 +#: bookwyrm/templates/settings/users/user_moderation_actions.html:64 +#: bookwyrm/templates/shelf/form.html:25 +#: bookwyrm/templates/snippets/reading_modals/layout.html:18 msgid "Save" msgstr "Enregistrer" #: bookwyrm/templates/author/edit_author.html:117 #: bookwyrm/templates/book/book.html:141 bookwyrm/templates/book/book.html:190 #: bookwyrm/templates/book/cover_modal.html:32 -#: bookwyrm/templates/book/edit_book.html:329 +#: bookwyrm/templates/book/edit_book.html:342 #: bookwyrm/templates/book/readthrough.html:77 #: bookwyrm/templates/lists/delete_list_modal.html:17 -#: bookwyrm/templates/moderation/report_modal.html:34 -#: bookwyrm/templates/settings/federated_server.html:99 +#: bookwyrm/templates/settings/federation/instance.html:88 #: bookwyrm/templates/snippets/delete_readthrough_modal.html:17 -#: bookwyrm/templates/snippets/goal_form.html:32 -#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:43 +#: bookwyrm/templates/snippets/report_modal.html:34 msgid "Cancel" msgstr "Annuler" @@ -391,7 +413,7 @@ msgstr "Ajouter une description" #: bookwyrm/templates/book/book.html:136 #: bookwyrm/templates/book/edit_book.html:143 -#: bookwyrm/templates/lists/form.html:12 +#: bookwyrm/templates/lists/form.html:12 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "Description :" @@ -450,7 +472,7 @@ msgstr "Sujets" msgid "Places" msgstr "Lieux" -#: bookwyrm/templates/book/book.html:292 bookwyrm/templates/layout.html:68 +#: bookwyrm/templates/book/book.html:292 bookwyrm/templates/layout.html:75 #: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12 #: bookwyrm/templates/search/layout.html:25 #: bookwyrm/templates/search/layout.html:50 @@ -464,8 +486,9 @@ msgstr "Ajouter à la liste" #: bookwyrm/templates/book/book.html:313 #: bookwyrm/templates/book/cover_modal.html:31 -#: bookwyrm/templates/lists/list.html:179 -#: bookwyrm/templates/settings/domain_form.html:26 +#: bookwyrm/templates/lists/list.html:181 +#: bookwyrm/templates/settings/email_blocklist/domain_form.html:26 +#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:32 msgid "Add" msgstr "Ajouter" @@ -474,12 +497,12 @@ msgid "ISBN:" msgstr "ISBN :" #: bookwyrm/templates/book/book_identifiers.html:14 -#: bookwyrm/templates/book/edit_book.html:308 +#: bookwyrm/templates/book/edit_book.html:321 msgid "OCLC Number:" msgstr "Numéro OCLC :" #: bookwyrm/templates/book/book_identifiers.html:21 -#: bookwyrm/templates/book/edit_book.html:316 +#: bookwyrm/templates/book/edit_book.html:329 msgid "ASIN:" msgstr "ASIN :" @@ -489,7 +512,7 @@ msgid "Upload cover:" msgstr "Charger une couverture :" #: bookwyrm/templates/book/cover_modal.html:23 -#: bookwyrm/templates/book/edit_book.html:242 +#: bookwyrm/templates/book/edit_book.html:241 msgid "Load cover from url:" msgstr "Charger la couverture depuis une URL :" @@ -601,11 +624,11 @@ msgid "John Doe, Jane Smith" msgstr "Claude Dupont, Dominique Durand" #: bookwyrm/templates/book/edit_book.html:227 -#: bookwyrm/templates/user/shelf/shelf.html:110 +#: bookwyrm/templates/shelf/shelf.html:127 msgid "Cover" msgstr "Couverture" -#: bookwyrm/templates/book/edit_book.html:255 +#: bookwyrm/templates/book/edit_book.html:253 msgid "Physical Properties" msgstr "Propriétés physiques" @@ -614,23 +637,29 @@ msgstr "Propriétés physiques" msgid "Format:" msgstr "Format :" -#: bookwyrm/templates/book/edit_book.html:265 +#: bookwyrm/templates/book/edit_book.html:268 +#, fuzzy +#| msgid "User details" +msgid "Format details:" +msgstr "Détails du compte" + +#: bookwyrm/templates/book/edit_book.html:278 msgid "Pages:" msgstr "Pages :" -#: bookwyrm/templates/book/edit_book.html:274 +#: bookwyrm/templates/book/edit_book.html:287 msgid "Book Identifiers" msgstr "Identifiants du livre" -#: bookwyrm/templates/book/edit_book.html:276 +#: bookwyrm/templates/book/edit_book.html:289 msgid "ISBN 13:" msgstr "ISBN 13 :" -#: bookwyrm/templates/book/edit_book.html:284 +#: bookwyrm/templates/book/edit_book.html:297 msgid "ISBN 10:" msgstr "ISBN 10 :" -#: bookwyrm/templates/book/edit_book.html:292 +#: bookwyrm/templates/book/edit_book.html:305 msgid "Openlibrary ID:" msgstr "Identifiant Openlibrary :" @@ -763,14 +792,14 @@ msgid "Sorry! We couldn't find that code." msgstr "Pardon ! Nous ne reconnaissons pas ce code." #: bookwyrm/templates/confirm_email/confirm_email.html:19 -#: bookwyrm/templates/user_admin/user_info.html:100 +#: bookwyrm/templates/settings/users/user_info.html:85 msgid "Confirmation code:" msgstr "Code de confirmation :" #: bookwyrm/templates/confirm_email/confirm_email.html:25 -#: bookwyrm/templates/landing/landing_layout.html:70 -#: bookwyrm/templates/moderation/report_modal.html:33 -#: bookwyrm/templates/settings/dashboard.html:93 +#: bookwyrm/templates/landing/layout.html:73 +#: bookwyrm/templates/settings/dashboard/dashboard.html:93 +#: bookwyrm/templates/snippets/report_modal.html:33 msgid "Submit" msgstr "Valider" @@ -783,9 +812,9 @@ msgid "Resend confirmation link" msgstr "Envoyer le lien de confirmation de nouveau" #: bookwyrm/templates/confirm_email/resend_form.html:11 -#: bookwyrm/templates/landing/landing_layout.html:64 +#: bookwyrm/templates/landing/layout.html:67 #: bookwyrm/templates/password_reset_request.html:18 -#: bookwyrm/templates/preferences/edit_user.html:38 +#: bookwyrm/templates/preferences/edit_user.html:56 #: bookwyrm/templates/snippets/register_form.html:13 msgid "Email address:" msgstr "Adresse email :" @@ -808,7 +837,7 @@ msgstr "Communauté fédérée" #: bookwyrm/templates/directory/directory.html:4 #: bookwyrm/templates/directory/directory.html:9 -#: bookwyrm/templates/layout.html:94 +#: bookwyrm/templates/layout.html:101 msgid "Directory" msgstr "Répertoire" @@ -822,8 +851,8 @@ msgid "You can opt-out at any time in your profile settings msgstr "Vous pouvez décider de ne plus y figurer à n’importe quel moment depuis vos paramètres de profil." #: bookwyrm/templates/directory/directory.html:29 +#: bookwyrm/templates/feed/goal_card.html:17 #: bookwyrm/templates/snippets/announcement.html:34 -#: bookwyrm/templates/snippets/goal_card.html:22 msgid "Dismiss message" msgstr "Fermer le message" @@ -832,13 +861,13 @@ msgid "Order by" msgstr "Trier par" #: bookwyrm/templates/directory/sort_filter.html:8 -msgid "Suggested" -msgstr "Suggéré" - -#: bookwyrm/templates/directory/sort_filter.html:9 msgid "Recently active" msgstr "Actif récemment" +#: bookwyrm/templates/directory/sort_filter.html:9 +msgid "Suggested" +msgstr "Suggéré" + #: bookwyrm/templates/directory/user_card.html:17 #: bookwyrm/templates/directory/user_card.html:18 #: bookwyrm/templates/user/user_preview.html:16 @@ -882,7 +911,7 @@ msgstr "Tous les comptes connus" #: bookwyrm/templates/discover/discover.html:4 #: bookwyrm/templates/discover/discover.html:10 -#: bookwyrm/templates/layout.html:71 +#: bookwyrm/templates/layout.html:78 #, fuzzy #| msgid "Discard" msgid "Discover" @@ -1012,7 +1041,7 @@ msgid "Direct Messages with %(username)s" msgstr "Messages directs avec %(username)s" #: bookwyrm/templates/feed/direct_messages.html:10 -#: bookwyrm/templates/layout.html:104 +#: bookwyrm/templates/layout.html:111 msgid "Direct Messages" msgstr "Messages directs" @@ -1034,12 +1063,24 @@ msgstr "charger le(s) 0 statut(s) non msgid "There aren't any activities right now! Try following a user to get started" msgstr "Aucune activité pour l’instant ! Abonnez‑vous à quelqu’un pour commencer" +#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/layout.html:90 +#: bookwyrm/templates/user/goal_form.html:6 +#, python-format +msgid "%(year)s Reading Goal" +msgstr "Défi lecture pour %(year)s" + +#: bookwyrm/templates/feed/goal_card.html:18 +#, python-format +msgid "You can set or change your reading goal any time from your profile page" +msgstr "Vous pouvez définir ou changer votre défi lecture à n’importe quel moment depuis votre profil" + #: bookwyrm/templates/feed/layout.html:5 msgid "Updates" msgstr "Mises à jour" #: bookwyrm/templates/feed/layout.html:12 -#: bookwyrm/templates/user/shelf/books_header.html:3 +#: bookwyrm/templates/user/books_header.html:3 msgid "Your books" msgstr "Vos livres" @@ -1048,28 +1089,22 @@ msgid "There are no books here right now! Try searching for a book to get starte msgstr "Aucun livre ici pour l’instant ! Cherchez un livre pour commencer" #: bookwyrm/templates/feed/layout.html:25 -#: bookwyrm/templates/user/shelf/shelf.html:38 +#: bookwyrm/templates/shelf/shelf.html:38 msgid "To Read" msgstr "À lire" #: bookwyrm/templates/feed/layout.html:26 -#: bookwyrm/templates/user/shelf/shelf.html:40 +#: bookwyrm/templates/shelf/shelf.html:40 msgid "Currently Reading" msgstr "Lectures en cours" #: bookwyrm/templates/feed/layout.html:27 +#: bookwyrm/templates/shelf/shelf.html:42 #: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:23 #: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12 -#: bookwyrm/templates/user/shelf/shelf.html:42 msgid "Read" msgstr "Lu" -#: bookwyrm/templates/feed/layout.html:90 bookwyrm/templates/goal.html:26 -#: bookwyrm/templates/snippets/goal_card.html:6 -#, python-format -msgid "%(year)s Reading Goal" -msgstr "Défi lecture pour %(year)s" - #: bookwyrm/templates/feed/suggested_users.html:5 #: bookwyrm/templates/get_started/users.html:6 msgid "Who to follow" @@ -1097,7 +1132,7 @@ msgid "What are you reading?" msgstr "Que lisez‑vous ?" #: bookwyrm/templates/get_started/books.html:9 -#: bookwyrm/templates/lists/list.html:135 +#: bookwyrm/templates/layout.html:45 bookwyrm/templates/lists/list.html:137 msgid "Search for a book" msgstr "Chercher un livre" @@ -1115,8 +1150,8 @@ msgstr "Vous pourrez ajouter des livres lorsque vous commencerez à utiliser %(s #: bookwyrm/templates/get_started/books.html:17 #: bookwyrm/templates/get_started/users.html:18 #: bookwyrm/templates/get_started/users.html:19 -#: bookwyrm/templates/layout.html:44 bookwyrm/templates/layout.html:45 -#: bookwyrm/templates/lists/list.html:139 +#: bookwyrm/templates/layout.html:51 bookwyrm/templates/layout.html:52 +#: bookwyrm/templates/lists/list.html:141 #: bookwyrm/templates/search/layout.html:4 #: bookwyrm/templates/search/layout.html:9 msgid "Search" @@ -1132,7 +1167,7 @@ msgid "Popular on %(site_name)s" msgstr "Populaire sur %(site_name)s" #: bookwyrm/templates/get_started/books.html:58 -#: bookwyrm/templates/lists/list.html:152 +#: bookwyrm/templates/lists/list.html:154 msgid "No books found" msgstr "Aucun livre trouvé" @@ -1142,7 +1177,7 @@ msgid "Save & continue" msgstr "Enregistrer & continuer" #: bookwyrm/templates/get_started/layout.html:5 -#: bookwyrm/templates/landing/landing_layout.html:5 +#: bookwyrm/templates/landing/layout.html:5 msgid "Welcome" msgstr "Bienvenue" @@ -1177,12 +1212,12 @@ msgid "Finish" msgstr "Terminer" #: bookwyrm/templates/get_started/profile.html:15 -#: bookwyrm/templates/preferences/edit_user.html:24 +#: bookwyrm/templates/preferences/edit_user.html:42 msgid "Display name:" msgstr "Nom affiché :" #: bookwyrm/templates/get_started/profile.html:22 -#: bookwyrm/templates/preferences/edit_user.html:31 +#: bookwyrm/templates/preferences/edit_user.html:49 msgid "Summary:" msgstr "Résumé :" @@ -1191,17 +1226,17 @@ msgid "A little bit about you" msgstr "Parlez‑nous de vous" #: bookwyrm/templates/get_started/profile.html:32 -#: bookwyrm/templates/preferences/edit_user.html:17 +#: bookwyrm/templates/preferences/edit_user.html:27 msgid "Avatar:" msgstr "Avatar :" #: bookwyrm/templates/get_started/profile.html:42 -#: bookwyrm/templates/preferences/edit_user.html:62 +#: bookwyrm/templates/preferences/edit_user.html:104 msgid "Manually approve followers:" msgstr "Autoriser les abonnements manuellement :" #: bookwyrm/templates/get_started/profile.html:48 -#: bookwyrm/templates/preferences/edit_user.html:54 +#: bookwyrm/templates/preferences/edit_user.html:80 msgid "Show this account in suggested users:" msgstr "Afficher ce compte dans ceux suggérés :" @@ -1218,39 +1253,9 @@ msgstr "Chercher un compte" msgid "No users found for \"%(query)s\"" msgstr "Aucun compte trouvé pour « %(query)s »" -#: bookwyrm/templates/goal.html:7 -#, python-format -msgid "%(year)s Reading Progress" -msgstr "Progression de lecture pour %(year)s" - -#: bookwyrm/templates/goal.html:11 -msgid "Edit Goal" -msgstr "Modifier le défi" - -#: bookwyrm/templates/goal.html:30 -#: bookwyrm/templates/snippets/goal_card.html:13 -#, python-format -msgid "Set a goal for how many books you'll finish reading in %(year)s, and track your progress throughout the year." -msgstr "Définissez un nombre de livre à lire comme objectif pour %(year)s, et suivezvotre progression au fil de l’année." - -#: bookwyrm/templates/goal.html:39 -#, python-format -msgid "%(name)s hasn't set a reading goal for %(year)s." -msgstr "%(name)s n’a aucun défi lecture pour %(year)s." - -#: bookwyrm/templates/goal.html:51 -#, python-format -msgid "Your %(year)s Books" -msgstr "Vos livres en %(year)s" - -#: bookwyrm/templates/goal.html:53 -#, python-format -msgid "%(username)s's %(year)s Books" -msgstr "Livres de %(username)s en %(year)s" - #: bookwyrm/templates/import/import.html:5 #: bookwyrm/templates/import/import.html:9 -#: bookwyrm/templates/user/shelf/shelf.html:57 +#: bookwyrm/templates/shelf/shelf.html:57 msgid "Import Books" msgstr "Importer des livres" @@ -1271,7 +1276,7 @@ msgid "Privacy setting for imported reviews:" msgstr "Confidentialité des critiques importées :" #: bookwyrm/templates/import/import.html:56 -#: bookwyrm/templates/settings/server_blocklist.html:64 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:64 msgid "Import" msgstr "Importer" @@ -1351,14 +1356,14 @@ msgid "Book" msgstr "Livre" #: bookwyrm/templates/import/import_status.html:122 -#: bookwyrm/templates/user/shelf/shelf.html:111 -#: bookwyrm/templates/user/shelf/shelf.html:131 +#: bookwyrm/templates/shelf/shelf.html:128 +#: bookwyrm/templates/shelf/shelf.html:148 msgid "Title" msgstr "Titre" #: bookwyrm/templates/import/import_status.html:125 -#: bookwyrm/templates/user/shelf/shelf.html:112 -#: bookwyrm/templates/user/shelf/shelf.html:134 +#: bookwyrm/templates/shelf/shelf.html:129 +#: bookwyrm/templates/shelf/shelf.html:151 msgid "Author" msgstr "Auteur/autrice" @@ -1370,8 +1375,8 @@ msgstr "Importé" msgid "You can download your GoodReads data from the Import/Export page of your GoodReads account." msgstr "" -#: bookwyrm/templates/invite.html:4 bookwyrm/templates/invite.html:12 -#: bookwyrm/templates/login.html:51 +#: bookwyrm/templates/invite.html:4 bookwyrm/templates/invite.html:8 +#: bookwyrm/templates/login.html:49 msgid "Create an Account" msgstr "Créer un compte" @@ -1402,135 +1407,144 @@ msgstr "Politique de vie privée" msgid "Recent Books" msgstr "Livres récents" -#: bookwyrm/templates/landing/landing_layout.html:17 +#: bookwyrm/templates/landing/layout.html:17 msgid "Decentralized" msgstr "Décentralisé" -#: bookwyrm/templates/landing/landing_layout.html:23 +#: bookwyrm/templates/landing/layout.html:23 msgid "Friendly" msgstr "Sympa" -#: bookwyrm/templates/landing/landing_layout.html:29 +#: bookwyrm/templates/landing/layout.html:29 msgid "Anti-Corporate" msgstr "Anti‑commercial" -#: bookwyrm/templates/landing/landing_layout.html:44 +#: bookwyrm/templates/landing/layout.html:45 #, python-format msgid "Join %(name)s" msgstr "Rejoignez %(name)s" -#: bookwyrm/templates/landing/landing_layout.html:51 -#: bookwyrm/templates/login.html:56 -msgid "This instance is closed" -msgstr "Cette instance est fermée" - -#: bookwyrm/templates/landing/landing_layout.html:57 -msgid "Thank you! Your request has been received." -msgstr "Merci ! Votre demande a bien été reçue." - -#: bookwyrm/templates/landing/landing_layout.html:60 +#: bookwyrm/templates/landing/layout.html:47 msgid "Request an Invitation" msgstr "Demander une invitation" -#: bookwyrm/templates/landing/landing_layout.html:79 +#: bookwyrm/templates/landing/layout.html:49 +#, fuzzy, python-format +#| msgid "(Recommended if registration is open)" +msgid "%(name)s registration is closed" +msgstr "(Recommandé si les inscriptions sont ouvertes)" + +#: bookwyrm/templates/landing/layout.html:60 +msgid "Thank you! Your request has been received." +msgstr "Merci ! Votre demande a bien été reçue." + +#: bookwyrm/templates/landing/layout.html:82 msgid "Your Account" msgstr "Votre compte" -#: bookwyrm/templates/layout.html:40 -msgid "Search for a book or user" +#: bookwyrm/templates/layout.html:13 +#, fuzzy, python-format +#| msgid "About %(site_name)s" +msgid "%(site_name)s search" +msgstr "À propos de %(site_name)s" + +#: bookwyrm/templates/layout.html:43 +#, fuzzy +#| msgid "Search for a book or user" +msgid "Search for a book, user, or list" msgstr "Chercher un livre ou un compte" -#: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/layout.html:61 bookwyrm/templates/layout.html:62 msgid "Main navigation menu" msgstr "Menu de navigation principal " -#: bookwyrm/templates/layout.html:65 +#: bookwyrm/templates/layout.html:72 msgid "Feed" msgstr "Fil d’actualité" -#: bookwyrm/templates/layout.html:99 +#: bookwyrm/templates/layout.html:106 msgid "Your Books" msgstr "Vos Livres" -#: bookwyrm/templates/layout.html:109 +#: bookwyrm/templates/layout.html:116 msgid "Settings" msgstr "Paramètres" -#: bookwyrm/templates/layout.html:118 +#: bookwyrm/templates/layout.html:125 +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:15 +#: bookwyrm/templates/settings/invites/manage_invites.html:3 +#: bookwyrm/templates/settings/invites/manage_invites.html:15 #: bookwyrm/templates/settings/layout.html:40 -#: bookwyrm/templates/settings/manage_invite_requests.html:15 -#: bookwyrm/templates/settings/manage_invites.html:3 -#: bookwyrm/templates/settings/manage_invites.html:15 msgid "Invites" msgstr "Invitations" -#: bookwyrm/templates/layout.html:125 +#: bookwyrm/templates/layout.html:132 msgid "Admin" msgstr "Admin" -#: bookwyrm/templates/layout.html:132 +#: bookwyrm/templates/layout.html:139 msgid "Log out" msgstr "Se déconnecter" -#: bookwyrm/templates/layout.html:140 bookwyrm/templates/layout.html:141 +#: bookwyrm/templates/layout.html:147 bookwyrm/templates/layout.html:148 #: bookwyrm/templates/notifications.html:6 #: bookwyrm/templates/notifications.html:11 msgid "Notifications" msgstr "Notifications" -#: bookwyrm/templates/layout.html:163 bookwyrm/templates/layout.html:167 -#: bookwyrm/templates/login.html:22 +#: bookwyrm/templates/layout.html:170 bookwyrm/templates/layout.html:174 +#: bookwyrm/templates/login.html:21 #: bookwyrm/templates/snippets/register_form.html:4 msgid "Username:" msgstr "Nom du compte :" -#: bookwyrm/templates/layout.html:168 +#: bookwyrm/templates/layout.html:175 msgid "password" msgstr "Mot de passe" -#: bookwyrm/templates/layout.html:169 bookwyrm/templates/login.html:41 +#: bookwyrm/templates/layout.html:176 bookwyrm/templates/login.html:40 msgid "Forgot your password?" msgstr "Mot de passe oublié ?" -#: bookwyrm/templates/layout.html:172 bookwyrm/templates/login.html:10 -#: bookwyrm/templates/login.html:38 +#: bookwyrm/templates/layout.html:179 bookwyrm/templates/login.html:7 +#: bookwyrm/templates/login.html:37 msgid "Log in" msgstr "Se connecter" -#: bookwyrm/templates/layout.html:180 +#: bookwyrm/templates/layout.html:187 msgid "Join" msgstr "Rejoindre" -#: bookwyrm/templates/layout.html:214 +#: bookwyrm/templates/layout.html:221 #, fuzzy #| msgid "Successfully imported" msgid "Successfully posted status" msgstr "Importation réussie" -#: bookwyrm/templates/layout.html:215 +#: bookwyrm/templates/layout.html:222 #, fuzzy #| msgid "Boost status" msgid "Error posting status" msgstr "Partager le statut" -#: bookwyrm/templates/layout.html:223 +#: bookwyrm/templates/layout.html:230 msgid "About this instance" msgstr "À propos de cette instance" -#: bookwyrm/templates/layout.html:227 +#: bookwyrm/templates/layout.html:234 msgid "Contact site admin" msgstr "Contacter l’administrateur du site" -#: bookwyrm/templates/layout.html:231 +#: bookwyrm/templates/layout.html:238 msgid "Documentation" msgstr "Documentation" -#: bookwyrm/templates/layout.html:238 +#: bookwyrm/templates/layout.html:245 #, python-format msgid "Support %(site_name)s on %(support_title)s" msgstr "Soutenez %(site_name)s avec %(support_title)s" -#: bookwyrm/templates/layout.html:242 +#: bookwyrm/templates/layout.html:249 msgid "BookWyrm's source code is freely available. You can contribute or report issues on GitHub." msgstr "BookWyrm est un logiciel libre. Vous pouvez contribuer ou faire des rapports de bogues via GitHub." @@ -1590,8 +1604,9 @@ msgid "This action cannot be un-done" msgstr "Cette étagère est vide" #: bookwyrm/templates/lists/delete_list_modal.html:15 -#: bookwyrm/templates/settings/announcement.html:20 -#: bookwyrm/templates/settings/email_blocklist.html:49 +#: bookwyrm/templates/settings/announcements/announcement.html:20 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49 +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:36 #: bookwyrm/templates/snippets/delete_readthrough_modal.html:15 #: bookwyrm/templates/snippets/follow_request_buttons.html:12 msgid "Delete" @@ -1622,9 +1637,8 @@ msgstr "Modérée" msgid "Anyone can suggest books, subject to your approval" msgstr "N’importe qui peut suggérer des livres, soumis à votre approbation" -#: bookwyrm/templates/lists/form.html:31 -#: bookwyrm/templates/moderation/reports.html:25 -#: bookwyrm/templates/search/book.html:30 +#: bookwyrm/templates/lists/form.html:31 bookwyrm/templates/search/book.html:30 +#: bookwyrm/templates/settings/reports/reports.html:25 #: bookwyrm/templates/snippets/announcement.html:16 msgid "Open" msgstr "Ouverte" @@ -1633,7 +1647,7 @@ msgstr "Ouverte" msgid "Anyone can add books to this list" msgstr "N’importe qui peut suggérer des livres" -#: bookwyrm/templates/lists/form.html:49 +#: bookwyrm/templates/lists/form.html:50 #, fuzzy #| msgid "Delete status" msgid "Delete list" @@ -1656,7 +1670,7 @@ msgstr "Cette liste est actuellement vide" msgid "Added by %(username)s" msgstr "Ajouté par %(username)s" -#: bookwyrm/templates/lists/list.html:74 +#: bookwyrm/templates/lists/list.html:75 msgid "List position" msgstr "Position" @@ -1664,42 +1678,42 @@ msgstr "Position" msgid "Set" msgstr "Appliquer" -#: bookwyrm/templates/lists/list.html:89 +#: bookwyrm/templates/lists/list.html:91 #: bookwyrm/templates/snippets/shelf_selector.html:26 msgid "Remove" msgstr "Retirer" -#: bookwyrm/templates/lists/list.html:103 -#: bookwyrm/templates/lists/list.html:120 +#: bookwyrm/templates/lists/list.html:105 +#: bookwyrm/templates/lists/list.html:122 msgid "Sort List" msgstr "Trier la liste" -#: bookwyrm/templates/lists/list.html:113 +#: bookwyrm/templates/lists/list.html:115 msgid "Direction" msgstr "Direction" -#: bookwyrm/templates/lists/list.html:127 +#: bookwyrm/templates/lists/list.html:129 msgid "Add Books" msgstr "Ajouter des livres" -#: bookwyrm/templates/lists/list.html:129 +#: bookwyrm/templates/lists/list.html:131 msgid "Suggest Books" msgstr "Suggérer des livres" -#: bookwyrm/templates/lists/list.html:140 +#: bookwyrm/templates/lists/list.html:142 msgid "search" msgstr "chercher" -#: bookwyrm/templates/lists/list.html:146 +#: bookwyrm/templates/lists/list.html:148 msgid "Clear search" msgstr "Vider la requête" -#: bookwyrm/templates/lists/list.html:151 +#: bookwyrm/templates/lists/list.html:153 #, python-format msgid "No books found matching the query \"%(query)s\"" msgstr "Aucun livre trouvé pour la requête « %(query)s »" -#: bookwyrm/templates/lists/list.html:179 +#: bookwyrm/templates/lists/list.html:181 msgid "Suggest" msgstr "Suggérer" @@ -1729,110 +1743,19 @@ msgstr "Créer une liste" msgid "Login" msgstr "Connexion" -#: bookwyrm/templates/login.html:16 +#: bookwyrm/templates/login.html:15 msgid "Success! Email address confirmed." msgstr "Bravo ! L’adresse email a été confirmée." -#: bookwyrm/templates/login.html:28 bookwyrm/templates/password_reset.html:17 +#: bookwyrm/templates/login.html:27 bookwyrm/templates/password_reset.html:17 #: bookwyrm/templates/snippets/register_form.html:22 msgid "Password:" msgstr "Mot de passe :" -#: bookwyrm/templates/login.html:57 -msgid "Contact an administrator to get an invite" -msgstr "Contacter un administrateur pour obtenir une invitation" - -#: bookwyrm/templates/login.html:68 +#: bookwyrm/templates/login.html:62 msgid "More about this site" msgstr "En savoir plus sur ce site" -#: bookwyrm/templates/moderation/report.html:5 -#: bookwyrm/templates/moderation/report.html:6 -#: bookwyrm/templates/moderation/report_preview.html:6 -#, python-format -msgid "Report #%(report_id)s: %(username)s" -msgstr "Signalement #%(report_id)s : %(username)s" - -#: bookwyrm/templates/moderation/report.html:10 -msgid "Back to reports" -msgstr "Retour aux signalements" - -#: bookwyrm/templates/moderation/report.html:22 -msgid "Moderator Comments" -msgstr "Commentaires de l’équipe de modération" - -#: bookwyrm/templates/moderation/report.html:40 -#: bookwyrm/templates/snippets/create_status.html:28 -msgid "Comment" -msgstr "Commentaire" - -#: bookwyrm/templates/moderation/report.html:45 -msgid "Reported statuses" -msgstr "Statuts signalés" - -#: bookwyrm/templates/moderation/report.html:47 -msgid "No statuses reported" -msgstr "Aucun statut signalé" - -#: bookwyrm/templates/moderation/report.html:53 -msgid "Status has been deleted" -msgstr "Le statut a été supprimé" - -#: bookwyrm/templates/moderation/report_modal.html:6 -#, python-format -msgid "Report @%(username)s" -msgstr "Signaler @%(username)s" - -#: bookwyrm/templates/moderation/report_modal.html:23 -#, python-format -msgid "This report will be sent to %(site_name)s's moderators for review." -msgstr "Ce signalement sera envoyé à l’équipe de modération de %(site_name)s pour traitement." - -#: bookwyrm/templates/moderation/report_modal.html:24 -msgid "More info about this report:" -msgstr "En savoir plus sur ce signalement :" - -#: bookwyrm/templates/moderation/report_preview.html:13 -msgid "No notes provided" -msgstr "Aucune note fournie" - -#: bookwyrm/templates/moderation/report_preview.html:20 -#, python-format -msgid "Reported by %(username)s" -msgstr "Signalé par %(username)s" - -#: bookwyrm/templates/moderation/report_preview.html:30 -msgid "Re-open" -msgstr "Réouvrir" - -#: bookwyrm/templates/moderation/report_preview.html:32 -msgid "Resolve" -msgstr "Résoudre" - -#: bookwyrm/templates/moderation/reports.html:6 -#, python-format -msgid "Reports: %(instance_name)s" -msgstr "Signalements : %(instance_name)s" - -#: bookwyrm/templates/moderation/reports.html:8 -#: bookwyrm/templates/moderation/reports.html:17 -#: bookwyrm/templates/settings/layout.html:55 -msgid "Reports" -msgstr "Signalements" - -#: bookwyrm/templates/moderation/reports.html:14 -#, python-format -msgid "Reports: %(instance_name)s" -msgstr "Signalements : %(instance_name)s" - -#: bookwyrm/templates/moderation/reports.html:28 -msgid "Resolved" -msgstr "Résolus" - -#: bookwyrm/templates/moderation/reports.html:37 -msgid "No reports found." -msgstr "Aucun signalement trouvé." - #: bookwyrm/templates/notifications.html:16 msgid "Delete notifications" msgstr "Supprimer les notifications" @@ -1973,7 +1896,7 @@ msgstr "Changer de mot de passe" #: bookwyrm/templates/preferences/blocks.html:4 #: bookwyrm/templates/preferences/blocks.html:7 -#: bookwyrm/templates/preferences/layout.html:30 +#: bookwyrm/templates/preferences/layout.html:31 msgid "Blocked Users" msgstr "Comptes bloqués" @@ -1984,7 +1907,7 @@ msgstr "Aucun compte bloqué actuellement" #: bookwyrm/templates/preferences/change_password.html:4 #: bookwyrm/templates/preferences/change_password.html:7 #: bookwyrm/templates/preferences/change_password.html:21 -#: bookwyrm/templates/preferences/layout.html:19 +#: bookwyrm/templates/preferences/layout.html:20 msgid "Change Password" msgstr "Changer le mot de passe" @@ -1995,8 +1918,8 @@ msgstr "Nouveau mot de passe :" #: bookwyrm/templates/preferences/delete_user.html:4 #: bookwyrm/templates/preferences/delete_user.html:7 #: bookwyrm/templates/preferences/delete_user.html:26 -#: bookwyrm/templates/preferences/layout.html:23 -#: bookwyrm/templates/user_admin/delete_user_form.html:23 +#: bookwyrm/templates/preferences/layout.html:24 +#: bookwyrm/templates/settings/users/delete_user_form.html:23 #, fuzzy #| msgid "Create an Account" msgid "Delete Account" @@ -2012,46 +1935,62 @@ msgstr "" #: bookwyrm/templates/preferences/edit_user.html:4 #: bookwyrm/templates/preferences/edit_user.html:7 +#: bookwyrm/templates/preferences/layout.html:15 msgid "Edit Profile" msgstr "Modifier le profil" -#: bookwyrm/templates/preferences/edit_user.html:46 +#: bookwyrm/templates/preferences/edit_user.html:12 +#: bookwyrm/templates/preferences/edit_user.html:25 +#: bookwyrm/templates/settings/users/user_info.html:7 +msgid "Profile" +msgstr "Profil" + +#: bookwyrm/templates/preferences/edit_user.html:13 +#: bookwyrm/templates/preferences/edit_user.html:68 +#, fuzzy +#| msgid "Email preference" +msgid "Display preferences" +msgstr "Paramètres d’email" + +#: bookwyrm/templates/preferences/edit_user.html:14 +#: bookwyrm/templates/preferences/edit_user.html:100 +#, fuzzy +#| msgid "Post privacy" +msgid "Privacy" +msgstr "Confidentialité du statut" + +#: bookwyrm/templates/preferences/edit_user.html:72 #, fuzzy #| msgid "Show set reading goal prompt in feed:" msgid "Show reading goal prompt in feed:" msgstr "Afficher le message pour définir un défi lecture dans le fil d’actualité :" -#: bookwyrm/templates/preferences/edit_user.html:50 +#: bookwyrm/templates/preferences/edit_user.html:76 #, fuzzy #| msgid "Show this account in suggested users:" msgid "Show suggested users:" msgstr "Afficher ce compte dans ceux suggérés :" -#: bookwyrm/templates/preferences/edit_user.html:58 +#: bookwyrm/templates/preferences/edit_user.html:85 #, python-format msgid "Your account will show up in the directory, and may be recommended to other BookWyrm users." msgstr "Votre compte sera listé dans le répertoire et pourra être recommandé à d’autres utilisateurs ou utilisatrices de BookWyrm." -#: bookwyrm/templates/preferences/edit_user.html:68 +#: bookwyrm/templates/preferences/edit_user.html:89 +msgid "Preferred Timezone: " +msgstr "Fuseau horaire préféré" + +#: bookwyrm/templates/preferences/edit_user.html:110 #, fuzzy #| msgid "Post privacy" msgid "Default post privacy:" msgstr "Confidentialité du statut" -#: bookwyrm/templates/preferences/edit_user.html:75 -msgid "Preferred Timezone: " -msgstr "Fuseau horaire préféré" - #: bookwyrm/templates/preferences/layout.html:11 msgid "Account" msgstr "Compte" -#: bookwyrm/templates/preferences/layout.html:15 -#: bookwyrm/templates/user_admin/user_info.html:7 -msgid "Profile" -msgstr "Profil" - -#: bookwyrm/templates/preferences/layout.html:26 +#: bookwyrm/templates/preferences/layout.html:27 msgid "Relationships" msgstr "Relations" @@ -2095,11 +2034,11 @@ msgstr "Type de recherche" #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:46 -#: bookwyrm/templates/settings/email_blocklist.html:27 -#: bookwyrm/templates/settings/federation.html:44 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:27 +#: bookwyrm/templates/settings/federation/instance_list.html:44 #: bookwyrm/templates/settings/layout.html:34 -#: bookwyrm/templates/user_admin/user_admin.html:3 -#: bookwyrm/templates/user_admin/user_admin.html:10 +#: bookwyrm/templates/settings/users/user_admin.html:3 +#: bookwyrm/templates/settings/users/user_admin.html:10 msgid "Users" msgstr "Comptes" @@ -2108,147 +2047,147 @@ msgstr "Comptes" msgid "No results found for \"%(query)s\"" msgstr "Aucun résultat pour « %(query)s »" -#: bookwyrm/templates/settings/announcement.html:3 -#: bookwyrm/templates/settings/announcement.html:6 +#: bookwyrm/templates/settings/announcements/announcement.html:3 +#: bookwyrm/templates/settings/announcements/announcement.html:6 msgid "Announcement" msgstr "Annonce" -#: bookwyrm/templates/settings/announcement.html:7 -#: bookwyrm/templates/settings/federated_server.html:13 +#: bookwyrm/templates/settings/announcements/announcement.html:7 +#: bookwyrm/templates/settings/federation/instance.html:13 msgid "Back to list" msgstr "Retour à la liste" -#: bookwyrm/templates/settings/announcement.html:11 -#: bookwyrm/templates/settings/announcement_form.html:6 +#: bookwyrm/templates/settings/announcements/announcement.html:11 +#: bookwyrm/templates/settings/announcements/announcement_form.html:6 msgid "Edit Announcement" msgstr "Modifier l’annonce" -#: bookwyrm/templates/settings/announcement.html:35 +#: bookwyrm/templates/settings/announcements/announcement.html:35 msgid "Visible:" msgstr "Visible :" -#: bookwyrm/templates/settings/announcement.html:38 +#: bookwyrm/templates/settings/announcements/announcement.html:38 msgid "True" msgstr "Vrai" -#: bookwyrm/templates/settings/announcement.html:40 +#: bookwyrm/templates/settings/announcements/announcement.html:40 msgid "False" msgstr "Faux" -#: bookwyrm/templates/settings/announcement.html:47 -#: bookwyrm/templates/settings/announcement_form.html:40 -#: bookwyrm/templates/settings/dashboard.html:71 +#: bookwyrm/templates/settings/announcements/announcement.html:47 +#: bookwyrm/templates/settings/announcements/announcement_form.html:40 +#: bookwyrm/templates/settings/dashboard/dashboard.html:71 msgid "Start date:" msgstr "Date de début :" -#: bookwyrm/templates/settings/announcement.html:54 -#: bookwyrm/templates/settings/announcement_form.html:49 -#: bookwyrm/templates/settings/dashboard.html:77 +#: bookwyrm/templates/settings/announcements/announcement.html:54 +#: bookwyrm/templates/settings/announcements/announcement_form.html:49 +#: bookwyrm/templates/settings/dashboard/dashboard.html:77 msgid "End date:" msgstr "Date de fin :" -#: bookwyrm/templates/settings/announcement.html:60 -#: bookwyrm/templates/settings/announcement_form.html:58 +#: bookwyrm/templates/settings/announcements/announcement.html:60 +#: bookwyrm/templates/settings/announcements/announcement_form.html:58 msgid "Active:" msgstr "Active :" -#: bookwyrm/templates/settings/announcement_form.html:8 -#: bookwyrm/templates/settings/announcements.html:8 +#: bookwyrm/templates/settings/announcements/announcement_form.html:8 +#: bookwyrm/templates/settings/announcements/announcements.html:8 msgid "Create Announcement" msgstr "Ajouter une annonce" -#: bookwyrm/templates/settings/announcement_form.html:16 +#: bookwyrm/templates/settings/announcements/announcement_form.html:16 #, fuzzy #| msgid "Preview" msgid "Preview:" msgstr "Aperçu" -#: bookwyrm/templates/settings/announcement_form.html:23 +#: bookwyrm/templates/settings/announcements/announcement_form.html:23 #, fuzzy #| msgid "Content" msgid "Content:" msgstr "Contenu" -#: bookwyrm/templates/settings/announcement_form.html:30 +#: bookwyrm/templates/settings/announcements/announcement_form.html:30 #, fuzzy #| msgid "End date:" msgid "Event date:" msgstr "Date de fin :" -#: bookwyrm/templates/settings/announcements.html:3 -#: bookwyrm/templates/settings/announcements.html:5 -#: bookwyrm/templates/settings/layout.html:68 +#: bookwyrm/templates/settings/announcements/announcements.html:3 +#: bookwyrm/templates/settings/announcements/announcements.html:5 +#: bookwyrm/templates/settings/layout.html:72 msgid "Announcements" msgstr "Annonces" -#: bookwyrm/templates/settings/announcements.html:22 -#: bookwyrm/templates/settings/federation.html:36 +#: bookwyrm/templates/settings/announcements/announcements.html:22 +#: bookwyrm/templates/settings/federation/instance_list.html:36 msgid "Date added" msgstr "Date d’ajout" -#: bookwyrm/templates/settings/announcements.html:26 +#: bookwyrm/templates/settings/announcements/announcements.html:26 msgid "Preview" msgstr "Aperçu" -#: bookwyrm/templates/settings/announcements.html:30 +#: bookwyrm/templates/settings/announcements/announcements.html:30 msgid "Start date" msgstr "Date de début" -#: bookwyrm/templates/settings/announcements.html:34 +#: bookwyrm/templates/settings/announcements/announcements.html:34 msgid "End date" msgstr "Date de fin" -#: bookwyrm/templates/settings/announcements.html:38 -#: bookwyrm/templates/settings/federation.html:46 -#: bookwyrm/templates/settings/manage_invite_requests.html:44 -#: bookwyrm/templates/settings/status_filter.html:5 -#: bookwyrm/templates/user_admin/user_admin.html:34 -#: bookwyrm/templates/user_admin/user_info.html:20 +#: bookwyrm/templates/settings/announcements/announcements.html:38 +#: bookwyrm/templates/settings/federation/instance_list.html:46 +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:44 +#: bookwyrm/templates/settings/invites/status_filter.html:5 +#: bookwyrm/templates/settings/users/user_admin.html:34 +#: bookwyrm/templates/settings/users/user_info.html:20 msgid "Status" msgstr "Statut" -#: bookwyrm/templates/settings/announcements.html:48 +#: bookwyrm/templates/settings/announcements/announcements.html:48 msgid "active" msgstr "active" -#: bookwyrm/templates/settings/announcements.html:48 +#: bookwyrm/templates/settings/announcements/announcements.html:48 msgid "inactive" msgstr "inactive" -#: bookwyrm/templates/settings/announcements.html:54 +#: bookwyrm/templates/settings/announcements/announcements.html:52 #, fuzzy #| msgid "Announcements" -msgid "No announcements found." +msgid "No announcements found" msgstr "Annonces" -#: bookwyrm/templates/settings/dashboard.html:6 -#: bookwyrm/templates/settings/dashboard.html:8 +#: bookwyrm/templates/settings/dashboard/dashboard.html:6 +#: bookwyrm/templates/settings/dashboard/dashboard.html:8 #: bookwyrm/templates/settings/layout.html:26 msgid "Dashboard" msgstr "" -#: bookwyrm/templates/settings/dashboard.html:15 +#: bookwyrm/templates/settings/dashboard/dashboard.html:15 #, fuzzy #| msgid "Local users" msgid "Total users" msgstr "Comptes locaux" -#: bookwyrm/templates/settings/dashboard.html:21 -#: bookwyrm/templates/settings/dashboard_user_chart.html:12 +#: bookwyrm/templates/settings/dashboard/dashboard.html:21 +#: bookwyrm/templates/settings/dashboard/dashboard_user_chart.html:12 msgid "Active this month" msgstr "" -#: bookwyrm/templates/settings/dashboard.html:27 +#: bookwyrm/templates/settings/dashboard/dashboard.html:27 #, fuzzy #| msgid "Status" msgid "Statuses" msgstr "Statut" -#: bookwyrm/templates/settings/dashboard.html:33 +#: bookwyrm/templates/settings/dashboard/dashboard.html:33 msgid "Works" msgstr "" -#: bookwyrm/templates/settings/dashboard.html:43 +#: bookwyrm/templates/settings/dashboard/dashboard.html:43 #, fuzzy, python-format #| msgid "%(count)d uses" msgid "%(display_count)s open report" @@ -2256,7 +2195,7 @@ msgid_plural "%(display_count)s open reports" msgstr[0] "%(count)d utilisations" msgstr[1] "%(count)d utilisations" -#: bookwyrm/templates/settings/dashboard.html:54 +#: bookwyrm/templates/settings/dashboard/dashboard.html:54 #, fuzzy, python-format #| msgid "%(count)d uses" msgid "%(display_count)s invite request" @@ -2264,126 +2203,81 @@ msgid_plural "%(display_count)s invite requests" msgstr[0] "%(count)d utilisations" msgstr[1] "%(count)d utilisations" -#: bookwyrm/templates/settings/dashboard.html:65 +#: bookwyrm/templates/settings/dashboard/dashboard.html:65 #, fuzzy #| msgid "User Activity" msgid "Instance Activity" msgstr "Activité du compte" -#: bookwyrm/templates/settings/dashboard.html:83 +#: bookwyrm/templates/settings/dashboard/dashboard.html:83 msgid "Interval:" msgstr "" -#: bookwyrm/templates/settings/dashboard.html:86 +#: bookwyrm/templates/settings/dashboard/dashboard.html:87 msgid "Days" msgstr "" -#: bookwyrm/templates/settings/dashboard.html:87 +#: bookwyrm/templates/settings/dashboard/dashboard.html:88 #, fuzzy #| msgid "One Week" msgid "Weeks" msgstr "Une semaine" -#: bookwyrm/templates/settings/dashboard.html:100 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 #, fuzzy #| msgid "User Activity" msgid "User signup activity" msgstr "Activité du compte" -#: bookwyrm/templates/settings/dashboard.html:106 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #, fuzzy #| msgid "User Activity" msgid "Status activity" msgstr "Activité du compte" -#: bookwyrm/templates/settings/dashboard_status_chart.html:7 +#: bookwyrm/templates/settings/dashboard/dashboard_status_chart.html:7 #, fuzzy #| msgid "No statuses reported" msgid "Statuses posted" msgstr "Aucun statut signalé" -#: bookwyrm/templates/settings/dashboard_user_chart.html:7 +#: bookwyrm/templates/settings/dashboard/dashboard_user_chart.html:7 msgid "Total" msgstr "" -#: bookwyrm/templates/settings/domain_form.html:5 -#: bookwyrm/templates/settings/email_blocklist.html:10 +#: bookwyrm/templates/settings/email_blocklist/domain_form.html:5 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:10 msgid "Add domain" msgstr "" -#: bookwyrm/templates/settings/domain_form.html:11 +#: bookwyrm/templates/settings/email_blocklist/domain_form.html:11 msgid "Domain:" msgstr "" -#: bookwyrm/templates/settings/edit_server.html:3 -#: bookwyrm/templates/settings/edit_server.html:6 -#: bookwyrm/templates/settings/edit_server.html:20 -#: bookwyrm/templates/settings/federation.html:9 -#: bookwyrm/templates/settings/federation.html:10 -#: bookwyrm/templates/settings/server_blocklist.html:3 -#: bookwyrm/templates/settings/server_blocklist.html:20 -msgid "Add instance" -msgstr "Ajouter une instance" - -#: bookwyrm/templates/settings/edit_server.html:7 -#: bookwyrm/templates/settings/server_blocklist.html:7 -msgid "Back to instance list" -msgstr "Retour à la liste des instances" - -#: bookwyrm/templates/settings/edit_server.html:16 -#: bookwyrm/templates/settings/server_blocklist.html:16 -msgid "Import block list" -msgstr "Importer une liste de blocage" - -#: bookwyrm/templates/settings/edit_server.html:30 -msgid "Instance:" -msgstr "Instance :" - -#: bookwyrm/templates/settings/edit_server.html:37 -#: bookwyrm/templates/settings/federated_server.html:31 -#: bookwyrm/templates/user_admin/user_info.html:125 -msgid "Status:" -msgstr "Statut :" - -#: bookwyrm/templates/settings/edit_server.html:48 -#: bookwyrm/templates/settings/federated_server.html:23 -#: bookwyrm/templates/user_admin/user_info.html:117 -msgid "Software:" -msgstr "Logiciel :" - -#: bookwyrm/templates/settings/edit_server.html:55 -#: bookwyrm/templates/settings/federated_server.html:27 -#: bookwyrm/templates/user_admin/user_info.html:121 -msgid "Version:" -msgstr "Description :" - -#: bookwyrm/templates/settings/edit_server.html:64 -msgid "Notes:" -msgstr "Remarques :" - -#: bookwyrm/templates/settings/email_blocklist.html:5 -#: bookwyrm/templates/settings/email_blocklist.html:7 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:5 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:7 #: bookwyrm/templates/settings/layout.html:59 #, fuzzy #| msgid "Import Blocklist" msgid "Email Blocklist" msgstr "Importer une liste de blocage" -#: bookwyrm/templates/settings/email_blocklist.html:18 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:18 msgid "When someone tries to register with an email from this domain, no account will be created. The registration process will appear to have worked." msgstr "" -#: bookwyrm/templates/settings/email_blocklist.html:25 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:25 msgid "Domain" msgstr "" -#: bookwyrm/templates/settings/email_blocklist.html:29 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:29 +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:27 #, fuzzy #| msgid "Actions" msgid "Options" msgstr "Actions" -#: bookwyrm/templates/settings/email_blocklist.html:38 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:38 #, fuzzy, python-format #| msgid "%(count)d uses" msgid "%(display_count)s user" @@ -2391,88 +2285,318 @@ msgid_plural "%(display_count)s users" msgstr[0] "%(count)d utilisations" msgstr[1] "%(count)d utilisations" -#: bookwyrm/templates/settings/federated_server.html:19 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:59 +#, fuzzy +#| msgid "No users currently blocked." +msgid "No email domains currently blocked" +msgstr "Aucun compte bloqué actuellement" + +#: bookwyrm/templates/settings/federation/edit_instance.html:3 +#: bookwyrm/templates/settings/federation/edit_instance.html:6 +#: bookwyrm/templates/settings/federation/edit_instance.html:20 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:3 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:20 +#: bookwyrm/templates/settings/federation/instance_list.html:9 +#: bookwyrm/templates/settings/federation/instance_list.html:10 +msgid "Add instance" +msgstr "Ajouter une instance" + +#: bookwyrm/templates/settings/federation/edit_instance.html:7 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:7 +msgid "Back to instance list" +msgstr "Retour à la liste des instances" + +#: bookwyrm/templates/settings/federation/edit_instance.html:16 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:16 +msgid "Import block list" +msgstr "Importer une liste de blocage" + +#: bookwyrm/templates/settings/federation/edit_instance.html:30 +msgid "Instance:" +msgstr "Instance :" + +#: bookwyrm/templates/settings/federation/edit_instance.html:39 +#: bookwyrm/templates/settings/federation/instance.html:28 +#: bookwyrm/templates/settings/users/user_info.html:106 +msgid "Status:" +msgstr "Statut :" + +#: bookwyrm/templates/settings/federation/edit_instance.html:52 +#: bookwyrm/templates/settings/federation/instance.html:22 +#: bookwyrm/templates/settings/users/user_info.html:100 +msgid "Software:" +msgstr "Logiciel :" + +#: bookwyrm/templates/settings/federation/edit_instance.html:61 +#: bookwyrm/templates/settings/federation/instance.html:25 +#: bookwyrm/templates/settings/users/user_info.html:103 +msgid "Version:" +msgstr "Description :" + +#: bookwyrm/templates/settings/federation/edit_instance.html:70 +msgid "Notes:" +msgstr "Remarques :" + +#: bookwyrm/templates/settings/federation/instance.html:19 msgid "Details" msgstr "Détails" -#: bookwyrm/templates/settings/federated_server.html:39 +#: bookwyrm/templates/settings/federation/instance.html:35 #: bookwyrm/templates/user/layout.html:63 msgid "Activity" msgstr "Activité" -#: bookwyrm/templates/settings/federated_server.html:43 +#: bookwyrm/templates/settings/federation/instance.html:38 msgid "Users:" msgstr "Comptes :" -#: bookwyrm/templates/settings/federated_server.html:46 -#: bookwyrm/templates/settings/federated_server.html:53 +#: bookwyrm/templates/settings/federation/instance.html:41 +#: bookwyrm/templates/settings/federation/instance.html:47 msgid "View all" msgstr "Voir tous" -#: bookwyrm/templates/settings/federated_server.html:50 -#: bookwyrm/templates/user_admin/user_info.html:59 +#: bookwyrm/templates/settings/federation/instance.html:44 +#: bookwyrm/templates/settings/users/user_info.html:56 msgid "Reports:" msgstr "Signalements :" -#: bookwyrm/templates/settings/federated_server.html:57 +#: bookwyrm/templates/settings/federation/instance.html:50 msgid "Followed by us:" msgstr "Suivi par nous :" -#: bookwyrm/templates/settings/federated_server.html:63 +#: bookwyrm/templates/settings/federation/instance.html:55 msgid "Followed by them:" msgstr "Suivi par eux :" -#: bookwyrm/templates/settings/federated_server.html:69 +#: bookwyrm/templates/settings/federation/instance.html:60 msgid "Blocked by us:" msgstr "Bloqués par nous :" -#: bookwyrm/templates/settings/federated_server.html:82 -#: bookwyrm/templates/user_admin/user_info.html:130 +#: bookwyrm/templates/settings/federation/instance.html:72 +#: bookwyrm/templates/settings/users/user_info.html:110 msgid "Notes" msgstr "Remarques" -#: bookwyrm/templates/settings/federated_server.html:85 +#: bookwyrm/templates/settings/federation/instance.html:75 msgid "Edit" msgstr "Modifier" -#: bookwyrm/templates/settings/federated_server.html:105 -#: bookwyrm/templates/user_admin/user_moderation_actions.html:8 +#: bookwyrm/templates/settings/federation/instance.html:79 +msgid "No notes" +msgstr "" + +#: bookwyrm/templates/settings/federation/instance.html:94 +#: bookwyrm/templates/settings/users/user_moderation_actions.html:8 msgid "Actions" msgstr "Actions" -#: bookwyrm/templates/settings/federated_server.html:109 +#: bookwyrm/templates/settings/federation/instance.html:98 #: bookwyrm/templates/snippets/block_button.html:5 msgid "Block" msgstr "Bloquer" -#: bookwyrm/templates/settings/federated_server.html:110 +#: bookwyrm/templates/settings/federation/instance.html:99 msgid "All users from this instance will be deactivated." msgstr "Tous les comptes de cette instance seront désactivés." -#: bookwyrm/templates/settings/federated_server.html:115 +#: bookwyrm/templates/settings/federation/instance.html:104 #: bookwyrm/templates/snippets/block_button.html:10 msgid "Un-block" msgstr "Débloquer" -#: bookwyrm/templates/settings/federated_server.html:116 +#: bookwyrm/templates/settings/federation/instance.html:105 msgid "All users from this instance will be re-activated." msgstr "Tous les comptes de cette instance seront réactivés." -#: bookwyrm/templates/settings/federation.html:3 -#: bookwyrm/templates/settings/federation.html:5 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:6 +msgid "Import Blocklist" +msgstr "Importer une liste de blocage" + +#: bookwyrm/templates/settings/federation/instance_blocklist.html:26 +#: bookwyrm/templates/snippets/goal_progress.html:7 +msgid "Success!" +msgstr "Bravo !" + +#: bookwyrm/templates/settings/federation/instance_blocklist.html:30 +msgid "Successfully blocked:" +msgstr "Blocage réussi :" + +#: bookwyrm/templates/settings/federation/instance_blocklist.html:32 +msgid "Failed:" +msgstr "Échec :" + +#: bookwyrm/templates/settings/federation/instance_list.html:3 +#: bookwyrm/templates/settings/federation/instance_list.html:5 #: bookwyrm/templates/settings/layout.html:45 msgid "Federated Instances" msgstr "Instances fédérées" -#: bookwyrm/templates/settings/federation.html:32 -#: bookwyrm/templates/user_admin/server_filter.html:5 +#: bookwyrm/templates/settings/federation/instance_list.html:32 +#: bookwyrm/templates/settings/users/server_filter.html:5 msgid "Instance name" msgstr "Nom de l’instance" -#: bookwyrm/templates/settings/federation.html:40 +#: bookwyrm/templates/settings/federation/instance_list.html:40 msgid "Software" msgstr "Logiciel" +#: bookwyrm/templates/settings/federation/instance_list.html:63 +#, fuzzy +#| msgid "Announcements" +msgid "No instances found" +msgstr "Annonces" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:4 +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:11 +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:25 +#: bookwyrm/templates/settings/invites/manage_invites.html:11 +msgid "Invite Requests" +msgstr "Demandes d’invitation" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:23 +msgid "Ignored Invite Requests" +msgstr "Invitations ignorées" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:35 +msgid "Date requested" +msgstr "Date d’envoi" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:39 +msgid "Date accepted" +msgstr "Date de validation" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:42 +msgid "Email" +msgstr "Email" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:47 +msgid "Action" +msgstr "Action" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:50 +msgid "No requests" +msgstr "Aucune demande" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:59 +#: bookwyrm/templates/settings/invites/status_filter.html:16 +msgid "Accepted" +msgstr "Accepté(e)s" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:61 +#: bookwyrm/templates/settings/invites/status_filter.html:12 +msgid "Sent" +msgstr "Envoyé(e)s" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:63 +#: bookwyrm/templates/settings/invites/status_filter.html:8 +msgid "Requested" +msgstr "Demandé(e)s" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:73 +msgid "Send invite" +msgstr "Envoyer l’invitation" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:75 +msgid "Re-send invite" +msgstr "Envoyer l’invitation de nouveau" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:95 +msgid "Ignore" +msgstr "Ignorer" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:97 +msgid "Un-ignore" +msgstr "Ne plus ignorer" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:108 +msgid "Back to pending requests" +msgstr "Retour aux demandes en attente" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:110 +msgid "View ignored requests" +msgstr "Voir les demandes ignorées" + +#: bookwyrm/templates/settings/invites/manage_invites.html:21 +msgid "Generate New Invite" +msgstr "Générer une nouvelle invitation" + +#: bookwyrm/templates/settings/invites/manage_invites.html:27 +msgid "Expiry:" +msgstr "Expiration :" + +#: bookwyrm/templates/settings/invites/manage_invites.html:33 +msgid "Use limit:" +msgstr "Limiter à :" + +#: bookwyrm/templates/settings/invites/manage_invites.html:40 +msgid "Create Invite" +msgstr "Créer une invitation" + +#: bookwyrm/templates/settings/invites/manage_invites.html:47 +msgid "Link" +msgstr "Lien" + +#: bookwyrm/templates/settings/invites/manage_invites.html:48 +msgid "Expires" +msgstr "Expiration" + +#: bookwyrm/templates/settings/invites/manage_invites.html:49 +msgid "Max uses" +msgstr "Nombre maximum d’utilisations" + +#: bookwyrm/templates/settings/invites/manage_invites.html:50 +msgid "Times used" +msgstr "Nombre de fois utilisée" + +#: bookwyrm/templates/settings/invites/manage_invites.html:53 +msgid "No active invites" +msgstr "Aucune invitation active" + +#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:5 +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:10 +#, fuzzy +#| msgid "Email address:" +msgid "Add IP address" +msgstr "Adresse email :" + +#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:11 +msgid "Use IP address blocks with caution, and consider using blocks only temporarily, as IP addresses are often shared or change hands. If you block your own IP, you will not be able to access this page." +msgstr "" + +#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:18 +#, fuzzy +#| msgid "Email address:" +msgid "IP Address:" +msgstr "Adresse email :" + +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:5 +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:7 +#: bookwyrm/templates/settings/layout.html:63 +#, fuzzy +#| msgid "Import Blocklist" +msgid "IP Address Blocklist" +msgstr "Importer une liste de blocage" + +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:18 +msgid "Any traffic from this IP address will get a 404 response when trying to access any part of the application." +msgstr "" + +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:24 +#, fuzzy +#| msgid "Email address:" +msgid "Address" +msgstr "Adresse email :" + +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:46 +#, fuzzy +#| msgid "No users currently blocked." +msgid "No IP addresses currently blocked" +msgstr "Aucun compte bloqué actuellement" + +#: bookwyrm/templates/settings/ip_blocklist/ip_tooltip.html:6 +msgid "You can block IP ranges using CIDR syntax." +msgstr "" + #: bookwyrm/templates/settings/layout.html:4 msgid "Administration" msgstr "Administration" @@ -2487,237 +2611,395 @@ msgstr "Gérer les comptes" msgid "Moderation" msgstr "Modération de la liste :" -#: bookwyrm/templates/settings/layout.html:64 +#: bookwyrm/templates/settings/layout.html:55 +#: bookwyrm/templates/settings/reports/reports.html:8 +#: bookwyrm/templates/settings/reports/reports.html:17 +msgid "Reports" +msgstr "Signalements" + +#: bookwyrm/templates/settings/layout.html:68 msgid "Instance Settings" msgstr "Paramètres de l’instance" -#: bookwyrm/templates/settings/layout.html:72 +#: bookwyrm/templates/settings/layout.html:76 #: bookwyrm/templates/settings/site.html:4 #: bookwyrm/templates/settings/site.html:6 msgid "Site Settings" msgstr "Paramètres du site" -#: bookwyrm/templates/settings/layout.html:75 -#: bookwyrm/templates/settings/site.html:13 +#: bookwyrm/templates/settings/reports/report.html:5 +#: bookwyrm/templates/settings/reports/report.html:8 +#: bookwyrm/templates/settings/reports/report_preview.html:6 +#, python-format +msgid "Report #%(report_id)s: %(username)s" +msgstr "Signalement #%(report_id)s : %(username)s" + +#: bookwyrm/templates/settings/reports/report.html:9 +msgid "Back to reports" +msgstr "Retour aux signalements" + +#: bookwyrm/templates/settings/reports/report.html:23 +msgid "Moderator Comments" +msgstr "Commentaires de l’équipe de modération" + +#: bookwyrm/templates/settings/reports/report.html:41 +#: bookwyrm/templates/snippets/create_status.html:28 +msgid "Comment" +msgstr "Commentaire" + +#: bookwyrm/templates/settings/reports/report.html:46 +msgid "Reported statuses" +msgstr "Statuts signalés" + +#: bookwyrm/templates/settings/reports/report.html:48 +msgid "No statuses reported" +msgstr "Aucun statut signalé" + +#: bookwyrm/templates/settings/reports/report.html:54 +msgid "Status has been deleted" +msgstr "Le statut a été supprimé" + +#: bookwyrm/templates/settings/reports/report_preview.html:13 +msgid "No notes provided" +msgstr "Aucune note fournie" + +#: bookwyrm/templates/settings/reports/report_preview.html:20 +#, python-format +msgid "Reported by %(username)s" +msgstr "Signalé par %(username)s" + +#: bookwyrm/templates/settings/reports/report_preview.html:30 +msgid "Re-open" +msgstr "Réouvrir" + +#: bookwyrm/templates/settings/reports/report_preview.html:32 +msgid "Resolve" +msgstr "Résoudre" + +#: bookwyrm/templates/settings/reports/reports.html:6 +#, python-format +msgid "Reports: %(instance_name)s" +msgstr "Signalements : %(instance_name)s" + +#: bookwyrm/templates/settings/reports/reports.html:14 +#, python-format +msgid "Reports: %(instance_name)s" +msgstr "Signalements : %(instance_name)s" + +#: bookwyrm/templates/settings/reports/reports.html:28 +msgid "Resolved" +msgstr "Résolus" + +#: bookwyrm/templates/settings/reports/reports.html:37 +msgid "No reports found." +msgstr "Aucun signalement trouvé." + +#: bookwyrm/templates/settings/site.html:10 +#: bookwyrm/templates/settings/site.html:21 msgid "Instance Info" msgstr "Information sur l’instance" -#: bookwyrm/templates/settings/layout.html:76 -#: bookwyrm/templates/settings/site.html:44 +#: bookwyrm/templates/settings/site.html:11 +#: bookwyrm/templates/settings/site.html:54 msgid "Images" msgstr "Images" -#: bookwyrm/templates/settings/layout.html:77 -#: bookwyrm/templates/settings/site.html:64 +#: bookwyrm/templates/settings/site.html:12 +#: bookwyrm/templates/settings/site.html:74 msgid "Footer Content" msgstr "Contenu du pied de page" -#: bookwyrm/templates/settings/layout.html:78 -#: bookwyrm/templates/settings/site.html:86 +#: bookwyrm/templates/settings/site.html:13 +#: bookwyrm/templates/settings/site.html:98 msgid "Registration" msgstr "Inscription" -#: bookwyrm/templates/settings/manage_invite_requests.html:4 -#: bookwyrm/templates/settings/manage_invite_requests.html:11 -#: bookwyrm/templates/settings/manage_invite_requests.html:25 -#: bookwyrm/templates/settings/manage_invites.html:11 -msgid "Invite Requests" -msgstr "Demandes d’invitation" - -#: bookwyrm/templates/settings/manage_invite_requests.html:23 -msgid "Ignored Invite Requests" -msgstr "Invitations ignorées" - -#: bookwyrm/templates/settings/manage_invite_requests.html:35 -msgid "Date requested" -msgstr "Date d’envoi" - -#: bookwyrm/templates/settings/manage_invite_requests.html:39 -msgid "Date accepted" -msgstr "Date de validation" - -#: bookwyrm/templates/settings/manage_invite_requests.html:42 -msgid "Email" -msgstr "Email" - -#: bookwyrm/templates/settings/manage_invite_requests.html:47 -msgid "Action" -msgstr "Action" - -#: bookwyrm/templates/settings/manage_invite_requests.html:50 -msgid "No requests" -msgstr "Aucune demande" - -#: bookwyrm/templates/settings/manage_invite_requests.html:59 -#: bookwyrm/templates/settings/status_filter.html:16 -msgid "Accepted" -msgstr "Accepté(e)s" - -#: bookwyrm/templates/settings/manage_invite_requests.html:61 -#: bookwyrm/templates/settings/status_filter.html:12 -msgid "Sent" -msgstr "Envoyé(e)s" - -#: bookwyrm/templates/settings/manage_invite_requests.html:63 -#: bookwyrm/templates/settings/status_filter.html:8 -msgid "Requested" -msgstr "Demandé(e)s" - -#: bookwyrm/templates/settings/manage_invite_requests.html:73 -msgid "Send invite" -msgstr "Envoyer l’invitation" - -#: bookwyrm/templates/settings/manage_invite_requests.html:75 -msgid "Re-send invite" -msgstr "Envoyer l’invitation de nouveau" - -#: bookwyrm/templates/settings/manage_invite_requests.html:95 -msgid "Ignore" -msgstr "Ignorer" - -#: bookwyrm/templates/settings/manage_invite_requests.html:97 -msgid "Un-ignore" -msgstr "Ne plus ignorer" - -#: bookwyrm/templates/settings/manage_invite_requests.html:108 -msgid "Back to pending requests" -msgstr "Retour aux demandes en attente" - -#: bookwyrm/templates/settings/manage_invite_requests.html:110 -msgid "View ignored requests" -msgstr "Voir les demandes ignorées" - -#: bookwyrm/templates/settings/manage_invites.html:21 -msgid "Generate New Invite" -msgstr "Générer une nouvelle invitation" - -#: bookwyrm/templates/settings/manage_invites.html:27 -msgid "Expiry:" -msgstr "Expiration :" - -#: bookwyrm/templates/settings/manage_invites.html:33 -msgid "Use limit:" -msgstr "Limiter à :" - -#: bookwyrm/templates/settings/manage_invites.html:40 -msgid "Create Invite" -msgstr "Créer une invitation" - -#: bookwyrm/templates/settings/manage_invites.html:47 -msgid "Link" -msgstr "Lien" - -#: bookwyrm/templates/settings/manage_invites.html:48 -msgid "Expires" -msgstr "Expiration" - -#: bookwyrm/templates/settings/manage_invites.html:49 -msgid "Max uses" -msgstr "Nombre maximum d’utilisations" - -#: bookwyrm/templates/settings/manage_invites.html:50 -msgid "Times used" -msgstr "Nombre de fois utilisée" - -#: bookwyrm/templates/settings/manage_invites.html:53 -msgid "No active invites" -msgstr "Aucune invitation active" - -#: bookwyrm/templates/settings/server_blocklist.html:6 -msgid "Import Blocklist" -msgstr "Importer une liste de blocage" - -#: bookwyrm/templates/settings/server_blocklist.html:26 -#: bookwyrm/templates/snippets/goal_progress.html:7 -msgid "Success!" -msgstr "Bravo !" - -#: bookwyrm/templates/settings/server_blocklist.html:30 -msgid "Successfully blocked:" -msgstr "Blocage réussi :" - -#: bookwyrm/templates/settings/server_blocklist.html:32 -msgid "Failed:" -msgstr "Échec :" - -#: bookwyrm/templates/settings/site.html:15 +#: bookwyrm/templates/settings/site.html:24 msgid "Instance Name:" msgstr "Nom de l’instance :" -#: bookwyrm/templates/settings/site.html:19 +#: bookwyrm/templates/settings/site.html:28 msgid "Tagline:" msgstr "Slogan :" -#: bookwyrm/templates/settings/site.html:23 +#: bookwyrm/templates/settings/site.html:32 msgid "Instance description:" msgstr "Description de l’instance :" -#: bookwyrm/templates/settings/site.html:27 +#: bookwyrm/templates/settings/site.html:36 #, fuzzy #| msgid "Description:" msgid "Short description:" msgstr "Description :" -#: bookwyrm/templates/settings/site.html:28 +#: bookwyrm/templates/settings/site.html:37 msgid "Used when the instance is previewed on joinbookwyrm.com. Does not support html or markdown." msgstr "" -#: bookwyrm/templates/settings/site.html:32 +#: bookwyrm/templates/settings/site.html:41 msgid "Code of conduct:" msgstr "Code de conduite :" -#: bookwyrm/templates/settings/site.html:36 +#: bookwyrm/templates/settings/site.html:45 msgid "Privacy Policy:" msgstr "Politique de vie privée :" -#: bookwyrm/templates/settings/site.html:47 +#: bookwyrm/templates/settings/site.html:57 msgid "Logo:" msgstr "Logo :" -#: bookwyrm/templates/settings/site.html:51 +#: bookwyrm/templates/settings/site.html:61 msgid "Logo small:" msgstr "Logo réduit :" -#: bookwyrm/templates/settings/site.html:55 +#: bookwyrm/templates/settings/site.html:65 msgid "Favicon:" msgstr "Favicon :" -#: bookwyrm/templates/settings/site.html:66 +#: bookwyrm/templates/settings/site.html:77 msgid "Support link:" msgstr "URL pour soutenir l’instance :" -#: bookwyrm/templates/settings/site.html:70 +#: bookwyrm/templates/settings/site.html:81 msgid "Support title:" msgstr "Titre pour soutenir l’instance :" -#: bookwyrm/templates/settings/site.html:74 +#: bookwyrm/templates/settings/site.html:85 msgid "Admin email:" msgstr "Email de l’administrateur :" -#: bookwyrm/templates/settings/site.html:78 +#: bookwyrm/templates/settings/site.html:89 msgid "Additional info:" msgstr "Infos supplémentaires :" -#: bookwyrm/templates/settings/site.html:90 +#: bookwyrm/templates/settings/site.html:103 msgid "Allow registration" msgstr "Autoriser les inscriptions" -#: bookwyrm/templates/settings/site.html:96 +#: bookwyrm/templates/settings/site.html:109 msgid "Allow invite requests" msgstr "Autoriser les demandes d’invitation" -#: bookwyrm/templates/settings/site.html:102 +#: bookwyrm/templates/settings/site.html:115 msgid "Require users to confirm email address" msgstr "Demander aux utilisateurs et utilisatrices de confirmer leur adresse email" -#: bookwyrm/templates/settings/site.html:104 +#: bookwyrm/templates/settings/site.html:117 msgid "(Recommended if registration is open)" msgstr "(Recommandé si les inscriptions sont ouvertes)" -#: bookwyrm/templates/settings/site.html:107 +#: bookwyrm/templates/settings/site.html:120 msgid "Registration closed text:" msgstr "Texte affiché lorsque les inscriptions sont closes :" +#: bookwyrm/templates/settings/site.html:124 +#, fuzzy +#| msgid "Invite Requests" +msgid "Invite request text:" +msgstr "Demandes d’invitation" + +#: bookwyrm/templates/settings/users/delete_user_form.html:5 +#: bookwyrm/templates/settings/users/user_moderation_actions.html:31 +msgid "Permanently delete user" +msgstr "" + +#: bookwyrm/templates/settings/users/delete_user_form.html:12 +#, python-format +msgid "Are you sure you want to delete %(username)s's account? This action cannot be undone. To proceed, please enter your password to confirm deletion." +msgstr "" + +#: bookwyrm/templates/settings/users/delete_user_form.html:17 +#, fuzzy +#| msgid "Confirm password:" +msgid "Your password:" +msgstr "Confirmez le mot de passe :" + +#: bookwyrm/templates/settings/users/user.html:7 +msgid "Back to users" +msgstr "Retour aux comptes" + +#: bookwyrm/templates/settings/users/user_admin.html:7 +#, python-format +msgid "Users: %(instance_name)s" +msgstr "Comptes : %(instance_name)s" + +#: bookwyrm/templates/settings/users/user_admin.html:22 +#: bookwyrm/templates/settings/users/username_filter.html:5 +msgid "Username" +msgstr "Nom du compte" + +#: bookwyrm/templates/settings/users/user_admin.html:26 +msgid "Date Added" +msgstr "Date d’ajout" + +#: bookwyrm/templates/settings/users/user_admin.html:30 +msgid "Last Active" +msgstr "Dernière activité" + +#: bookwyrm/templates/settings/users/user_admin.html:38 +msgid "Remote instance" +msgstr "Instance distante" + +#: bookwyrm/templates/settings/users/user_admin.html:47 +#: bookwyrm/templates/settings/users/user_info.html:24 +msgid "Active" +msgstr "Actif" + +#: bookwyrm/templates/settings/users/user_admin.html:47 +#: bookwyrm/templates/settings/users/user_info.html:28 +msgid "Inactive" +msgstr "Inactif" + +#: bookwyrm/templates/settings/users/user_admin.html:52 +#: bookwyrm/templates/settings/users/user_info.html:120 +msgid "Not set" +msgstr "Non défini" + +#: bookwyrm/templates/settings/users/user_info.html:16 +msgid "View user profile" +msgstr "Voir le profil" + +#: bookwyrm/templates/settings/users/user_info.html:36 +msgid "Local" +msgstr "Local" + +#: bookwyrm/templates/settings/users/user_info.html:38 +#, fuzzy +#| msgid "Remove" +msgid "Remote" +msgstr "Retirer" + +#: bookwyrm/templates/settings/users/user_info.html:47 +msgid "User details" +msgstr "Détails du compte" + +#: bookwyrm/templates/settings/users/user_info.html:51 +#, fuzzy +#| msgid "Email" +msgid "Email:" +msgstr "Email" + +#: bookwyrm/templates/settings/users/user_info.html:61 +#, fuzzy +#| msgid "Directory" +msgid "(View reports)" +msgstr "Répertoire" + +#: bookwyrm/templates/settings/users/user_info.html:67 +#, fuzzy +#| msgid "Blocked by us:" +msgid "Blocked by count:" +msgstr "Bloqués par nous :" + +#: bookwyrm/templates/settings/users/user_info.html:70 +#, fuzzy +#| msgid "last active" +msgid "Last active date:" +msgstr "dernière activité" + +#: bookwyrm/templates/settings/users/user_info.html:73 +#, fuzzy +#| msgid "Manually approve followers:" +msgid "Manually approved followers:" +msgstr "Autoriser les abonnements manuellement :" + +#: bookwyrm/templates/settings/users/user_info.html:76 +#, fuzzy +#| msgid "Discard" +msgid "Discoverable:" +msgstr "Rejeter" + +#: bookwyrm/templates/settings/users/user_info.html:80 +#, fuzzy +#| msgid "Deactivate user" +msgid "Deactivation reason:" +msgstr "Désactiver le compte" + +#: bookwyrm/templates/settings/users/user_info.html:95 +msgid "Instance details" +msgstr "Détails de l’instance" + +#: bookwyrm/templates/settings/users/user_info.html:117 +msgid "View instance" +msgstr "Voir l’instance" + +#: bookwyrm/templates/settings/users/user_moderation_actions.html:5 +msgid "Permanently deleted" +msgstr "" + +#: bookwyrm/templates/settings/users/user_moderation_actions.html:13 +#: bookwyrm/templates/snippets/status/status_options.html:35 +#: bookwyrm/templates/snippets/user_options.html:13 +msgid "Send direct message" +msgstr "Envoyer un message direct" + +#: bookwyrm/templates/settings/users/user_moderation_actions.html:20 +msgid "Suspend user" +msgstr "Suspendre le compte" + +#: bookwyrm/templates/settings/users/user_moderation_actions.html:25 +msgid "Un-suspend user" +msgstr "Rétablir le compte" + +#: bookwyrm/templates/settings/users/user_moderation_actions.html:47 +msgid "Access level:" +msgstr "Niveau d’accès :" + +#: bookwyrm/templates/shelf/create_shelf_form.html:5 +msgid "Create Shelf" +msgstr "Créer une étagère" + +#: bookwyrm/templates/shelf/edit_shelf_form.html:5 +msgid "Edit Shelf" +msgstr "Modifier l’étagère" + +#: bookwyrm/templates/shelf/shelf.html:28 bookwyrm/views/shelf.py:56 +msgid "All books" +msgstr "Tous les livres" + +#: bookwyrm/templates/shelf/shelf.html:55 +msgid "Create shelf" +msgstr "Créer une étagère" + +#: bookwyrm/templates/shelf/shelf.html:77 +#, python-format +msgid "%(formatted_count)s book" +msgid_plural "%(formatted_count)s books" +msgstr[0] "" +msgstr[1] "" + +#: bookwyrm/templates/shelf/shelf.html:84 +#, python-format +msgid "(showing %(start)s-%(end)s)" +msgstr "" + +#: bookwyrm/templates/shelf/shelf.html:96 +msgid "Edit shelf" +msgstr "Modifier l’étagère" + +#: bookwyrm/templates/shelf/shelf.html:104 +msgid "Delete shelf" +msgstr "Supprimer l’étagère" + +#: bookwyrm/templates/shelf/shelf.html:130 +#: bookwyrm/templates/shelf/shelf.html:154 +msgid "Shelved" +msgstr "Date d’ajout" + +#: bookwyrm/templates/shelf/shelf.html:131 +#: bookwyrm/templates/shelf/shelf.html:158 +msgid "Started" +msgstr "Commencé" + +#: bookwyrm/templates/shelf/shelf.html:132 +#: bookwyrm/templates/shelf/shelf.html:161 +msgid "Finished" +msgstr "Terminé" + +#: bookwyrm/templates/shelf/shelf.html:187 +msgid "This shelf is empty." +msgstr "Cette étagère est vide" + #: bookwyrm/templates/snippets/announcement.html:31 #, python-format msgid "Posted by %(username)s" @@ -2763,24 +3045,21 @@ msgid "Some thoughts on the book" msgstr "" #: bookwyrm/templates/snippets/create_status/comment.html:26 -#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:16 +#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:15 msgid "Progress:" msgstr "Progression :" #: bookwyrm/templates/snippets/create_status/comment.html:52 -#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:30 -#: bookwyrm/templates/snippets/readthrough_form.html:22 +#: bookwyrm/templates/snippets/progress_field.html:18 msgid "pages" msgstr "pages" #: bookwyrm/templates/snippets/create_status/comment.html:58 -#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:31 -#: bookwyrm/templates/snippets/readthrough_form.html:23 +#: bookwyrm/templates/snippets/progress_field.html:23 msgid "percent" msgstr "pourcent" #: bookwyrm/templates/snippets/create_status/comment.html:65 -#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:36 #, python-format msgid "of %(pages)s pages" msgstr "sur %(pages)s pages" @@ -2796,11 +3075,13 @@ msgstr "Répondre" msgid "Content" msgstr "Contenu" -#: bookwyrm/templates/snippets/create_status/content_warning_field.html:3 -msgid "Spoiler alert:" -msgstr "Alerte Spoiler :" - #: bookwyrm/templates/snippets/create_status/content_warning_field.html:10 +#, fuzzy +#| msgid "Content" +msgid "Content warning:" +msgstr "Contenu" + +#: bookwyrm/templates/snippets/create_status/content_warning_field.html:18 msgid "Spoilers ahead!" msgstr "Attention spoilers !" @@ -2808,7 +3089,7 @@ msgstr "Attention spoilers !" msgid "Include spoiler alert" msgstr "Afficher une alerte spoiler" -#: bookwyrm/templates/snippets/create_status/layout.html:38 +#: bookwyrm/templates/snippets/create_status/layout.html:41 #: bookwyrm/templates/snippets/reading_modals/form.html:7 msgid "Comment:" msgstr "Commentaire :" @@ -2975,29 +3256,29 @@ msgstr[1] "Critique de « %(book_title)s » (%(display_rating)s stars) : % msgid "Review of \"%(book_title)s\": %(review_title)s" msgstr "Critique de « %(book_title)s » : %(review_title)s" -#: bookwyrm/templates/snippets/goal_card.html:23 +#: bookwyrm/templates/snippets/goal_form.html:3 #, python-format -msgid "You can set or change your reading goal any time from your profile page" -msgstr "Vous pouvez définir ou changer votre défi lecture à n’importe quel moment depuis votre profil" +msgid "Set a goal for how many books you'll finish reading in %(year)s, and track your progress throughout the year." +msgstr "Définissez un nombre de livre à lire comme objectif pour %(year)s, et suivezvotre progression au fil de l’année." -#: bookwyrm/templates/snippets/goal_form.html:9 +#: bookwyrm/templates/snippets/goal_form.html:12 msgid "Reading goal:" msgstr "Défi lecture :" -#: bookwyrm/templates/snippets/goal_form.html:14 +#: bookwyrm/templates/snippets/goal_form.html:17 msgid "books" msgstr "livres" -#: bookwyrm/templates/snippets/goal_form.html:19 +#: bookwyrm/templates/snippets/goal_form.html:22 msgid "Goal privacy:" msgstr "Confidentialité du défi :" -#: bookwyrm/templates/snippets/goal_form.html:26 +#: bookwyrm/templates/snippets/goal_form.html:29 #: bookwyrm/templates/snippets/reading_modals/layout.html:13 msgid "Post to feed" msgstr "Publier sur le fil d’actualité" -#: bookwyrm/templates/snippets/goal_form.html:30 +#: bookwyrm/templates/snippets/goal_form.html:33 msgid "Set goal" msgstr "Valider ce défi" @@ -3073,18 +3354,18 @@ msgstr "Noter" msgid "Finish \"%(book_title)s\"" msgstr "Terminer « %(book_title)s »" -#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:22 +#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:23 #: bookwyrm/templates/snippets/reading_modals/start_reading_modal.html:20 #: bookwyrm/templates/snippets/readthrough_form.html:7 msgid "Started reading" msgstr "Lecture commencée le" -#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:30 -#: bookwyrm/templates/snippets/readthrough_form.html:30 +#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:31 +#: bookwyrm/templates/snippets/readthrough_form.html:20 msgid "Finished reading" msgstr "Lecture terminée le" -#: bookwyrm/templates/snippets/reading_modals/form.html:8 +#: bookwyrm/templates/snippets/reading_modals/form.html:9 msgid "(Optional)" msgstr "" @@ -3115,6 +3396,20 @@ msgstr "S’enregistrer" msgid "Report" msgstr "Signaler" +#: bookwyrm/templates/snippets/report_modal.html:6 +#, python-format +msgid "Report @%(username)s" +msgstr "Signaler @%(username)s" + +#: bookwyrm/templates/snippets/report_modal.html:23 +#, python-format +msgid "This report will be sent to %(site_name)s's moderators for review." +msgstr "Ce signalement sera envoyé à l’équipe de modération de %(site_name)s pour traitement." + +#: bookwyrm/templates/snippets/report_modal.html:24 +msgid "More info about this report:" +msgstr "En savoir plus sur ce signalement :" + #: bookwyrm/templates/snippets/search_result_text.html:36 msgid "Import book" msgstr "Importer le livre" @@ -3146,32 +3441,40 @@ msgstr "Retirer de %(name)s" msgid "Finish reading" msgstr "Terminer la lecture" -#: bookwyrm/templates/snippets/status/content_status.html:73 -#: bookwyrm/templates/snippets/trimmed_text.html:17 -msgid "Show more" -msgstr "Déplier" +#: bookwyrm/templates/snippets/status/content_status.html:72 +#, fuzzy +#| msgid "Content" +msgid "Content warning" +msgstr "Contenu" -#: bookwyrm/templates/snippets/status/content_status.html:88 -#: bookwyrm/templates/snippets/trimmed_text.html:34 -msgid "Show less" -msgstr "Replier" +#: bookwyrm/templates/snippets/status/content_status.html:79 +#, fuzzy +#| msgid "Like status" +msgid "Show status" +msgstr "Ajouter le statut aux favoris" -#: bookwyrm/templates/snippets/status/content_status.html:103 +#: bookwyrm/templates/snippets/status/content_status.html:101 #, fuzzy, python-format #| msgid "page %(page)s" msgid "(Page %(page)s)" msgstr "page %(page)s" -#: bookwyrm/templates/snippets/status/content_status.html:105 +#: bookwyrm/templates/snippets/status/content_status.html:103 #, fuzzy, python-format #| msgid "%(percent)s%% complete!" msgid "(%(percent)s%%)" msgstr "%(percent)s%% terminé !" -#: bookwyrm/templates/snippets/status/content_status.html:127 +#: bookwyrm/templates/snippets/status/content_status.html:125 msgid "Open image in new window" msgstr "Ouvrir l’image dans une nouvelle fenêtre" +#: bookwyrm/templates/snippets/status/content_status.html:144 +#, fuzzy +#| msgid "Like status" +msgid "Hide status" +msgstr "Ajouter le statut aux favoris" + #: bookwyrm/templates/snippets/status/headers/comment.html:2 #, fuzzy, python-format #| msgid "Editions of \"%(work_title)s\"" @@ -3247,12 +3550,6 @@ msgstr "Plus d’options" msgid "Delete & re-draft" msgstr "Supprimer & recommencer la rédaction" -#: bookwyrm/templates/snippets/status/status_options.html:35 -#: bookwyrm/templates/snippets/user_options.html:13 -#: bookwyrm/templates/user_admin/user_moderation_actions.html:13 -msgid "Send direct message" -msgstr "Envoyer un message direct" - #: bookwyrm/templates/snippets/suggested_users.html:16 #, python-format msgid "%(mutuals)s follower you follow" @@ -3286,6 +3583,43 @@ msgstr "Trié par ordre croissant" msgid "Sorted descending" msgstr "Trié par ordre décroissant" +#: bookwyrm/templates/snippets/trimmed_text.html:17 +msgid "Show more" +msgstr "Déplier" + +#: bookwyrm/templates/snippets/trimmed_text.html:35 +msgid "Show less" +msgstr "Replier" + +#: bookwyrm/templates/user/books_header.html:5 +#, python-format +msgid "%(username)s's books" +msgstr "Livres de %(username)s" + +#: bookwyrm/templates/user/goal.html:8 +#, python-format +msgid "%(year)s Reading Progress" +msgstr "Progression de lecture pour %(year)s" + +#: bookwyrm/templates/user/goal.html:12 +msgid "Edit Goal" +msgstr "Modifier le défi" + +#: bookwyrm/templates/user/goal.html:28 +#, python-format +msgid "%(name)s hasn't set a reading goal for %(year)s." +msgstr "%(name)s n’a aucun défi lecture pour %(year)s." + +#: bookwyrm/templates/user/goal.html:40 +#, python-format +msgid "Your %(year)s Books" +msgstr "Vos livres en %(year)s" + +#: bookwyrm/templates/user/goal.html:42 +#, python-format +msgid "%(username)s's %(year)s Books" +msgstr "Livres de %(username)s en %(year)s" + #: bookwyrm/templates/user/layout.html:18 bookwyrm/templates/user/user.html:10 msgid "User Profile" msgstr "Profil" @@ -3322,71 +3656,6 @@ msgstr "Comptes suivis" msgid "%(username)s isn't following any users" msgstr "%(username)s ne suit personne" -#: bookwyrm/templates/user/shelf/books_header.html:5 -#, python-format -msgid "%(username)s's books" -msgstr "Livres de %(username)s" - -#: bookwyrm/templates/user/shelf/create_shelf_form.html:5 -#: bookwyrm/templates/user/shelf/create_shelf_form.html:22 -msgid "Create Shelf" -msgstr "Créer une étagère" - -#: bookwyrm/templates/user/shelf/edit_shelf_form.html:5 -msgid "Edit Shelf" -msgstr "Modifier l’étagère" - -#: bookwyrm/templates/user/shelf/edit_shelf_form.html:26 -msgid "Update shelf" -msgstr "Mettre l’étagère à jour" - -#: bookwyrm/templates/user/shelf/shelf.html:28 bookwyrm/views/shelf.py:56 -msgid "All books" -msgstr "Tous les livres" - -#: bookwyrm/templates/user/shelf/shelf.html:55 -msgid "Create shelf" -msgstr "Créer une étagère" - -#: bookwyrm/templates/user/shelf/shelf.html:76 -#, python-format -msgid "%(formatted_count)s book" -msgid_plural "%(formatted_count)s books" -msgstr[0] "" -msgstr[1] "" - -#: bookwyrm/templates/user/shelf/shelf.html:83 -#, python-format -msgid "(showing %(start)s-%(end)s)" -msgstr "" - -#: bookwyrm/templates/user/shelf/shelf.html:94 -msgid "Edit shelf" -msgstr "Modifier l’étagère" - -#: bookwyrm/templates/user/shelf/shelf.html:113 -#: bookwyrm/templates/user/shelf/shelf.html:137 -msgid "Shelved" -msgstr "Date d’ajout" - -#: bookwyrm/templates/user/shelf/shelf.html:114 -#: bookwyrm/templates/user/shelf/shelf.html:141 -msgid "Started" -msgstr "Commencé" - -#: bookwyrm/templates/user/shelf/shelf.html:115 -#: bookwyrm/templates/user/shelf/shelf.html:144 -msgid "Finished" -msgstr "Terminé" - -#: bookwyrm/templates/user/shelf/shelf.html:170 -msgid "This shelf is empty." -msgstr "Cette étagère est vide" - -#: bookwyrm/templates/user/shelf/shelf.html:176 -msgid "Delete shelf" -msgstr "Supprimer l’étagère" - #: bookwyrm/templates/user/user.html:16 msgid "Edit profile" msgstr "Modifier le profil" @@ -3443,147 +3712,6 @@ msgstr[1] "%(mutuals_display)s abonné(e)s que vous suivez" msgid "No followers you follow" msgstr "compte que vous suivez" -#: bookwyrm/templates/user_admin/delete_user_form.html:5 -#: bookwyrm/templates/user_admin/user_moderation_actions.html:31 -msgid "Permanently delete user" -msgstr "" - -#: bookwyrm/templates/user_admin/delete_user_form.html:12 -#, python-format -msgid "Are you sure you want to delete %(username)s's account? This action cannot be undone. To proceed, please enter your password to confirm deletion." -msgstr "" - -#: bookwyrm/templates/user_admin/delete_user_form.html:17 -#, fuzzy -#| msgid "Confirm password:" -msgid "Your password:" -msgstr "Confirmez le mot de passe :" - -#: bookwyrm/templates/user_admin/user.html:8 -msgid "Back to users" -msgstr "Retour aux comptes" - -#: bookwyrm/templates/user_admin/user_admin.html:7 -#, python-format -msgid "Users: %(instance_name)s" -msgstr "Comptes : %(instance_name)s" - -#: bookwyrm/templates/user_admin/user_admin.html:22 -#: bookwyrm/templates/user_admin/username_filter.html:5 -msgid "Username" -msgstr "Nom du compte" - -#: bookwyrm/templates/user_admin/user_admin.html:26 -msgid "Date Added" -msgstr "Date d’ajout" - -#: bookwyrm/templates/user_admin/user_admin.html:30 -msgid "Last Active" -msgstr "Dernière activité" - -#: bookwyrm/templates/user_admin/user_admin.html:38 -msgid "Remote instance" -msgstr "Instance distante" - -#: bookwyrm/templates/user_admin/user_admin.html:47 -#: bookwyrm/templates/user_admin/user_info.html:24 -msgid "Active" -msgstr "Actif" - -#: bookwyrm/templates/user_admin/user_admin.html:47 -#: bookwyrm/templates/user_admin/user_info.html:28 -msgid "Inactive" -msgstr "Inactif" - -#: bookwyrm/templates/user_admin/user_admin.html:52 -#: bookwyrm/templates/user_admin/user_info.html:140 -msgid "Not set" -msgstr "Non défini" - -#: bookwyrm/templates/user_admin/user_info.html:16 -msgid "View user profile" -msgstr "Voir le profil" - -#: bookwyrm/templates/user_admin/user_info.html:36 -msgid "Local" -msgstr "Local" - -#: bookwyrm/templates/user_admin/user_info.html:38 -#, fuzzy -#| msgid "Remove" -msgid "Remote" -msgstr "Retirer" - -#: bookwyrm/templates/user_admin/user_info.html:47 -msgid "User details" -msgstr "Détails du compte" - -#: bookwyrm/templates/user_admin/user_info.html:52 -#, fuzzy -#| msgid "Email" -msgid "Email:" -msgstr "Email" - -#: bookwyrm/templates/user_admin/user_info.html:64 -#, fuzzy -#| msgid "Directory" -msgid "(View reports)" -msgstr "Répertoire" - -#: bookwyrm/templates/user_admin/user_info.html:72 -#, fuzzy -#| msgid "Blocked by us:" -msgid "Blocked by count:" -msgstr "Bloqués par nous :" - -#: bookwyrm/templates/user_admin/user_info.html:77 -#, fuzzy -#| msgid "last active" -msgid "Last active date:" -msgstr "dernière activité" - -#: bookwyrm/templates/user_admin/user_info.html:82 -#, fuzzy -#| msgid "Manually approve followers:" -msgid "Manually approved followers:" -msgstr "Autoriser les abonnements manuellement :" - -#: bookwyrm/templates/user_admin/user_info.html:87 -#, fuzzy -#| msgid "Discard" -msgid "Discoverable:" -msgstr "Rejeter" - -#: bookwyrm/templates/user_admin/user_info.html:93 -#, fuzzy -#| msgid "Deactivate user" -msgid "Deactivation reason:" -msgstr "Désactiver le compte" - -#: bookwyrm/templates/user_admin/user_info.html:111 -msgid "Instance details" -msgstr "Détails de l’instance" - -#: bookwyrm/templates/user_admin/user_info.html:137 -msgid "View instance" -msgstr "Voir l’instance" - -#: bookwyrm/templates/user_admin/user_moderation_actions.html:5 -msgid "Permanently deleted" -msgstr "" - -#: bookwyrm/templates/user_admin/user_moderation_actions.html:20 -msgid "Suspend user" -msgstr "Suspendre le compte" - -#: bookwyrm/templates/user_admin/user_moderation_actions.html:25 -msgid "Un-suspend user" -msgstr "Rétablir le compte" - -#: bookwyrm/templates/user_admin/user_moderation_actions.html:47 -msgid "Access level:" -msgstr "Niveau d’accès :" - #: bookwyrm/templates/widgets/clearable_file_input_with_warning.html:28 msgid "File exceeds maximum size: 10MB" msgstr "Ce fichier dépasse la taille limite : 10 Mo" @@ -3597,7 +3725,7 @@ msgstr "%(title)s (%(subtitle)s)" msgid "Not a valid csv file" msgstr "Fichier CSV non valide" -#: bookwyrm/views/login.py:70 +#: bookwyrm/views/login.py:68 msgid "Username or password are incorrect" msgstr "" @@ -3606,8 +3734,9 @@ msgid "No user with that email address was found." msgstr "Aucun compte avec cette adresse email n’a été trouvé." #: bookwyrm/views/password.py:41 -#, python-format -msgid "A password reset link sent to %s" +#, fuzzy, python-brace-format +#| msgid "A password reset link sent to %s" +msgid "A password reset link sent to {email}" msgstr "Un lien de réinitialisation a été envoyé à %s." #: bookwyrm/views/rss_feed.py:34 @@ -3615,6 +3744,21 @@ msgstr "Un lien de réinitialisation a été envoyé à %s." msgid "Status updates from {obj.display_name}" msgstr "" +#~ msgid "Update shelf" +#~ msgstr "Mettre l’étagère à jour" + +#~ msgid "%(count)d uses" +#~ msgstr "%(count)d utilisations" + +#~ msgid "This instance is closed" +#~ msgstr "Cette instance est fermée" + +#~ msgid "Contact an administrator to get an invite" +#~ msgstr "Contacter un administrateur pour obtenir une invitation" + +#~ msgid "Spoiler alert:" +#~ msgstr "Alerte Spoiler :" + #~ msgid "Date federated" #~ msgstr "Date de fédération" @@ -3715,11 +3859,6 @@ msgstr "" #~ msgid "IPv4 address" #~ msgstr "Adresse email :" -#, fuzzy -#~| msgid "Email address:" -#~ msgid "IP address" -#~ msgstr "Adresse email :" - #, fuzzy #~| msgid "No active invites" #~ msgid "Positive integer" diff --git a/locale/zh_Hans/LC_MESSAGES/django.mo b/locale/zh_Hans/LC_MESSAGES/django.mo index 8f980f2a..5501c309 100644 Binary files a/locale/zh_Hans/LC_MESSAGES/django.mo and b/locale/zh_Hans/LC_MESSAGES/django.mo differ diff --git a/locale/zh_Hans/LC_MESSAGES/django.po b/locale/zh_Hans/LC_MESSAGES/django.po index 5298074d..28e02904 100644 --- a/locale/zh_Hans/LC_MESSAGES/django.po +++ b/locale/zh_Hans/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.1.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-12 17:16+0000\n" +"POT-Creation-Date: 2021-09-29 18:32+0000\n" "PO-Revision-Date: 2021-03-20 00:56+0000\n" "Last-Translator: Kana \n" "Language-Team: Mouse Reeve \n" @@ -18,59 +18,59 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: bookwyrm/forms.py:242 +#: bookwyrm/forms.py:241 msgid "A user with this email already exists." msgstr "已经存在使用该邮箱的用户。" -#: bookwyrm/forms.py:256 +#: bookwyrm/forms.py:255 msgid "One Day" msgstr "一天" -#: bookwyrm/forms.py:257 +#: bookwyrm/forms.py:256 msgid "One Week" msgstr "一周" -#: bookwyrm/forms.py:258 +#: bookwyrm/forms.py:257 msgid "One Month" msgstr "一个月" -#: bookwyrm/forms.py:259 +#: bookwyrm/forms.py:258 msgid "Does Not Expire" msgstr "永不失效" -#: bookwyrm/forms.py:264 -#, python-format -msgid "%(count)d uses" -msgstr "%(count)d 次使用" +#: bookwyrm/forms.py:262 +#, fuzzy, python-brace-format +#| msgid "Max uses" +msgid "{i} uses" +msgstr "最大使用次数" -#: bookwyrm/forms.py:267 +#: bookwyrm/forms.py:263 msgid "Unlimited" msgstr "不受限" -#: bookwyrm/forms.py:323 +#: bookwyrm/forms.py:325 msgid "List Order" msgstr "列表顺序" -#: bookwyrm/forms.py:324 +#: bookwyrm/forms.py:326 msgid "Book Title" msgstr "书名" -#: bookwyrm/forms.py:325 +#: bookwyrm/forms.py:327 bookwyrm/templates/shelf/shelf.html:134 +#: bookwyrm/templates/shelf/shelf.html:165 #: bookwyrm/templates/snippets/create_status/review.html:33 -#: bookwyrm/templates/user/shelf/shelf.html:117 -#: bookwyrm/templates/user/shelf/shelf.html:148 msgid "Rating" msgstr "评价" -#: bookwyrm/forms.py:327 bookwyrm/templates/lists/list.html:107 +#: bookwyrm/forms.py:329 bookwyrm/templates/lists/list.html:109 msgid "Sort By" msgstr "排序方式" -#: bookwyrm/forms.py:331 +#: bookwyrm/forms.py:333 msgid "Ascending" msgstr "升序" -#: bookwyrm/forms.py:332 +#: bookwyrm/forms.py:334 msgid "Descending" msgstr "降序" @@ -82,44 +82,70 @@ msgstr "" msgid "Could not find a match for book" msgstr "" -#: bookwyrm/models/base_model.py:13 +#: bookwyrm/models/base_model.py:16 #, fuzzy #| msgid "Ascending" msgid "Pending" msgstr "升序" -#: bookwyrm/models/base_model.py:14 +#: bookwyrm/models/base_model.py:17 msgid "Self deletion" msgstr "" -#: bookwyrm/models/base_model.py:15 +#: bookwyrm/models/base_model.py:18 #, fuzzy #| msgid "Moderator Comments" msgid "Moderator suspension" msgstr "监察员评论" -#: bookwyrm/models/base_model.py:16 +#: bookwyrm/models/base_model.py:19 #, fuzzy #| msgid "Mentions" msgid "Moderator deletion" msgstr "提及" -#: bookwyrm/models/base_model.py:17 +#: bookwyrm/models/base_model.py:20 #, fuzzy #| msgid "Un-block" msgid "Domain block" msgstr "取消屏蔽" +#: bookwyrm/models/book.py:232 +#, fuzzy +#| msgid "Add books" +msgid "Audiobook" +msgstr "添加书目" + +#: bookwyrm/models/book.py:233 +#, fuzzy +#| msgid "Book" +msgid "eBook" +msgstr "书目" + +#: bookwyrm/models/book.py:234 +msgid "Graphic novel" +msgstr "" + +#: bookwyrm/models/book.py:235 +#, fuzzy +#| msgid "Add cover" +msgid "Hardcover" +msgstr "添加封面" + +#: bookwyrm/models/book.py:236 +msgid "Paperback" +msgstr "" + #: bookwyrm/models/federated_server.py:11 -#: bookwyrm/templates/settings/edit_server.html:40 -#: bookwyrm/templates/settings/federation.html:19 +#: bookwyrm/templates/settings/federation/edit_instance.html:42 +#: bookwyrm/templates/settings/federation/instance_list.html:19 msgid "Federated" msgstr "跨站" #: bookwyrm/models/federated_server.py:12 -#: bookwyrm/templates/settings/edit_server.html:41 -#: bookwyrm/templates/settings/federated_server.html:10 -#: bookwyrm/templates/settings/federation.html:23 +#: bookwyrm/templates/settings/federation/edit_instance.html:43 +#: bookwyrm/templates/settings/federation/instance.html:10 +#: bookwyrm/templates/settings/federation/instance_list.html:23 msgid "Blocked" msgstr "已屏蔽" @@ -133,7 +159,7 @@ msgstr "%(value)s 不是有效的 remote_id" msgid "%(value)s is not a valid username" msgstr "%(value)s 不是有效的用户名" -#: bookwyrm/models/fields.py:181 bookwyrm/templates/layout.html:164 +#: bookwyrm/models/fields.py:181 bookwyrm/templates/layout.html:171 msgid "username" msgstr "用户名" @@ -141,45 +167,45 @@ msgstr "用户名" msgid "A user with that username already exists." msgstr "已经存在使用该用户名的用户。" -#: bookwyrm/settings.py:115 +#: bookwyrm/settings.py:116 msgid "Home Timeline" msgstr "主页时间线" -#: bookwyrm/settings.py:115 +#: bookwyrm/settings.py:116 msgid "Home" msgstr "主页" -#: bookwyrm/settings.py:116 +#: bookwyrm/settings.py:117 msgid "Books Timeline" msgstr "书目时间线" -#: bookwyrm/settings.py:116 bookwyrm/templates/search/layout.html:21 +#: bookwyrm/settings.py:117 bookwyrm/templates/search/layout.html:21 #: bookwyrm/templates/search/layout.html:42 #: bookwyrm/templates/user/layout.html:81 msgid "Books" msgstr "书目" -#: bookwyrm/settings.py:162 +#: bookwyrm/settings.py:163 msgid "English" msgstr "English(英语)" -#: bookwyrm/settings.py:163 +#: bookwyrm/settings.py:164 msgid "German" msgstr "Deutsch(德语)" -#: bookwyrm/settings.py:164 +#: bookwyrm/settings.py:165 msgid "Spanish" msgstr "Español(西班牙语)" -#: bookwyrm/settings.py:165 +#: bookwyrm/settings.py:166 msgid "French" msgstr "Français(法语)" -#: bookwyrm/settings.py:166 +#: bookwyrm/settings.py:167 msgid "Simplified Chinese" msgstr "简体中文" -#: bookwyrm/settings.py:167 +#: bookwyrm/settings.py:168 msgid "Traditional Chinese" msgstr "繁體中文(繁体中文)" @@ -273,9 +299,7 @@ msgid "Metadata" msgstr "元数据" #: bookwyrm/templates/author/edit_author.html:33 -#: bookwyrm/templates/lists/form.html:8 -#: bookwyrm/templates/user/shelf/create_shelf_form.html:13 -#: bookwyrm/templates/user/shelf/edit_shelf_form.html:14 +#: bookwyrm/templates/lists/form.html:8 bookwyrm/templates/shelf/form.html:9 msgid "Name:" msgstr "名称:" @@ -311,7 +335,7 @@ msgid "Openlibrary key:" msgstr "Openlibrary key:" #: bookwyrm/templates/author/edit_author.html:89 -#: bookwyrm/templates/book/edit_book.html:300 +#: bookwyrm/templates/book/edit_book.html:313 msgid "Inventaire ID:" msgstr "Inventaire ID:" @@ -325,32 +349,30 @@ msgstr "Goodreads key:" #: bookwyrm/templates/author/edit_author.html:116 #: bookwyrm/templates/book/book.html:140 -#: bookwyrm/templates/book/edit_book.html:328 +#: bookwyrm/templates/book/edit_book.html:341 #: bookwyrm/templates/book/readthrough.html:76 #: bookwyrm/templates/lists/bookmark_button.html:15 #: bookwyrm/templates/lists/form.html:44 -#: bookwyrm/templates/preferences/edit_user.html:80 -#: bookwyrm/templates/settings/announcement_form.html:69 -#: bookwyrm/templates/settings/edit_server.html:68 -#: bookwyrm/templates/settings/federated_server.html:98 -#: bookwyrm/templates/settings/site.html:113 -#: bookwyrm/templates/snippets/reading_modals/layout.html:16 -#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:42 -#: bookwyrm/templates/user_admin/user_moderation_actions.html:64 +#: bookwyrm/templates/preferences/edit_user.html:118 +#: bookwyrm/templates/settings/announcements/announcement_form.html:69 +#: bookwyrm/templates/settings/federation/edit_instance.html:74 +#: bookwyrm/templates/settings/federation/instance.html:87 +#: bookwyrm/templates/settings/site.html:134 +#: bookwyrm/templates/settings/users/user_moderation_actions.html:64 +#: bookwyrm/templates/shelf/form.html:25 +#: bookwyrm/templates/snippets/reading_modals/layout.html:18 msgid "Save" msgstr "保存" #: bookwyrm/templates/author/edit_author.html:117 #: bookwyrm/templates/book/book.html:141 bookwyrm/templates/book/book.html:190 #: bookwyrm/templates/book/cover_modal.html:32 -#: bookwyrm/templates/book/edit_book.html:329 +#: bookwyrm/templates/book/edit_book.html:342 #: bookwyrm/templates/book/readthrough.html:77 #: bookwyrm/templates/lists/delete_list_modal.html:17 -#: bookwyrm/templates/moderation/report_modal.html:34 -#: bookwyrm/templates/settings/federated_server.html:99 +#: bookwyrm/templates/settings/federation/instance.html:88 #: bookwyrm/templates/snippets/delete_readthrough_modal.html:17 -#: bookwyrm/templates/snippets/goal_form.html:32 -#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:43 +#: bookwyrm/templates/snippets/report_modal.html:34 msgid "Cancel" msgstr "取消" @@ -386,7 +408,7 @@ msgstr "添加描述" #: bookwyrm/templates/book/book.html:136 #: bookwyrm/templates/book/edit_book.html:143 -#: bookwyrm/templates/lists/form.html:12 +#: bookwyrm/templates/lists/form.html:12 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "描述:" @@ -445,7 +467,7 @@ msgstr "主题" msgid "Places" msgstr "地点" -#: bookwyrm/templates/book/book.html:292 bookwyrm/templates/layout.html:68 +#: bookwyrm/templates/book/book.html:292 bookwyrm/templates/layout.html:75 #: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12 #: bookwyrm/templates/search/layout.html:25 #: bookwyrm/templates/search/layout.html:50 @@ -459,8 +481,9 @@ msgstr "添加到列表" #: bookwyrm/templates/book/book.html:313 #: bookwyrm/templates/book/cover_modal.html:31 -#: bookwyrm/templates/lists/list.html:179 -#: bookwyrm/templates/settings/domain_form.html:26 +#: bookwyrm/templates/lists/list.html:181 +#: bookwyrm/templates/settings/email_blocklist/domain_form.html:26 +#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:32 msgid "Add" msgstr "添加" @@ -469,12 +492,12 @@ msgid "ISBN:" msgstr "ISBN:" #: bookwyrm/templates/book/book_identifiers.html:14 -#: bookwyrm/templates/book/edit_book.html:308 +#: bookwyrm/templates/book/edit_book.html:321 msgid "OCLC Number:" msgstr "OCLC 号:" #: bookwyrm/templates/book/book_identifiers.html:21 -#: bookwyrm/templates/book/edit_book.html:316 +#: bookwyrm/templates/book/edit_book.html:329 msgid "ASIN:" msgstr "ASIN:" @@ -484,7 +507,7 @@ msgid "Upload cover:" msgstr "上传封面:" #: bookwyrm/templates/book/cover_modal.html:23 -#: bookwyrm/templates/book/edit_book.html:242 +#: bookwyrm/templates/book/edit_book.html:241 msgid "Load cover from url:" msgstr "从网址加载封面:" @@ -596,11 +619,11 @@ msgid "John Doe, Jane Smith" msgstr "张三, 李四" #: bookwyrm/templates/book/edit_book.html:227 -#: bookwyrm/templates/user/shelf/shelf.html:110 +#: bookwyrm/templates/shelf/shelf.html:127 msgid "Cover" msgstr "封面" -#: bookwyrm/templates/book/edit_book.html:255 +#: bookwyrm/templates/book/edit_book.html:253 msgid "Physical Properties" msgstr "实体性质" @@ -609,23 +632,29 @@ msgstr "实体性质" msgid "Format:" msgstr "格式:" -#: bookwyrm/templates/book/edit_book.html:265 +#: bookwyrm/templates/book/edit_book.html:268 +#, fuzzy +#| msgid "User details" +msgid "Format details:" +msgstr "用户详情" + +#: bookwyrm/templates/book/edit_book.html:278 msgid "Pages:" msgstr "页数:" -#: bookwyrm/templates/book/edit_book.html:274 +#: bookwyrm/templates/book/edit_book.html:287 msgid "Book Identifiers" msgstr "书目标识号" -#: bookwyrm/templates/book/edit_book.html:276 +#: bookwyrm/templates/book/edit_book.html:289 msgid "ISBN 13:" msgstr "ISBN 13:" -#: bookwyrm/templates/book/edit_book.html:284 +#: bookwyrm/templates/book/edit_book.html:297 msgid "ISBN 10:" msgstr "ISBN 10:" -#: bookwyrm/templates/book/edit_book.html:292 +#: bookwyrm/templates/book/edit_book.html:305 msgid "Openlibrary ID:" msgstr "Openlibrary ID:" @@ -758,14 +787,14 @@ msgid "Sorry! We couldn't find that code." msgstr "抱歉!我们无法找到该代码。" #: bookwyrm/templates/confirm_email/confirm_email.html:19 -#: bookwyrm/templates/user_admin/user_info.html:100 +#: bookwyrm/templates/settings/users/user_info.html:85 msgid "Confirmation code:" msgstr "确认代码:" #: bookwyrm/templates/confirm_email/confirm_email.html:25 -#: bookwyrm/templates/landing/landing_layout.html:70 -#: bookwyrm/templates/moderation/report_modal.html:33 -#: bookwyrm/templates/settings/dashboard.html:93 +#: bookwyrm/templates/landing/layout.html:73 +#: bookwyrm/templates/settings/dashboard/dashboard.html:93 +#: bookwyrm/templates/snippets/report_modal.html:33 msgid "Submit" msgstr "提交" @@ -778,9 +807,9 @@ msgid "Resend confirmation link" msgstr "重新发送确认链接" #: bookwyrm/templates/confirm_email/resend_form.html:11 -#: bookwyrm/templates/landing/landing_layout.html:64 +#: bookwyrm/templates/landing/layout.html:67 #: bookwyrm/templates/password_reset_request.html:18 -#: bookwyrm/templates/preferences/edit_user.html:38 +#: bookwyrm/templates/preferences/edit_user.html:56 #: bookwyrm/templates/snippets/register_form.html:13 msgid "Email address:" msgstr "邮箱地址:" @@ -803,7 +832,7 @@ msgstr "跨站社区" #: bookwyrm/templates/directory/directory.html:4 #: bookwyrm/templates/directory/directory.html:9 -#: bookwyrm/templates/layout.html:94 +#: bookwyrm/templates/layout.html:101 msgid "Directory" msgstr "目录" @@ -817,8 +846,8 @@ msgid "You can opt-out at any time in your profile settings msgstr "你可以在任何时候从你的 个人资料设定 中退出。" #: bookwyrm/templates/directory/directory.html:29 +#: bookwyrm/templates/feed/goal_card.html:17 #: bookwyrm/templates/snippets/announcement.html:34 -#: bookwyrm/templates/snippets/goal_card.html:22 msgid "Dismiss message" msgstr "遣散消息" @@ -827,13 +856,13 @@ msgid "Order by" msgstr "排列顺序" #: bookwyrm/templates/directory/sort_filter.html:8 -msgid "Suggested" -msgstr "受推荐" - -#: bookwyrm/templates/directory/sort_filter.html:9 msgid "Recently active" msgstr "最近活跃" +#: bookwyrm/templates/directory/sort_filter.html:9 +msgid "Suggested" +msgstr "受推荐" + #: bookwyrm/templates/directory/user_card.html:17 #: bookwyrm/templates/directory/user_card.html:18 #: bookwyrm/templates/user/user_preview.html:16 @@ -873,7 +902,7 @@ msgstr "所有已知用户" #: bookwyrm/templates/discover/discover.html:4 #: bookwyrm/templates/discover/discover.html:10 -#: bookwyrm/templates/layout.html:71 +#: bookwyrm/templates/layout.html:78 msgid "Discover" msgstr "发现" @@ -999,7 +1028,7 @@ msgid "Direct Messages with %(username)s" msgstr "与 %(username)s 私信" #: bookwyrm/templates/feed/direct_messages.html:10 -#: bookwyrm/templates/layout.html:104 +#: bookwyrm/templates/layout.html:111 msgid "Direct Messages" msgstr "私信" @@ -1020,12 +1049,24 @@ msgstr "加载 0 条未读状态" msgid "There aren't any activities right now! Try following a user to get started" msgstr "现在还没有任何活动!尝试从关注一个用户开始吧" +#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/layout.html:90 +#: bookwyrm/templates/user/goal_form.html:6 +#, python-format +msgid "%(year)s Reading Goal" +msgstr "%(year)s 阅读目标" + +#: bookwyrm/templates/feed/goal_card.html:18 +#, python-format +msgid "You can set or change your reading goal any time from your profile page" +msgstr "你可以在任何时候从你的个人资料页面 中设置或改变你的阅读目标" + #: bookwyrm/templates/feed/layout.html:5 msgid "Updates" msgstr "更新" #: bookwyrm/templates/feed/layout.html:12 -#: bookwyrm/templates/user/shelf/books_header.html:3 +#: bookwyrm/templates/user/books_header.html:3 msgid "Your books" msgstr "你的书目" @@ -1034,28 +1075,22 @@ msgid "There are no books here right now! Try searching for a book to get starte msgstr "现在这里还没有任何书目!尝试着从搜索某本书开始吧" #: bookwyrm/templates/feed/layout.html:25 -#: bookwyrm/templates/user/shelf/shelf.html:38 +#: bookwyrm/templates/shelf/shelf.html:38 msgid "To Read" msgstr "想读" #: bookwyrm/templates/feed/layout.html:26 -#: bookwyrm/templates/user/shelf/shelf.html:40 +#: bookwyrm/templates/shelf/shelf.html:40 msgid "Currently Reading" msgstr "在读" #: bookwyrm/templates/feed/layout.html:27 +#: bookwyrm/templates/shelf/shelf.html:42 #: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:23 #: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12 -#: bookwyrm/templates/user/shelf/shelf.html:42 msgid "Read" msgstr "读过" -#: bookwyrm/templates/feed/layout.html:90 bookwyrm/templates/goal.html:26 -#: bookwyrm/templates/snippets/goal_card.html:6 -#, python-format -msgid "%(year)s Reading Goal" -msgstr "%(year)s 阅读目标" - #: bookwyrm/templates/feed/suggested_users.html:5 #: bookwyrm/templates/get_started/users.html:6 msgid "Who to follow" @@ -1083,7 +1118,7 @@ msgid "What are you reading?" msgstr "你在阅读什么?" #: bookwyrm/templates/get_started/books.html:9 -#: bookwyrm/templates/lists/list.html:135 +#: bookwyrm/templates/layout.html:45 bookwyrm/templates/lists/list.html:137 msgid "Search for a book" msgstr "搜索书目" @@ -1101,8 +1136,8 @@ msgstr "你可以在开始使用 %(site_name)s 后添加书目。" #: bookwyrm/templates/get_started/books.html:17 #: bookwyrm/templates/get_started/users.html:18 #: bookwyrm/templates/get_started/users.html:19 -#: bookwyrm/templates/layout.html:44 bookwyrm/templates/layout.html:45 -#: bookwyrm/templates/lists/list.html:139 +#: bookwyrm/templates/layout.html:51 bookwyrm/templates/layout.html:52 +#: bookwyrm/templates/lists/list.html:141 #: bookwyrm/templates/search/layout.html:4 #: bookwyrm/templates/search/layout.html:9 msgid "Search" @@ -1118,7 +1153,7 @@ msgid "Popular on %(site_name)s" msgstr "%(site_name)s 上的热门" #: bookwyrm/templates/get_started/books.html:58 -#: bookwyrm/templates/lists/list.html:152 +#: bookwyrm/templates/lists/list.html:154 msgid "No books found" msgstr "没有找到书目" @@ -1128,7 +1163,7 @@ msgid "Save & continue" msgstr "保存 & 继续" #: bookwyrm/templates/get_started/layout.html:5 -#: bookwyrm/templates/landing/landing_layout.html:5 +#: bookwyrm/templates/landing/layout.html:5 msgid "Welcome" msgstr "欢迎" @@ -1163,12 +1198,12 @@ msgid "Finish" msgstr "完成" #: bookwyrm/templates/get_started/profile.html:15 -#: bookwyrm/templates/preferences/edit_user.html:24 +#: bookwyrm/templates/preferences/edit_user.html:42 msgid "Display name:" msgstr "显示名称:" #: bookwyrm/templates/get_started/profile.html:22 -#: bookwyrm/templates/preferences/edit_user.html:31 +#: bookwyrm/templates/preferences/edit_user.html:49 msgid "Summary:" msgstr "概要:" @@ -1177,17 +1212,17 @@ msgid "A little bit about you" msgstr "少许关于你的信息" #: bookwyrm/templates/get_started/profile.html:32 -#: bookwyrm/templates/preferences/edit_user.html:17 +#: bookwyrm/templates/preferences/edit_user.html:27 msgid "Avatar:" msgstr "头像:" #: bookwyrm/templates/get_started/profile.html:42 -#: bookwyrm/templates/preferences/edit_user.html:62 +#: bookwyrm/templates/preferences/edit_user.html:104 msgid "Manually approve followers:" msgstr "手动批准关注者:" #: bookwyrm/templates/get_started/profile.html:48 -#: bookwyrm/templates/preferences/edit_user.html:54 +#: bookwyrm/templates/preferences/edit_user.html:80 msgid "Show this account in suggested users:" msgstr "在推荐的用户中显示此帐号:" @@ -1204,39 +1239,9 @@ msgstr "搜索用户" msgid "No users found for \"%(query)s\"" msgstr "没有找到 \"%(query)s\" 的用户" -#: bookwyrm/templates/goal.html:7 -#, python-format -msgid "%(year)s Reading Progress" -msgstr "%(year)s 阅读进度" - -#: bookwyrm/templates/goal.html:11 -msgid "Edit Goal" -msgstr "编辑目标" - -#: bookwyrm/templates/goal.html:30 -#: bookwyrm/templates/snippets/goal_card.html:13 -#, python-format -msgid "Set a goal for how many books you'll finish reading in %(year)s, and track your progress throughout the year." -msgstr "设定一个 %(year)s 内要读多少书的目标,并记录你全年的进度。" - -#: bookwyrm/templates/goal.html:39 -#, python-format -msgid "%(name)s hasn't set a reading goal for %(year)s." -msgstr "%(name)s 还没有设定 %(year)s 的阅读目标。" - -#: bookwyrm/templates/goal.html:51 -#, python-format -msgid "Your %(year)s Books" -msgstr "你 %(year)s 的书目" - -#: bookwyrm/templates/goal.html:53 -#, python-format -msgid "%(username)s's %(year)s Books" -msgstr "%(username)s 在 %(year)s 的书目" - #: bookwyrm/templates/import/import.html:5 #: bookwyrm/templates/import/import.html:9 -#: bookwyrm/templates/user/shelf/shelf.html:57 +#: bookwyrm/templates/shelf/shelf.html:57 msgid "Import Books" msgstr "导入书目" @@ -1257,7 +1262,7 @@ msgid "Privacy setting for imported reviews:" msgstr "导入书评的隐私设定" #: bookwyrm/templates/import/import.html:56 -#: bookwyrm/templates/settings/server_blocklist.html:64 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:64 msgid "Import" msgstr "导入" @@ -1333,14 +1338,14 @@ msgid "Book" msgstr "书目" #: bookwyrm/templates/import/import_status.html:122 -#: bookwyrm/templates/user/shelf/shelf.html:111 -#: bookwyrm/templates/user/shelf/shelf.html:131 +#: bookwyrm/templates/shelf/shelf.html:128 +#: bookwyrm/templates/shelf/shelf.html:148 msgid "Title" msgstr "标题" #: bookwyrm/templates/import/import_status.html:125 -#: bookwyrm/templates/user/shelf/shelf.html:112 -#: bookwyrm/templates/user/shelf/shelf.html:134 +#: bookwyrm/templates/shelf/shelf.html:129 +#: bookwyrm/templates/shelf/shelf.html:151 msgid "Author" msgstr "作者" @@ -1352,8 +1357,8 @@ msgstr "已导入" msgid "You can download your GoodReads data from the Import/Export page of your GoodReads account." msgstr "" -#: bookwyrm/templates/invite.html:4 bookwyrm/templates/invite.html:12 -#: bookwyrm/templates/login.html:51 +#: bookwyrm/templates/invite.html:4 bookwyrm/templates/invite.html:8 +#: bookwyrm/templates/login.html:49 msgid "Create an Account" msgstr "创建帐号" @@ -1384,135 +1389,144 @@ msgstr "隐私政策" msgid "Recent Books" msgstr "最近书目" -#: bookwyrm/templates/landing/landing_layout.html:17 +#: bookwyrm/templates/landing/layout.html:17 msgid "Decentralized" msgstr "去中心化" -#: bookwyrm/templates/landing/landing_layout.html:23 +#: bookwyrm/templates/landing/layout.html:23 msgid "Friendly" msgstr "友好" -#: bookwyrm/templates/landing/landing_layout.html:29 +#: bookwyrm/templates/landing/layout.html:29 msgid "Anti-Corporate" msgstr "反企业" -#: bookwyrm/templates/landing/landing_layout.html:44 +#: bookwyrm/templates/landing/layout.html:45 #, python-format msgid "Join %(name)s" msgstr "加入 %(name)s" -#: bookwyrm/templates/landing/landing_layout.html:51 -#: bookwyrm/templates/login.html:56 -msgid "This instance is closed" -msgstr "本实例不开放。" - -#: bookwyrm/templates/landing/landing_layout.html:57 -msgid "Thank you! Your request has been received." -msgstr "谢谢你!我们已经收到了你的请求。" - -#: bookwyrm/templates/landing/landing_layout.html:60 +#: bookwyrm/templates/landing/layout.html:47 msgid "Request an Invitation" msgstr "请求邀请" -#: bookwyrm/templates/landing/landing_layout.html:79 +#: bookwyrm/templates/landing/layout.html:49 +#, fuzzy, python-format +#| msgid "(Recommended if registration is open)" +msgid "%(name)s registration is closed" +msgstr "(当开放注册时推荐)" + +#: bookwyrm/templates/landing/layout.html:60 +msgid "Thank you! Your request has been received." +msgstr "谢谢你!我们已经收到了你的请求。" + +#: bookwyrm/templates/landing/layout.html:82 msgid "Your Account" msgstr "你的帐号" -#: bookwyrm/templates/layout.html:40 -msgid "Search for a book or user" +#: bookwyrm/templates/layout.html:13 +#, fuzzy, python-format +#| msgid "About %(site_name)s" +msgid "%(site_name)s search" +msgstr "关于 %(site_name)s" + +#: bookwyrm/templates/layout.html:43 +#, fuzzy +#| msgid "Search for a book or user" +msgid "Search for a book, user, or list" msgstr "搜索书目或用户" -#: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/layout.html:61 bookwyrm/templates/layout.html:62 msgid "Main navigation menu" msgstr "主导航菜单" -#: bookwyrm/templates/layout.html:65 +#: bookwyrm/templates/layout.html:72 msgid "Feed" msgstr "动态" -#: bookwyrm/templates/layout.html:99 +#: bookwyrm/templates/layout.html:106 msgid "Your Books" msgstr "你的书目" -#: bookwyrm/templates/layout.html:109 +#: bookwyrm/templates/layout.html:116 msgid "Settings" msgstr "设置" -#: bookwyrm/templates/layout.html:118 +#: bookwyrm/templates/layout.html:125 +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:15 +#: bookwyrm/templates/settings/invites/manage_invites.html:3 +#: bookwyrm/templates/settings/invites/manage_invites.html:15 #: bookwyrm/templates/settings/layout.html:40 -#: bookwyrm/templates/settings/manage_invite_requests.html:15 -#: bookwyrm/templates/settings/manage_invites.html:3 -#: bookwyrm/templates/settings/manage_invites.html:15 msgid "Invites" msgstr "邀请" -#: bookwyrm/templates/layout.html:125 +#: bookwyrm/templates/layout.html:132 msgid "Admin" msgstr "管理员" -#: bookwyrm/templates/layout.html:132 +#: bookwyrm/templates/layout.html:139 msgid "Log out" msgstr "登出" -#: bookwyrm/templates/layout.html:140 bookwyrm/templates/layout.html:141 +#: bookwyrm/templates/layout.html:147 bookwyrm/templates/layout.html:148 #: bookwyrm/templates/notifications.html:6 #: bookwyrm/templates/notifications.html:11 msgid "Notifications" msgstr "通知" -#: bookwyrm/templates/layout.html:163 bookwyrm/templates/layout.html:167 -#: bookwyrm/templates/login.html:22 +#: bookwyrm/templates/layout.html:170 bookwyrm/templates/layout.html:174 +#: bookwyrm/templates/login.html:21 #: bookwyrm/templates/snippets/register_form.html:4 msgid "Username:" msgstr "用户名:" -#: bookwyrm/templates/layout.html:168 +#: bookwyrm/templates/layout.html:175 msgid "password" msgstr "密码" -#: bookwyrm/templates/layout.html:169 bookwyrm/templates/login.html:41 +#: bookwyrm/templates/layout.html:176 bookwyrm/templates/login.html:40 msgid "Forgot your password?" msgstr "忘记了密码?" -#: bookwyrm/templates/layout.html:172 bookwyrm/templates/login.html:10 -#: bookwyrm/templates/login.html:38 +#: bookwyrm/templates/layout.html:179 bookwyrm/templates/login.html:7 +#: bookwyrm/templates/login.html:37 msgid "Log in" msgstr "登录" -#: bookwyrm/templates/layout.html:180 +#: bookwyrm/templates/layout.html:187 msgid "Join" msgstr "加入" -#: bookwyrm/templates/layout.html:214 +#: bookwyrm/templates/layout.html:221 #, fuzzy #| msgid "Successfully imported" msgid "Successfully posted status" msgstr "成功导入了" -#: bookwyrm/templates/layout.html:215 +#: bookwyrm/templates/layout.html:222 #, fuzzy #| msgid "Boost status" msgid "Error posting status" msgstr "转发状态" -#: bookwyrm/templates/layout.html:223 +#: bookwyrm/templates/layout.html:230 msgid "About this instance" msgstr "关于本实例" -#: bookwyrm/templates/layout.html:227 +#: bookwyrm/templates/layout.html:234 msgid "Contact site admin" msgstr "联系站点管理员" -#: bookwyrm/templates/layout.html:231 +#: bookwyrm/templates/layout.html:238 msgid "Documentation" msgstr "文档" -#: bookwyrm/templates/layout.html:238 +#: bookwyrm/templates/layout.html:245 #, python-format msgid "Support %(site_name)s on %(support_title)s" msgstr "在 %(support_title)s 上支持 %(site_name)s" -#: bookwyrm/templates/layout.html:242 +#: bookwyrm/templates/layout.html:249 msgid "BookWyrm's source code is freely available. You can contribute or report issues on GitHub." msgstr "BookWyrm 是开源软件。你可以在 GitHub 贡献或报告问题。" @@ -1570,8 +1584,9 @@ msgid "This action cannot be un-done" msgstr "" #: bookwyrm/templates/lists/delete_list_modal.html:15 -#: bookwyrm/templates/settings/announcement.html:20 -#: bookwyrm/templates/settings/email_blocklist.html:49 +#: bookwyrm/templates/settings/announcements/announcement.html:20 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49 +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:36 #: bookwyrm/templates/snippets/delete_readthrough_modal.html:15 #: bookwyrm/templates/snippets/follow_request_buttons.html:12 msgid "Delete" @@ -1602,9 +1617,8 @@ msgstr "策展" msgid "Anyone can suggest books, subject to your approval" msgstr "任何人都可以推荐书目、主题让你批准" -#: bookwyrm/templates/lists/form.html:31 -#: bookwyrm/templates/moderation/reports.html:25 -#: bookwyrm/templates/search/book.html:30 +#: bookwyrm/templates/lists/form.html:31 bookwyrm/templates/search/book.html:30 +#: bookwyrm/templates/settings/reports/reports.html:25 #: bookwyrm/templates/snippets/announcement.html:16 msgid "Open" msgstr "开放" @@ -1613,7 +1627,7 @@ msgstr "开放" msgid "Anyone can add books to this list" msgstr "任何人都可以向此列表中添加书目" -#: bookwyrm/templates/lists/form.html:49 +#: bookwyrm/templates/lists/form.html:50 #, fuzzy #| msgid "Delete status" msgid "Delete list" @@ -1636,7 +1650,7 @@ msgstr "此列表当前是空的" msgid "Added by %(username)s" msgstr "由 %(username)s 添加" -#: bookwyrm/templates/lists/list.html:74 +#: bookwyrm/templates/lists/list.html:75 msgid "List position" msgstr "列表位置:" @@ -1644,42 +1658,42 @@ msgstr "列表位置:" msgid "Set" msgstr "设定" -#: bookwyrm/templates/lists/list.html:89 +#: bookwyrm/templates/lists/list.html:91 #: bookwyrm/templates/snippets/shelf_selector.html:26 msgid "Remove" msgstr "移除" -#: bookwyrm/templates/lists/list.html:103 -#: bookwyrm/templates/lists/list.html:120 +#: bookwyrm/templates/lists/list.html:105 +#: bookwyrm/templates/lists/list.html:122 msgid "Sort List" msgstr "排序列表" -#: bookwyrm/templates/lists/list.html:113 +#: bookwyrm/templates/lists/list.html:115 msgid "Direction" msgstr "方向" -#: bookwyrm/templates/lists/list.html:127 +#: bookwyrm/templates/lists/list.html:129 msgid "Add Books" msgstr "添加书目" -#: bookwyrm/templates/lists/list.html:129 +#: bookwyrm/templates/lists/list.html:131 msgid "Suggest Books" msgstr "推荐书目" -#: bookwyrm/templates/lists/list.html:140 +#: bookwyrm/templates/lists/list.html:142 msgid "search" msgstr "搜索" -#: bookwyrm/templates/lists/list.html:146 +#: bookwyrm/templates/lists/list.html:148 msgid "Clear search" msgstr "清除搜索" -#: bookwyrm/templates/lists/list.html:151 +#: bookwyrm/templates/lists/list.html:153 #, python-format msgid "No books found matching the query \"%(query)s\"" msgstr "没有符合 “%(query)s” 请求的书目" -#: bookwyrm/templates/lists/list.html:179 +#: bookwyrm/templates/lists/list.html:181 msgid "Suggest" msgstr "推荐" @@ -1709,110 +1723,19 @@ msgstr "创建列表" msgid "Login" msgstr "登录" -#: bookwyrm/templates/login.html:16 +#: bookwyrm/templates/login.html:15 msgid "Success! Email address confirmed." msgstr "成功!邮箱地址已确认。" -#: bookwyrm/templates/login.html:28 bookwyrm/templates/password_reset.html:17 +#: bookwyrm/templates/login.html:27 bookwyrm/templates/password_reset.html:17 #: bookwyrm/templates/snippets/register_form.html:22 msgid "Password:" msgstr "密码:" -#: bookwyrm/templates/login.html:57 -msgid "Contact an administrator to get an invite" -msgstr "联系管理员以取得邀请" - -#: bookwyrm/templates/login.html:68 +#: bookwyrm/templates/login.html:62 msgid "More about this site" msgstr "更多关于本站点的信息" -#: bookwyrm/templates/moderation/report.html:5 -#: bookwyrm/templates/moderation/report.html:6 -#: bookwyrm/templates/moderation/report_preview.html:6 -#, python-format -msgid "Report #%(report_id)s: %(username)s" -msgstr "报告 #%(report_id)s: %(username)s" - -#: bookwyrm/templates/moderation/report.html:10 -msgid "Back to reports" -msgstr "回到报告" - -#: bookwyrm/templates/moderation/report.html:22 -msgid "Moderator Comments" -msgstr "监察员评论" - -#: bookwyrm/templates/moderation/report.html:40 -#: bookwyrm/templates/snippets/create_status.html:28 -msgid "Comment" -msgstr "评论" - -#: bookwyrm/templates/moderation/report.html:45 -msgid "Reported statuses" -msgstr "被报告的状态" - -#: bookwyrm/templates/moderation/report.html:47 -msgid "No statuses reported" -msgstr "没有被报告的状态" - -#: bookwyrm/templates/moderation/report.html:53 -msgid "Status has been deleted" -msgstr "状态已被删除" - -#: bookwyrm/templates/moderation/report_modal.html:6 -#, python-format -msgid "Report @%(username)s" -msgstr "报告 %(username)s" - -#: bookwyrm/templates/moderation/report_modal.html:23 -#, python-format -msgid "This report will be sent to %(site_name)s's moderators for review." -msgstr "本报告会被发送至 %(site_name)s 的监察员以复查。" - -#: bookwyrm/templates/moderation/report_modal.html:24 -msgid "More info about this report:" -msgstr "关于本报告的更多信息" - -#: bookwyrm/templates/moderation/report_preview.html:13 -msgid "No notes provided" -msgstr "没有提供摘记" - -#: bookwyrm/templates/moderation/report_preview.html:20 -#, python-format -msgid "Reported by %(username)s" -msgstr "由 %(username)s 报告" - -#: bookwyrm/templates/moderation/report_preview.html:30 -msgid "Re-open" -msgstr "重新开启" - -#: bookwyrm/templates/moderation/report_preview.html:32 -msgid "Resolve" -msgstr "已解决" - -#: bookwyrm/templates/moderation/reports.html:6 -#, python-format -msgid "Reports: %(instance_name)s" -msgstr "报告: %(instance_name)s" - -#: bookwyrm/templates/moderation/reports.html:8 -#: bookwyrm/templates/moderation/reports.html:17 -#: bookwyrm/templates/settings/layout.html:55 -msgid "Reports" -msgstr "报告" - -#: bookwyrm/templates/moderation/reports.html:14 -#, python-format -msgid "Reports: %(instance_name)s" -msgstr "报告: %(instance_name)s" - -#: bookwyrm/templates/moderation/reports.html:28 -msgid "Resolved" -msgstr "已解决" - -#: bookwyrm/templates/moderation/reports.html:37 -msgid "No reports found." -msgstr "没有找到报告" - #: bookwyrm/templates/notifications.html:16 msgid "Delete notifications" msgstr "删除通知" @@ -1954,7 +1877,7 @@ msgstr "重设密码" #: bookwyrm/templates/preferences/blocks.html:4 #: bookwyrm/templates/preferences/blocks.html:7 -#: bookwyrm/templates/preferences/layout.html:30 +#: bookwyrm/templates/preferences/layout.html:31 msgid "Blocked Users" msgstr "屏蔽的用户" @@ -1965,7 +1888,7 @@ msgstr "当前没有被屏蔽的用户。" #: bookwyrm/templates/preferences/change_password.html:4 #: bookwyrm/templates/preferences/change_password.html:7 #: bookwyrm/templates/preferences/change_password.html:21 -#: bookwyrm/templates/preferences/layout.html:19 +#: bookwyrm/templates/preferences/layout.html:20 msgid "Change Password" msgstr "更改密码" @@ -1976,8 +1899,8 @@ msgstr "新密码:" #: bookwyrm/templates/preferences/delete_user.html:4 #: bookwyrm/templates/preferences/delete_user.html:7 #: bookwyrm/templates/preferences/delete_user.html:26 -#: bookwyrm/templates/preferences/layout.html:23 -#: bookwyrm/templates/user_admin/delete_user_form.html:23 +#: bookwyrm/templates/preferences/layout.html:24 +#: bookwyrm/templates/settings/users/delete_user_form.html:23 msgid "Delete Account" msgstr "删除帐号" @@ -1991,44 +1914,60 @@ msgstr "删除帐号的操作将无法被撤销。对应用户名也无法被再 #: bookwyrm/templates/preferences/edit_user.html:4 #: bookwyrm/templates/preferences/edit_user.html:7 +#: bookwyrm/templates/preferences/layout.html:15 msgid "Edit Profile" msgstr "编辑个人资料" -#: bookwyrm/templates/preferences/edit_user.html:46 +#: bookwyrm/templates/preferences/edit_user.html:12 +#: bookwyrm/templates/preferences/edit_user.html:25 +#: bookwyrm/templates/settings/users/user_info.html:7 +msgid "Profile" +msgstr "个人资料" + +#: bookwyrm/templates/preferences/edit_user.html:13 +#: bookwyrm/templates/preferences/edit_user.html:68 +#, fuzzy +#| msgid "Email preference" +msgid "Display preferences" +msgstr "邮箱偏好" + +#: bookwyrm/templates/preferences/edit_user.html:14 +#: bookwyrm/templates/preferences/edit_user.html:100 +#, fuzzy +#| msgid "Post privacy" +msgid "Privacy" +msgstr "发文隐私" + +#: bookwyrm/templates/preferences/edit_user.html:72 #, fuzzy #| msgid "Show set reading goal prompt in feed:" msgid "Show reading goal prompt in feed:" msgstr "在消息流中显示设置阅读目标的提示:" -#: bookwyrm/templates/preferences/edit_user.html:50 +#: bookwyrm/templates/preferences/edit_user.html:76 #, fuzzy #| msgid "Show this account in suggested users:" msgid "Show suggested users:" msgstr "在推荐的用户中显示此帐号:" -#: bookwyrm/templates/preferences/edit_user.html:58 +#: bookwyrm/templates/preferences/edit_user.html:85 #, python-format msgid "Your account will show up in the directory, and may be recommended to other BookWyrm users." msgstr "你的帐号会显示在 目录 中,并可能受其它 BookWyrm 用户推荐。" -#: bookwyrm/templates/preferences/edit_user.html:68 -msgid "Default post privacy:" -msgstr "默认发文隐私:" - -#: bookwyrm/templates/preferences/edit_user.html:75 +#: bookwyrm/templates/preferences/edit_user.html:89 msgid "Preferred Timezone: " msgstr "偏好的时区:" +#: bookwyrm/templates/preferences/edit_user.html:110 +msgid "Default post privacy:" +msgstr "默认发文隐私:" + #: bookwyrm/templates/preferences/layout.html:11 msgid "Account" msgstr "帐号" -#: bookwyrm/templates/preferences/layout.html:15 -#: bookwyrm/templates/user_admin/user_info.html:7 -msgid "Profile" -msgstr "个人资料" - -#: bookwyrm/templates/preferences/layout.html:26 +#: bookwyrm/templates/preferences/layout.html:27 msgid "Relationships" msgstr "关系" @@ -2069,11 +2008,11 @@ msgstr "搜索类型" #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:46 -#: bookwyrm/templates/settings/email_blocklist.html:27 -#: bookwyrm/templates/settings/federation.html:44 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:27 +#: bookwyrm/templates/settings/federation/instance_list.html:44 #: bookwyrm/templates/settings/layout.html:34 -#: bookwyrm/templates/user_admin/user_admin.html:3 -#: bookwyrm/templates/user_admin/user_admin.html:10 +#: bookwyrm/templates/settings/users/user_admin.html:3 +#: bookwyrm/templates/settings/users/user_admin.html:10 msgid "Users" msgstr "用户" @@ -2082,368 +2021,551 @@ msgstr "用户" msgid "No results found for \"%(query)s\"" msgstr "没有找到 “%(query)s” 的搜索结果" -#: bookwyrm/templates/settings/announcement.html:3 -#: bookwyrm/templates/settings/announcement.html:6 +#: bookwyrm/templates/settings/announcements/announcement.html:3 +#: bookwyrm/templates/settings/announcements/announcement.html:6 msgid "Announcement" msgstr "公告" -#: bookwyrm/templates/settings/announcement.html:7 -#: bookwyrm/templates/settings/federated_server.html:13 +#: bookwyrm/templates/settings/announcements/announcement.html:7 +#: bookwyrm/templates/settings/federation/instance.html:13 msgid "Back to list" msgstr "回到列表" -#: bookwyrm/templates/settings/announcement.html:11 -#: bookwyrm/templates/settings/announcement_form.html:6 +#: bookwyrm/templates/settings/announcements/announcement.html:11 +#: bookwyrm/templates/settings/announcements/announcement_form.html:6 msgid "Edit Announcement" msgstr "编辑公告" -#: bookwyrm/templates/settings/announcement.html:35 +#: bookwyrm/templates/settings/announcements/announcement.html:35 msgid "Visible:" msgstr "可见:" -#: bookwyrm/templates/settings/announcement.html:38 +#: bookwyrm/templates/settings/announcements/announcement.html:38 msgid "True" msgstr "是" -#: bookwyrm/templates/settings/announcement.html:40 +#: bookwyrm/templates/settings/announcements/announcement.html:40 msgid "False" msgstr "否" -#: bookwyrm/templates/settings/announcement.html:47 -#: bookwyrm/templates/settings/announcement_form.html:40 -#: bookwyrm/templates/settings/dashboard.html:71 +#: bookwyrm/templates/settings/announcements/announcement.html:47 +#: bookwyrm/templates/settings/announcements/announcement_form.html:40 +#: bookwyrm/templates/settings/dashboard/dashboard.html:71 msgid "Start date:" msgstr "开始日期:" -#: bookwyrm/templates/settings/announcement.html:54 -#: bookwyrm/templates/settings/announcement_form.html:49 -#: bookwyrm/templates/settings/dashboard.html:77 +#: bookwyrm/templates/settings/announcements/announcement.html:54 +#: bookwyrm/templates/settings/announcements/announcement_form.html:49 +#: bookwyrm/templates/settings/dashboard/dashboard.html:77 msgid "End date:" msgstr "结束日期:" -#: bookwyrm/templates/settings/announcement.html:60 -#: bookwyrm/templates/settings/announcement_form.html:58 +#: bookwyrm/templates/settings/announcements/announcement.html:60 +#: bookwyrm/templates/settings/announcements/announcement_form.html:58 msgid "Active:" msgstr "活跃:" -#: bookwyrm/templates/settings/announcement_form.html:8 -#: bookwyrm/templates/settings/announcements.html:8 +#: bookwyrm/templates/settings/announcements/announcement_form.html:8 +#: bookwyrm/templates/settings/announcements/announcements.html:8 msgid "Create Announcement" msgstr "创建公告" -#: bookwyrm/templates/settings/announcement_form.html:16 +#: bookwyrm/templates/settings/announcements/announcement_form.html:16 #, fuzzy #| msgid "Preview" msgid "Preview:" msgstr "预览" -#: bookwyrm/templates/settings/announcement_form.html:23 +#: bookwyrm/templates/settings/announcements/announcement_form.html:23 #, fuzzy #| msgid "Content" msgid "Content:" msgstr "内容" -#: bookwyrm/templates/settings/announcement_form.html:30 +#: bookwyrm/templates/settings/announcements/announcement_form.html:30 #, fuzzy #| msgid "End date:" msgid "Event date:" msgstr "结束日期:" -#: bookwyrm/templates/settings/announcements.html:3 -#: bookwyrm/templates/settings/announcements.html:5 -#: bookwyrm/templates/settings/layout.html:68 +#: bookwyrm/templates/settings/announcements/announcements.html:3 +#: bookwyrm/templates/settings/announcements/announcements.html:5 +#: bookwyrm/templates/settings/layout.html:72 msgid "Announcements" msgstr "公告" -#: bookwyrm/templates/settings/announcements.html:22 -#: bookwyrm/templates/settings/federation.html:36 +#: bookwyrm/templates/settings/announcements/announcements.html:22 +#: bookwyrm/templates/settings/federation/instance_list.html:36 msgid "Date added" msgstr "添加日期:" -#: bookwyrm/templates/settings/announcements.html:26 +#: bookwyrm/templates/settings/announcements/announcements.html:26 msgid "Preview" msgstr "预览" -#: bookwyrm/templates/settings/announcements.html:30 +#: bookwyrm/templates/settings/announcements/announcements.html:30 msgid "Start date" msgstr "开始日期" -#: bookwyrm/templates/settings/announcements.html:34 +#: bookwyrm/templates/settings/announcements/announcements.html:34 msgid "End date" msgstr "结束日期" -#: bookwyrm/templates/settings/announcements.html:38 -#: bookwyrm/templates/settings/federation.html:46 -#: bookwyrm/templates/settings/manage_invite_requests.html:44 -#: bookwyrm/templates/settings/status_filter.html:5 -#: bookwyrm/templates/user_admin/user_admin.html:34 -#: bookwyrm/templates/user_admin/user_info.html:20 +#: bookwyrm/templates/settings/announcements/announcements.html:38 +#: bookwyrm/templates/settings/federation/instance_list.html:46 +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:44 +#: bookwyrm/templates/settings/invites/status_filter.html:5 +#: bookwyrm/templates/settings/users/user_admin.html:34 +#: bookwyrm/templates/settings/users/user_info.html:20 msgid "Status" msgstr "状态" -#: bookwyrm/templates/settings/announcements.html:48 +#: bookwyrm/templates/settings/announcements/announcements.html:48 msgid "active" msgstr "活跃" -#: bookwyrm/templates/settings/announcements.html:48 +#: bookwyrm/templates/settings/announcements/announcements.html:48 msgid "inactive" msgstr "停用" -#: bookwyrm/templates/settings/announcements.html:54 +#: bookwyrm/templates/settings/announcements/announcements.html:52 #, fuzzy #| msgid "Announcements" -msgid "No announcements found." +msgid "No announcements found" msgstr "公告" -#: bookwyrm/templates/settings/dashboard.html:6 -#: bookwyrm/templates/settings/dashboard.html:8 +#: bookwyrm/templates/settings/dashboard/dashboard.html:6 +#: bookwyrm/templates/settings/dashboard/dashboard.html:8 #: bookwyrm/templates/settings/layout.html:26 msgid "Dashboard" msgstr "" -#: bookwyrm/templates/settings/dashboard.html:15 +#: bookwyrm/templates/settings/dashboard/dashboard.html:15 #, fuzzy #| msgid "Local users" msgid "Total users" msgstr "本地用户" -#: bookwyrm/templates/settings/dashboard.html:21 -#: bookwyrm/templates/settings/dashboard_user_chart.html:12 +#: bookwyrm/templates/settings/dashboard/dashboard.html:21 +#: bookwyrm/templates/settings/dashboard/dashboard_user_chart.html:12 msgid "Active this month" msgstr "" -#: bookwyrm/templates/settings/dashboard.html:27 +#: bookwyrm/templates/settings/dashboard/dashboard.html:27 #, fuzzy #| msgid "Status" msgid "Statuses" msgstr "状态" -#: bookwyrm/templates/settings/dashboard.html:33 +#: bookwyrm/templates/settings/dashboard/dashboard.html:33 msgid "Works" msgstr "" -#: bookwyrm/templates/settings/dashboard.html:43 +#: bookwyrm/templates/settings/dashboard/dashboard.html:43 #, fuzzy, python-format #| msgid "%(count)d uses" msgid "%(display_count)s open report" msgid_plural "%(display_count)s open reports" msgstr[0] "%(count)d 次使用" -#: bookwyrm/templates/settings/dashboard.html:54 +#: bookwyrm/templates/settings/dashboard/dashboard.html:54 #, fuzzy, python-format #| msgid "%(count)d uses" msgid "%(display_count)s invite request" msgid_plural "%(display_count)s invite requests" msgstr[0] "%(count)d 次使用" -#: bookwyrm/templates/settings/dashboard.html:65 +#: bookwyrm/templates/settings/dashboard/dashboard.html:65 #, fuzzy #| msgid "User Activity" msgid "Instance Activity" msgstr "用户活动" -#: bookwyrm/templates/settings/dashboard.html:83 +#: bookwyrm/templates/settings/dashboard/dashboard.html:83 msgid "Interval:" msgstr "" -#: bookwyrm/templates/settings/dashboard.html:86 +#: bookwyrm/templates/settings/dashboard/dashboard.html:87 msgid "Days" msgstr "" -#: bookwyrm/templates/settings/dashboard.html:87 +#: bookwyrm/templates/settings/dashboard/dashboard.html:88 #, fuzzy #| msgid "One Week" msgid "Weeks" msgstr "一周" -#: bookwyrm/templates/settings/dashboard.html:100 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 #, fuzzy #| msgid "User Activity" msgid "User signup activity" msgstr "用户活动" -#: bookwyrm/templates/settings/dashboard.html:106 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #, fuzzy #| msgid "User Activity" msgid "Status activity" msgstr "用户活动" -#: bookwyrm/templates/settings/dashboard_status_chart.html:7 +#: bookwyrm/templates/settings/dashboard/dashboard_status_chart.html:7 #, fuzzy #| msgid "No statuses reported" msgid "Statuses posted" msgstr "没有被报告的状态" -#: bookwyrm/templates/settings/dashboard_user_chart.html:7 +#: bookwyrm/templates/settings/dashboard/dashboard_user_chart.html:7 msgid "Total" msgstr "" -#: bookwyrm/templates/settings/domain_form.html:5 -#: bookwyrm/templates/settings/email_blocklist.html:10 +#: bookwyrm/templates/settings/email_blocklist/domain_form.html:5 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:10 msgid "Add domain" msgstr "" -#: bookwyrm/templates/settings/domain_form.html:11 +#: bookwyrm/templates/settings/email_blocklist/domain_form.html:11 msgid "Domain:" msgstr "" -#: bookwyrm/templates/settings/edit_server.html:3 -#: bookwyrm/templates/settings/edit_server.html:6 -#: bookwyrm/templates/settings/edit_server.html:20 -#: bookwyrm/templates/settings/federation.html:9 -#: bookwyrm/templates/settings/federation.html:10 -#: bookwyrm/templates/settings/server_blocklist.html:3 -#: bookwyrm/templates/settings/server_blocklist.html:20 -msgid "Add instance" -msgstr "添加实例" - -#: bookwyrm/templates/settings/edit_server.html:7 -#: bookwyrm/templates/settings/server_blocklist.html:7 -msgid "Back to instance list" -msgstr "回到实例列表" - -#: bookwyrm/templates/settings/edit_server.html:16 -#: bookwyrm/templates/settings/server_blocklist.html:16 -msgid "Import block list" -msgstr "导入屏蔽列表" - -#: bookwyrm/templates/settings/edit_server.html:30 -msgid "Instance:" -msgstr "实例:" - -#: bookwyrm/templates/settings/edit_server.html:37 -#: bookwyrm/templates/settings/federated_server.html:31 -#: bookwyrm/templates/user_admin/user_info.html:125 -msgid "Status:" -msgstr "状态:" - -#: bookwyrm/templates/settings/edit_server.html:48 -#: bookwyrm/templates/settings/federated_server.html:23 -#: bookwyrm/templates/user_admin/user_info.html:117 -msgid "Software:" -msgstr "软件:" - -#: bookwyrm/templates/settings/edit_server.html:55 -#: bookwyrm/templates/settings/federated_server.html:27 -#: bookwyrm/templates/user_admin/user_info.html:121 -msgid "Version:" -msgstr "版本:" - -#: bookwyrm/templates/settings/edit_server.html:64 -msgid "Notes:" -msgstr "备注:" - -#: bookwyrm/templates/settings/email_blocklist.html:5 -#: bookwyrm/templates/settings/email_blocklist.html:7 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:5 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:7 #: bookwyrm/templates/settings/layout.html:59 #, fuzzy #| msgid "Import Blocklist" msgid "Email Blocklist" msgstr "导入屏蔽列表" -#: bookwyrm/templates/settings/email_blocklist.html:18 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:18 msgid "When someone tries to register with an email from this domain, no account will be created. The registration process will appear to have worked." msgstr "" -#: bookwyrm/templates/settings/email_blocklist.html:25 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:25 msgid "Domain" msgstr "" -#: bookwyrm/templates/settings/email_blocklist.html:29 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:29 +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:27 #, fuzzy #| msgid "Actions" msgid "Options" msgstr "动作" -#: bookwyrm/templates/settings/email_blocklist.html:38 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:38 #, fuzzy, python-format #| msgid "%(count)d uses" msgid "%(display_count)s user" msgid_plural "%(display_count)s users" msgstr[0] "%(count)d 次使用" -#: bookwyrm/templates/settings/federated_server.html:19 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:59 +#, fuzzy +#| msgid "No users currently blocked." +msgid "No email domains currently blocked" +msgstr "当前没有被屏蔽的用户。" + +#: bookwyrm/templates/settings/federation/edit_instance.html:3 +#: bookwyrm/templates/settings/federation/edit_instance.html:6 +#: bookwyrm/templates/settings/federation/edit_instance.html:20 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:3 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:20 +#: bookwyrm/templates/settings/federation/instance_list.html:9 +#: bookwyrm/templates/settings/federation/instance_list.html:10 +msgid "Add instance" +msgstr "添加实例" + +#: bookwyrm/templates/settings/federation/edit_instance.html:7 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:7 +msgid "Back to instance list" +msgstr "回到实例列表" + +#: bookwyrm/templates/settings/federation/edit_instance.html:16 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:16 +msgid "Import block list" +msgstr "导入屏蔽列表" + +#: bookwyrm/templates/settings/federation/edit_instance.html:30 +msgid "Instance:" +msgstr "实例:" + +#: bookwyrm/templates/settings/federation/edit_instance.html:39 +#: bookwyrm/templates/settings/federation/instance.html:28 +#: bookwyrm/templates/settings/users/user_info.html:106 +msgid "Status:" +msgstr "状态:" + +#: bookwyrm/templates/settings/federation/edit_instance.html:52 +#: bookwyrm/templates/settings/federation/instance.html:22 +#: bookwyrm/templates/settings/users/user_info.html:100 +msgid "Software:" +msgstr "软件:" + +#: bookwyrm/templates/settings/federation/edit_instance.html:61 +#: bookwyrm/templates/settings/federation/instance.html:25 +#: bookwyrm/templates/settings/users/user_info.html:103 +msgid "Version:" +msgstr "版本:" + +#: bookwyrm/templates/settings/federation/edit_instance.html:70 +msgid "Notes:" +msgstr "备注:" + +#: bookwyrm/templates/settings/federation/instance.html:19 msgid "Details" msgstr "详细" -#: bookwyrm/templates/settings/federated_server.html:39 +#: bookwyrm/templates/settings/federation/instance.html:35 #: bookwyrm/templates/user/layout.html:63 msgid "Activity" msgstr "活动" -#: bookwyrm/templates/settings/federated_server.html:43 +#: bookwyrm/templates/settings/federation/instance.html:38 msgid "Users:" msgstr "用户:" -#: bookwyrm/templates/settings/federated_server.html:46 -#: bookwyrm/templates/settings/federated_server.html:53 +#: bookwyrm/templates/settings/federation/instance.html:41 +#: bookwyrm/templates/settings/federation/instance.html:47 msgid "View all" msgstr "查看全部" -#: bookwyrm/templates/settings/federated_server.html:50 -#: bookwyrm/templates/user_admin/user_info.html:59 +#: bookwyrm/templates/settings/federation/instance.html:44 +#: bookwyrm/templates/settings/users/user_info.html:56 msgid "Reports:" msgstr "报告:" -#: bookwyrm/templates/settings/federated_server.html:57 +#: bookwyrm/templates/settings/federation/instance.html:50 msgid "Followed by us:" msgstr "我们关注了的:" -#: bookwyrm/templates/settings/federated_server.html:63 +#: bookwyrm/templates/settings/federation/instance.html:55 msgid "Followed by them:" msgstr "TA 们关注了的:" -#: bookwyrm/templates/settings/federated_server.html:69 +#: bookwyrm/templates/settings/federation/instance.html:60 msgid "Blocked by us:" msgstr "我们所屏蔽的:" -#: bookwyrm/templates/settings/federated_server.html:82 -#: bookwyrm/templates/user_admin/user_info.html:130 +#: bookwyrm/templates/settings/federation/instance.html:72 +#: bookwyrm/templates/settings/users/user_info.html:110 msgid "Notes" msgstr "备注" -#: bookwyrm/templates/settings/federated_server.html:85 +#: bookwyrm/templates/settings/federation/instance.html:75 msgid "Edit" msgstr "编辑" -#: bookwyrm/templates/settings/federated_server.html:105 -#: bookwyrm/templates/user_admin/user_moderation_actions.html:8 +#: bookwyrm/templates/settings/federation/instance.html:79 +msgid "No notes" +msgstr "" + +#: bookwyrm/templates/settings/federation/instance.html:94 +#: bookwyrm/templates/settings/users/user_moderation_actions.html:8 msgid "Actions" msgstr "动作" -#: bookwyrm/templates/settings/federated_server.html:109 +#: bookwyrm/templates/settings/federation/instance.html:98 #: bookwyrm/templates/snippets/block_button.html:5 msgid "Block" msgstr "屏蔽" -#: bookwyrm/templates/settings/federated_server.html:110 +#: bookwyrm/templates/settings/federation/instance.html:99 msgid "All users from this instance will be deactivated." msgstr "来自此实例的所有用户将会被停用。" -#: bookwyrm/templates/settings/federated_server.html:115 +#: bookwyrm/templates/settings/federation/instance.html:104 #: bookwyrm/templates/snippets/block_button.html:10 msgid "Un-block" msgstr "取消屏蔽" -#: bookwyrm/templates/settings/federated_server.html:116 +#: bookwyrm/templates/settings/federation/instance.html:105 msgid "All users from this instance will be re-activated." msgstr "来自此实例的所有用户将会被重新启用。" -#: bookwyrm/templates/settings/federation.html:3 -#: bookwyrm/templates/settings/federation.html:5 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:6 +msgid "Import Blocklist" +msgstr "导入屏蔽列表" + +#: bookwyrm/templates/settings/federation/instance_blocklist.html:26 +#: bookwyrm/templates/snippets/goal_progress.html:7 +msgid "Success!" +msgstr "成功!" + +#: bookwyrm/templates/settings/federation/instance_blocklist.html:30 +msgid "Successfully blocked:" +msgstr "成功屏蔽了" + +#: bookwyrm/templates/settings/federation/instance_blocklist.html:32 +msgid "Failed:" +msgstr "已失败:" + +#: bookwyrm/templates/settings/federation/instance_list.html:3 +#: bookwyrm/templates/settings/federation/instance_list.html:5 #: bookwyrm/templates/settings/layout.html:45 msgid "Federated Instances" msgstr "互联实例" -#: bookwyrm/templates/settings/federation.html:32 -#: bookwyrm/templates/user_admin/server_filter.html:5 +#: bookwyrm/templates/settings/federation/instance_list.html:32 +#: bookwyrm/templates/settings/users/server_filter.html:5 msgid "Instance name" msgstr "实例名称" -#: bookwyrm/templates/settings/federation.html:40 +#: bookwyrm/templates/settings/federation/instance_list.html:40 msgid "Software" msgstr "软件" +#: bookwyrm/templates/settings/federation/instance_list.html:63 +#, fuzzy +#| msgid "Announcements" +msgid "No instances found" +msgstr "公告" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:4 +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:11 +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:25 +#: bookwyrm/templates/settings/invites/manage_invites.html:11 +msgid "Invite Requests" +msgstr "邀请请求" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:23 +msgid "Ignored Invite Requests" +msgstr "已忽略的邀请请求" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:35 +msgid "Date requested" +msgstr "请求日期" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:39 +msgid "Date accepted" +msgstr "接受日期" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:42 +msgid "Email" +msgstr "邮箱" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:47 +msgid "Action" +msgstr "动作" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:50 +msgid "No requests" +msgstr "没有请求" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:59 +#: bookwyrm/templates/settings/invites/status_filter.html:16 +msgid "Accepted" +msgstr "已接受" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:61 +#: bookwyrm/templates/settings/invites/status_filter.html:12 +msgid "Sent" +msgstr "已发送" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:63 +#: bookwyrm/templates/settings/invites/status_filter.html:8 +msgid "Requested" +msgstr "已请求" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:73 +msgid "Send invite" +msgstr "发送请求" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:75 +msgid "Re-send invite" +msgstr "重新发送请求" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:95 +msgid "Ignore" +msgstr "忽略" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:97 +msgid "Un-ignore" +msgstr "取消忽略" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:108 +msgid "Back to pending requests" +msgstr "回到待处理的请求" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:110 +msgid "View ignored requests" +msgstr "查看忽略的请求" + +#: bookwyrm/templates/settings/invites/manage_invites.html:21 +msgid "Generate New Invite" +msgstr "生成新的邀请" + +#: bookwyrm/templates/settings/invites/manage_invites.html:27 +msgid "Expiry:" +msgstr "过期:" + +#: bookwyrm/templates/settings/invites/manage_invites.html:33 +msgid "Use limit:" +msgstr "使用限制:" + +#: bookwyrm/templates/settings/invites/manage_invites.html:40 +msgid "Create Invite" +msgstr "创建邀请" + +#: bookwyrm/templates/settings/invites/manage_invites.html:47 +msgid "Link" +msgstr "链接" + +#: bookwyrm/templates/settings/invites/manage_invites.html:48 +msgid "Expires" +msgstr "过期" + +#: bookwyrm/templates/settings/invites/manage_invites.html:49 +msgid "Max uses" +msgstr "最大使用次数" + +#: bookwyrm/templates/settings/invites/manage_invites.html:50 +msgid "Times used" +msgstr "已使用次数" + +#: bookwyrm/templates/settings/invites/manage_invites.html:53 +msgid "No active invites" +msgstr "无有效的邀请" + +#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:5 +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:10 +#, fuzzy +#| msgid "Add read dates" +msgid "Add IP address" +msgstr "添加阅读日期" + +#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:11 +msgid "Use IP address blocks with caution, and consider using blocks only temporarily, as IP addresses are often shared or change hands. If you block your own IP, you will not be able to access this page." +msgstr "" + +#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:18 +#, fuzzy +#| msgid "Email address:" +msgid "IP Address:" +msgstr "邮箱地址:" + +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:5 +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:7 +#: bookwyrm/templates/settings/layout.html:63 +#, fuzzy +#| msgid "Import Blocklist" +msgid "IP Address Blocklist" +msgstr "导入屏蔽列表" + +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:18 +msgid "Any traffic from this IP address will get a 404 response when trying to access any part of the application." +msgstr "" + +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:24 +msgid "Address" +msgstr "" + +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:46 +#, fuzzy +#| msgid "No users currently blocked." +msgid "No IP addresses currently blocked" +msgstr "当前没有被屏蔽的用户。" + +#: bookwyrm/templates/settings/ip_blocklist/ip_tooltip.html:6 +msgid "You can block IP ranges using CIDR syntax." +msgstr "" + #: bookwyrm/templates/settings/layout.html:4 msgid "Administration" msgstr "管理" @@ -2458,237 +2580,394 @@ msgstr "管理用户" msgid "Moderation" msgstr "提及" -#: bookwyrm/templates/settings/layout.html:64 +#: bookwyrm/templates/settings/layout.html:55 +#: bookwyrm/templates/settings/reports/reports.html:8 +#: bookwyrm/templates/settings/reports/reports.html:17 +msgid "Reports" +msgstr "报告" + +#: bookwyrm/templates/settings/layout.html:68 msgid "Instance Settings" msgstr "实例设置" -#: bookwyrm/templates/settings/layout.html:72 +#: bookwyrm/templates/settings/layout.html:76 #: bookwyrm/templates/settings/site.html:4 #: bookwyrm/templates/settings/site.html:6 msgid "Site Settings" msgstr "站点设置" -#: bookwyrm/templates/settings/layout.html:75 -#: bookwyrm/templates/settings/site.html:13 +#: bookwyrm/templates/settings/reports/report.html:5 +#: bookwyrm/templates/settings/reports/report.html:8 +#: bookwyrm/templates/settings/reports/report_preview.html:6 +#, python-format +msgid "Report #%(report_id)s: %(username)s" +msgstr "报告 #%(report_id)s: %(username)s" + +#: bookwyrm/templates/settings/reports/report.html:9 +msgid "Back to reports" +msgstr "回到报告" + +#: bookwyrm/templates/settings/reports/report.html:23 +msgid "Moderator Comments" +msgstr "监察员评论" + +#: bookwyrm/templates/settings/reports/report.html:41 +#: bookwyrm/templates/snippets/create_status.html:28 +msgid "Comment" +msgstr "评论" + +#: bookwyrm/templates/settings/reports/report.html:46 +msgid "Reported statuses" +msgstr "被报告的状态" + +#: bookwyrm/templates/settings/reports/report.html:48 +msgid "No statuses reported" +msgstr "没有被报告的状态" + +#: bookwyrm/templates/settings/reports/report.html:54 +msgid "Status has been deleted" +msgstr "状态已被删除" + +#: bookwyrm/templates/settings/reports/report_preview.html:13 +msgid "No notes provided" +msgstr "没有提供摘记" + +#: bookwyrm/templates/settings/reports/report_preview.html:20 +#, python-format +msgid "Reported by %(username)s" +msgstr "由 %(username)s 报告" + +#: bookwyrm/templates/settings/reports/report_preview.html:30 +msgid "Re-open" +msgstr "重新开启" + +#: bookwyrm/templates/settings/reports/report_preview.html:32 +msgid "Resolve" +msgstr "已解决" + +#: bookwyrm/templates/settings/reports/reports.html:6 +#, python-format +msgid "Reports: %(instance_name)s" +msgstr "报告: %(instance_name)s" + +#: bookwyrm/templates/settings/reports/reports.html:14 +#, python-format +msgid "Reports: %(instance_name)s" +msgstr "报告: %(instance_name)s" + +#: bookwyrm/templates/settings/reports/reports.html:28 +msgid "Resolved" +msgstr "已解决" + +#: bookwyrm/templates/settings/reports/reports.html:37 +msgid "No reports found." +msgstr "没有找到报告" + +#: bookwyrm/templates/settings/site.html:10 +#: bookwyrm/templates/settings/site.html:21 msgid "Instance Info" msgstr "实例信息" -#: bookwyrm/templates/settings/layout.html:76 -#: bookwyrm/templates/settings/site.html:44 +#: bookwyrm/templates/settings/site.html:11 +#: bookwyrm/templates/settings/site.html:54 msgid "Images" msgstr "图像" -#: bookwyrm/templates/settings/layout.html:77 -#: bookwyrm/templates/settings/site.html:64 +#: bookwyrm/templates/settings/site.html:12 +#: bookwyrm/templates/settings/site.html:74 msgid "Footer Content" msgstr "页脚内容" -#: bookwyrm/templates/settings/layout.html:78 -#: bookwyrm/templates/settings/site.html:86 +#: bookwyrm/templates/settings/site.html:13 +#: bookwyrm/templates/settings/site.html:98 msgid "Registration" msgstr "注册" -#: bookwyrm/templates/settings/manage_invite_requests.html:4 -#: bookwyrm/templates/settings/manage_invite_requests.html:11 -#: bookwyrm/templates/settings/manage_invite_requests.html:25 -#: bookwyrm/templates/settings/manage_invites.html:11 -msgid "Invite Requests" -msgstr "邀请请求" - -#: bookwyrm/templates/settings/manage_invite_requests.html:23 -msgid "Ignored Invite Requests" -msgstr "已忽略的邀请请求" - -#: bookwyrm/templates/settings/manage_invite_requests.html:35 -msgid "Date requested" -msgstr "请求日期" - -#: bookwyrm/templates/settings/manage_invite_requests.html:39 -msgid "Date accepted" -msgstr "接受日期" - -#: bookwyrm/templates/settings/manage_invite_requests.html:42 -msgid "Email" -msgstr "邮箱" - -#: bookwyrm/templates/settings/manage_invite_requests.html:47 -msgid "Action" -msgstr "动作" - -#: bookwyrm/templates/settings/manage_invite_requests.html:50 -msgid "No requests" -msgstr "没有请求" - -#: bookwyrm/templates/settings/manage_invite_requests.html:59 -#: bookwyrm/templates/settings/status_filter.html:16 -msgid "Accepted" -msgstr "已接受" - -#: bookwyrm/templates/settings/manage_invite_requests.html:61 -#: bookwyrm/templates/settings/status_filter.html:12 -msgid "Sent" -msgstr "已发送" - -#: bookwyrm/templates/settings/manage_invite_requests.html:63 -#: bookwyrm/templates/settings/status_filter.html:8 -msgid "Requested" -msgstr "已请求" - -#: bookwyrm/templates/settings/manage_invite_requests.html:73 -msgid "Send invite" -msgstr "发送请求" - -#: bookwyrm/templates/settings/manage_invite_requests.html:75 -msgid "Re-send invite" -msgstr "重新发送请求" - -#: bookwyrm/templates/settings/manage_invite_requests.html:95 -msgid "Ignore" -msgstr "忽略" - -#: bookwyrm/templates/settings/manage_invite_requests.html:97 -msgid "Un-ignore" -msgstr "取消忽略" - -#: bookwyrm/templates/settings/manage_invite_requests.html:108 -msgid "Back to pending requests" -msgstr "回到待处理的请求" - -#: bookwyrm/templates/settings/manage_invite_requests.html:110 -msgid "View ignored requests" -msgstr "查看忽略的请求" - -#: bookwyrm/templates/settings/manage_invites.html:21 -msgid "Generate New Invite" -msgstr "生成新的邀请" - -#: bookwyrm/templates/settings/manage_invites.html:27 -msgid "Expiry:" -msgstr "过期:" - -#: bookwyrm/templates/settings/manage_invites.html:33 -msgid "Use limit:" -msgstr "使用限制:" - -#: bookwyrm/templates/settings/manage_invites.html:40 -msgid "Create Invite" -msgstr "创建邀请" - -#: bookwyrm/templates/settings/manage_invites.html:47 -msgid "Link" -msgstr "链接" - -#: bookwyrm/templates/settings/manage_invites.html:48 -msgid "Expires" -msgstr "过期" - -#: bookwyrm/templates/settings/manage_invites.html:49 -msgid "Max uses" -msgstr "最大使用次数" - -#: bookwyrm/templates/settings/manage_invites.html:50 -msgid "Times used" -msgstr "已使用次数" - -#: bookwyrm/templates/settings/manage_invites.html:53 -msgid "No active invites" -msgstr "无有效的邀请" - -#: bookwyrm/templates/settings/server_blocklist.html:6 -msgid "Import Blocklist" -msgstr "导入屏蔽列表" - -#: bookwyrm/templates/settings/server_blocklist.html:26 -#: bookwyrm/templates/snippets/goal_progress.html:7 -msgid "Success!" -msgstr "成功!" - -#: bookwyrm/templates/settings/server_blocklist.html:30 -msgid "Successfully blocked:" -msgstr "成功屏蔽了" - -#: bookwyrm/templates/settings/server_blocklist.html:32 -msgid "Failed:" -msgstr "已失败:" - -#: bookwyrm/templates/settings/site.html:15 +#: bookwyrm/templates/settings/site.html:24 msgid "Instance Name:" msgstr "实例名称" -#: bookwyrm/templates/settings/site.html:19 +#: bookwyrm/templates/settings/site.html:28 msgid "Tagline:" msgstr "标语" -#: bookwyrm/templates/settings/site.html:23 +#: bookwyrm/templates/settings/site.html:32 msgid "Instance description:" msgstr "实例描述:" -#: bookwyrm/templates/settings/site.html:27 +#: bookwyrm/templates/settings/site.html:36 #, fuzzy #| msgid "Description:" msgid "Short description:" msgstr "描述:" -#: bookwyrm/templates/settings/site.html:28 +#: bookwyrm/templates/settings/site.html:37 msgid "Used when the instance is previewed on joinbookwyrm.com. Does not support html or markdown." msgstr "" -#: bookwyrm/templates/settings/site.html:32 +#: bookwyrm/templates/settings/site.html:41 msgid "Code of conduct:" msgstr "行为准则:" -#: bookwyrm/templates/settings/site.html:36 +#: bookwyrm/templates/settings/site.html:45 msgid "Privacy Policy:" msgstr "隐私政策:" -#: bookwyrm/templates/settings/site.html:47 +#: bookwyrm/templates/settings/site.html:57 msgid "Logo:" msgstr "图标:" -#: bookwyrm/templates/settings/site.html:51 +#: bookwyrm/templates/settings/site.html:61 msgid "Logo small:" msgstr "小号图标:" -#: bookwyrm/templates/settings/site.html:55 +#: bookwyrm/templates/settings/site.html:65 msgid "Favicon:" msgstr "Favicon:" -#: bookwyrm/templates/settings/site.html:66 +#: bookwyrm/templates/settings/site.html:77 msgid "Support link:" msgstr "支持链接:" -#: bookwyrm/templates/settings/site.html:70 +#: bookwyrm/templates/settings/site.html:81 msgid "Support title:" msgstr "支持标题:" -#: bookwyrm/templates/settings/site.html:74 +#: bookwyrm/templates/settings/site.html:85 msgid "Admin email:" msgstr "管理员邮件:" -#: bookwyrm/templates/settings/site.html:78 +#: bookwyrm/templates/settings/site.html:89 msgid "Additional info:" msgstr "附加信息:" -#: bookwyrm/templates/settings/site.html:90 +#: bookwyrm/templates/settings/site.html:103 msgid "Allow registration" msgstr "允许注册" -#: bookwyrm/templates/settings/site.html:96 +#: bookwyrm/templates/settings/site.html:109 msgid "Allow invite requests" msgstr "允许请求邀请" -#: bookwyrm/templates/settings/site.html:102 +#: bookwyrm/templates/settings/site.html:115 msgid "Require users to confirm email address" msgstr "要求用户确认邮箱地址" -#: bookwyrm/templates/settings/site.html:104 +#: bookwyrm/templates/settings/site.html:117 msgid "(Recommended if registration is open)" msgstr "(当开放注册时推荐)" -#: bookwyrm/templates/settings/site.html:107 +#: bookwyrm/templates/settings/site.html:120 msgid "Registration closed text:" msgstr "注册关闭文字:" +#: bookwyrm/templates/settings/site.html:124 +#, fuzzy +#| msgid "Invite Requests" +msgid "Invite request text:" +msgstr "邀请请求" + +#: bookwyrm/templates/settings/users/delete_user_form.html:5 +#: bookwyrm/templates/settings/users/user_moderation_actions.html:31 +#, fuzzy +#| msgid "Permanently deleted" +msgid "Permanently delete user" +msgstr "已永久删除" + +#: bookwyrm/templates/settings/users/delete_user_form.html:12 +#, python-format +msgid "Are you sure you want to delete %(username)s's account? This action cannot be undone. To proceed, please enter your password to confirm deletion." +msgstr "" + +#: bookwyrm/templates/settings/users/delete_user_form.html:17 +#, fuzzy +#| msgid "Confirm password:" +msgid "Your password:" +msgstr "确认密码:" + +#: bookwyrm/templates/settings/users/user.html:7 +msgid "Back to users" +msgstr "回到用户" + +#: bookwyrm/templates/settings/users/user_admin.html:7 +#, python-format +msgid "Users: %(instance_name)s" +msgstr "用户: %(instance_name)s" + +#: bookwyrm/templates/settings/users/user_admin.html:22 +#: bookwyrm/templates/settings/users/username_filter.html:5 +msgid "Username" +msgstr "用户名" + +#: bookwyrm/templates/settings/users/user_admin.html:26 +msgid "Date Added" +msgstr "添加日期:" + +#: bookwyrm/templates/settings/users/user_admin.html:30 +msgid "Last Active" +msgstr "最后或缺" + +#: bookwyrm/templates/settings/users/user_admin.html:38 +msgid "Remote instance" +msgstr "移除服务器" + +#: bookwyrm/templates/settings/users/user_admin.html:47 +#: bookwyrm/templates/settings/users/user_info.html:24 +msgid "Active" +msgstr "活跃" + +#: bookwyrm/templates/settings/users/user_admin.html:47 +#: bookwyrm/templates/settings/users/user_info.html:28 +msgid "Inactive" +msgstr "停用" + +#: bookwyrm/templates/settings/users/user_admin.html:52 +#: bookwyrm/templates/settings/users/user_info.html:120 +msgid "Not set" +msgstr "未设置" + +#: bookwyrm/templates/settings/users/user_info.html:16 +msgid "View user profile" +msgstr "查看用户个人资料" + +#: bookwyrm/templates/settings/users/user_info.html:36 +msgid "Local" +msgstr "本站" + +#: bookwyrm/templates/settings/users/user_info.html:38 +#, fuzzy +#| msgid "Remove" +msgid "Remote" +msgstr "移除" + +#: bookwyrm/templates/settings/users/user_info.html:47 +msgid "User details" +msgstr "用户详情" + +#: bookwyrm/templates/settings/users/user_info.html:51 +#, fuzzy +#| msgid "Email" +msgid "Email:" +msgstr "邮箱" + +#: bookwyrm/templates/settings/users/user_info.html:61 +#, fuzzy +#| msgid "Directory" +msgid "(View reports)" +msgstr "目录" + +#: bookwyrm/templates/settings/users/user_info.html:67 +#, fuzzy +#| msgid "Blocked by us:" +msgid "Blocked by count:" +msgstr "我们所屏蔽的:" + +#: bookwyrm/templates/settings/users/user_info.html:70 +#, fuzzy +#| msgid "last active" +msgid "Last active date:" +msgstr "最后活跃" + +#: bookwyrm/templates/settings/users/user_info.html:73 +#, fuzzy +#| msgid "Manually approve followers:" +msgid "Manually approved followers:" +msgstr "手动批准关注者:" + +#: bookwyrm/templates/settings/users/user_info.html:76 +#, fuzzy +#| msgid "Discover" +msgid "Discoverable:" +msgstr "发现" + +#: bookwyrm/templates/settings/users/user_info.html:80 +msgid "Deactivation reason:" +msgstr "" + +#: bookwyrm/templates/settings/users/user_info.html:95 +msgid "Instance details" +msgstr "实例详情" + +#: bookwyrm/templates/settings/users/user_info.html:117 +msgid "View instance" +msgstr "查看实例" + +#: bookwyrm/templates/settings/users/user_moderation_actions.html:5 +msgid "Permanently deleted" +msgstr "已永久删除" + +#: bookwyrm/templates/settings/users/user_moderation_actions.html:13 +#: bookwyrm/templates/snippets/status/status_options.html:35 +#: bookwyrm/templates/snippets/user_options.html:13 +msgid "Send direct message" +msgstr "发送私信" + +#: bookwyrm/templates/settings/users/user_moderation_actions.html:20 +msgid "Suspend user" +msgstr "停用用户" + +#: bookwyrm/templates/settings/users/user_moderation_actions.html:25 +msgid "Un-suspend user" +msgstr "取消停用用户" + +#: bookwyrm/templates/settings/users/user_moderation_actions.html:47 +msgid "Access level:" +msgstr "访问级别:" + +#: bookwyrm/templates/shelf/create_shelf_form.html:5 +msgid "Create Shelf" +msgstr "创建书架" + +#: bookwyrm/templates/shelf/edit_shelf_form.html:5 +msgid "Edit Shelf" +msgstr "编辑书架" + +#: bookwyrm/templates/shelf/shelf.html:28 bookwyrm/views/shelf.py:56 +msgid "All books" +msgstr "所有书目" + +#: bookwyrm/templates/shelf/shelf.html:55 +msgid "Create shelf" +msgstr "创建书架" + +#: bookwyrm/templates/shelf/shelf.html:77 +#, python-format +msgid "%(formatted_count)s book" +msgid_plural "%(formatted_count)s books" +msgstr[0] "" + +#: bookwyrm/templates/shelf/shelf.html:84 +#, python-format +msgid "(showing %(start)s-%(end)s)" +msgstr "" + +#: bookwyrm/templates/shelf/shelf.html:96 +msgid "Edit shelf" +msgstr "编辑书架" + +#: bookwyrm/templates/shelf/shelf.html:104 +msgid "Delete shelf" +msgstr "删除书架" + +#: bookwyrm/templates/shelf/shelf.html:130 +#: bookwyrm/templates/shelf/shelf.html:154 +msgid "Shelved" +msgstr "上架时间" + +#: bookwyrm/templates/shelf/shelf.html:131 +#: bookwyrm/templates/shelf/shelf.html:158 +msgid "Started" +msgstr "开始时间" + +#: bookwyrm/templates/shelf/shelf.html:132 +#: bookwyrm/templates/shelf/shelf.html:161 +msgid "Finished" +msgstr "完成时间" + +#: bookwyrm/templates/shelf/shelf.html:187 +msgid "This shelf is empty." +msgstr "此书架是空的。" + #: bookwyrm/templates/snippets/announcement.html:31 #, python-format msgid "Posted by %(username)s" @@ -2732,24 +3011,21 @@ msgid "Some thoughts on the book" msgstr "对书的一些看法" #: bookwyrm/templates/snippets/create_status/comment.html:26 -#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:16 +#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:15 msgid "Progress:" msgstr "进度:" #: bookwyrm/templates/snippets/create_status/comment.html:52 -#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:30 -#: bookwyrm/templates/snippets/readthrough_form.html:22 +#: bookwyrm/templates/snippets/progress_field.html:18 msgid "pages" msgstr "页数" #: bookwyrm/templates/snippets/create_status/comment.html:58 -#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:31 -#: bookwyrm/templates/snippets/readthrough_form.html:23 +#: bookwyrm/templates/snippets/progress_field.html:23 msgid "percent" msgstr "百分比" #: bookwyrm/templates/snippets/create_status/comment.html:65 -#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:36 #, python-format msgid "of %(pages)s pages" msgstr "全书 %(pages)s 页" @@ -2765,11 +3041,13 @@ msgstr "回复" msgid "Content" msgstr "内容" -#: bookwyrm/templates/snippets/create_status/content_warning_field.html:3 -msgid "Spoiler alert:" -msgstr "剧透警告:" - #: bookwyrm/templates/snippets/create_status/content_warning_field.html:10 +#, fuzzy +#| msgid "Content" +msgid "Content warning:" +msgstr "内容" + +#: bookwyrm/templates/snippets/create_status/content_warning_field.html:18 msgid "Spoilers ahead!" msgstr "前有剧透!" @@ -2777,7 +3055,7 @@ msgstr "前有剧透!" msgid "Include spoiler alert" msgstr "加入剧透警告" -#: bookwyrm/templates/snippets/create_status/layout.html:38 +#: bookwyrm/templates/snippets/create_status/layout.html:41 #: bookwyrm/templates/snippets/reading_modals/form.html:7 msgid "Comment:" msgstr "评论:" @@ -2933,29 +3211,29 @@ msgstr[0] "《%(book_title)s》的书评(%(display_rating)s 星): %(review_t msgid "Review of \"%(book_title)s\": %(review_title)s" msgstr "《%(book_title)s》的书评: %(review_title)s" -#: bookwyrm/templates/snippets/goal_card.html:23 +#: bookwyrm/templates/snippets/goal_form.html:3 #, python-format -msgid "You can set or change your reading goal any time from your profile page" -msgstr "你可以在任何时候从你的个人资料页面 中设置或改变你的阅读目标" +msgid "Set a goal for how many books you'll finish reading in %(year)s, and track your progress throughout the year." +msgstr "设定一个 %(year)s 内要读多少书的目标,并记录你全年的进度。" -#: bookwyrm/templates/snippets/goal_form.html:9 +#: bookwyrm/templates/snippets/goal_form.html:12 msgid "Reading goal:" msgstr "阅读目标:" -#: bookwyrm/templates/snippets/goal_form.html:14 +#: bookwyrm/templates/snippets/goal_form.html:17 msgid "books" msgstr "本书" -#: bookwyrm/templates/snippets/goal_form.html:19 +#: bookwyrm/templates/snippets/goal_form.html:22 msgid "Goal privacy:" msgstr "目标隐私:" -#: bookwyrm/templates/snippets/goal_form.html:26 +#: bookwyrm/templates/snippets/goal_form.html:29 #: bookwyrm/templates/snippets/reading_modals/layout.html:13 msgid "Post to feed" msgstr "发布到消息流中" -#: bookwyrm/templates/snippets/goal_form.html:30 +#: bookwyrm/templates/snippets/goal_form.html:33 msgid "Set goal" msgstr "设置目标" @@ -3031,18 +3309,18 @@ msgstr "评价" msgid "Finish \"%(book_title)s\"" msgstr "完成《%(book_title)s》" -#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:22 +#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:23 #: bookwyrm/templates/snippets/reading_modals/start_reading_modal.html:20 #: bookwyrm/templates/snippets/readthrough_form.html:7 msgid "Started reading" msgstr "已开始阅读" -#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:30 -#: bookwyrm/templates/snippets/readthrough_form.html:30 +#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:31 +#: bookwyrm/templates/snippets/readthrough_form.html:20 msgid "Finished reading" msgstr "已完成阅读" -#: bookwyrm/templates/snippets/reading_modals/form.html:8 +#: bookwyrm/templates/snippets/reading_modals/form.html:9 msgid "(Optional)" msgstr "" @@ -3073,6 +3351,20 @@ msgstr "注册" msgid "Report" msgstr "报告" +#: bookwyrm/templates/snippets/report_modal.html:6 +#, python-format +msgid "Report @%(username)s" +msgstr "报告 %(username)s" + +#: bookwyrm/templates/snippets/report_modal.html:23 +#, python-format +msgid "This report will be sent to %(site_name)s's moderators for review." +msgstr "本报告会被发送至 %(site_name)s 的监察员以复查。" + +#: bookwyrm/templates/snippets/report_modal.html:24 +msgid "More info about this report:" +msgstr "关于本报告的更多信息" + #: bookwyrm/templates/snippets/search_result_text.html:36 msgid "Import book" msgstr "导入书目" @@ -3104,32 +3396,40 @@ msgstr "从 %(name)s 移除" msgid "Finish reading" msgstr "完成阅读" -#: bookwyrm/templates/snippets/status/content_status.html:73 -#: bookwyrm/templates/snippets/trimmed_text.html:17 -msgid "Show more" -msgstr "显示更多" +#: bookwyrm/templates/snippets/status/content_status.html:72 +#, fuzzy +#| msgid "Content" +msgid "Content warning" +msgstr "内容" -#: bookwyrm/templates/snippets/status/content_status.html:88 -#: bookwyrm/templates/snippets/trimmed_text.html:34 -msgid "Show less" -msgstr "显示更少" +#: bookwyrm/templates/snippets/status/content_status.html:79 +#, fuzzy +#| msgid "View status" +msgid "Show status" +msgstr "浏览状态" -#: bookwyrm/templates/snippets/status/content_status.html:103 +#: bookwyrm/templates/snippets/status/content_status.html:101 #, fuzzy, python-format #| msgid "page %(page)s" msgid "(Page %(page)s)" msgstr "第 %(page)s 页" -#: bookwyrm/templates/snippets/status/content_status.html:105 +#: bookwyrm/templates/snippets/status/content_status.html:103 #, fuzzy, python-format #| msgid "%(percent)s%% complete!" msgid "(%(percent)s%%)" msgstr "完成了 %(percent)s%% !" -#: bookwyrm/templates/snippets/status/content_status.html:127 +#: bookwyrm/templates/snippets/status/content_status.html:125 msgid "Open image in new window" msgstr "在新窗口中打开图像" +#: bookwyrm/templates/snippets/status/content_status.html:144 +#, fuzzy +#| msgid "Like status" +msgid "Hide status" +msgstr "喜欢状态" + #: bookwyrm/templates/snippets/status/headers/comment.html:2 #, python-format msgid "commented on %(book)s" @@ -3198,12 +3498,6 @@ msgstr "更多选项" msgid "Delete & re-draft" msgstr "删除并重新起草" -#: bookwyrm/templates/snippets/status/status_options.html:35 -#: bookwyrm/templates/snippets/user_options.html:13 -#: bookwyrm/templates/user_admin/user_moderation_actions.html:13 -msgid "Send direct message" -msgstr "发送私信" - #: bookwyrm/templates/snippets/suggested_users.html:16 #, python-format msgid "%(mutuals)s follower you follow" @@ -3233,6 +3527,43 @@ msgstr "升序排序" msgid "Sorted descending" msgstr "降序排序" +#: bookwyrm/templates/snippets/trimmed_text.html:17 +msgid "Show more" +msgstr "显示更多" + +#: bookwyrm/templates/snippets/trimmed_text.html:35 +msgid "Show less" +msgstr "显示更少" + +#: bookwyrm/templates/user/books_header.html:5 +#, python-format +msgid "%(username)s's books" +msgstr "%(username)s 的书目" + +#: bookwyrm/templates/user/goal.html:8 +#, python-format +msgid "%(year)s Reading Progress" +msgstr "%(year)s 阅读进度" + +#: bookwyrm/templates/user/goal.html:12 +msgid "Edit Goal" +msgstr "编辑目标" + +#: bookwyrm/templates/user/goal.html:28 +#, python-format +msgid "%(name)s hasn't set a reading goal for %(year)s." +msgstr "%(name)s 还没有设定 %(year)s 的阅读目标。" + +#: bookwyrm/templates/user/goal.html:40 +#, python-format +msgid "Your %(year)s Books" +msgstr "你 %(year)s 的书目" + +#: bookwyrm/templates/user/goal.html:42 +#, python-format +msgid "%(username)s's %(year)s Books" +msgstr "%(username)s 在 %(year)s 的书目" + #: bookwyrm/templates/user/layout.html:18 bookwyrm/templates/user/user.html:10 msgid "User Profile" msgstr "用户个人资料" @@ -3269,70 +3600,6 @@ msgstr "正在关注" msgid "%(username)s isn't following any users" msgstr "%(username)s 没有关注任何用户" -#: bookwyrm/templates/user/shelf/books_header.html:5 -#, python-format -msgid "%(username)s's books" -msgstr "%(username)s 的书目" - -#: bookwyrm/templates/user/shelf/create_shelf_form.html:5 -#: bookwyrm/templates/user/shelf/create_shelf_form.html:22 -msgid "Create Shelf" -msgstr "创建书架" - -#: bookwyrm/templates/user/shelf/edit_shelf_form.html:5 -msgid "Edit Shelf" -msgstr "编辑书架" - -#: bookwyrm/templates/user/shelf/edit_shelf_form.html:26 -msgid "Update shelf" -msgstr "更新书架" - -#: bookwyrm/templates/user/shelf/shelf.html:28 bookwyrm/views/shelf.py:56 -msgid "All books" -msgstr "所有书目" - -#: bookwyrm/templates/user/shelf/shelf.html:55 -msgid "Create shelf" -msgstr "创建书架" - -#: bookwyrm/templates/user/shelf/shelf.html:76 -#, python-format -msgid "%(formatted_count)s book" -msgid_plural "%(formatted_count)s books" -msgstr[0] "" - -#: bookwyrm/templates/user/shelf/shelf.html:83 -#, python-format -msgid "(showing %(start)s-%(end)s)" -msgstr "" - -#: bookwyrm/templates/user/shelf/shelf.html:94 -msgid "Edit shelf" -msgstr "编辑书架" - -#: bookwyrm/templates/user/shelf/shelf.html:113 -#: bookwyrm/templates/user/shelf/shelf.html:137 -msgid "Shelved" -msgstr "上架时间" - -#: bookwyrm/templates/user/shelf/shelf.html:114 -#: bookwyrm/templates/user/shelf/shelf.html:141 -msgid "Started" -msgstr "开始时间" - -#: bookwyrm/templates/user/shelf/shelf.html:115 -#: bookwyrm/templates/user/shelf/shelf.html:144 -msgid "Finished" -msgstr "完成时间" - -#: bookwyrm/templates/user/shelf/shelf.html:170 -msgid "This shelf is empty." -msgstr "此书架是空的。" - -#: bookwyrm/templates/user/shelf/shelf.html:176 -msgid "Delete shelf" -msgstr "删除书架" - #: bookwyrm/templates/user/user.html:16 msgid "Edit profile" msgstr "编辑个人资料" @@ -3384,147 +3651,6 @@ msgstr[0] "%(mutuals_display)s 个你也关注的关注者" msgid "No followers you follow" msgstr "没有你关注的关注者" -#: bookwyrm/templates/user_admin/delete_user_form.html:5 -#: bookwyrm/templates/user_admin/user_moderation_actions.html:31 -#, fuzzy -#| msgid "Permanently deleted" -msgid "Permanently delete user" -msgstr "已永久删除" - -#: bookwyrm/templates/user_admin/delete_user_form.html:12 -#, python-format -msgid "Are you sure you want to delete %(username)s's account? This action cannot be undone. To proceed, please enter your password to confirm deletion." -msgstr "" - -#: bookwyrm/templates/user_admin/delete_user_form.html:17 -#, fuzzy -#| msgid "Confirm password:" -msgid "Your password:" -msgstr "确认密码:" - -#: bookwyrm/templates/user_admin/user.html:8 -msgid "Back to users" -msgstr "回到用户" - -#: bookwyrm/templates/user_admin/user_admin.html:7 -#, python-format -msgid "Users: %(instance_name)s" -msgstr "用户: %(instance_name)s" - -#: bookwyrm/templates/user_admin/user_admin.html:22 -#: bookwyrm/templates/user_admin/username_filter.html:5 -msgid "Username" -msgstr "用户名" - -#: bookwyrm/templates/user_admin/user_admin.html:26 -msgid "Date Added" -msgstr "添加日期:" - -#: bookwyrm/templates/user_admin/user_admin.html:30 -msgid "Last Active" -msgstr "最后或缺" - -#: bookwyrm/templates/user_admin/user_admin.html:38 -msgid "Remote instance" -msgstr "移除服务器" - -#: bookwyrm/templates/user_admin/user_admin.html:47 -#: bookwyrm/templates/user_admin/user_info.html:24 -msgid "Active" -msgstr "活跃" - -#: bookwyrm/templates/user_admin/user_admin.html:47 -#: bookwyrm/templates/user_admin/user_info.html:28 -msgid "Inactive" -msgstr "停用" - -#: bookwyrm/templates/user_admin/user_admin.html:52 -#: bookwyrm/templates/user_admin/user_info.html:140 -msgid "Not set" -msgstr "未设置" - -#: bookwyrm/templates/user_admin/user_info.html:16 -msgid "View user profile" -msgstr "查看用户个人资料" - -#: bookwyrm/templates/user_admin/user_info.html:36 -msgid "Local" -msgstr "本站" - -#: bookwyrm/templates/user_admin/user_info.html:38 -#, fuzzy -#| msgid "Remove" -msgid "Remote" -msgstr "移除" - -#: bookwyrm/templates/user_admin/user_info.html:47 -msgid "User details" -msgstr "用户详情" - -#: bookwyrm/templates/user_admin/user_info.html:52 -#, fuzzy -#| msgid "Email" -msgid "Email:" -msgstr "邮箱" - -#: bookwyrm/templates/user_admin/user_info.html:64 -#, fuzzy -#| msgid "Directory" -msgid "(View reports)" -msgstr "目录" - -#: bookwyrm/templates/user_admin/user_info.html:72 -#, fuzzy -#| msgid "Blocked by us:" -msgid "Blocked by count:" -msgstr "我们所屏蔽的:" - -#: bookwyrm/templates/user_admin/user_info.html:77 -#, fuzzy -#| msgid "last active" -msgid "Last active date:" -msgstr "最后活跃" - -#: bookwyrm/templates/user_admin/user_info.html:82 -#, fuzzy -#| msgid "Manually approve followers:" -msgid "Manually approved followers:" -msgstr "手动批准关注者:" - -#: bookwyrm/templates/user_admin/user_info.html:87 -#, fuzzy -#| msgid "Discover" -msgid "Discoverable:" -msgstr "发现" - -#: bookwyrm/templates/user_admin/user_info.html:93 -msgid "Deactivation reason:" -msgstr "" - -#: bookwyrm/templates/user_admin/user_info.html:111 -msgid "Instance details" -msgstr "实例详情" - -#: bookwyrm/templates/user_admin/user_info.html:137 -msgid "View instance" -msgstr "查看实例" - -#: bookwyrm/templates/user_admin/user_moderation_actions.html:5 -msgid "Permanently deleted" -msgstr "已永久删除" - -#: bookwyrm/templates/user_admin/user_moderation_actions.html:20 -msgid "Suspend user" -msgstr "停用用户" - -#: bookwyrm/templates/user_admin/user_moderation_actions.html:25 -msgid "Un-suspend user" -msgstr "取消停用用户" - -#: bookwyrm/templates/user_admin/user_moderation_actions.html:47 -msgid "Access level:" -msgstr "访问级别:" - #: bookwyrm/templates/widgets/clearable_file_input_with_warning.html:28 msgid "File exceeds maximum size: 10MB" msgstr "文件超过了最大大小: 10MB" @@ -3538,7 +3664,7 @@ msgstr "%(title)s:%(subtitle)s" msgid "Not a valid csv file" msgstr "不是有效的 csv 文件" -#: bookwyrm/views/login.py:70 +#: bookwyrm/views/login.py:68 msgid "Username or password are incorrect" msgstr "用户名或密码不正确" @@ -3547,8 +3673,9 @@ msgid "No user with that email address was found." msgstr "没有找到使用该邮箱的用户。" #: bookwyrm/views/password.py:41 -#, python-format -msgid "A password reset link sent to %s" +#, fuzzy, python-brace-format +#| msgid "A password reset link sent to %s" +msgid "A password reset link sent to {email}" msgstr "密码重置连接已发送给 %s" #: bookwyrm/views/rss_feed.py:34 @@ -3556,6 +3683,21 @@ msgstr "密码重置连接已发送给 %s" msgid "Status updates from {obj.display_name}" msgstr "" +#~ msgid "Update shelf" +#~ msgstr "更新书架" + +#~ msgid "%(count)d uses" +#~ msgstr "%(count)d 次使用" + +#~ msgid "This instance is closed" +#~ msgstr "本实例不开放。" + +#~ msgid "Contact an administrator to get an invite" +#~ msgstr "联系管理员以取得邀请" + +#~ msgid "Spoiler alert:" +#~ msgstr "剧透警告:" + #~ msgid "Date federated" #~ msgstr "跨站日期" diff --git a/locale/zh_Hant/LC_MESSAGES/django.mo b/locale/zh_Hant/LC_MESSAGES/django.mo index f95835e9..4dd8c915 100644 Binary files a/locale/zh_Hant/LC_MESSAGES/django.mo and b/locale/zh_Hant/LC_MESSAGES/django.mo differ diff --git a/locale/zh_Hant/LC_MESSAGES/django.po b/locale/zh_Hant/LC_MESSAGES/django.po index 193be32e..7c147092 100644 --- a/locale/zh_Hant/LC_MESSAGES/django.po +++ b/locale/zh_Hant/LC_MESSAGES/django.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: 0.0.1\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-09-12 17:16+0000\n" +"POT-Creation-Date: 2021-09-29 18:32+0000\n" "PO-Revision-Date: 2021-06-30 10:36+0000\n" "Last-Translator: Grace Cheng \n" "Language-Team: LANGUAGE \n" @@ -18,59 +18,59 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -#: bookwyrm/forms.py:242 +#: bookwyrm/forms.py:241 msgid "A user with this email already exists." msgstr "已經存在使用該郵箱的使用者。" -#: bookwyrm/forms.py:256 +#: bookwyrm/forms.py:255 msgid "One Day" msgstr "一天" -#: bookwyrm/forms.py:257 +#: bookwyrm/forms.py:256 msgid "One Week" msgstr "一週" -#: bookwyrm/forms.py:258 +#: bookwyrm/forms.py:257 msgid "One Month" msgstr "一個月" -#: bookwyrm/forms.py:259 +#: bookwyrm/forms.py:258 msgid "Does Not Expire" msgstr "永不失效" -#: bookwyrm/forms.py:264 -#, python-format -msgid "%(count)d uses" -msgstr "%(count)d 次使用" +#: bookwyrm/forms.py:262 +#, fuzzy, python-brace-format +#| msgid "Max uses" +msgid "{i} uses" +msgstr "最大使用次數" -#: bookwyrm/forms.py:267 +#: bookwyrm/forms.py:263 msgid "Unlimited" msgstr "不受限" -#: bookwyrm/forms.py:323 +#: bookwyrm/forms.py:325 msgid "List Order" msgstr "列表順序" -#: bookwyrm/forms.py:324 +#: bookwyrm/forms.py:326 msgid "Book Title" msgstr "書名" -#: bookwyrm/forms.py:325 +#: bookwyrm/forms.py:327 bookwyrm/templates/shelf/shelf.html:134 +#: bookwyrm/templates/shelf/shelf.html:165 #: bookwyrm/templates/snippets/create_status/review.html:33 -#: bookwyrm/templates/user/shelf/shelf.html:117 -#: bookwyrm/templates/user/shelf/shelf.html:148 msgid "Rating" msgstr "評價" -#: bookwyrm/forms.py:327 bookwyrm/templates/lists/list.html:107 +#: bookwyrm/forms.py:329 bookwyrm/templates/lists/list.html:109 msgid "Sort By" msgstr "排序方式" -#: bookwyrm/forms.py:331 +#: bookwyrm/forms.py:333 msgid "Ascending" msgstr "升序" -#: bookwyrm/forms.py:332 +#: bookwyrm/forms.py:334 msgid "Descending" msgstr "降序" @@ -82,44 +82,70 @@ msgstr "" msgid "Could not find a match for book" msgstr "" -#: bookwyrm/models/base_model.py:13 +#: bookwyrm/models/base_model.py:16 #, fuzzy #| msgid "Ascending" msgid "Pending" msgstr "升序" -#: bookwyrm/models/base_model.py:14 +#: bookwyrm/models/base_model.py:17 msgid "Self deletion" msgstr "" -#: bookwyrm/models/base_model.py:15 +#: bookwyrm/models/base_model.py:18 #, fuzzy #| msgid "Moderator Comments" msgid "Moderator suspension" msgstr "監察員評論" -#: bookwyrm/models/base_model.py:16 +#: bookwyrm/models/base_model.py:19 #, fuzzy #| msgid "Mentions" msgid "Moderator deletion" msgstr "提及" -#: bookwyrm/models/base_model.py:17 +#: bookwyrm/models/base_model.py:20 #, fuzzy #| msgid "Un-block" msgid "Domain block" msgstr "取消封鎖" +#: bookwyrm/models/book.py:232 +#, fuzzy +#| msgid "Add books" +msgid "Audiobook" +msgstr "新增書目" + +#: bookwyrm/models/book.py:233 +#, fuzzy +#| msgid "Book" +msgid "eBook" +msgstr "書目" + +#: bookwyrm/models/book.py:234 +msgid "Graphic novel" +msgstr "" + +#: bookwyrm/models/book.py:235 +#, fuzzy +#| msgid "Add cover" +msgid "Hardcover" +msgstr "新增封面" + +#: bookwyrm/models/book.py:236 +msgid "Paperback" +msgstr "" + #: bookwyrm/models/federated_server.py:11 -#: bookwyrm/templates/settings/edit_server.html:40 -#: bookwyrm/templates/settings/federation.html:19 +#: bookwyrm/templates/settings/federation/edit_instance.html:42 +#: bookwyrm/templates/settings/federation/instance_list.html:19 msgid "Federated" msgstr "跨站" #: bookwyrm/models/federated_server.py:12 -#: bookwyrm/templates/settings/edit_server.html:41 -#: bookwyrm/templates/settings/federated_server.html:10 -#: bookwyrm/templates/settings/federation.html:23 +#: bookwyrm/templates/settings/federation/edit_instance.html:43 +#: bookwyrm/templates/settings/federation/instance.html:10 +#: bookwyrm/templates/settings/federation/instance_list.html:23 msgid "Blocked" msgstr "已封鎖" @@ -133,7 +159,7 @@ msgstr "%(value)s 不是有效的 remote_id" msgid "%(value)s is not a valid username" msgstr "%(value)s 不是有效的使用者名稱" -#: bookwyrm/models/fields.py:181 bookwyrm/templates/layout.html:164 +#: bookwyrm/models/fields.py:181 bookwyrm/templates/layout.html:171 msgid "username" msgstr "使用者名稱" @@ -141,47 +167,47 @@ msgstr "使用者名稱" msgid "A user with that username already exists." msgstr "已經存在使用該名稱的使用者。" -#: bookwyrm/settings.py:115 +#: bookwyrm/settings.py:116 msgid "Home Timeline" msgstr "主頁時間線" -#: bookwyrm/settings.py:115 +#: bookwyrm/settings.py:116 msgid "Home" msgstr "主頁" -#: bookwyrm/settings.py:116 +#: bookwyrm/settings.py:117 #, fuzzy #| msgid "Book Title" msgid "Books Timeline" msgstr "書名" -#: bookwyrm/settings.py:116 bookwyrm/templates/search/layout.html:21 +#: bookwyrm/settings.py:117 bookwyrm/templates/search/layout.html:21 #: bookwyrm/templates/search/layout.html:42 #: bookwyrm/templates/user/layout.html:81 msgid "Books" msgstr "書目" -#: bookwyrm/settings.py:162 +#: bookwyrm/settings.py:163 msgid "English" msgstr "English(英語)" -#: bookwyrm/settings.py:163 +#: bookwyrm/settings.py:164 msgid "German" msgstr "Deutsch(德語)" -#: bookwyrm/settings.py:164 +#: bookwyrm/settings.py:165 msgid "Spanish" msgstr "Español(西班牙語)" -#: bookwyrm/settings.py:165 +#: bookwyrm/settings.py:166 msgid "French" msgstr "Français(法語)" -#: bookwyrm/settings.py:166 +#: bookwyrm/settings.py:167 msgid "Simplified Chinese" msgstr "簡體中文" -#: bookwyrm/settings.py:167 +#: bookwyrm/settings.py:168 #, fuzzy #| msgid "Tranditional Chinese" msgid "Traditional Chinese" @@ -279,9 +305,7 @@ msgid "Metadata" msgstr "元資料" #: bookwyrm/templates/author/edit_author.html:33 -#: bookwyrm/templates/lists/form.html:8 -#: bookwyrm/templates/user/shelf/create_shelf_form.html:13 -#: bookwyrm/templates/user/shelf/edit_shelf_form.html:14 +#: bookwyrm/templates/lists/form.html:8 bookwyrm/templates/shelf/form.html:9 msgid "Name:" msgstr "名稱:" @@ -317,7 +341,7 @@ msgid "Openlibrary key:" msgstr "Openlibrary key:" #: bookwyrm/templates/author/edit_author.html:89 -#: bookwyrm/templates/book/edit_book.html:300 +#: bookwyrm/templates/book/edit_book.html:313 msgid "Inventaire ID:" msgstr "Inventaire ID:" @@ -331,32 +355,30 @@ msgstr "Goodreads key:" #: bookwyrm/templates/author/edit_author.html:116 #: bookwyrm/templates/book/book.html:140 -#: bookwyrm/templates/book/edit_book.html:328 +#: bookwyrm/templates/book/edit_book.html:341 #: bookwyrm/templates/book/readthrough.html:76 #: bookwyrm/templates/lists/bookmark_button.html:15 #: bookwyrm/templates/lists/form.html:44 -#: bookwyrm/templates/preferences/edit_user.html:80 -#: bookwyrm/templates/settings/announcement_form.html:69 -#: bookwyrm/templates/settings/edit_server.html:68 -#: bookwyrm/templates/settings/federated_server.html:98 -#: bookwyrm/templates/settings/site.html:113 -#: bookwyrm/templates/snippets/reading_modals/layout.html:16 -#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:42 -#: bookwyrm/templates/user_admin/user_moderation_actions.html:64 +#: bookwyrm/templates/preferences/edit_user.html:118 +#: bookwyrm/templates/settings/announcements/announcement_form.html:69 +#: bookwyrm/templates/settings/federation/edit_instance.html:74 +#: bookwyrm/templates/settings/federation/instance.html:87 +#: bookwyrm/templates/settings/site.html:134 +#: bookwyrm/templates/settings/users/user_moderation_actions.html:64 +#: bookwyrm/templates/shelf/form.html:25 +#: bookwyrm/templates/snippets/reading_modals/layout.html:18 msgid "Save" msgstr "儲存" #: bookwyrm/templates/author/edit_author.html:117 #: bookwyrm/templates/book/book.html:141 bookwyrm/templates/book/book.html:190 #: bookwyrm/templates/book/cover_modal.html:32 -#: bookwyrm/templates/book/edit_book.html:329 +#: bookwyrm/templates/book/edit_book.html:342 #: bookwyrm/templates/book/readthrough.html:77 #: bookwyrm/templates/lists/delete_list_modal.html:17 -#: bookwyrm/templates/moderation/report_modal.html:34 -#: bookwyrm/templates/settings/federated_server.html:99 +#: bookwyrm/templates/settings/federation/instance.html:88 #: bookwyrm/templates/snippets/delete_readthrough_modal.html:17 -#: bookwyrm/templates/snippets/goal_form.html:32 -#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:43 +#: bookwyrm/templates/snippets/report_modal.html:34 msgid "Cancel" msgstr "取消" @@ -392,7 +414,7 @@ msgstr "新增描述" #: bookwyrm/templates/book/book.html:136 #: bookwyrm/templates/book/edit_book.html:143 -#: bookwyrm/templates/lists/form.html:12 +#: bookwyrm/templates/lists/form.html:12 bookwyrm/templates/shelf/form.html:17 msgid "Description:" msgstr "描述:" @@ -451,7 +473,7 @@ msgstr "主題" msgid "Places" msgstr "地點" -#: bookwyrm/templates/book/book.html:292 bookwyrm/templates/layout.html:68 +#: bookwyrm/templates/book/book.html:292 bookwyrm/templates/layout.html:75 #: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12 #: bookwyrm/templates/search/layout.html:25 #: bookwyrm/templates/search/layout.html:50 @@ -465,8 +487,9 @@ msgstr "新增到列表" #: bookwyrm/templates/book/book.html:313 #: bookwyrm/templates/book/cover_modal.html:31 -#: bookwyrm/templates/lists/list.html:179 -#: bookwyrm/templates/settings/domain_form.html:26 +#: bookwyrm/templates/lists/list.html:181 +#: bookwyrm/templates/settings/email_blocklist/domain_form.html:26 +#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:32 msgid "Add" msgstr "新增" @@ -475,12 +498,12 @@ msgid "ISBN:" msgstr "ISBN:" #: bookwyrm/templates/book/book_identifiers.html:14 -#: bookwyrm/templates/book/edit_book.html:308 +#: bookwyrm/templates/book/edit_book.html:321 msgid "OCLC Number:" msgstr "OCLC 號:" #: bookwyrm/templates/book/book_identifiers.html:21 -#: bookwyrm/templates/book/edit_book.html:316 +#: bookwyrm/templates/book/edit_book.html:329 msgid "ASIN:" msgstr "ASIN:" @@ -490,7 +513,7 @@ msgid "Upload cover:" msgstr "上載封面:" #: bookwyrm/templates/book/cover_modal.html:23 -#: bookwyrm/templates/book/edit_book.html:242 +#: bookwyrm/templates/book/edit_book.html:241 msgid "Load cover from url:" msgstr "從網址載入封面:" @@ -604,11 +627,11 @@ msgid "John Doe, Jane Smith" msgstr "John Doe, Jane Smith" #: bookwyrm/templates/book/edit_book.html:227 -#: bookwyrm/templates/user/shelf/shelf.html:110 +#: bookwyrm/templates/shelf/shelf.html:127 msgid "Cover" msgstr "封面" -#: bookwyrm/templates/book/edit_book.html:255 +#: bookwyrm/templates/book/edit_book.html:253 msgid "Physical Properties" msgstr "實體性質" @@ -617,23 +640,29 @@ msgstr "實體性質" msgid "Format:" msgstr "格式:" -#: bookwyrm/templates/book/edit_book.html:265 +#: bookwyrm/templates/book/edit_book.html:268 +#, fuzzy +#| msgid "User details" +msgid "Format details:" +msgstr "使用者詳情" + +#: bookwyrm/templates/book/edit_book.html:278 msgid "Pages:" msgstr "頁數:" -#: bookwyrm/templates/book/edit_book.html:274 +#: bookwyrm/templates/book/edit_book.html:287 msgid "Book Identifiers" msgstr "書目標識號" -#: bookwyrm/templates/book/edit_book.html:276 +#: bookwyrm/templates/book/edit_book.html:289 msgid "ISBN 13:" msgstr "ISBN 13:" -#: bookwyrm/templates/book/edit_book.html:284 +#: bookwyrm/templates/book/edit_book.html:297 msgid "ISBN 10:" msgstr "ISBN 10:" -#: bookwyrm/templates/book/edit_book.html:292 +#: bookwyrm/templates/book/edit_book.html:305 msgid "Openlibrary ID:" msgstr "Openlibrary ID:" @@ -770,16 +799,16 @@ msgid "Sorry! We couldn't find that code." msgstr "" #: bookwyrm/templates/confirm_email/confirm_email.html:19 -#: bookwyrm/templates/user_admin/user_info.html:100 +#: bookwyrm/templates/settings/users/user_info.html:85 #, fuzzy #| msgid "Confirm password:" msgid "Confirmation code:" msgstr "確認密碼:" #: bookwyrm/templates/confirm_email/confirm_email.html:25 -#: bookwyrm/templates/landing/landing_layout.html:70 -#: bookwyrm/templates/moderation/report_modal.html:33 -#: bookwyrm/templates/settings/dashboard.html:93 +#: bookwyrm/templates/landing/layout.html:73 +#: bookwyrm/templates/settings/dashboard/dashboard.html:93 +#: bookwyrm/templates/snippets/report_modal.html:33 msgid "Submit" msgstr "提交" @@ -792,9 +821,9 @@ msgid "Resend confirmation link" msgstr "" #: bookwyrm/templates/confirm_email/resend_form.html:11 -#: bookwyrm/templates/landing/landing_layout.html:64 +#: bookwyrm/templates/landing/layout.html:67 #: bookwyrm/templates/password_reset_request.html:18 -#: bookwyrm/templates/preferences/edit_user.html:38 +#: bookwyrm/templates/preferences/edit_user.html:56 #: bookwyrm/templates/snippets/register_form.html:13 msgid "Email address:" msgstr "郵箱地址:" @@ -819,7 +848,7 @@ msgstr "跨站社群" #: bookwyrm/templates/directory/directory.html:4 #: bookwyrm/templates/directory/directory.html:9 -#: bookwyrm/templates/layout.html:94 +#: bookwyrm/templates/layout.html:101 msgid "Directory" msgstr "目錄" @@ -833,8 +862,8 @@ msgid "You can opt-out at any time in your profile settings msgstr "你可以在任何時候從你的 使用者資料設定 中退出。" #: bookwyrm/templates/directory/directory.html:29 +#: bookwyrm/templates/feed/goal_card.html:17 #: bookwyrm/templates/snippets/announcement.html:34 -#: bookwyrm/templates/snippets/goal_card.html:22 msgid "Dismiss message" msgstr "關閉訊息" @@ -843,13 +872,13 @@ msgid "Order by" msgstr "排列順序" #: bookwyrm/templates/directory/sort_filter.html:8 -msgid "Suggested" -msgstr "受推薦" - -#: bookwyrm/templates/directory/sort_filter.html:9 msgid "Recently active" msgstr "最近活躍" +#: bookwyrm/templates/directory/sort_filter.html:9 +msgid "Suggested" +msgstr "受推薦" + #: bookwyrm/templates/directory/user_card.html:17 #: bookwyrm/templates/directory/user_card.html:18 #: bookwyrm/templates/user/user_preview.html:16 @@ -891,7 +920,7 @@ msgstr "所有已知使用者" #: bookwyrm/templates/discover/discover.html:4 #: bookwyrm/templates/discover/discover.html:10 -#: bookwyrm/templates/layout.html:71 +#: bookwyrm/templates/layout.html:78 #, fuzzy #| msgid "Discard" msgid "Discover" @@ -1023,7 +1052,7 @@ msgid "Direct Messages with %(username)s" msgstr "與 %(username)s 私信" #: bookwyrm/templates/feed/direct_messages.html:10 -#: bookwyrm/templates/layout.html:104 +#: bookwyrm/templates/layout.html:111 msgid "Direct Messages" msgstr "私信" @@ -1045,12 +1074,24 @@ msgstr "載入 0 條未讀狀態" msgid "There aren't any activities right now! Try following a user to get started" msgstr "現在還沒有任何活動!嘗試著從關注一個使用者開始吧" +#: bookwyrm/templates/feed/goal_card.html:6 +#: bookwyrm/templates/feed/layout.html:90 +#: bookwyrm/templates/user/goal_form.html:6 +#, python-format +msgid "%(year)s Reading Goal" +msgstr "%(year)s 閱讀目標" + +#: bookwyrm/templates/feed/goal_card.html:18 +#, python-format +msgid "You can set or change your reading goal any time from your profile page" +msgstr "你可以在任何時候從你的使用者資料頁面 中設定或改變你的閱讀目標" + #: bookwyrm/templates/feed/layout.html:5 msgid "Updates" msgstr "更新" #: bookwyrm/templates/feed/layout.html:12 -#: bookwyrm/templates/user/shelf/books_header.html:3 +#: bookwyrm/templates/user/books_header.html:3 msgid "Your books" msgstr "你的書目" @@ -1059,28 +1100,22 @@ msgid "There are no books here right now! Try searching for a book to get starte msgstr "現在這裡還沒有任何書目!嘗試著從搜尋某本書開始吧" #: bookwyrm/templates/feed/layout.html:25 -#: bookwyrm/templates/user/shelf/shelf.html:38 +#: bookwyrm/templates/shelf/shelf.html:38 msgid "To Read" msgstr "想讀" #: bookwyrm/templates/feed/layout.html:26 -#: bookwyrm/templates/user/shelf/shelf.html:40 +#: bookwyrm/templates/shelf/shelf.html:40 msgid "Currently Reading" msgstr "在讀" #: bookwyrm/templates/feed/layout.html:27 +#: bookwyrm/templates/shelf/shelf.html:42 #: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown_options.html:23 #: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:12 -#: bookwyrm/templates/user/shelf/shelf.html:42 msgid "Read" msgstr "讀過" -#: bookwyrm/templates/feed/layout.html:90 bookwyrm/templates/goal.html:26 -#: bookwyrm/templates/snippets/goal_card.html:6 -#, python-format -msgid "%(year)s Reading Goal" -msgstr "%(year)s 閱讀目標" - #: bookwyrm/templates/feed/suggested_users.html:5 #: bookwyrm/templates/get_started/users.html:6 msgid "Who to follow" @@ -1108,7 +1143,7 @@ msgid "What are you reading?" msgstr "你在閱讀什麼?" #: bookwyrm/templates/get_started/books.html:9 -#: bookwyrm/templates/lists/list.html:135 +#: bookwyrm/templates/layout.html:45 bookwyrm/templates/lists/list.html:137 msgid "Search for a book" msgstr "搜尋書目" @@ -1126,8 +1161,8 @@ msgstr "你可以在開始使用 %(site_name)s 後新增書目。" #: bookwyrm/templates/get_started/books.html:17 #: bookwyrm/templates/get_started/users.html:18 #: bookwyrm/templates/get_started/users.html:19 -#: bookwyrm/templates/layout.html:44 bookwyrm/templates/layout.html:45 -#: bookwyrm/templates/lists/list.html:139 +#: bookwyrm/templates/layout.html:51 bookwyrm/templates/layout.html:52 +#: bookwyrm/templates/lists/list.html:141 #: bookwyrm/templates/search/layout.html:4 #: bookwyrm/templates/search/layout.html:9 msgid "Search" @@ -1143,7 +1178,7 @@ msgid "Popular on %(site_name)s" msgstr "%(site_name)s 上的熱門" #: bookwyrm/templates/get_started/books.html:58 -#: bookwyrm/templates/lists/list.html:152 +#: bookwyrm/templates/lists/list.html:154 msgid "No books found" msgstr "沒有找到書目" @@ -1153,7 +1188,7 @@ msgid "Save & continue" msgstr "儲存 & 繼續" #: bookwyrm/templates/get_started/layout.html:5 -#: bookwyrm/templates/landing/landing_layout.html:5 +#: bookwyrm/templates/landing/layout.html:5 msgid "Welcome" msgstr "歡迎" @@ -1188,12 +1223,12 @@ msgid "Finish" msgstr "完成" #: bookwyrm/templates/get_started/profile.html:15 -#: bookwyrm/templates/preferences/edit_user.html:24 +#: bookwyrm/templates/preferences/edit_user.html:42 msgid "Display name:" msgstr "顯示名稱:" #: bookwyrm/templates/get_started/profile.html:22 -#: bookwyrm/templates/preferences/edit_user.html:31 +#: bookwyrm/templates/preferences/edit_user.html:49 msgid "Summary:" msgstr "概要:" @@ -1202,17 +1237,17 @@ msgid "A little bit about you" msgstr "少許關於你的資訊" #: bookwyrm/templates/get_started/profile.html:32 -#: bookwyrm/templates/preferences/edit_user.html:17 +#: bookwyrm/templates/preferences/edit_user.html:27 msgid "Avatar:" msgstr "頭像:" #: bookwyrm/templates/get_started/profile.html:42 -#: bookwyrm/templates/preferences/edit_user.html:62 +#: bookwyrm/templates/preferences/edit_user.html:104 msgid "Manually approve followers:" msgstr "手動批准關注者:" #: bookwyrm/templates/get_started/profile.html:48 -#: bookwyrm/templates/preferences/edit_user.html:54 +#: bookwyrm/templates/preferences/edit_user.html:80 msgid "Show this account in suggested users:" msgstr "在推薦的使用者中顯示此帳號:" @@ -1229,39 +1264,9 @@ msgstr "搜尋使用者" msgid "No users found for \"%(query)s\"" msgstr "沒有找到 \"%(query)s\" 的使用者" -#: bookwyrm/templates/goal.html:7 -#, python-format -msgid "%(year)s Reading Progress" -msgstr "%(year)s 閱讀進度" - -#: bookwyrm/templates/goal.html:11 -msgid "Edit Goal" -msgstr "編輯目標" - -#: bookwyrm/templates/goal.html:30 -#: bookwyrm/templates/snippets/goal_card.html:13 -#, python-format -msgid "Set a goal for how many books you'll finish reading in %(year)s, and track your progress throughout the year." -msgstr "設定一個 %(year)s 內要讀多少書的目標,並記錄你全年的進度。" - -#: bookwyrm/templates/goal.html:39 -#, python-format -msgid "%(name)s hasn't set a reading goal for %(year)s." -msgstr "%(name)s 還沒有設定 %(year)s 的閱讀目標。" - -#: bookwyrm/templates/goal.html:51 -#, python-format -msgid "Your %(year)s Books" -msgstr "你 %(year)s 的書目" - -#: bookwyrm/templates/goal.html:53 -#, python-format -msgid "%(username)s's %(year)s Books" -msgstr "%(username)s 在 %(year)s 的書目" - #: bookwyrm/templates/import/import.html:5 #: bookwyrm/templates/import/import.html:9 -#: bookwyrm/templates/user/shelf/shelf.html:57 +#: bookwyrm/templates/shelf/shelf.html:57 msgid "Import Books" msgstr "匯入書目" @@ -1282,7 +1287,7 @@ msgid "Privacy setting for imported reviews:" msgstr "匯入書評的隱私設定" #: bookwyrm/templates/import/import.html:56 -#: bookwyrm/templates/settings/server_blocklist.html:64 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:64 msgid "Import" msgstr "匯入" @@ -1362,14 +1367,14 @@ msgid "Book" msgstr "書目" #: bookwyrm/templates/import/import_status.html:122 -#: bookwyrm/templates/user/shelf/shelf.html:111 -#: bookwyrm/templates/user/shelf/shelf.html:131 +#: bookwyrm/templates/shelf/shelf.html:128 +#: bookwyrm/templates/shelf/shelf.html:148 msgid "Title" msgstr "標題" #: bookwyrm/templates/import/import_status.html:125 -#: bookwyrm/templates/user/shelf/shelf.html:112 -#: bookwyrm/templates/user/shelf/shelf.html:134 +#: bookwyrm/templates/shelf/shelf.html:129 +#: bookwyrm/templates/shelf/shelf.html:151 msgid "Author" msgstr "作者" @@ -1381,8 +1386,8 @@ msgstr "已匯入" msgid "You can download your GoodReads data from the Import/Export page of your GoodReads account." msgstr "" -#: bookwyrm/templates/invite.html:4 bookwyrm/templates/invite.html:12 -#: bookwyrm/templates/login.html:51 +#: bookwyrm/templates/invite.html:4 bookwyrm/templates/invite.html:8 +#: bookwyrm/templates/login.html:49 msgid "Create an Account" msgstr "建立帳號" @@ -1413,135 +1418,144 @@ msgstr "隱私政策" msgid "Recent Books" msgstr "最近書目" -#: bookwyrm/templates/landing/landing_layout.html:17 +#: bookwyrm/templates/landing/layout.html:17 msgid "Decentralized" msgstr "去中心化" -#: bookwyrm/templates/landing/landing_layout.html:23 +#: bookwyrm/templates/landing/layout.html:23 msgid "Friendly" msgstr "友好" -#: bookwyrm/templates/landing/landing_layout.html:29 +#: bookwyrm/templates/landing/layout.html:29 msgid "Anti-Corporate" msgstr "反企業" -#: bookwyrm/templates/landing/landing_layout.html:44 +#: bookwyrm/templates/landing/layout.html:45 #, python-format msgid "Join %(name)s" msgstr "加入 %(name)s" -#: bookwyrm/templates/landing/landing_layout.html:51 -#: bookwyrm/templates/login.html:56 -msgid "This instance is closed" -msgstr "本實例不開放。" - -#: bookwyrm/templates/landing/landing_layout.html:57 -msgid "Thank you! Your request has been received." -msgstr "謝謝你!我們已經受到了你的請求。" - -#: bookwyrm/templates/landing/landing_layout.html:60 +#: bookwyrm/templates/landing/layout.html:47 msgid "Request an Invitation" msgstr "請求邀請" -#: bookwyrm/templates/landing/landing_layout.html:79 +#: bookwyrm/templates/landing/layout.html:49 +#, fuzzy, python-format +#| msgid "Registration closed text:" +msgid "%(name)s registration is closed" +msgstr "註冊關閉文字:" + +#: bookwyrm/templates/landing/layout.html:60 +msgid "Thank you! Your request has been received." +msgstr "謝謝你!我們已經受到了你的請求。" + +#: bookwyrm/templates/landing/layout.html:82 msgid "Your Account" msgstr "你的帳號" -#: bookwyrm/templates/layout.html:40 -msgid "Search for a book or user" +#: bookwyrm/templates/layout.html:13 +#, fuzzy, python-format +#| msgid "About %(site_name)s" +msgid "%(site_name)s search" +msgstr "關於 %(site_name)s" + +#: bookwyrm/templates/layout.html:43 +#, fuzzy +#| msgid "Search for a book or user" +msgid "Search for a book, user, or list" msgstr "搜尋書目或使用者" -#: bookwyrm/templates/layout.html:54 bookwyrm/templates/layout.html:55 +#: bookwyrm/templates/layout.html:61 bookwyrm/templates/layout.html:62 msgid "Main navigation menu" msgstr "主導航選單" -#: bookwyrm/templates/layout.html:65 +#: bookwyrm/templates/layout.html:72 msgid "Feed" msgstr "動態" -#: bookwyrm/templates/layout.html:99 +#: bookwyrm/templates/layout.html:106 msgid "Your Books" msgstr "你的書目" -#: bookwyrm/templates/layout.html:109 +#: bookwyrm/templates/layout.html:116 msgid "Settings" msgstr "設定" -#: bookwyrm/templates/layout.html:118 +#: bookwyrm/templates/layout.html:125 +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:15 +#: bookwyrm/templates/settings/invites/manage_invites.html:3 +#: bookwyrm/templates/settings/invites/manage_invites.html:15 #: bookwyrm/templates/settings/layout.html:40 -#: bookwyrm/templates/settings/manage_invite_requests.html:15 -#: bookwyrm/templates/settings/manage_invites.html:3 -#: bookwyrm/templates/settings/manage_invites.html:15 msgid "Invites" msgstr "邀請" -#: bookwyrm/templates/layout.html:125 +#: bookwyrm/templates/layout.html:132 msgid "Admin" msgstr "管理員" -#: bookwyrm/templates/layout.html:132 +#: bookwyrm/templates/layout.html:139 msgid "Log out" msgstr "登出" -#: bookwyrm/templates/layout.html:140 bookwyrm/templates/layout.html:141 +#: bookwyrm/templates/layout.html:147 bookwyrm/templates/layout.html:148 #: bookwyrm/templates/notifications.html:6 #: bookwyrm/templates/notifications.html:11 msgid "Notifications" msgstr "通知" -#: bookwyrm/templates/layout.html:163 bookwyrm/templates/layout.html:167 -#: bookwyrm/templates/login.html:22 +#: bookwyrm/templates/layout.html:170 bookwyrm/templates/layout.html:174 +#: bookwyrm/templates/login.html:21 #: bookwyrm/templates/snippets/register_form.html:4 msgid "Username:" msgstr "使用者名稱:" -#: bookwyrm/templates/layout.html:168 +#: bookwyrm/templates/layout.html:175 msgid "password" msgstr "密碼" -#: bookwyrm/templates/layout.html:169 bookwyrm/templates/login.html:41 +#: bookwyrm/templates/layout.html:176 bookwyrm/templates/login.html:40 msgid "Forgot your password?" msgstr "忘記了密碼?" -#: bookwyrm/templates/layout.html:172 bookwyrm/templates/login.html:10 -#: bookwyrm/templates/login.html:38 +#: bookwyrm/templates/layout.html:179 bookwyrm/templates/login.html:7 +#: bookwyrm/templates/login.html:37 msgid "Log in" msgstr "登入" -#: bookwyrm/templates/layout.html:180 +#: bookwyrm/templates/layout.html:187 msgid "Join" msgstr "加入" -#: bookwyrm/templates/layout.html:214 +#: bookwyrm/templates/layout.html:221 #, fuzzy #| msgid "Successfully imported" msgid "Successfully posted status" msgstr "成功匯入了" -#: bookwyrm/templates/layout.html:215 +#: bookwyrm/templates/layout.html:222 #, fuzzy #| msgid "Boost status" msgid "Error posting status" msgstr "轉發狀態" -#: bookwyrm/templates/layout.html:223 +#: bookwyrm/templates/layout.html:230 msgid "About this instance" msgstr "關於本實例" -#: bookwyrm/templates/layout.html:227 +#: bookwyrm/templates/layout.html:234 msgid "Contact site admin" msgstr "聯絡網站管理員" -#: bookwyrm/templates/layout.html:231 +#: bookwyrm/templates/layout.html:238 msgid "Documentation" msgstr "文件:" -#: bookwyrm/templates/layout.html:238 +#: bookwyrm/templates/layout.html:245 #, python-format msgid "Support %(site_name)s on %(support_title)s" msgstr "在 %(support_title)s 上支援 %(site_name)s" -#: bookwyrm/templates/layout.html:242 +#: bookwyrm/templates/layout.html:249 msgid "BookWyrm's source code is freely available. You can contribute or report issues on GitHub." msgstr "BookWyrm 是開源軟體。你可以在 GitHub 貢獻或報告問題。" @@ -1599,8 +1613,9 @@ msgid "This action cannot be un-done" msgstr "" #: bookwyrm/templates/lists/delete_list_modal.html:15 -#: bookwyrm/templates/settings/announcement.html:20 -#: bookwyrm/templates/settings/email_blocklist.html:49 +#: bookwyrm/templates/settings/announcements/announcement.html:20 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:49 +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:36 #: bookwyrm/templates/snippets/delete_readthrough_modal.html:15 #: bookwyrm/templates/snippets/follow_request_buttons.html:12 msgid "Delete" @@ -1631,9 +1646,8 @@ msgstr "管理" msgid "Anyone can suggest books, subject to your approval" msgstr "任何人都可以推薦書目、主題,但須經你的批准。" -#: bookwyrm/templates/lists/form.html:31 -#: bookwyrm/templates/moderation/reports.html:25 -#: bookwyrm/templates/search/book.html:30 +#: bookwyrm/templates/lists/form.html:31 bookwyrm/templates/search/book.html:30 +#: bookwyrm/templates/settings/reports/reports.html:25 #: bookwyrm/templates/snippets/announcement.html:16 msgid "Open" msgstr "開放" @@ -1642,7 +1656,7 @@ msgstr "開放" msgid "Anyone can add books to this list" msgstr "任何人都可以向此列表新增書目" -#: bookwyrm/templates/lists/form.html:49 +#: bookwyrm/templates/lists/form.html:50 #, fuzzy #| msgid "Delete status" msgid "Delete list" @@ -1665,7 +1679,7 @@ msgstr "此列表當前是空的" msgid "Added by %(username)s" msgstr "由 %(username)s 新增" -#: bookwyrm/templates/lists/list.html:74 +#: bookwyrm/templates/lists/list.html:75 msgid "List position" msgstr "列表位置:" @@ -1673,42 +1687,42 @@ msgstr "列表位置:" msgid "Set" msgstr "設定" -#: bookwyrm/templates/lists/list.html:89 +#: bookwyrm/templates/lists/list.html:91 #: bookwyrm/templates/snippets/shelf_selector.html:26 msgid "Remove" msgstr "移除" -#: bookwyrm/templates/lists/list.html:103 -#: bookwyrm/templates/lists/list.html:120 +#: bookwyrm/templates/lists/list.html:105 +#: bookwyrm/templates/lists/list.html:122 msgid "Sort List" msgstr "排序列表" -#: bookwyrm/templates/lists/list.html:113 +#: bookwyrm/templates/lists/list.html:115 msgid "Direction" msgstr "方向" -#: bookwyrm/templates/lists/list.html:127 +#: bookwyrm/templates/lists/list.html:129 msgid "Add Books" msgstr "新增書目" -#: bookwyrm/templates/lists/list.html:129 +#: bookwyrm/templates/lists/list.html:131 msgid "Suggest Books" msgstr "推薦書目" -#: bookwyrm/templates/lists/list.html:140 +#: bookwyrm/templates/lists/list.html:142 msgid "search" msgstr "搜尋" -#: bookwyrm/templates/lists/list.html:146 +#: bookwyrm/templates/lists/list.html:148 msgid "Clear search" msgstr "清除搜尋" -#: bookwyrm/templates/lists/list.html:151 +#: bookwyrm/templates/lists/list.html:153 #, python-format msgid "No books found matching the query \"%(query)s\"" msgstr "沒有符合 \"%(query)s\" 請求的書目" -#: bookwyrm/templates/lists/list.html:179 +#: bookwyrm/templates/lists/list.html:181 msgid "Suggest" msgstr "推薦" @@ -1738,110 +1752,19 @@ msgstr "建立列表" msgid "Login" msgstr "登入" -#: bookwyrm/templates/login.html:16 +#: bookwyrm/templates/login.html:15 msgid "Success! Email address confirmed." msgstr "" -#: bookwyrm/templates/login.html:28 bookwyrm/templates/password_reset.html:17 +#: bookwyrm/templates/login.html:27 bookwyrm/templates/password_reset.html:17 #: bookwyrm/templates/snippets/register_form.html:22 msgid "Password:" msgstr "密碼:" -#: bookwyrm/templates/login.html:57 -msgid "Contact an administrator to get an invite" -msgstr "聯絡管理員以取得邀請" - -#: bookwyrm/templates/login.html:68 +#: bookwyrm/templates/login.html:62 msgid "More about this site" msgstr "關於本網站的更多" -#: bookwyrm/templates/moderation/report.html:5 -#: bookwyrm/templates/moderation/report.html:6 -#: bookwyrm/templates/moderation/report_preview.html:6 -#, python-format -msgid "Report #%(report_id)s: %(username)s" -msgstr "舉報 #%(report_id)s: %(username)s" - -#: bookwyrm/templates/moderation/report.html:10 -msgid "Back to reports" -msgstr "回到舉報" - -#: bookwyrm/templates/moderation/report.html:22 -msgid "Moderator Comments" -msgstr "監察員評論" - -#: bookwyrm/templates/moderation/report.html:40 -#: bookwyrm/templates/snippets/create_status.html:28 -msgid "Comment" -msgstr "評論" - -#: bookwyrm/templates/moderation/report.html:45 -msgid "Reported statuses" -msgstr "被舉報的狀態" - -#: bookwyrm/templates/moderation/report.html:47 -msgid "No statuses reported" -msgstr "沒有被舉報的狀態" - -#: bookwyrm/templates/moderation/report.html:53 -msgid "Status has been deleted" -msgstr "狀態已被刪除" - -#: bookwyrm/templates/moderation/report_modal.html:6 -#, python-format -msgid "Report @%(username)s" -msgstr "舉報 %(username)s" - -#: bookwyrm/templates/moderation/report_modal.html:23 -#, python-format -msgid "This report will be sent to %(site_name)s's moderators for review." -msgstr "本舉報會被發送至 %(site_name)s 的監察員以複查。" - -#: bookwyrm/templates/moderation/report_modal.html:24 -msgid "More info about this report:" -msgstr "關於本舉報的更多資訊" - -#: bookwyrm/templates/moderation/report_preview.html:13 -msgid "No notes provided" -msgstr "沒有提供摘記" - -#: bookwyrm/templates/moderation/report_preview.html:20 -#, python-format -msgid "Reported by %(username)s" -msgstr "由 %(username)s 舉報" - -#: bookwyrm/templates/moderation/report_preview.html:30 -msgid "Re-open" -msgstr "重新開啟" - -#: bookwyrm/templates/moderation/report_preview.html:32 -msgid "Resolve" -msgstr "已解決" - -#: bookwyrm/templates/moderation/reports.html:6 -#, python-format -msgid "Reports: %(instance_name)s" -msgstr "舉報: %(instance_name)s" - -#: bookwyrm/templates/moderation/reports.html:8 -#: bookwyrm/templates/moderation/reports.html:17 -#: bookwyrm/templates/settings/layout.html:55 -msgid "Reports" -msgstr "舉報" - -#: bookwyrm/templates/moderation/reports.html:14 -#, python-format -msgid "Reports: %(instance_name)s" -msgstr "舉報: %(instance_name)s" - -#: bookwyrm/templates/moderation/reports.html:28 -msgid "Resolved" -msgstr "已解決" - -#: bookwyrm/templates/moderation/reports.html:37 -msgid "No reports found." -msgstr "沒有找到舉報" - #: bookwyrm/templates/notifications.html:16 msgid "Delete notifications" msgstr "刪除通知" @@ -1982,7 +1905,7 @@ msgstr "重設密碼" #: bookwyrm/templates/preferences/blocks.html:4 #: bookwyrm/templates/preferences/blocks.html:7 -#: bookwyrm/templates/preferences/layout.html:30 +#: bookwyrm/templates/preferences/layout.html:31 msgid "Blocked Users" msgstr "封鎖的使用者" @@ -1993,7 +1916,7 @@ msgstr "當前沒有被封鎖的使用者。" #: bookwyrm/templates/preferences/change_password.html:4 #: bookwyrm/templates/preferences/change_password.html:7 #: bookwyrm/templates/preferences/change_password.html:21 -#: bookwyrm/templates/preferences/layout.html:19 +#: bookwyrm/templates/preferences/layout.html:20 msgid "Change Password" msgstr "更改密碼" @@ -2004,8 +1927,8 @@ msgstr "新密碼:" #: bookwyrm/templates/preferences/delete_user.html:4 #: bookwyrm/templates/preferences/delete_user.html:7 #: bookwyrm/templates/preferences/delete_user.html:26 -#: bookwyrm/templates/preferences/layout.html:23 -#: bookwyrm/templates/user_admin/delete_user_form.html:23 +#: bookwyrm/templates/preferences/layout.html:24 +#: bookwyrm/templates/settings/users/delete_user_form.html:23 #, fuzzy #| msgid "Create an Account" msgid "Delete Account" @@ -2021,46 +1944,62 @@ msgstr "" #: bookwyrm/templates/preferences/edit_user.html:4 #: bookwyrm/templates/preferences/edit_user.html:7 +#: bookwyrm/templates/preferences/layout.html:15 msgid "Edit Profile" msgstr "編輯使用者資料" -#: bookwyrm/templates/preferences/edit_user.html:46 +#: bookwyrm/templates/preferences/edit_user.html:12 +#: bookwyrm/templates/preferences/edit_user.html:25 +#: bookwyrm/templates/settings/users/user_info.html:7 +msgid "Profile" +msgstr "使用者資料" + +#: bookwyrm/templates/preferences/edit_user.html:13 +#: bookwyrm/templates/preferences/edit_user.html:68 +#, fuzzy +#| msgid "Email preference" +msgid "Display preferences" +msgstr "郵箱偏好" + +#: bookwyrm/templates/preferences/edit_user.html:14 +#: bookwyrm/templates/preferences/edit_user.html:100 +#, fuzzy +#| msgid "Post privacy" +msgid "Privacy" +msgstr "發文隱私" + +#: bookwyrm/templates/preferences/edit_user.html:72 #, fuzzy #| msgid "Show set reading goal prompt in feed:" msgid "Show reading goal prompt in feed:" msgstr "在即時動態中顯示設定的閱讀目標提示:" -#: bookwyrm/templates/preferences/edit_user.html:50 +#: bookwyrm/templates/preferences/edit_user.html:76 #, fuzzy #| msgid "Show this account in suggested users:" msgid "Show suggested users:" msgstr "在推薦的使用者中顯示此帳號:" -#: bookwyrm/templates/preferences/edit_user.html:58 +#: bookwyrm/templates/preferences/edit_user.html:85 #, python-format msgid "Your account will show up in the directory, and may be recommended to other BookWyrm users." msgstr "你的帳號會顯示在 目錄 中,並可能受其它 BookWyrm 使用者推薦。" -#: bookwyrm/templates/preferences/edit_user.html:68 +#: bookwyrm/templates/preferences/edit_user.html:89 +msgid "Preferred Timezone: " +msgstr "偏好時區:" + +#: bookwyrm/templates/preferences/edit_user.html:110 #, fuzzy #| msgid "Post privacy" msgid "Default post privacy:" msgstr "發文隱私" -#: bookwyrm/templates/preferences/edit_user.html:75 -msgid "Preferred Timezone: " -msgstr "偏好時區:" - #: bookwyrm/templates/preferences/layout.html:11 msgid "Account" msgstr "帳號" -#: bookwyrm/templates/preferences/layout.html:15 -#: bookwyrm/templates/user_admin/user_info.html:7 -msgid "Profile" -msgstr "使用者資料" - -#: bookwyrm/templates/preferences/layout.html:26 +#: bookwyrm/templates/preferences/layout.html:27 msgid "Relationships" msgstr "關係" @@ -2104,11 +2043,11 @@ msgstr "搜尋類別" #: bookwyrm/templates/search/layout.html:23 #: bookwyrm/templates/search/layout.html:46 -#: bookwyrm/templates/settings/email_blocklist.html:27 -#: bookwyrm/templates/settings/federation.html:44 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:27 +#: bookwyrm/templates/settings/federation/instance_list.html:44 #: bookwyrm/templates/settings/layout.html:34 -#: bookwyrm/templates/user_admin/user_admin.html:3 -#: bookwyrm/templates/user_admin/user_admin.html:10 +#: bookwyrm/templates/settings/users/user_admin.html:3 +#: bookwyrm/templates/settings/users/user_admin.html:10 msgid "Users" msgstr "使用者" @@ -2117,368 +2056,551 @@ msgstr "使用者" msgid "No results found for \"%(query)s\"" msgstr "沒有找到 \"%(query)s\" 的搜尋結果" -#: bookwyrm/templates/settings/announcement.html:3 -#: bookwyrm/templates/settings/announcement.html:6 +#: bookwyrm/templates/settings/announcements/announcement.html:3 +#: bookwyrm/templates/settings/announcements/announcement.html:6 msgid "Announcement" msgstr "公告" -#: bookwyrm/templates/settings/announcement.html:7 -#: bookwyrm/templates/settings/federated_server.html:13 +#: bookwyrm/templates/settings/announcements/announcement.html:7 +#: bookwyrm/templates/settings/federation/instance.html:13 msgid "Back to list" msgstr "回到列表" -#: bookwyrm/templates/settings/announcement.html:11 -#: bookwyrm/templates/settings/announcement_form.html:6 +#: bookwyrm/templates/settings/announcements/announcement.html:11 +#: bookwyrm/templates/settings/announcements/announcement_form.html:6 msgid "Edit Announcement" msgstr "編輯公告" -#: bookwyrm/templates/settings/announcement.html:35 +#: bookwyrm/templates/settings/announcements/announcement.html:35 msgid "Visible:" msgstr "可見:" -#: bookwyrm/templates/settings/announcement.html:38 +#: bookwyrm/templates/settings/announcements/announcement.html:38 msgid "True" msgstr "是" -#: bookwyrm/templates/settings/announcement.html:40 +#: bookwyrm/templates/settings/announcements/announcement.html:40 msgid "False" msgstr "否" -#: bookwyrm/templates/settings/announcement.html:47 -#: bookwyrm/templates/settings/announcement_form.html:40 -#: bookwyrm/templates/settings/dashboard.html:71 +#: bookwyrm/templates/settings/announcements/announcement.html:47 +#: bookwyrm/templates/settings/announcements/announcement_form.html:40 +#: bookwyrm/templates/settings/dashboard/dashboard.html:71 msgid "Start date:" msgstr "開始日期:" -#: bookwyrm/templates/settings/announcement.html:54 -#: bookwyrm/templates/settings/announcement_form.html:49 -#: bookwyrm/templates/settings/dashboard.html:77 +#: bookwyrm/templates/settings/announcements/announcement.html:54 +#: bookwyrm/templates/settings/announcements/announcement_form.html:49 +#: bookwyrm/templates/settings/dashboard/dashboard.html:77 msgid "End date:" msgstr "結束日期:" -#: bookwyrm/templates/settings/announcement.html:60 -#: bookwyrm/templates/settings/announcement_form.html:58 +#: bookwyrm/templates/settings/announcements/announcement.html:60 +#: bookwyrm/templates/settings/announcements/announcement_form.html:58 msgid "Active:" msgstr "活躍:" -#: bookwyrm/templates/settings/announcement_form.html:8 -#: bookwyrm/templates/settings/announcements.html:8 +#: bookwyrm/templates/settings/announcements/announcement_form.html:8 +#: bookwyrm/templates/settings/announcements/announcements.html:8 msgid "Create Announcement" msgstr "建立公告" -#: bookwyrm/templates/settings/announcement_form.html:16 +#: bookwyrm/templates/settings/announcements/announcement_form.html:16 #, fuzzy #| msgid "Preview" msgid "Preview:" msgstr "預覽" -#: bookwyrm/templates/settings/announcement_form.html:23 +#: bookwyrm/templates/settings/announcements/announcement_form.html:23 #, fuzzy #| msgid "Content" msgid "Content:" msgstr "內容" -#: bookwyrm/templates/settings/announcement_form.html:30 +#: bookwyrm/templates/settings/announcements/announcement_form.html:30 #, fuzzy #| msgid "End date:" msgid "Event date:" msgstr "結束日期:" -#: bookwyrm/templates/settings/announcements.html:3 -#: bookwyrm/templates/settings/announcements.html:5 -#: bookwyrm/templates/settings/layout.html:68 +#: bookwyrm/templates/settings/announcements/announcements.html:3 +#: bookwyrm/templates/settings/announcements/announcements.html:5 +#: bookwyrm/templates/settings/layout.html:72 msgid "Announcements" msgstr "公告" -#: bookwyrm/templates/settings/announcements.html:22 -#: bookwyrm/templates/settings/federation.html:36 +#: bookwyrm/templates/settings/announcements/announcements.html:22 +#: bookwyrm/templates/settings/federation/instance_list.html:36 msgid "Date added" msgstr "新增日期:" -#: bookwyrm/templates/settings/announcements.html:26 +#: bookwyrm/templates/settings/announcements/announcements.html:26 msgid "Preview" msgstr "預覽" -#: bookwyrm/templates/settings/announcements.html:30 +#: bookwyrm/templates/settings/announcements/announcements.html:30 msgid "Start date" msgstr "開始日期" -#: bookwyrm/templates/settings/announcements.html:34 +#: bookwyrm/templates/settings/announcements/announcements.html:34 msgid "End date" msgstr "結束日期" -#: bookwyrm/templates/settings/announcements.html:38 -#: bookwyrm/templates/settings/federation.html:46 -#: bookwyrm/templates/settings/manage_invite_requests.html:44 -#: bookwyrm/templates/settings/status_filter.html:5 -#: bookwyrm/templates/user_admin/user_admin.html:34 -#: bookwyrm/templates/user_admin/user_info.html:20 +#: bookwyrm/templates/settings/announcements/announcements.html:38 +#: bookwyrm/templates/settings/federation/instance_list.html:46 +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:44 +#: bookwyrm/templates/settings/invites/status_filter.html:5 +#: bookwyrm/templates/settings/users/user_admin.html:34 +#: bookwyrm/templates/settings/users/user_info.html:20 msgid "Status" msgstr "狀態" -#: bookwyrm/templates/settings/announcements.html:48 +#: bookwyrm/templates/settings/announcements/announcements.html:48 msgid "active" msgstr "啟用" -#: bookwyrm/templates/settings/announcements.html:48 +#: bookwyrm/templates/settings/announcements/announcements.html:48 msgid "inactive" msgstr "停用" -#: bookwyrm/templates/settings/announcements.html:54 +#: bookwyrm/templates/settings/announcements/announcements.html:52 #, fuzzy #| msgid "Announcements" -msgid "No announcements found." +msgid "No announcements found" msgstr "公告" -#: bookwyrm/templates/settings/dashboard.html:6 -#: bookwyrm/templates/settings/dashboard.html:8 +#: bookwyrm/templates/settings/dashboard/dashboard.html:6 +#: bookwyrm/templates/settings/dashboard/dashboard.html:8 #: bookwyrm/templates/settings/layout.html:26 msgid "Dashboard" msgstr "" -#: bookwyrm/templates/settings/dashboard.html:15 +#: bookwyrm/templates/settings/dashboard/dashboard.html:15 #, fuzzy #| msgid "Local users" msgid "Total users" msgstr "本地使用者" -#: bookwyrm/templates/settings/dashboard.html:21 -#: bookwyrm/templates/settings/dashboard_user_chart.html:12 +#: bookwyrm/templates/settings/dashboard/dashboard.html:21 +#: bookwyrm/templates/settings/dashboard/dashboard_user_chart.html:12 msgid "Active this month" msgstr "" -#: bookwyrm/templates/settings/dashboard.html:27 +#: bookwyrm/templates/settings/dashboard/dashboard.html:27 #, fuzzy #| msgid "Status" msgid "Statuses" msgstr "狀態" -#: bookwyrm/templates/settings/dashboard.html:33 +#: bookwyrm/templates/settings/dashboard/dashboard.html:33 msgid "Works" msgstr "" -#: bookwyrm/templates/settings/dashboard.html:43 +#: bookwyrm/templates/settings/dashboard/dashboard.html:43 #, fuzzy, python-format #| msgid "%(count)d uses" msgid "%(display_count)s open report" msgid_plural "%(display_count)s open reports" msgstr[0] "%(count)d 次使用" -#: bookwyrm/templates/settings/dashboard.html:54 +#: bookwyrm/templates/settings/dashboard/dashboard.html:54 #, fuzzy, python-format #| msgid "%(count)d uses" msgid "%(display_count)s invite request" msgid_plural "%(display_count)s invite requests" msgstr[0] "%(count)d 次使用" -#: bookwyrm/templates/settings/dashboard.html:65 +#: bookwyrm/templates/settings/dashboard/dashboard.html:65 #, fuzzy #| msgid "User Activity" msgid "Instance Activity" msgstr "使用者活動" -#: bookwyrm/templates/settings/dashboard.html:83 +#: bookwyrm/templates/settings/dashboard/dashboard.html:83 msgid "Interval:" msgstr "" -#: bookwyrm/templates/settings/dashboard.html:86 +#: bookwyrm/templates/settings/dashboard/dashboard.html:87 msgid "Days" msgstr "" -#: bookwyrm/templates/settings/dashboard.html:87 +#: bookwyrm/templates/settings/dashboard/dashboard.html:88 #, fuzzy #| msgid "One Week" msgid "Weeks" msgstr "一週" -#: bookwyrm/templates/settings/dashboard.html:100 +#: bookwyrm/templates/settings/dashboard/dashboard.html:100 #, fuzzy #| msgid "User Activity" msgid "User signup activity" msgstr "使用者活動" -#: bookwyrm/templates/settings/dashboard.html:106 +#: bookwyrm/templates/settings/dashboard/dashboard.html:106 #, fuzzy #| msgid "User Activity" msgid "Status activity" msgstr "使用者活動" -#: bookwyrm/templates/settings/dashboard_status_chart.html:7 +#: bookwyrm/templates/settings/dashboard/dashboard_status_chart.html:7 #, fuzzy #| msgid "No statuses reported" msgid "Statuses posted" msgstr "沒有被舉報的狀態" -#: bookwyrm/templates/settings/dashboard_user_chart.html:7 +#: bookwyrm/templates/settings/dashboard/dashboard_user_chart.html:7 msgid "Total" msgstr "" -#: bookwyrm/templates/settings/domain_form.html:5 -#: bookwyrm/templates/settings/email_blocklist.html:10 +#: bookwyrm/templates/settings/email_blocklist/domain_form.html:5 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:10 msgid "Add domain" msgstr "" -#: bookwyrm/templates/settings/domain_form.html:11 +#: bookwyrm/templates/settings/email_blocklist/domain_form.html:11 msgid "Domain:" msgstr "" -#: bookwyrm/templates/settings/edit_server.html:3 -#: bookwyrm/templates/settings/edit_server.html:6 -#: bookwyrm/templates/settings/edit_server.html:20 -#: bookwyrm/templates/settings/federation.html:9 -#: bookwyrm/templates/settings/federation.html:10 -#: bookwyrm/templates/settings/server_blocklist.html:3 -#: bookwyrm/templates/settings/server_blocklist.html:20 -msgid "Add instance" -msgstr "新增實例" - -#: bookwyrm/templates/settings/edit_server.html:7 -#: bookwyrm/templates/settings/server_blocklist.html:7 -msgid "Back to instance list" -msgstr "回到實例列表" - -#: bookwyrm/templates/settings/edit_server.html:16 -#: bookwyrm/templates/settings/server_blocklist.html:16 -msgid "Import block list" -msgstr "匯入封鎖列表" - -#: bookwyrm/templates/settings/edit_server.html:30 -msgid "Instance:" -msgstr "實例:" - -#: bookwyrm/templates/settings/edit_server.html:37 -#: bookwyrm/templates/settings/federated_server.html:31 -#: bookwyrm/templates/user_admin/user_info.html:125 -msgid "Status:" -msgstr "狀態:" - -#: bookwyrm/templates/settings/edit_server.html:48 -#: bookwyrm/templates/settings/federated_server.html:23 -#: bookwyrm/templates/user_admin/user_info.html:117 -msgid "Software:" -msgstr "軟件:" - -#: bookwyrm/templates/settings/edit_server.html:55 -#: bookwyrm/templates/settings/federated_server.html:27 -#: bookwyrm/templates/user_admin/user_info.html:121 -msgid "Version:" -msgstr "版本:" - -#: bookwyrm/templates/settings/edit_server.html:64 -msgid "Notes:" -msgstr "備註:" - -#: bookwyrm/templates/settings/email_blocklist.html:5 -#: bookwyrm/templates/settings/email_blocklist.html:7 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:5 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:7 #: bookwyrm/templates/settings/layout.html:59 #, fuzzy #| msgid "Import Blocklist" msgid "Email Blocklist" msgstr "匯入封鎖列表" -#: bookwyrm/templates/settings/email_blocklist.html:18 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:18 msgid "When someone tries to register with an email from this domain, no account will be created. The registration process will appear to have worked." msgstr "" -#: bookwyrm/templates/settings/email_blocklist.html:25 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:25 msgid "Domain" msgstr "" -#: bookwyrm/templates/settings/email_blocklist.html:29 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:29 +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:27 #, fuzzy #| msgid "Actions" msgid "Options" msgstr "動作" -#: bookwyrm/templates/settings/email_blocklist.html:38 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:38 #, fuzzy, python-format #| msgid "%(count)d uses" msgid "%(display_count)s user" msgid_plural "%(display_count)s users" msgstr[0] "%(count)d 次使用" -#: bookwyrm/templates/settings/federated_server.html:19 +#: bookwyrm/templates/settings/email_blocklist/email_blocklist.html:59 +#, fuzzy +#| msgid "No users currently blocked." +msgid "No email domains currently blocked" +msgstr "當前沒有被封鎖的使用者。" + +#: bookwyrm/templates/settings/federation/edit_instance.html:3 +#: bookwyrm/templates/settings/federation/edit_instance.html:6 +#: bookwyrm/templates/settings/federation/edit_instance.html:20 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:3 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:20 +#: bookwyrm/templates/settings/federation/instance_list.html:9 +#: bookwyrm/templates/settings/federation/instance_list.html:10 +msgid "Add instance" +msgstr "新增實例" + +#: bookwyrm/templates/settings/federation/edit_instance.html:7 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:7 +msgid "Back to instance list" +msgstr "回到實例列表" + +#: bookwyrm/templates/settings/federation/edit_instance.html:16 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:16 +msgid "Import block list" +msgstr "匯入封鎖列表" + +#: bookwyrm/templates/settings/federation/edit_instance.html:30 +msgid "Instance:" +msgstr "實例:" + +#: bookwyrm/templates/settings/federation/edit_instance.html:39 +#: bookwyrm/templates/settings/federation/instance.html:28 +#: bookwyrm/templates/settings/users/user_info.html:106 +msgid "Status:" +msgstr "狀態:" + +#: bookwyrm/templates/settings/federation/edit_instance.html:52 +#: bookwyrm/templates/settings/federation/instance.html:22 +#: bookwyrm/templates/settings/users/user_info.html:100 +msgid "Software:" +msgstr "軟件:" + +#: bookwyrm/templates/settings/federation/edit_instance.html:61 +#: bookwyrm/templates/settings/federation/instance.html:25 +#: bookwyrm/templates/settings/users/user_info.html:103 +msgid "Version:" +msgstr "版本:" + +#: bookwyrm/templates/settings/federation/edit_instance.html:70 +msgid "Notes:" +msgstr "備註:" + +#: bookwyrm/templates/settings/federation/instance.html:19 msgid "Details" msgstr "詳細" -#: bookwyrm/templates/settings/federated_server.html:39 +#: bookwyrm/templates/settings/federation/instance.html:35 #: bookwyrm/templates/user/layout.html:63 msgid "Activity" msgstr "活動" -#: bookwyrm/templates/settings/federated_server.html:43 +#: bookwyrm/templates/settings/federation/instance.html:38 msgid "Users:" msgstr "使用者:" -#: bookwyrm/templates/settings/federated_server.html:46 -#: bookwyrm/templates/settings/federated_server.html:53 +#: bookwyrm/templates/settings/federation/instance.html:41 +#: bookwyrm/templates/settings/federation/instance.html:47 msgid "View all" msgstr "檢視全部" -#: bookwyrm/templates/settings/federated_server.html:50 -#: bookwyrm/templates/user_admin/user_info.html:59 +#: bookwyrm/templates/settings/federation/instance.html:44 +#: bookwyrm/templates/settings/users/user_info.html:56 msgid "Reports:" msgstr "舉報:" -#: bookwyrm/templates/settings/federated_server.html:57 +#: bookwyrm/templates/settings/federation/instance.html:50 msgid "Followed by us:" msgstr "我們關注了的:" -#: bookwyrm/templates/settings/federated_server.html:63 +#: bookwyrm/templates/settings/federation/instance.html:55 msgid "Followed by them:" msgstr "TA 們關注了的:" -#: bookwyrm/templates/settings/federated_server.html:69 +#: bookwyrm/templates/settings/federation/instance.html:60 msgid "Blocked by us:" msgstr "我們所封鎖的:" -#: bookwyrm/templates/settings/federated_server.html:82 -#: bookwyrm/templates/user_admin/user_info.html:130 +#: bookwyrm/templates/settings/federation/instance.html:72 +#: bookwyrm/templates/settings/users/user_info.html:110 msgid "Notes" msgstr "備註" -#: bookwyrm/templates/settings/federated_server.html:85 +#: bookwyrm/templates/settings/federation/instance.html:75 msgid "Edit" msgstr "編輯" -#: bookwyrm/templates/settings/federated_server.html:105 -#: bookwyrm/templates/user_admin/user_moderation_actions.html:8 +#: bookwyrm/templates/settings/federation/instance.html:79 +msgid "No notes" +msgstr "" + +#: bookwyrm/templates/settings/federation/instance.html:94 +#: bookwyrm/templates/settings/users/user_moderation_actions.html:8 msgid "Actions" msgstr "動作" -#: bookwyrm/templates/settings/federated_server.html:109 +#: bookwyrm/templates/settings/federation/instance.html:98 #: bookwyrm/templates/snippets/block_button.html:5 msgid "Block" msgstr "封鎖" -#: bookwyrm/templates/settings/federated_server.html:110 +#: bookwyrm/templates/settings/federation/instance.html:99 msgid "All users from this instance will be deactivated." msgstr "來自此實例的所有使用者將會被停用。" -#: bookwyrm/templates/settings/federated_server.html:115 +#: bookwyrm/templates/settings/federation/instance.html:104 #: bookwyrm/templates/snippets/block_button.html:10 msgid "Un-block" msgstr "取消封鎖" -#: bookwyrm/templates/settings/federated_server.html:116 +#: bookwyrm/templates/settings/federation/instance.html:105 msgid "All users from this instance will be re-activated." msgstr "來自此實例的所有使用者將會被重新啟用。" -#: bookwyrm/templates/settings/federation.html:3 -#: bookwyrm/templates/settings/federation.html:5 +#: bookwyrm/templates/settings/federation/instance_blocklist.html:6 +msgid "Import Blocklist" +msgstr "匯入封鎖列表" + +#: bookwyrm/templates/settings/federation/instance_blocklist.html:26 +#: bookwyrm/templates/snippets/goal_progress.html:7 +msgid "Success!" +msgstr "成功!" + +#: bookwyrm/templates/settings/federation/instance_blocklist.html:30 +msgid "Successfully blocked:" +msgstr "成功封鎖了" + +#: bookwyrm/templates/settings/federation/instance_blocklist.html:32 +msgid "Failed:" +msgstr "已失敗:" + +#: bookwyrm/templates/settings/federation/instance_list.html:3 +#: bookwyrm/templates/settings/federation/instance_list.html:5 #: bookwyrm/templates/settings/layout.html:45 msgid "Federated Instances" msgstr "聯合實例" -#: bookwyrm/templates/settings/federation.html:32 -#: bookwyrm/templates/user_admin/server_filter.html:5 +#: bookwyrm/templates/settings/federation/instance_list.html:32 +#: bookwyrm/templates/settings/users/server_filter.html:5 msgid "Instance name" msgstr "實例名稱" -#: bookwyrm/templates/settings/federation.html:40 +#: bookwyrm/templates/settings/federation/instance_list.html:40 msgid "Software" msgstr "軟體" +#: bookwyrm/templates/settings/federation/instance_list.html:63 +#, fuzzy +#| msgid "Announcements" +msgid "No instances found" +msgstr "公告" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:4 +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:11 +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:25 +#: bookwyrm/templates/settings/invites/manage_invites.html:11 +msgid "Invite Requests" +msgstr "邀請請求" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:23 +msgid "Ignored Invite Requests" +msgstr "已忽略的邀請請求" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:35 +msgid "Date requested" +msgstr "請求日期" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:39 +msgid "Date accepted" +msgstr "接受日期" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:42 +msgid "Email" +msgstr "郵箱" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:47 +msgid "Action" +msgstr "動作" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:50 +msgid "No requests" +msgstr "沒有請求" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:59 +#: bookwyrm/templates/settings/invites/status_filter.html:16 +msgid "Accepted" +msgstr "已接受" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:61 +#: bookwyrm/templates/settings/invites/status_filter.html:12 +msgid "Sent" +msgstr "已傳送" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:63 +#: bookwyrm/templates/settings/invites/status_filter.html:8 +msgid "Requested" +msgstr "已請求" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:73 +msgid "Send invite" +msgstr "傳送請求" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:75 +msgid "Re-send invite" +msgstr "重新發送請求" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:95 +msgid "Ignore" +msgstr "忽略" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:97 +msgid "Un-ignore" +msgstr "取消忽略" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:108 +msgid "Back to pending requests" +msgstr "回到待處理的請求" + +#: bookwyrm/templates/settings/invites/manage_invite_requests.html:110 +msgid "View ignored requests" +msgstr "檢視忽略的請求" + +#: bookwyrm/templates/settings/invites/manage_invites.html:21 +msgid "Generate New Invite" +msgstr "生成新的邀請" + +#: bookwyrm/templates/settings/invites/manage_invites.html:27 +msgid "Expiry:" +msgstr "過期:" + +#: bookwyrm/templates/settings/invites/manage_invites.html:33 +msgid "Use limit:" +msgstr "使用限制:" + +#: bookwyrm/templates/settings/invites/manage_invites.html:40 +msgid "Create Invite" +msgstr "創建邀請" + +#: bookwyrm/templates/settings/invites/manage_invites.html:47 +msgid "Link" +msgstr "連結" + +#: bookwyrm/templates/settings/invites/manage_invites.html:48 +msgid "Expires" +msgstr "過期" + +#: bookwyrm/templates/settings/invites/manage_invites.html:49 +msgid "Max uses" +msgstr "最大使用次數" + +#: bookwyrm/templates/settings/invites/manage_invites.html:50 +msgid "Times used" +msgstr "已使用次數" + +#: bookwyrm/templates/settings/invites/manage_invites.html:53 +msgid "No active invites" +msgstr "無有效的邀請" + +#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:5 +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:10 +#, fuzzy +#| msgid "Add read dates" +msgid "Add IP address" +msgstr "新增閱讀日期" + +#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:11 +msgid "Use IP address blocks with caution, and consider using blocks only temporarily, as IP addresses are often shared or change hands. If you block your own IP, you will not be able to access this page." +msgstr "" + +#: bookwyrm/templates/settings/ip_blocklist/ip_address_form.html:18 +#, fuzzy +#| msgid "Email address:" +msgid "IP Address:" +msgstr "郵箱地址:" + +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:5 +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:7 +#: bookwyrm/templates/settings/layout.html:63 +#, fuzzy +#| msgid "Import Blocklist" +msgid "IP Address Blocklist" +msgstr "匯入封鎖列表" + +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:18 +msgid "Any traffic from this IP address will get a 404 response when trying to access any part of the application." +msgstr "" + +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:24 +msgid "Address" +msgstr "" + +#: bookwyrm/templates/settings/ip_blocklist/ip_blocklist.html:46 +#, fuzzy +#| msgid "No users currently blocked." +msgid "No IP addresses currently blocked" +msgstr "當前沒有被封鎖的使用者。" + +#: bookwyrm/templates/settings/ip_blocklist/ip_tooltip.html:6 +msgid "You can block IP ranges using CIDR syntax." +msgstr "" + #: bookwyrm/templates/settings/layout.html:4 msgid "Administration" msgstr "管理" @@ -2493,241 +2615,396 @@ msgstr "管理使用者" msgid "Moderation" msgstr "提及" -#: bookwyrm/templates/settings/layout.html:64 +#: bookwyrm/templates/settings/layout.html:55 +#: bookwyrm/templates/settings/reports/reports.html:8 +#: bookwyrm/templates/settings/reports/reports.html:17 +msgid "Reports" +msgstr "舉報" + +#: bookwyrm/templates/settings/layout.html:68 msgid "Instance Settings" msgstr "實例設定" -#: bookwyrm/templates/settings/layout.html:72 +#: bookwyrm/templates/settings/layout.html:76 #: bookwyrm/templates/settings/site.html:4 #: bookwyrm/templates/settings/site.html:6 msgid "Site Settings" msgstr "網站設定" -#: bookwyrm/templates/settings/layout.html:75 -#: bookwyrm/templates/settings/site.html:13 +#: bookwyrm/templates/settings/reports/report.html:5 +#: bookwyrm/templates/settings/reports/report.html:8 +#: bookwyrm/templates/settings/reports/report_preview.html:6 +#, python-format +msgid "Report #%(report_id)s: %(username)s" +msgstr "舉報 #%(report_id)s: %(username)s" + +#: bookwyrm/templates/settings/reports/report.html:9 +msgid "Back to reports" +msgstr "回到舉報" + +#: bookwyrm/templates/settings/reports/report.html:23 +msgid "Moderator Comments" +msgstr "監察員評論" + +#: bookwyrm/templates/settings/reports/report.html:41 +#: bookwyrm/templates/snippets/create_status.html:28 +msgid "Comment" +msgstr "評論" + +#: bookwyrm/templates/settings/reports/report.html:46 +msgid "Reported statuses" +msgstr "被舉報的狀態" + +#: bookwyrm/templates/settings/reports/report.html:48 +msgid "No statuses reported" +msgstr "沒有被舉報的狀態" + +#: bookwyrm/templates/settings/reports/report.html:54 +msgid "Status has been deleted" +msgstr "狀態已被刪除" + +#: bookwyrm/templates/settings/reports/report_preview.html:13 +msgid "No notes provided" +msgstr "沒有提供摘記" + +#: bookwyrm/templates/settings/reports/report_preview.html:20 +#, python-format +msgid "Reported by %(username)s" +msgstr "由 %(username)s 舉報" + +#: bookwyrm/templates/settings/reports/report_preview.html:30 +msgid "Re-open" +msgstr "重新開啟" + +#: bookwyrm/templates/settings/reports/report_preview.html:32 +msgid "Resolve" +msgstr "已解決" + +#: bookwyrm/templates/settings/reports/reports.html:6 +#, python-format +msgid "Reports: %(instance_name)s" +msgstr "舉報: %(instance_name)s" + +#: bookwyrm/templates/settings/reports/reports.html:14 +#, python-format +msgid "Reports: %(instance_name)s" +msgstr "舉報: %(instance_name)s" + +#: bookwyrm/templates/settings/reports/reports.html:28 +msgid "Resolved" +msgstr "已解決" + +#: bookwyrm/templates/settings/reports/reports.html:37 +msgid "No reports found." +msgstr "沒有找到舉報" + +#: bookwyrm/templates/settings/site.html:10 +#: bookwyrm/templates/settings/site.html:21 msgid "Instance Info" msgstr "實例資訊" -#: bookwyrm/templates/settings/layout.html:76 -#: bookwyrm/templates/settings/site.html:44 +#: bookwyrm/templates/settings/site.html:11 +#: bookwyrm/templates/settings/site.html:54 msgid "Images" msgstr "圖片" -#: bookwyrm/templates/settings/layout.html:77 -#: bookwyrm/templates/settings/site.html:64 +#: bookwyrm/templates/settings/site.html:12 +#: bookwyrm/templates/settings/site.html:74 msgid "Footer Content" msgstr "頁尾內容" -#: bookwyrm/templates/settings/layout.html:78 -#: bookwyrm/templates/settings/site.html:86 +#: bookwyrm/templates/settings/site.html:13 +#: bookwyrm/templates/settings/site.html:98 msgid "Registration" msgstr "註冊" -#: bookwyrm/templates/settings/manage_invite_requests.html:4 -#: bookwyrm/templates/settings/manage_invite_requests.html:11 -#: bookwyrm/templates/settings/manage_invite_requests.html:25 -#: bookwyrm/templates/settings/manage_invites.html:11 -msgid "Invite Requests" -msgstr "邀請請求" - -#: bookwyrm/templates/settings/manage_invite_requests.html:23 -msgid "Ignored Invite Requests" -msgstr "已忽略的邀請請求" - -#: bookwyrm/templates/settings/manage_invite_requests.html:35 -msgid "Date requested" -msgstr "請求日期" - -#: bookwyrm/templates/settings/manage_invite_requests.html:39 -msgid "Date accepted" -msgstr "接受日期" - -#: bookwyrm/templates/settings/manage_invite_requests.html:42 -msgid "Email" -msgstr "郵箱" - -#: bookwyrm/templates/settings/manage_invite_requests.html:47 -msgid "Action" -msgstr "動作" - -#: bookwyrm/templates/settings/manage_invite_requests.html:50 -msgid "No requests" -msgstr "沒有請求" - -#: bookwyrm/templates/settings/manage_invite_requests.html:59 -#: bookwyrm/templates/settings/status_filter.html:16 -msgid "Accepted" -msgstr "已接受" - -#: bookwyrm/templates/settings/manage_invite_requests.html:61 -#: bookwyrm/templates/settings/status_filter.html:12 -msgid "Sent" -msgstr "已傳送" - -#: bookwyrm/templates/settings/manage_invite_requests.html:63 -#: bookwyrm/templates/settings/status_filter.html:8 -msgid "Requested" -msgstr "已請求" - -#: bookwyrm/templates/settings/manage_invite_requests.html:73 -msgid "Send invite" -msgstr "傳送請求" - -#: bookwyrm/templates/settings/manage_invite_requests.html:75 -msgid "Re-send invite" -msgstr "重新發送請求" - -#: bookwyrm/templates/settings/manage_invite_requests.html:95 -msgid "Ignore" -msgstr "忽略" - -#: bookwyrm/templates/settings/manage_invite_requests.html:97 -msgid "Un-ignore" -msgstr "取消忽略" - -#: bookwyrm/templates/settings/manage_invite_requests.html:108 -msgid "Back to pending requests" -msgstr "回到待處理的請求" - -#: bookwyrm/templates/settings/manage_invite_requests.html:110 -msgid "View ignored requests" -msgstr "檢視忽略的請求" - -#: bookwyrm/templates/settings/manage_invites.html:21 -msgid "Generate New Invite" -msgstr "生成新的邀請" - -#: bookwyrm/templates/settings/manage_invites.html:27 -msgid "Expiry:" -msgstr "過期:" - -#: bookwyrm/templates/settings/manage_invites.html:33 -msgid "Use limit:" -msgstr "使用限制:" - -#: bookwyrm/templates/settings/manage_invites.html:40 -msgid "Create Invite" -msgstr "創建邀請" - -#: bookwyrm/templates/settings/manage_invites.html:47 -msgid "Link" -msgstr "連結" - -#: bookwyrm/templates/settings/manage_invites.html:48 -msgid "Expires" -msgstr "過期" - -#: bookwyrm/templates/settings/manage_invites.html:49 -msgid "Max uses" -msgstr "最大使用次數" - -#: bookwyrm/templates/settings/manage_invites.html:50 -msgid "Times used" -msgstr "已使用次數" - -#: bookwyrm/templates/settings/manage_invites.html:53 -msgid "No active invites" -msgstr "無有效的邀請" - -#: bookwyrm/templates/settings/server_blocklist.html:6 -msgid "Import Blocklist" -msgstr "匯入封鎖列表" - -#: bookwyrm/templates/settings/server_blocklist.html:26 -#: bookwyrm/templates/snippets/goal_progress.html:7 -msgid "Success!" -msgstr "成功!" - -#: bookwyrm/templates/settings/server_blocklist.html:30 -msgid "Successfully blocked:" -msgstr "成功封鎖了" - -#: bookwyrm/templates/settings/server_blocklist.html:32 -msgid "Failed:" -msgstr "已失敗:" - -#: bookwyrm/templates/settings/site.html:15 +#: bookwyrm/templates/settings/site.html:24 msgid "Instance Name:" msgstr "實例名稱" -#: bookwyrm/templates/settings/site.html:19 +#: bookwyrm/templates/settings/site.html:28 msgid "Tagline:" msgstr "標語" -#: bookwyrm/templates/settings/site.html:23 +#: bookwyrm/templates/settings/site.html:32 msgid "Instance description:" msgstr "實例描述:" -#: bookwyrm/templates/settings/site.html:27 +#: bookwyrm/templates/settings/site.html:36 #, fuzzy #| msgid "Description:" msgid "Short description:" msgstr "描述:" -#: bookwyrm/templates/settings/site.html:28 +#: bookwyrm/templates/settings/site.html:37 msgid "Used when the instance is previewed on joinbookwyrm.com. Does not support html or markdown." msgstr "" -#: bookwyrm/templates/settings/site.html:32 +#: bookwyrm/templates/settings/site.html:41 msgid "Code of conduct:" msgstr "行為準則:" -#: bookwyrm/templates/settings/site.html:36 +#: bookwyrm/templates/settings/site.html:45 msgid "Privacy Policy:" msgstr "隱私政策:" -#: bookwyrm/templates/settings/site.html:47 +#: bookwyrm/templates/settings/site.html:57 msgid "Logo:" msgstr "圖示:" -#: bookwyrm/templates/settings/site.html:51 +#: bookwyrm/templates/settings/site.html:61 msgid "Logo small:" msgstr "小號圖示:" -#: bookwyrm/templates/settings/site.html:55 +#: bookwyrm/templates/settings/site.html:65 msgid "Favicon:" msgstr "Favicon:" -#: bookwyrm/templates/settings/site.html:66 +#: bookwyrm/templates/settings/site.html:77 msgid "Support link:" msgstr "支援連結:" -#: bookwyrm/templates/settings/site.html:70 +#: bookwyrm/templates/settings/site.html:81 msgid "Support title:" msgstr "支援標題:" -#: bookwyrm/templates/settings/site.html:74 +#: bookwyrm/templates/settings/site.html:85 msgid "Admin email:" msgstr "管理員郵件:" -#: bookwyrm/templates/settings/site.html:78 +#: bookwyrm/templates/settings/site.html:89 msgid "Additional info:" msgstr "附加資訊:" -#: bookwyrm/templates/settings/site.html:90 +#: bookwyrm/templates/settings/site.html:103 #, fuzzy #| msgid "Allow registration:" msgid "Allow registration" msgstr "允許註冊:" -#: bookwyrm/templates/settings/site.html:96 +#: bookwyrm/templates/settings/site.html:109 #, fuzzy #| msgid "Allow invite requests:" msgid "Allow invite requests" msgstr "允許請求邀請:" -#: bookwyrm/templates/settings/site.html:102 +#: bookwyrm/templates/settings/site.html:115 msgid "Require users to confirm email address" msgstr "" -#: bookwyrm/templates/settings/site.html:104 +#: bookwyrm/templates/settings/site.html:117 msgid "(Recommended if registration is open)" msgstr "" -#: bookwyrm/templates/settings/site.html:107 +#: bookwyrm/templates/settings/site.html:120 msgid "Registration closed text:" msgstr "註冊關閉文字:" +#: bookwyrm/templates/settings/site.html:124 +#, fuzzy +#| msgid "Invite Requests" +msgid "Invite request text:" +msgstr "邀請請求" + +#: bookwyrm/templates/settings/users/delete_user_form.html:5 +#: bookwyrm/templates/settings/users/user_moderation_actions.html:31 +msgid "Permanently delete user" +msgstr "" + +#: bookwyrm/templates/settings/users/delete_user_form.html:12 +#, python-format +msgid "Are you sure you want to delete %(username)s's account? This action cannot be undone. To proceed, please enter your password to confirm deletion." +msgstr "" + +#: bookwyrm/templates/settings/users/delete_user_form.html:17 +#, fuzzy +#| msgid "Confirm password:" +msgid "Your password:" +msgstr "確認密碼:" + +#: bookwyrm/templates/settings/users/user.html:7 +msgid "Back to users" +msgstr "回到使用者" + +#: bookwyrm/templates/settings/users/user_admin.html:7 +#, python-format +msgid "Users: %(instance_name)s" +msgstr "使用者: %(instance_name)s" + +#: bookwyrm/templates/settings/users/user_admin.html:22 +#: bookwyrm/templates/settings/users/username_filter.html:5 +msgid "Username" +msgstr "使用者名稱" + +#: bookwyrm/templates/settings/users/user_admin.html:26 +msgid "Date Added" +msgstr "新增日期:" + +#: bookwyrm/templates/settings/users/user_admin.html:30 +msgid "Last Active" +msgstr "最後活躍" + +#: bookwyrm/templates/settings/users/user_admin.html:38 +msgid "Remote instance" +msgstr "移除伺服器" + +#: bookwyrm/templates/settings/users/user_admin.html:47 +#: bookwyrm/templates/settings/users/user_info.html:24 +msgid "Active" +msgstr "活躍" + +#: bookwyrm/templates/settings/users/user_admin.html:47 +#: bookwyrm/templates/settings/users/user_info.html:28 +msgid "Inactive" +msgstr "停用" + +#: bookwyrm/templates/settings/users/user_admin.html:52 +#: bookwyrm/templates/settings/users/user_info.html:120 +msgid "Not set" +msgstr "未設定" + +#: bookwyrm/templates/settings/users/user_info.html:16 +msgid "View user profile" +msgstr "檢視使用者資料" + +#: bookwyrm/templates/settings/users/user_info.html:36 +msgid "Local" +msgstr "本站" + +#: bookwyrm/templates/settings/users/user_info.html:38 +#, fuzzy +#| msgid "Remove" +msgid "Remote" +msgstr "移除" + +#: bookwyrm/templates/settings/users/user_info.html:47 +msgid "User details" +msgstr "使用者詳情" + +#: bookwyrm/templates/settings/users/user_info.html:51 +#, fuzzy +#| msgid "Email" +msgid "Email:" +msgstr "郵箱" + +#: bookwyrm/templates/settings/users/user_info.html:61 +#, fuzzy +#| msgid "Directory" +msgid "(View reports)" +msgstr "目錄" + +#: bookwyrm/templates/settings/users/user_info.html:67 +#, fuzzy +#| msgid "Blocked by us:" +msgid "Blocked by count:" +msgstr "我們所封鎖的:" + +#: bookwyrm/templates/settings/users/user_info.html:70 +#, fuzzy +#| msgid "last active" +msgid "Last active date:" +msgstr "最後活躍" + +#: bookwyrm/templates/settings/users/user_info.html:73 +#, fuzzy +#| msgid "Manually approve followers:" +msgid "Manually approved followers:" +msgstr "手動批准關注者:" + +#: bookwyrm/templates/settings/users/user_info.html:76 +#, fuzzy +#| msgid "Discard" +msgid "Discoverable:" +msgstr "放棄" + +#: bookwyrm/templates/settings/users/user_info.html:80 +msgid "Deactivation reason:" +msgstr "" + +#: bookwyrm/templates/settings/users/user_info.html:95 +msgid "Instance details" +msgstr "實例詳情" + +#: bookwyrm/templates/settings/users/user_info.html:117 +msgid "View instance" +msgstr "檢視實例" + +#: bookwyrm/templates/settings/users/user_moderation_actions.html:5 +msgid "Permanently deleted" +msgstr "" + +#: bookwyrm/templates/settings/users/user_moderation_actions.html:13 +#: bookwyrm/templates/snippets/status/status_options.html:35 +#: bookwyrm/templates/snippets/user_options.html:13 +msgid "Send direct message" +msgstr "發送私信" + +#: bookwyrm/templates/settings/users/user_moderation_actions.html:20 +msgid "Suspend user" +msgstr "停用使用者" + +#: bookwyrm/templates/settings/users/user_moderation_actions.html:25 +msgid "Un-suspend user" +msgstr "取消停用使用者" + +#: bookwyrm/templates/settings/users/user_moderation_actions.html:47 +msgid "Access level:" +msgstr "訪問權限:" + +#: bookwyrm/templates/shelf/create_shelf_form.html:5 +msgid "Create Shelf" +msgstr "建立書架" + +#: bookwyrm/templates/shelf/edit_shelf_form.html:5 +msgid "Edit Shelf" +msgstr "編輯書架" + +#: bookwyrm/templates/shelf/shelf.html:28 bookwyrm/views/shelf.py:56 +msgid "All books" +msgstr "所有書目" + +#: bookwyrm/templates/shelf/shelf.html:55 +msgid "Create shelf" +msgstr "建立書架" + +#: bookwyrm/templates/shelf/shelf.html:77 +#, python-format +msgid "%(formatted_count)s book" +msgid_plural "%(formatted_count)s books" +msgstr[0] "" + +#: bookwyrm/templates/shelf/shelf.html:84 +#, python-format +msgid "(showing %(start)s-%(end)s)" +msgstr "" + +#: bookwyrm/templates/shelf/shelf.html:96 +msgid "Edit shelf" +msgstr "編輯書架" + +#: bookwyrm/templates/shelf/shelf.html:104 +msgid "Delete shelf" +msgstr "刪除書架" + +#: bookwyrm/templates/shelf/shelf.html:130 +#: bookwyrm/templates/shelf/shelf.html:154 +msgid "Shelved" +msgstr "上架時間" + +#: bookwyrm/templates/shelf/shelf.html:131 +#: bookwyrm/templates/shelf/shelf.html:158 +msgid "Started" +msgstr "開始時間" + +#: bookwyrm/templates/shelf/shelf.html:132 +#: bookwyrm/templates/shelf/shelf.html:161 +msgid "Finished" +msgstr "完成時間" + +#: bookwyrm/templates/shelf/shelf.html:187 +msgid "This shelf is empty." +msgstr "此書架是空的。" + #: bookwyrm/templates/snippets/announcement.html:31 #, python-format msgid "Posted by %(username)s" @@ -2772,24 +3049,21 @@ msgid "Some thoughts on the book" msgstr "" #: bookwyrm/templates/snippets/create_status/comment.html:26 -#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:16 +#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:15 msgid "Progress:" msgstr "進度:" #: bookwyrm/templates/snippets/create_status/comment.html:52 -#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:30 -#: bookwyrm/templates/snippets/readthrough_form.html:22 +#: bookwyrm/templates/snippets/progress_field.html:18 msgid "pages" msgstr "頁數" #: bookwyrm/templates/snippets/create_status/comment.html:58 -#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:31 -#: bookwyrm/templates/snippets/readthrough_form.html:23 +#: bookwyrm/templates/snippets/progress_field.html:23 msgid "percent" msgstr "百分比" #: bookwyrm/templates/snippets/create_status/comment.html:65 -#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:36 #, python-format msgid "of %(pages)s pages" msgstr "全書 %(pages)s 頁" @@ -2805,11 +3079,13 @@ msgstr "回覆" msgid "Content" msgstr "內容" -#: bookwyrm/templates/snippets/create_status/content_warning_field.html:3 -msgid "Spoiler alert:" -msgstr "劇透警告:" - #: bookwyrm/templates/snippets/create_status/content_warning_field.html:10 +#, fuzzy +#| msgid "Content" +msgid "Content warning:" +msgstr "內容" + +#: bookwyrm/templates/snippets/create_status/content_warning_field.html:18 msgid "Spoilers ahead!" msgstr "前有劇透!" @@ -2817,7 +3093,7 @@ msgstr "前有劇透!" msgid "Include spoiler alert" msgstr "加入劇透警告" -#: bookwyrm/templates/snippets/create_status/layout.html:38 +#: bookwyrm/templates/snippets/create_status/layout.html:41 #: bookwyrm/templates/snippets/reading_modals/form.html:7 msgid "Comment:" msgstr "評論:" @@ -2979,29 +3255,29 @@ msgstr[0] "\"%(book_title)s\" 的書評(%(display_rating)s 星): %(review_ti msgid "Review of \"%(book_title)s\": %(review_title)s" msgstr "\"%(book_title)s\" 的書評: %(review_title)s" -#: bookwyrm/templates/snippets/goal_card.html:23 +#: bookwyrm/templates/snippets/goal_form.html:3 #, python-format -msgid "You can set or change your reading goal any time from your profile page" -msgstr "你可以在任何時候從你的使用者資料頁面 中設定或改變你的閱讀目標" +msgid "Set a goal for how many books you'll finish reading in %(year)s, and track your progress throughout the year." +msgstr "設定一個 %(year)s 內要讀多少書的目標,並記錄你全年的進度。" -#: bookwyrm/templates/snippets/goal_form.html:9 +#: bookwyrm/templates/snippets/goal_form.html:12 msgid "Reading goal:" msgstr "閱讀目標:" -#: bookwyrm/templates/snippets/goal_form.html:14 +#: bookwyrm/templates/snippets/goal_form.html:17 msgid "books" msgstr "本書" -#: bookwyrm/templates/snippets/goal_form.html:19 +#: bookwyrm/templates/snippets/goal_form.html:22 msgid "Goal privacy:" msgstr "目標隱私:" -#: bookwyrm/templates/snippets/goal_form.html:26 +#: bookwyrm/templates/snippets/goal_form.html:29 #: bookwyrm/templates/snippets/reading_modals/layout.html:13 msgid "Post to feed" msgstr "發佈到即時動態" -#: bookwyrm/templates/snippets/goal_form.html:30 +#: bookwyrm/templates/snippets/goal_form.html:33 msgid "Set goal" msgstr "設定目標" @@ -3077,18 +3353,18 @@ msgstr "評價" msgid "Finish \"%(book_title)s\"" msgstr "完成 \"%(book_title)s\"" -#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:22 +#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:23 #: bookwyrm/templates/snippets/reading_modals/start_reading_modal.html:20 #: bookwyrm/templates/snippets/readthrough_form.html:7 msgid "Started reading" msgstr "已開始閱讀" -#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:30 -#: bookwyrm/templates/snippets/readthrough_form.html:30 +#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:31 +#: bookwyrm/templates/snippets/readthrough_form.html:20 msgid "Finished reading" msgstr "已完成閱讀" -#: bookwyrm/templates/snippets/reading_modals/form.html:8 +#: bookwyrm/templates/snippets/reading_modals/form.html:9 msgid "(Optional)" msgstr "" @@ -3119,6 +3395,20 @@ msgstr "註冊" msgid "Report" msgstr "舉報" +#: bookwyrm/templates/snippets/report_modal.html:6 +#, python-format +msgid "Report @%(username)s" +msgstr "舉報 %(username)s" + +#: bookwyrm/templates/snippets/report_modal.html:23 +#, python-format +msgid "This report will be sent to %(site_name)s's moderators for review." +msgstr "本舉報會被發送至 %(site_name)s 的監察員以複查。" + +#: bookwyrm/templates/snippets/report_modal.html:24 +msgid "More info about this report:" +msgstr "關於本舉報的更多資訊" + #: bookwyrm/templates/snippets/search_result_text.html:36 msgid "Import book" msgstr "匯入書目" @@ -3150,32 +3440,40 @@ msgstr "從 %(name)s 移除" msgid "Finish reading" msgstr "完成閱讀" -#: bookwyrm/templates/snippets/status/content_status.html:73 -#: bookwyrm/templates/snippets/trimmed_text.html:17 -msgid "Show more" -msgstr "顯示更多" +#: bookwyrm/templates/snippets/status/content_status.html:72 +#, fuzzy +#| msgid "Content" +msgid "Content warning" +msgstr "內容" -#: bookwyrm/templates/snippets/status/content_status.html:88 -#: bookwyrm/templates/snippets/trimmed_text.html:34 -msgid "Show less" -msgstr "顯示更少" +#: bookwyrm/templates/snippets/status/content_status.html:79 +#, fuzzy +#| msgid "Like status" +msgid "Show status" +msgstr "喜歡狀態" -#: bookwyrm/templates/snippets/status/content_status.html:103 +#: bookwyrm/templates/snippets/status/content_status.html:101 #, fuzzy, python-format #| msgid "page %(page)s" msgid "(Page %(page)s)" msgstr "第 %(page)s 頁" -#: bookwyrm/templates/snippets/status/content_status.html:105 +#: bookwyrm/templates/snippets/status/content_status.html:103 #, fuzzy, python-format #| msgid "%(percent)s%% complete!" msgid "(%(percent)s%%)" msgstr "完成了 %(percent)s%% !" -#: bookwyrm/templates/snippets/status/content_status.html:127 +#: bookwyrm/templates/snippets/status/content_status.html:125 msgid "Open image in new window" msgstr "在新視窗中開啟圖片" +#: bookwyrm/templates/snippets/status/content_status.html:144 +#, fuzzy +#| msgid "Like status" +msgid "Hide status" +msgstr "喜歡狀態" + #: bookwyrm/templates/snippets/status/headers/comment.html:2 #, fuzzy, python-format #| msgid "Editions of \"%(work_title)s\"" @@ -3251,12 +3549,6 @@ msgstr "更多選項" msgid "Delete & re-draft" msgstr "刪除並重新起草" -#: bookwyrm/templates/snippets/status/status_options.html:35 -#: bookwyrm/templates/snippets/user_options.html:13 -#: bookwyrm/templates/user_admin/user_moderation_actions.html:13 -msgid "Send direct message" -msgstr "發送私信" - #: bookwyrm/templates/snippets/suggested_users.html:16 #, python-format msgid "%(mutuals)s follower you follow" @@ -3288,6 +3580,43 @@ msgstr "升序排序" msgid "Sorted descending" msgstr "降序排序" +#: bookwyrm/templates/snippets/trimmed_text.html:17 +msgid "Show more" +msgstr "顯示更多" + +#: bookwyrm/templates/snippets/trimmed_text.html:35 +msgid "Show less" +msgstr "顯示更少" + +#: bookwyrm/templates/user/books_header.html:5 +#, python-format +msgid "%(username)s's books" +msgstr "%(username)s 的書目" + +#: bookwyrm/templates/user/goal.html:8 +#, python-format +msgid "%(year)s Reading Progress" +msgstr "%(year)s 閱讀進度" + +#: bookwyrm/templates/user/goal.html:12 +msgid "Edit Goal" +msgstr "編輯目標" + +#: bookwyrm/templates/user/goal.html:28 +#, python-format +msgid "%(name)s hasn't set a reading goal for %(year)s." +msgstr "%(name)s 還沒有設定 %(year)s 的閱讀目標。" + +#: bookwyrm/templates/user/goal.html:40 +#, python-format +msgid "Your %(year)s Books" +msgstr "你 %(year)s 的書目" + +#: bookwyrm/templates/user/goal.html:42 +#, python-format +msgid "%(username)s's %(year)s Books" +msgstr "%(username)s 在 %(year)s 的書目" + #: bookwyrm/templates/user/layout.html:18 bookwyrm/templates/user/user.html:10 msgid "User Profile" msgstr "使用者使用者資料" @@ -3324,70 +3653,6 @@ msgstr "正在關注" msgid "%(username)s isn't following any users" msgstr "%(username)s 沒有關注任何使用者" -#: bookwyrm/templates/user/shelf/books_header.html:5 -#, python-format -msgid "%(username)s's books" -msgstr "%(username)s 的書目" - -#: bookwyrm/templates/user/shelf/create_shelf_form.html:5 -#: bookwyrm/templates/user/shelf/create_shelf_form.html:22 -msgid "Create Shelf" -msgstr "建立書架" - -#: bookwyrm/templates/user/shelf/edit_shelf_form.html:5 -msgid "Edit Shelf" -msgstr "編輯書架" - -#: bookwyrm/templates/user/shelf/edit_shelf_form.html:26 -msgid "Update shelf" -msgstr "更新書架" - -#: bookwyrm/templates/user/shelf/shelf.html:28 bookwyrm/views/shelf.py:56 -msgid "All books" -msgstr "所有書目" - -#: bookwyrm/templates/user/shelf/shelf.html:55 -msgid "Create shelf" -msgstr "建立書架" - -#: bookwyrm/templates/user/shelf/shelf.html:76 -#, python-format -msgid "%(formatted_count)s book" -msgid_plural "%(formatted_count)s books" -msgstr[0] "" - -#: bookwyrm/templates/user/shelf/shelf.html:83 -#, python-format -msgid "(showing %(start)s-%(end)s)" -msgstr "" - -#: bookwyrm/templates/user/shelf/shelf.html:94 -msgid "Edit shelf" -msgstr "編輯書架" - -#: bookwyrm/templates/user/shelf/shelf.html:113 -#: bookwyrm/templates/user/shelf/shelf.html:137 -msgid "Shelved" -msgstr "上架時間" - -#: bookwyrm/templates/user/shelf/shelf.html:114 -#: bookwyrm/templates/user/shelf/shelf.html:141 -msgid "Started" -msgstr "開始時間" - -#: bookwyrm/templates/user/shelf/shelf.html:115 -#: bookwyrm/templates/user/shelf/shelf.html:144 -msgid "Finished" -msgstr "完成時間" - -#: bookwyrm/templates/user/shelf/shelf.html:170 -msgid "This shelf is empty." -msgstr "此書架是空的。" - -#: bookwyrm/templates/user/shelf/shelf.html:176 -msgid "Delete shelf" -msgstr "刪除書架" - #: bookwyrm/templates/user/user.html:16 msgid "Edit profile" msgstr "編輯使用者資料" @@ -3442,145 +3707,6 @@ msgstr[0] "%(mutuals_display)s 個你也關注的關注者" msgid "No followers you follow" msgstr "你關注的關注者" -#: bookwyrm/templates/user_admin/delete_user_form.html:5 -#: bookwyrm/templates/user_admin/user_moderation_actions.html:31 -msgid "Permanently delete user" -msgstr "" - -#: bookwyrm/templates/user_admin/delete_user_form.html:12 -#, python-format -msgid "Are you sure you want to delete %(username)s's account? This action cannot be undone. To proceed, please enter your password to confirm deletion." -msgstr "" - -#: bookwyrm/templates/user_admin/delete_user_form.html:17 -#, fuzzy -#| msgid "Confirm password:" -msgid "Your password:" -msgstr "確認密碼:" - -#: bookwyrm/templates/user_admin/user.html:8 -msgid "Back to users" -msgstr "回到使用者" - -#: bookwyrm/templates/user_admin/user_admin.html:7 -#, python-format -msgid "Users: %(instance_name)s" -msgstr "使用者: %(instance_name)s" - -#: bookwyrm/templates/user_admin/user_admin.html:22 -#: bookwyrm/templates/user_admin/username_filter.html:5 -msgid "Username" -msgstr "使用者名稱" - -#: bookwyrm/templates/user_admin/user_admin.html:26 -msgid "Date Added" -msgstr "新增日期:" - -#: bookwyrm/templates/user_admin/user_admin.html:30 -msgid "Last Active" -msgstr "最後活躍" - -#: bookwyrm/templates/user_admin/user_admin.html:38 -msgid "Remote instance" -msgstr "移除伺服器" - -#: bookwyrm/templates/user_admin/user_admin.html:47 -#: bookwyrm/templates/user_admin/user_info.html:24 -msgid "Active" -msgstr "活躍" - -#: bookwyrm/templates/user_admin/user_admin.html:47 -#: bookwyrm/templates/user_admin/user_info.html:28 -msgid "Inactive" -msgstr "停用" - -#: bookwyrm/templates/user_admin/user_admin.html:52 -#: bookwyrm/templates/user_admin/user_info.html:140 -msgid "Not set" -msgstr "未設定" - -#: bookwyrm/templates/user_admin/user_info.html:16 -msgid "View user profile" -msgstr "檢視使用者資料" - -#: bookwyrm/templates/user_admin/user_info.html:36 -msgid "Local" -msgstr "本站" - -#: bookwyrm/templates/user_admin/user_info.html:38 -#, fuzzy -#| msgid "Remove" -msgid "Remote" -msgstr "移除" - -#: bookwyrm/templates/user_admin/user_info.html:47 -msgid "User details" -msgstr "使用者詳情" - -#: bookwyrm/templates/user_admin/user_info.html:52 -#, fuzzy -#| msgid "Email" -msgid "Email:" -msgstr "郵箱" - -#: bookwyrm/templates/user_admin/user_info.html:64 -#, fuzzy -#| msgid "Directory" -msgid "(View reports)" -msgstr "目錄" - -#: bookwyrm/templates/user_admin/user_info.html:72 -#, fuzzy -#| msgid "Blocked by us:" -msgid "Blocked by count:" -msgstr "我們所封鎖的:" - -#: bookwyrm/templates/user_admin/user_info.html:77 -#, fuzzy -#| msgid "last active" -msgid "Last active date:" -msgstr "最後活躍" - -#: bookwyrm/templates/user_admin/user_info.html:82 -#, fuzzy -#| msgid "Manually approve followers:" -msgid "Manually approved followers:" -msgstr "手動批准關注者:" - -#: bookwyrm/templates/user_admin/user_info.html:87 -#, fuzzy -#| msgid "Discard" -msgid "Discoverable:" -msgstr "放棄" - -#: bookwyrm/templates/user_admin/user_info.html:93 -msgid "Deactivation reason:" -msgstr "" - -#: bookwyrm/templates/user_admin/user_info.html:111 -msgid "Instance details" -msgstr "實例詳情" - -#: bookwyrm/templates/user_admin/user_info.html:137 -msgid "View instance" -msgstr "檢視實例" - -#: bookwyrm/templates/user_admin/user_moderation_actions.html:5 -msgid "Permanently deleted" -msgstr "" - -#: bookwyrm/templates/user_admin/user_moderation_actions.html:20 -msgid "Suspend user" -msgstr "停用使用者" - -#: bookwyrm/templates/user_admin/user_moderation_actions.html:25 -msgid "Un-suspend user" -msgstr "取消停用使用者" - -#: bookwyrm/templates/user_admin/user_moderation_actions.html:47 -msgid "Access level:" -msgstr "訪問權限:" - #: bookwyrm/templates/widgets/clearable_file_input_with_warning.html:28 msgid "File exceeds maximum size: 10MB" msgstr "檔案超過了最大大小: 10MB" @@ -3594,7 +3720,7 @@ msgstr "" msgid "Not a valid csv file" msgstr "不是有效的 csv 檔案" -#: bookwyrm/views/login.py:70 +#: bookwyrm/views/login.py:68 msgid "Username or password are incorrect" msgstr "" @@ -3603,8 +3729,9 @@ msgid "No user with that email address was found." msgstr "沒有找到使用該郵箱的使用者。" #: bookwyrm/views/password.py:41 -#, python-format -msgid "A password reset link sent to %s" +#, fuzzy, python-brace-format +#| msgid "A password reset link sent to %s" +msgid "A password reset link sent to {email}" msgstr "密碼重置連結已傳送給 %s" #: bookwyrm/views/rss_feed.py:34 @@ -3612,6 +3739,21 @@ msgstr "密碼重置連結已傳送給 %s" msgid "Status updates from {obj.display_name}" msgstr "" +#~ msgid "Update shelf" +#~ msgstr "更新書架" + +#~ msgid "%(count)d uses" +#~ msgstr "%(count)d 次使用" + +#~ msgid "This instance is closed" +#~ msgstr "本實例不開放。" + +#~ msgid "Contact an administrator to get an invite" +#~ msgstr "聯絡管理員以取得邀請" + +#~ msgid "Spoiler alert:" +#~ msgstr "劇透警告:" + #~ msgid "Date federated" #~ msgstr "跨站日期" diff --git a/requirements.txt b/requirements.txt index 37be8944..2d79a475 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ celery==4.4.2 colorthief==0.2.1 -Django==3.2.4 +Django==3.2.5 django-imagekit==4.0.2 django-model-utils==4.0.0 environs==7.2.0 @@ -26,3 +26,4 @@ pytest==6.1.2 pytest-cov==2.10.1 pytest-env==0.6.2 pytest-xdist==2.3.0 +pytidylib==0.3.2 diff --git a/yarn.lock b/yarn.lock index af20d142..d25fbfb6 100644 --- a/yarn.lock +++ b/yarn.lock @@ -314,9 +314,9 @@ ansi-colors@^4.1.1: integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== ansi-styles@^3.2.1: version "3.2.1"