diff --git a/.env.dev.example b/.env.dev.example index 71cc11a1f..1613321ac 100644 --- a/.env.dev.example +++ b/.env.dev.example @@ -13,16 +13,10 @@ DEFAULT_LANGUAGE="English" ## Leave unset to allow all hosts # ALLOWED_HOSTS="localhost,127.0.0.1,[::1]" -OL_URL=https://openlibrary.org - -## Database backend to use. -## Default is postgres, sqlite is for dev quickstart only (NOT production!!!) -BOOKWYRM_DATABASE_BACKEND=postgres - MEDIA_ROOT=images/ POSTGRES_PORT=5432 -POSTGRES_PASSWORD=fedireads +POSTGRES_PASSWORD=securedbypassword123 POSTGRES_USER=fedireads POSTGRES_DB=fedireads POSTGRES_HOST=db @@ -34,10 +28,8 @@ REDIS_ACTIVITY_PORT=6379 #REDIS_ACTIVITY_PASSWORD=redispassword345 # Redis as celery broker -#REDIS_BROKER_PORT=6379 +REDIS_BROKER_PORT=6379 #REDIS_BROKER_PASSWORD=redispassword123 -CELERY_BROKER=redis://redis_broker:6379/0 -CELERY_RESULT_BACKEND=redis://redis_broker:6379/0 FLOWER_PORT=8888 #FLOWER_USER=mouse @@ -50,9 +42,6 @@ EMAIL_HOST_PASSWORD=emailpassword123 EMAIL_USE_TLS=true EMAIL_USE_SSL=false -# Set this to true when initializing certbot for domain, false when not -CERTBOT_INIT=false - # Preview image generation can be computing and storage intensive # ENABLE_PREVIEW_IMAGES=True @@ -63,4 +52,4 @@ PREVIEW_BG_COLOR=use_dominant_color_light PREVIEW_TEXT_COLOR=#363636 PREVIEW_IMG_WIDTH=1200 PREVIEW_IMG_HEIGHT=630 -PREVIEW_DEFAULT_COVER_COLOR=#002549 +PREVIEW_DEFAULT_COVER_COLOR=#002549 \ No newline at end of file diff --git a/.env.prod.example b/.env.prod.example index e132d216b..d8aa2435d 100644 --- a/.env.prod.example +++ b/.env.prod.example @@ -13,16 +13,10 @@ DEFAULT_LANGUAGE="English" ## Leave unset to allow all hosts # ALLOWED_HOSTS="localhost,127.0.0.1,[::1]" -OL_URL=https://openlibrary.org - -## Database backend to use. -## Default is postgres, sqlite is for dev quickstart only (NOT production!!!) -BOOKWYRM_DATABASE_BACKEND=postgres - MEDIA_ROOT=images/ POSTGRES_PORT=5432 -POSTGRES_PASSWORD=securedbpassword123 +POSTGRES_PASSWORD=securedbypassword123 POSTGRES_USER=fedireads POSTGRES_DB=fedireads POSTGRES_HOST=db @@ -36,8 +30,6 @@ REDIS_ACTIVITY_PASSWORD=redispassword345 # Redis as celery broker REDIS_BROKER_PORT=6379 REDIS_BROKER_PASSWORD=redispassword123 -CELERY_BROKER=redis://:${REDIS_BROKER_PASSWORD}@redis_broker:${REDIS_BROKER_PORT}/0 -CELERY_RESULT_BACKEND=redis://:${REDIS_BROKER_PASSWORD}@redis_broker:${REDIS_BROKER_PORT}/0 FLOWER_PORT=8888 FLOWER_USER=mouse @@ -50,9 +42,6 @@ EMAIL_HOST_PASSWORD=emailpassword123 EMAIL_USE_TLS=true EMAIL_USE_SSL=false -# Set this to true when initializing certbot for domain, false when not -CERTBOT_INIT=false - # Preview image generation can be computing and storage intensive # ENABLE_PREVIEW_IMAGES=True @@ -63,4 +52,4 @@ PREVIEW_BG_COLOR=use_dominant_color_light PREVIEW_TEXT_COLOR=#363636 PREVIEW_IMG_WIDTH=1200 PREVIEW_IMG_HEIGHT=630 -PREVIEW_DEFAULT_COVER_COLOR=#002549 +PREVIEW_DEFAULT_COVER_COLOR=#002549 \ No newline at end of file diff --git a/.github/workflows/django-tests.yml b/.github/workflows/django-tests.yml index c4f7bb6e5..b5b319f53 100644 --- a/.github/workflows/django-tests.yml +++ b/.github/workflows/django-tests.yml @@ -50,7 +50,6 @@ jobs: SECRET_KEY: beepbeep DEBUG: true DOMAIN: your.domain.here - OL_URL: https://openlibrary.org BOOKWYRM_DATABASE_BACKEND: postgres MEDIA_ROOT: images/ POSTGRES_PASSWORD: hunter2 @@ -58,7 +57,8 @@ jobs: POSTGRES_DB: github_actions POSTGRES_HOST: 127.0.0.1 CELERY_BROKER: "" - CELERY_RESULT_BACKEND: "" + REDIS_BROKER_PORT: 6379 + FLOWER_PORT: 8888 EMAIL_HOST: "smtp.mailgun.org" EMAIL_PORT: 587 EMAIL_HOST_USER: "" diff --git a/Dockerfile b/Dockerfile index 0f10015c6..1892ae234 100644 --- a/Dockerfile +++ b/Dockerfile @@ -9,5 +9,3 @@ 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 - -COPY ./bookwyrm ./celerywyrm /app/ diff --git a/bookwyrm/activitystreams.py b/bookwyrm/activitystreams.py index ff3c55fbd..a49a7ce4d 100644 --- a/bookwyrm/activitystreams.py +++ b/bookwyrm/activitystreams.py @@ -201,6 +201,19 @@ def add_status_on_create(sender, instance, created, *args, **kwargs): for stream in streams.values(): stream.add_status(instance) + if sender != models.Boost: + return + # remove the original post and other, earlier boosts + boosted = instance.boost.boosted_status + old_versions = models.Boost.objects.filter( + boosted_status__id=boosted.id, + created_date__lt=instance.created_date, + ) + for stream in streams.values(): + stream.remove_object_from_related_stores(boosted) + for status in old_versions: + stream.remove_object_from_related_stores(status) + @receiver(signals.post_delete, sender=models.Boost) # pylint: disable=unused-argument @@ -208,7 +221,10 @@ def remove_boost_on_delete(sender, instance, *args, **kwargs): """boosts are deleted""" # we're only interested in new statuses for stream in streams.values(): + # remove the boost stream.remove_object_from_related_stores(instance) + # re-add the original status + stream.add_status(instance.boosted_status) @receiver(signals.post_save, sender=models.UserFollows) diff --git a/bookwyrm/connectors/abstract_connector.py b/bookwyrm/connectors/abstract_connector.py index 606678150..22489af29 100644 --- a/bookwyrm/connectors/abstract_connector.py +++ b/bookwyrm/connectors/abstract_connector.py @@ -37,7 +37,7 @@ class AbstractMinimalConnector(ABC): for field in self_fields: setattr(self, field, getattr(info, field)) - def search(self, query, min_confidence=None): + def search(self, query, min_confidence=None, timeout=5): """free text search""" params = {} if min_confidence: @@ -46,6 +46,7 @@ class AbstractMinimalConnector(ABC): data = self.get_search_data( "%s%s" % (self.search_url, query), params=params, + timeout=timeout, ) results = [] @@ -218,7 +219,7 @@ def dict_from_mappings(data, mappings): return result -def get_data(url, params=None): +def get_data(url, params=None, timeout=10): """wrapper for request.get""" # check if the url is blocked if models.FederatedServer.is_blocked(url): @@ -234,6 +235,7 @@ def get_data(url, params=None): "Accept": "application/json; charset=utf-8", "User-Agent": settings.USER_AGENT, }, + timeout=timeout, ) except (RequestError, SSLError, ConnectionError) as e: logger.exception(e) @@ -250,7 +252,7 @@ def get_data(url, params=None): return data -def get_image(url): +def get_image(url, timeout=10): """wrapper for requesting an image""" try: resp = requests.get( @@ -258,6 +260,7 @@ def get_image(url): headers={ "User-Agent": settings.USER_AGENT, }, + timeout=timeout, ) except (RequestError, SSLError) as e: logger.exception(e) diff --git a/bookwyrm/connectors/connector_manager.py b/bookwyrm/connectors/connector_manager.py index 95c5959df..040e7fa5b 100644 --- a/bookwyrm/connectors/connector_manager.py +++ b/bookwyrm/connectors/connector_manager.py @@ -1,4 +1,5 @@ """ interface with whatever connectors the app has """ +from datetime import datetime import importlib import logging import re @@ -29,9 +30,11 @@ def search(query, min_confidence=0.1, return_first=False): isbn = re.sub(r"[\W_]", "", query) maybe_isbn = len(isbn) in [10, 13] # ISBN10 or ISBN13 + timeout = 15 + start_time = datetime.now() for connector in get_connectors(): result_set = None - if maybe_isbn and connector.isbn_search_url and connector.isbn_search_url == "": + if maybe_isbn and connector.isbn_search_url and connector.isbn_search_url != "": # Search on ISBN try: result_set = connector.isbn_search(isbn) @@ -59,6 +62,8 @@ def search(query, min_confidence=0.1, return_first=False): "results": result_set, } ) + if (datetime.now() - start_time).seconds >= timeout: + break if return_first: return None diff --git a/bookwyrm/connectors/self_connector.py b/bookwyrm/connectors/self_connector.py index a8f858345..5223390d8 100644 --- a/bookwyrm/connectors/self_connector.py +++ b/bookwyrm/connectors/self_connector.py @@ -3,7 +3,7 @@ from functools import reduce import operator from django.contrib.postgres.search import SearchRank, SearchVector -from django.db.models import Count, OuterRef, Subquery, F, Q +from django.db.models import OuterRef, Subquery, F, Q from bookwyrm import models from .abstract_connector import AbstractConnector, SearchResult @@ -122,6 +122,8 @@ def search_identifiers(query, *filters): results = models.Edition.objects.filter( *filters, reduce(operator.or_, (Q(**f) for f in or_filters)) ).distinct() + if results.count() <= 1: + return results # when there are multiple editions of the same work, pick the default. # it would be odd for this to happen. @@ -146,19 +148,15 @@ def search_title_author(query, min_confidence, *filters): ) results = ( - models.Edition.objects.annotate(search=vector) - .annotate(rank=SearchRank(vector, query)) + models.Edition.objects.annotate(rank=SearchRank(vector, query)) .filter(*filters, rank__gt=min_confidence) .order_by("-rank") ) # when there are multiple editions of the same work, pick the closest - editions_of_work = ( - results.values("parent_work") - .annotate(Count("parent_work")) - .values_list("parent_work") - ) + editions_of_work = results.values("parent_work__id").values_list("parent_work__id") + # filter out multiple editions of the same work for work_id in set(editions_of_work): editions = results.filter(parent_work=work_id) default = editions.order_by("-edition_rank").first() diff --git a/bookwyrm/forms.py b/bookwyrm/forms.py index 25b72a119..4931805fb 100644 --- a/bookwyrm/forms.py +++ b/bookwyrm/forms.py @@ -150,6 +150,12 @@ class LimitedEditUserForm(CustomForm): help_texts = {f: None for f in fields} +class DeleteUserForm(CustomForm): + class Meta: + model = models.User + fields = ["password"] + + class UserGroupForm(CustomForm): class Meta: model = models.User diff --git a/bookwyrm/models/fields.py b/bookwyrm/models/fields.py index 123b3efa4..379323b90 100644 --- a/bookwyrm/models/fields.py +++ b/bookwyrm/models/fields.py @@ -1,5 +1,6 @@ """ activitypub-aware django model fields """ from dataclasses import MISSING +import imghdr import re from uuid import uuid4 @@ -9,6 +10,7 @@ from django.contrib.postgres.fields import ArrayField as DjangoArrayField from django.core.exceptions import ValidationError from django.core.files.base import ContentFile from django.db import models +from django.forms import ClearableFileInput, ImageField as DjangoImageField from django.utils import timezone from django.utils.translation import gettext_lazy as _ from bookwyrm import activitypub @@ -332,6 +334,18 @@ class TagField(ManyToManyField): return items +class ClearableFileInputWithWarning(ClearableFileInput): + """max file size warning""" + + template_name = "widgets/clearable_file_input_with_warning.html" + + +class CustomImageField(DjangoImageField): + """overwrites image field for form""" + + widget = ClearableFileInputWithWarning + + def image_serializer(value, alt): """helper for serializing images""" if value and hasattr(value, "url"): @@ -391,10 +405,19 @@ class ImageField(ActivitypubFieldMixin, models.ImageField): if not response: return None - image_name = str(uuid4()) + "." + url.split(".")[-1] image_content = ContentFile(response.content) + image_name = str(uuid4()) + "." + imghdr.what(None, image_content.read()) return [image_name, image_content] + def formfield(self, **kwargs): + """special case for forms""" + return super().formfield( + **{ + "form_class": CustomImageField, + **kwargs, + } + ) + class DateTimeField(ActivitypubFieldMixin, models.DateTimeField): """activitypub-aware datetime field""" diff --git a/bookwyrm/models/import_job.py b/bookwyrm/models/import_job.py index c8130af26..f29938469 100644 --- a/bookwyrm/models/import_job.py +++ b/bookwyrm/models/import_job.py @@ -75,7 +75,12 @@ class ImportItem(models.Model): def resolve(self): """try various ways to lookup a book""" - self.book = self.get_book_from_isbn() or self.get_book_from_title_author() + if self.isbn: + self.book = self.get_book_from_isbn() + else: + # don't fall back on title/author search is isbn is present. + # you're too likely to mismatch + self.get_book_from_title_author() def get_book_from_isbn(self): """search by isbn""" diff --git a/bookwyrm/settings.py b/bookwyrm/settings.py index a4cf74f0b..b928f97ef 100644 --- a/bookwyrm/settings.py +++ b/bookwyrm/settings.py @@ -14,13 +14,18 @@ PAGE_LENGTH = env("PAGE_LENGTH", 15) DEFAULT_LANGUAGE = env("DEFAULT_LANGUAGE", "English") # celery -CELERY_BROKER = env("CELERY_BROKER") -CELERY_RESULT_BACKEND = env("CELERY_RESULT_BACKEND") +CELERY_BROKER = "redis://:{}@redis_broker:{}/0".format( + requests.utils.quote(env("REDIS_BROKER_PASSWORD", "")), env("REDIS_BROKER_PORT") +) +CELERY_RESULT_BACKEND = "redis://:{}@redis_broker:{}/0".format( + requests.utils.quote(env("REDIS_BROKER_PASSWORD", "")), env("REDIS_BROKER_PORT") +) CELERY_ACCEPT_CONTENT = ["application/json"] CELERY_TASK_SERIALIZER = "json" CELERY_RESULT_SERIALIZER = "json" # email +EMAIL_BACKEND = env("EMAIL_BACKEND", "django.core.mail.backends.smtp.EmailBackend") EMAIL_HOST = env("EMAIL_HOST") EMAIL_PORT = env("EMAIL_PORT", 587) EMAIL_HOST_USER = env("EMAIL_HOST_USER") @@ -55,7 +60,6 @@ SECRET_KEY = env("SECRET_KEY") DEBUG = env.bool("DEBUG", True) ALLOWED_HOSTS = env.list("ALLOWED_HOSTS", ["*"]) -OL_URL = env("OL_URL") # Application definition @@ -117,10 +121,8 @@ STREAMS = ["home", "local", "federated"] # Database # https://docs.djangoproject.com/en/3.2/ref/settings/#databases -BOOKWYRM_DATABASE_BACKEND = env("BOOKWYRM_DATABASE_BACKEND", "postgres") - -BOOKWYRM_DBS = { - "postgres": { +DATABASES = { + "default": { "ENGINE": "django.db.backends.postgresql_psycopg2", "NAME": env("POSTGRES_DB", "fedireads"), "USER": env("POSTGRES_USER", "fedireads"), @@ -130,8 +132,6 @@ BOOKWYRM_DBS = { }, } -DATABASES = {"default": BOOKWYRM_DBS[BOOKWYRM_DATABASE_BACKEND]} - LOGIN_URL = "/login/" AUTH_USER_MODEL = "bookwyrm.User" @@ -139,6 +139,7 @@ AUTH_USER_MODEL = "bookwyrm.User" # Password validation # https://docs.djangoproject.com/en/3.2/ref/settings/#auth-password-validators +# pylint: disable=line-too-long AUTH_PASSWORD_VALIDATORS = [ { "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator", diff --git a/bookwyrm/static/js/bookwyrm.js b/bookwyrm/static/js/bookwyrm.js index 3659a20e4..e43ed134b 100644 --- a/bookwyrm/static/js/bookwyrm.js +++ b/bookwyrm/static/js/bookwyrm.js @@ -3,6 +3,7 @@ let BookWyrm = new class { constructor() { + this.MAX_FILE_SIZE_BYTES = 10 * 1000000; this.initOnDOMLoaded(); this.initReccuringTasks(); this.initEventListeners(); @@ -32,15 +33,26 @@ let BookWyrm = new class { 'click', this.back) ); + + document.querySelectorAll('input[type="file"]') + .forEach(node => node.addEventListener( + 'change', + this.disableIfTooLarge.bind(this) + )); } /** * Execute code once the DOM is loaded. */ initOnDOMLoaded() { + const bookwyrm = this; + window.addEventListener('DOMContentLoaded', function() { document.querySelectorAll('.tab-group') .forEach(tabs => new TabGroup(tabs)); + document.querySelectorAll('input[type="file"]').forEach( + bookwyrm.disableIfTooLarge.bind(bookwyrm) + ); }); } @@ -126,6 +138,7 @@ let BookWyrm = new class { * @return {undefined} */ toggleAction(event) { + event.preventDefault(); let trigger = event.currentTarget; let pressed = trigger.getAttribute('aria-pressed') === 'false'; let targetId = trigger.dataset.controls; @@ -170,6 +183,8 @@ let BookWyrm = new class { if (focus) { this.toggleFocus(focus); } + + return false; } /** @@ -284,4 +299,27 @@ let BookWyrm = new class { node.classList.remove(classname); } } -} + + disableIfTooLarge(eventOrElement) { + const { addRemoveClass, MAX_FILE_SIZE_BYTES } = this; + const element = eventOrElement.currentTarget || eventOrElement; + + const submits = element.form.querySelectorAll('[type="submit"]'); + const warns = element.parentElement.querySelectorAll('.file-too-big'); + const isTooBig = element.files && + element.files[0] && + element.files[0].size > MAX_FILE_SIZE_BYTES; + + if (isTooBig) { + submits.forEach(submitter => submitter.disabled = true); + warns.forEach( + sib => addRemoveClass(sib, 'is-hidden', false) + ); + } else { + submits.forEach(submitter => submitter.disabled = false); + warns.forEach( + sib => addRemoveClass(sib, 'is-hidden', true) + ); + } + } +}(); diff --git a/bookwyrm/static/js/localstorage.js b/bookwyrm/static/js/localstorage.js index 059557799..b485ed7ea 100644 --- a/bookwyrm/static/js/localstorage.js +++ b/bookwyrm/static/js/localstorage.js @@ -17,7 +17,7 @@ let LocalStorageTools = new class { * @return {undefined} */ updateDisplay(event) { - // used in set reading goal + // Used in set reading goal let key = event.target.dataset.id; let value = event.target.dataset.value; @@ -34,10 +34,10 @@ let LocalStorageTools = new class { * @return {undefined} */ setDisplay(node) { - // used in set reading goal + // Used in set reading goal let key = node.dataset.hide; let value = window.localStorage.getItem(key); BookWyrm.addRemoveClass(node, 'is-hidden', value); } -} +}(); diff --git a/bookwyrm/templates/author/author.html b/bookwyrm/templates/author/author.html index aa99cbe27..0bc427758 100644 --- a/bookwyrm/templates/author/author.html +++ b/bookwyrm/templates/author/author.html @@ -15,49 +15,83 @@
- {% trans "Edit Author" %} + {% trans "Edit Author" %}
{% endif %} -
- {% if author.aliases or author.born or author.died or author.wikipedia_link %} -
-
+
+ + + {% if author.aliases or author.born or author.died or author.wikipedia_link or author.openlibrary_key or author.inventaire_id %} +
+
{% if author.aliases %} -
-
{% trans "Aliases:" %}
-
{{ author.aliases|join:', ' }}
+
+
{% trans "Aliases:" %}
+ {% for alias in author.aliases %} +
+ {{alias}}{% if not forloop.last %}, {% endif %} +
+ {% endfor %}
{% endif %} + {% if author.born %} -
-
{% trans "Born:" %}
-
{{ author.born|naturalday }}
+
+
{% trans "Born:" %}
+
{{ author.born|naturalday }}
{% endif %} + {% if author.died %} -
-
{% trans "Died:" %}
-
{{ author.died|naturalday }}
+
+
{% trans "Died:" %}
+
{{ author.died|naturalday }}
{% endif %}
{% if author.wikipedia_link %} -

{% trans "Wikipedia" %}

- {% endif %} - {% if author.openlibrary_key %} -

- {% trans "View on OpenLibrary" %} +

+ + {% trans "Wikipedia" %} +

{% endif %} + + {% if author.openlibrary_key %} +

+ + {% trans "View on OpenLibrary" %} + +

+ {% endif %} + {% if author.inventaire_id %} -

- {% trans "View on Inventaire" %} +

+ + {% trans "View on Inventaire" %} + +

+ {% endif %} + + {% if author.librarything_key %} +

+ + {% trans "View on LibraryThing" %} + +

+ {% endif %} + + {% if author.goodreads_key %} +

+ + {% trans "View on Goodreads" %} +

{% endif %}
diff --git a/bookwyrm/templates/author/edit_author.html b/bookwyrm/templates/author/edit_author.html index 010d36efc..103341bfd 100644 --- a/bookwyrm/templates/author/edit_author.html +++ b/bookwyrm/templates/author/edit_author.html @@ -29,67 +29,85 @@

{% trans "Metadata" %}

-

{{ form.name }}

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

{{ error | escape }}

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

{{ error | escape }}

+ {% endfor %} +
-

+

{{ form.aliases }} {% trans "Separate multiple values with commas." %} -

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

{{ error | escape }}

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

{{ error | escape }}

+ {% endfor %} +
-

{{ form.bio }}

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

{{ error | escape }}

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

{{ error | escape }}

+ {% endfor %} +
-

{{ form.wikipedia_link }}

+

{{ form.wikipedia_link }}

{% for error in form.wikipedia_link.errors %}

{{ error | escape }}

{% endfor %} -

+

-

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

{{ error | escape }}

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

{{ error | escape }}

+ {% endfor %} +
-

+

-

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

{{ error | escape }}

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

{{ error | escape }}

+ {% endfor %} +

{% trans "Author Identifiers" %}

-

{{ form.openlibrary_key }}

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

{{ error | escape }}

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

{{ error | escape }}

+ {% endfor %} +
-

{{ form.inventaire_id }}

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

{{ error | escape }}

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

{{ error | escape }}

+ {% endfor %} +
-

{{ form.librarything_key }}

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

{{ error | escape }}

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

{{ error | escape }}

+ {% endfor %} +
-

{{ form.goodreads_key }}

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

{{ error | escape }}

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

{{ error | escape }}

+ {% endfor %} +
diff --git a/bookwyrm/templates/book/book.html b/bookwyrm/templates/book/book.html index 150bda44e..26bd8322c 100644 --- a/bookwyrm/templates/book/book.html +++ b/bookwyrm/templates/book/book.html @@ -12,28 +12,36 @@
-

- - {{ book.title }}{% if book.subtitle %}: - {{ book.subtitle }} - {% endif %} - - - {% if book.series %} - - - - - ({{ book.series }} - {% if book.series_number %} #{{ book.series_number }}{% endif %}) - -
- {% endif %} +

+ {{ book.title }}

+ + {% if book.subtitle or book.series %} +

+ {% if book.subtitle %} + + + + {{ book.subtitle }} + + {% endif %} + + {% if book.series %} + + + + ({{ book.series }}{% if book.series_number %} #{{ book.series_number }}{% endif %}) + {% endif %} +

+ {% endif %} + {% if book.authors %} -

- {% trans "by" %} {% include 'snippets/authors.html' with book=book %} -

+
+ {% trans "by" %} {% include 'snippets/authors.html' with book=book %} +
{% endif %}
@@ -41,7 +49,7 @@ {% endif %} @@ -89,7 +97,7 @@
-

+

{% with full=book|book_description itemprop='abstract' %} {% include 'snippets/trimmed_text.html' %} @@ -185,7 +193,7 @@

{% trans "You don't have any reading activity for this book." %}

{% endif %} {% for readthrough in readthroughs %} - {% include 'snippets/readthrough.html' with readthrough=readthrough %} + {% include 'book/readthrough.html' with readthrough=readthrough %} {% endfor %} diff --git a/bookwyrm/templates/book/edit_book.html b/bookwyrm/templates/book/edit_book.html index 8dae1d044..32018a251 100644 --- a/bookwyrm/templates/book/edit_book.html +++ b/bookwyrm/templates/book/edit_book.html @@ -14,11 +14,25 @@ {% endif %} {% if book %} -
-

{% trans "Added:" %} {{ book.created_date | naturaltime }}

-

{% trans "Updated:" %} {{ book.updated_date | naturaltime }}

-

{% trans "Last edited by:" %} {{ book.last_edited_by.display_name }}

-
+
+
+
{% trans "Added:" %}
+
{{ book.created_date | naturaltime }}
+
+ +
+
{% trans "Updated:" %}
+
{{ book.updated_date | naturaltime }}
+
+ + {% if book.last_edited_by %} +
+
{% trans "Last edited by:" %}
+
{{ book.last_edited_by.display_name }}
+
+ {% endif %} + +
{% endif %} @@ -38,21 +52,28 @@ {% if confirm_mode %}

{% trans "Confirm Book Info" %}

-
+
{% if author_matches %}
{% for author in author_matches %} -
- {% blocktrans with name=author.name %}Is "{{ name }}" an existing author?{% endblocktrans %} +
+ + {% blocktrans with name=author.name %}Is "{{ name }}" an existing author?{% endblocktrans %} + {% with forloop.counter0 as counter %} {% for match in author.matches %} - +

{% blocktrans with book_title=match.book_set.first.title %}Author of {{ book_title }}{% endblocktrans %}

{% endfor %} - + {% endwith %}
{% endfor %} @@ -64,11 +85,17 @@ {% if not book %}
- {% trans "Is this an edition of an existing work?" %} + + {% trans "Is this an edition of an existing work?" %} + {% for match in book_matches %} - + {% endfor %} - +
{% endif %} @@ -89,76 +116,79 @@

{% trans "Metadata" %}

-

+

-

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

{{ error | escape }}

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

{{ error | escape }}

+ {% endfor %} +
-

+

-

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

{{ error | escape }}

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

{{ error | escape }}

+ {% endfor %} +
-

{{ form.description }}

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

{{ error | escape }}

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

{{ error | escape }}

+ {% endfor %} +
-

+

-

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

{{ error | escape }}

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

{{ error | escape }}

+ {% endfor %} +
-

+

{{ form.series_number }} -

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

{{ error | escape }}

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

{{ error | escape }}

+ {% endfor %} +
-

+

{{ form.languages }} {% trans "Separate multiple values with commas." %} -

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

{{ error | escape }}

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

{{ error | escape }}

+ {% endfor %} +
-

+

{{ form.publishers }} {% trans "Separate multiple values with commas." %} -

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

{{ error | escape }}

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

{{ error | escape }}

+ {% endfor %} +
-

+

-

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

{{ error | escape }}

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

{{ error | escape }}

+ {% endfor %} +
-

+

-

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

{{ error | escape }}

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

{{ error | escape }}

+ {% endfor %} +
@@ -166,16 +196,23 @@ {% if book.authors.exists %}
{% for author in book.authors.all %} - +
+ +

+ {% blocktrans with name=author.name %}Author page for {{ name }}{% endblocktrans %} +

+
{% endfor %}
{% endif %} - - - {% trans "Separate multiple values with commas." %} +
+ + + {% trans "Separate multiple values with commas." %} +
@@ -188,17 +225,17 @@
-

+

{{ form.cover }} -

+
{% if book %} -

+

-

+
{% endif %} {% for error in form.cover.errors %}

{{ error | escape }}

@@ -209,51 +246,72 @@

{% trans "Physical Properties" %}

-

{{ form.physical_format }}

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

{{ error | escape }}

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

{{ error | escape }}

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

{{ error | escape }}

+ {% endfor %} +
-

{{ form.pages }}

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

{{ error | escape }}

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

{{ error | escape }}

+ {% endfor %} +

{% trans "Book Identifiers" %}

-

{{ form.isbn_13 }}

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

{{ error | escape }}

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

{{ error | escape }}

+ {% endfor %} +
-

{{ form.isbn_10 }}

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

{{ error | escape }}

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

{{ error | escape }}

+ {% endfor %} +
-

{{ form.openlibrary_key }}

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

{{ error | escape }}

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

{{ error | escape }}

+ {% endfor %} +
-

{{ form.inventaire_id }}

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

{{ error | escape }}

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

{{ error | escape }}

+ {% endfor %} +
-

{{ form.oclc_number }}

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

{{ error | escape }}

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

{{ error | escape }}

+ {% endfor %} +
-

{{ form.asin }}

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

{{ error | escape }}

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

{{ error | escape }}

+ {% endfor %} +
@@ -261,7 +319,7 @@ {% if not confirm_mode %} {% endif %} diff --git a/bookwyrm/templates/book/editions.html b/bookwyrm/templates/book/editions.html index 0d5c10447..e2a0bdda5 100644 --- a/bookwyrm/templates/book/editions.html +++ b/bookwyrm/templates/book/editions.html @@ -40,7 +40,7 @@
- {% include 'snippets/shelve_button/shelve_button.html' with book=book switch_mode=True %} + {% include 'snippets/shelve_button/shelve_button.html' with book=book switch_mode=True right=True %}
{% endfor %} diff --git a/bookwyrm/templates/snippets/readthrough.html b/bookwyrm/templates/book/readthrough.html similarity index 97% rename from bookwyrm/templates/snippets/readthrough.html rename to bookwyrm/templates/book/readthrough.html index d5e79b864..751407461 100644 --- a/bookwyrm/templates/snippets/readthrough.html +++ b/bookwyrm/templates/book/readthrough.html @@ -1,8 +1,8 @@ {% load i18n %} {% load humanize %} {% load tz %} -
-
+
+
{% trans "Progress Updates:" %} diff --git a/bookwyrm/templates/components/modal.html b/bookwyrm/templates/components/modal.html index 0a05f9512..b29ff8d91 100644 --- a/bookwyrm/templates/components/modal.html +++ b/bookwyrm/templates/components/modal.html @@ -1,7 +1,7 @@ {% load i18n %} diff --git a/bookwyrm/templates/import.html b/bookwyrm/templates/import.html index 2b7d69e10..d2e407486 100644 --- a/bookwyrm/templates/import.html +++ b/bookwyrm/templates/import.html @@ -41,8 +41,8 @@
-
diff --git a/bookwyrm/templates/import_status.html b/bookwyrm/templates/import_status.html index b1145611d..11ff47f19 100644 --- a/bookwyrm/templates/import_status.html +++ b/bookwyrm/templates/import_status.html @@ -7,14 +7,19 @@ {% block content %}{% spaceless %}

{% trans "Import Status" %}

+ {% trans "Back to imports" %} -

- {% trans "Import started:" %} {{ job.created_date | naturaltime }} -

- {% if job.complete %} -

- {% trans "Import completed:" %} {{ task.date_done | naturaltime }} -

+
+
+
{% trans "Import started:" %}
+
{{ job.created_date | naturaltime }}
+
+ {% if job.complete %} +
+
{% trans "Import completed:" %}
+
{{ task.date_done | naturaltime }}
+
+
{% elif task.failed %}
{% trans "TASK FAILED" %}
{% endif %} @@ -22,8 +27,9 @@
{% if not job.complete %} - {% trans "Import still in progress." %}

+ {% trans "Import still in progress." %} +
{% trans "(Hit reload to update!)" %}

{% endif %} @@ -49,16 +55,13 @@
    {% for item in failed_items %} -
  • - - -

    +

  • + +
  • {% endfor %}
@@ -104,7 +107,11 @@ {% endif %}
+ {% if job.complete %}

{% trans "Successfully imported" %}

+ {% else %} +

{% trans "Import Progress" %}

+ {% endif %} {% url 'settings-federation' as url %} diff --git a/bookwyrm/templates/user_admin/user_moderation_actions.html b/bookwyrm/templates/user_admin/user_moderation_actions.html index 816e787a2..e4460a687 100644 --- a/bookwyrm/templates/user_admin/user_moderation_actions.html +++ b/bookwyrm/templates/user_admin/user_moderation_actions.html @@ -1,6 +1,12 @@ {% load i18n %}
+ {% if not user.is_active and user.deactivation_reason == "self_deletion" %} +
+ {% trans "Permanently deleted" %} +
+ {% else %}

{% trans "Actions" %}

+

{% trans "Send direct message" %} @@ -14,6 +20,7 @@ {% endif %}

+ {% if user.local %}
@@ -39,4 +46,6 @@
{% endif %} + + {% endif %}
diff --git a/bookwyrm/templates/widgets/clearable_file_input_with_warning.html b/bookwyrm/templates/widgets/clearable_file_input_with_warning.html new file mode 100644 index 000000000..e4906cb9a --- /dev/null +++ b/bookwyrm/templates/widgets/clearable_file_input_with_warning.html @@ -0,0 +1,24 @@ +{% load i18n %} +{% load utilities %} + +{% if widget.is_initial %} +

+ {{ widget.initial_text }}: + {{ widget.value|truncatepath:10 }} +

+{% if not widget.required %} +

+ {% endif %} +

+

+{{ widget.input_text }}: +{% else %} +

+{% endif %} + + +

+ diff --git a/bookwyrm/templatetags/utilities.py b/bookwyrm/templatetags/utilities.py index 68befa54a..23b6685d6 100644 --- a/bookwyrm/templatetags/utilities.py +++ b/bookwyrm/templatetags/utilities.py @@ -1,6 +1,8 @@ """ template filters for really common utilities """ +import os from uuid import uuid4 from django import template +from django.utils.translation import gettext_lazy as _ register = template.Library() @@ -19,13 +21,16 @@ def get_user_identifier(user): @register.filter(name="book_title") -def get_title(book): +def get_title(book, too_short=5): """display the subtitle if the title is short""" if not book: return "" title = book.title - if len(title) < 6 and book.subtitle: - title = "{:s}: {:s}".format(title, book.subtitle) + if len(title) <= too_short and book.subtitle: + title = _("%(title)s: %(subtitle)s") % { + "title": title, + "subtitle": book.subtitle, + } return title @@ -33,3 +38,15 @@ def get_title(book): def comparison_bool(str1, str2): """idk why I need to write a tag for this, it reutrns a bool""" return str1 == str2 + + +@register.filter(is_safe=True) +def truncatepath(value, arg): + """Truncate a path by removing all directories except the first and truncating .""" + path = os.path.normpath(value.name) + path_list = path.split(os.sep) + try: + 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:]) diff --git a/bookwyrm/tests/models/test_status_model.py b/bookwyrm/tests/models/test_status_model.py index a14c515ee..f8d49abc3 100644 --- a/bookwyrm/tests/models/test_status_model.py +++ b/bookwyrm/tests/models/test_status_model.py @@ -16,6 +16,7 @@ from bookwyrm import activitypub, models, settings # pylint: disable=too-many-public-methods @patch("bookwyrm.models.Status.broadcast") @patch("bookwyrm.activitystreams.ActivityStream.add_status") +@patch("bookwyrm.activitystreams.ActivityStream.remove_object_from_related_stores") class Status(TestCase): """lotta types of statuses""" @@ -393,7 +394,8 @@ class Status(TestCase): user=self.local_user, notification_type="GLORB" ) - def test_create_broadcast(self, _, broadcast_mock): + # pylint: disable=unused-argument + def test_create_broadcast(self, one, two, broadcast_mock, *_): """should send out two verions of a status on create""" models.Comment.objects.create( content="hi", user=self.local_user, book=self.book diff --git a/bookwyrm/tests/test_templatetags.py b/bookwyrm/tests/test_templatetags.py index 9a215cadf..2e10d9308 100644 --- a/bookwyrm/tests/test_templatetags.py +++ b/bookwyrm/tests/test_templatetags.py @@ -16,6 +16,7 @@ from bookwyrm.templatetags import ( @patch("bookwyrm.activitystreams.ActivityStream.add_status") +@patch("bookwyrm.activitystreams.ActivityStream.remove_object_from_related_stores") class TemplateTags(TestCase): """lotta different things here""" @@ -40,29 +41,29 @@ class TemplateTags(TestCase): with patch("bookwyrm.preview_images.generate_edition_preview_image_task.delay"): self.book = models.Edition.objects.create(title="Test Book") - def test_get_user_rating(self, _): + def test_get_user_rating(self, *_): """get a user's most recent rating of a book""" with patch("bookwyrm.preview_images.generate_edition_preview_image_task.delay"): with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): models.Review.objects.create(user=self.user, book=self.book, rating=3) self.assertEqual(bookwyrm_tags.get_user_rating(self.book, self.user), 3) - def test_get_user_rating_doesnt_exist(self, _): + def test_get_user_rating_doesnt_exist(self, *_): """there is no rating available""" self.assertEqual(bookwyrm_tags.get_user_rating(self.book, self.user), 0) - def test_get_user_identifer_local(self, _): + def test_get_user_identifer_local(self, *_): """fall back to the simplest uid available""" self.assertNotEqual(self.user.username, self.user.localname) self.assertEqual(utilities.get_user_identifier(self.user), "mouse") - def test_get_user_identifer_remote(self, _): + def test_get_user_identifer_remote(self, *_): """for a remote user, should be their full username""" self.assertEqual( utilities.get_user_identifier(self.remote_user), "rat@example.com" ) - def test_get_replies(self, _): + def test_get_replies(self, *_): """direct replies to a status""" with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): with patch( @@ -93,7 +94,7 @@ class TemplateTags(TestCase): self.assertTrue(second_child in replies) self.assertFalse(third_child in replies) - def test_get_parent(self, _): + def test_get_parent(self, *_): """get the reply parent of a status""" with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): with patch( @@ -110,7 +111,7 @@ class TemplateTags(TestCase): self.assertEqual(result, parent) self.assertIsInstance(result, models.Review) - def test_get_user_liked(self, _): + def test_get_user_liked(self, *_): """did a user like a status""" with patch("bookwyrm.preview_images.generate_edition_preview_image_task.delay"): status = models.Review.objects.create(user=self.remote_user, book=self.book) @@ -120,7 +121,7 @@ class TemplateTags(TestCase): models.Favorite.objects.create(user=self.user, status=status) self.assertTrue(interaction.get_user_liked(self.user, status)) - def test_get_user_boosted(self, _): + def test_get_user_boosted(self, *_): """did a user boost a status""" with patch("bookwyrm.preview_images.generate_edition_preview_image_task.delay"): status = models.Review.objects.create(user=self.remote_user, book=self.book) @@ -130,7 +131,7 @@ class TemplateTags(TestCase): models.Boost.objects.create(user=self.user, boosted_status=status) self.assertTrue(interaction.get_user_boosted(self.user, status)) - def test_get_boosted(self, _): + def test_get_boosted(self, *_): """load a boosted status""" with patch("bookwyrm.preview_images.generate_edition_preview_image_task.delay"): with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): @@ -144,7 +145,7 @@ class TemplateTags(TestCase): self.assertIsInstance(boosted, models.Review) self.assertEqual(boosted, status) - def test_get_book_description(self, _): + def test_get_book_description(self, *_): """grab it from the edition or the parent""" with patch("bookwyrm.preview_images.generate_edition_preview_image_task.delay"): work = models.Work.objects.create(title="Test Work") @@ -161,12 +162,12 @@ class TemplateTags(TestCase): self.book.save() self.assertEqual(bookwyrm_tags.get_book_description(self.book), "hello") - def test_get_uuid(self, _): + def test_get_uuid(self, *_): """uuid functionality""" uuid = utilities.get_uuid("hi") self.assertTrue(re.match(r"hi[A-Za-z0-9\-]", uuid)) - def test_get_markdown(self, _): + def test_get_markdown(self, *_): """mardown format data""" result = markdown.get_markdown("_hi_") self.assertEqual(result, "

hi

") @@ -174,13 +175,13 @@ class TemplateTags(TestCase): result = markdown.get_markdown("_hi_") self.assertEqual(result, "

hi

") - def test_get_mentions(self, _): + def test_get_mentions(self, *_): """list of people mentioned""" status = models.Status.objects.create(content="hi", user=self.remote_user) result = status_display.get_mentions(status, self.user) self.assertEqual(result, "@rat@example.com ") - def test_related_status(self, _): + def test_related_status(self, *_): """gets the subclass model for a notification status""" with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): status = models.Status.objects.create(content="hi", user=self.user) diff --git a/bookwyrm/tests/views/inbox/test_inbox_announce.py b/bookwyrm/tests/views/inbox/test_inbox_announce.py index 4815c6895..43900e339 100644 --- a/bookwyrm/tests/views/inbox/test_inbox_announce.py +++ b/bookwyrm/tests/views/inbox/test_inbox_announce.py @@ -54,7 +54,8 @@ class InboxActivities(TestCase): models.SiteSettings.objects.create() @patch("bookwyrm.activitystreams.ActivityStream.add_status") - def test_boost(self, redis_mock): + @patch("bookwyrm.activitystreams.ActivityStream.remove_object_from_related_stores") + def test_boost(self, redis_mock, _): """boost a status""" self.assertEqual(models.Notification.objects.count(), 0) activity = { @@ -84,7 +85,8 @@ class InboxActivities(TestCase): @responses.activate @patch("bookwyrm.activitystreams.ActivityStream.add_status") - def test_boost_remote_status(self, redis_mock): + @patch("bookwyrm.activitystreams.ActivityStream.remove_object_from_related_stores") + def test_boost_remote_status(self, redis_mock, _): """boost a status from a remote server""" with patch("bookwyrm.preview_images.generate_edition_preview_image_task.delay"): work = models.Work.objects.create(title="work title") @@ -157,12 +159,13 @@ class InboxActivities(TestCase): views.inbox.activity_task(activity) self.assertEqual(models.Boost.objects.count(), 0) - def test_unboost(self): + @patch("bookwyrm.activitystreams.ActivityStream.add_status") + @patch("bookwyrm.activitystreams.ActivityStream.remove_object_from_related_stores") + def test_unboost(self, *_): """undo a boost""" - with patch("bookwyrm.activitystreams.ActivityStream.add_status"): - boost = models.Boost.objects.create( - boosted_status=self.status, user=self.remote_user - ) + boost = models.Boost.objects.create( + boosted_status=self.status, user=self.remote_user + ) activity = { "type": "Undo", "actor": "hi", @@ -179,11 +182,7 @@ class InboxActivities(TestCase): "published": "Mon, 25 May 2020 19:31:20 GMT", }, } - with patch( - "bookwyrm.activitystreams.ActivityStream.remove_object_from_related_stores" - ) as redis_mock: - views.inbox.activity_task(activity) - self.assertTrue(redis_mock.called) + views.inbox.activity_task(activity) self.assertFalse(models.Boost.objects.exists()) def test_unboost_unknown_boost(self): diff --git a/bookwyrm/tests/views/test_edit_user.py b/bookwyrm/tests/views/test_edit_user.py new file mode 100644 index 000000000..e3b9d4635 --- /dev/null +++ b/bookwyrm/tests/views/test_edit_user.py @@ -0,0 +1,150 @@ +""" test for app action functionality """ +import json +import pathlib +from unittest.mock import patch +from PIL import Image + +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 +from django.test import TestCase +from django.test.client import RequestFactory + +from bookwyrm import forms, models, views + + +class EditUserViews(TestCase): + """view user and edit profile""" + + def setUp(self): + """we need basic test data and mocks""" + self.factory = RequestFactory() + self.local_user = models.User.objects.create_user( + "mouse@local.com", + "mouse@mouse.mouse", + "password", + local=True, + localname="mouse", + ) + self.rat = models.User.objects.create_user( + "rat@local.com", "rat@rat.rat", "password", local=True, localname="rat" + ) + self.book = models.Edition.objects.create(title="test") + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): + models.ShelfBook.objects.create( + book=self.book, + user=self.local_user, + shelf=self.local_user.shelf_set.first(), + ) + + models.SiteSettings.objects.create() + self.anonymous_user = AnonymousUser + self.anonymous_user.is_authenticated = False + + def test_edit_user_page(self): + """there are so many views, this just makes sure it LOADS""" + view = views.EditUser.as_view() + request = self.factory.get("") + request.user = self.local_user + result = view(request) + self.assertIsInstance(result, TemplateResponse) + result.render() + self.assertEqual(result.status_code, 200) + + def test_edit_user(self): + """use a form to update a user""" + view = views.EditUser.as_view() + form = forms.EditUserForm(instance=self.local_user) + form.data["name"] = "New Name" + form.data["email"] = "wow@email.com" + form.data["preferred_timezone"] = "UTC" + request = self.factory.post("", form.data) + request.user = self.local_user + + 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) + self.assertEqual(self.local_user.name, "New Name") + self.assertEqual(self.local_user.email, "wow@email.com") + + def test_edit_user_avatar(self): + """use a form to update a user""" + view = views.EditUser.as_view() + form = forms.EditUserForm(instance=self.local_user) + form.data["name"] = "New Name" + form.data["email"] = "wow@email.com" + form.data["preferred_timezone"] = "UTC" + image_file = pathlib.Path(__file__).parent.joinpath( + "../../static/images/no_cover.jpg" + ) + form.data["avatar"] = SimpleUploadedFile( + image_file, open(image_file, "rb").read(), content_type="image/jpeg" + ) + request = self.factory.post("", form.data) + request.user = self.local_user + + with patch( + "bookwyrm.models.activitypub_mixin.broadcast_task.delay" + ) as delay_mock: + view(request) + self.assertEqual(delay_mock.call_count, 1) + self.assertEqual(self.local_user.name, "New Name") + self.assertEqual(self.local_user.email, "wow@email.com") + self.assertIsNotNone(self.local_user.avatar) + self.assertEqual(self.local_user.avatar.width, 120) + self.assertEqual(self.local_user.avatar.height, 120) + + def test_crop_avatar(self): + """reduce that image size""" + image_file = pathlib.Path(__file__).parent.joinpath( + "../../static/images/no_cover.jpg" + ) + image = Image.open(image_file) + + result = views.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) + + 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_interaction.py b/bookwyrm/tests/views/test_interaction.py index cb974dcdb..1661676cb 100644 --- a/bookwyrm/tests/views/test_interaction.py +++ b/bookwyrm/tests/views/test_interaction.py @@ -8,6 +8,7 @@ from bookwyrm import models, views @patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay") +@patch("bookwyrm.activitystreams.ActivityStream.remove_object_from_related_stores") class InteractionViews(TestCase): """viewing and creating statuses""" @@ -42,7 +43,7 @@ class InteractionViews(TestCase): parent_work=work, ) - def test_favorite(self, _): + def test_favorite(self, *_): """create and broadcast faving a status""" view = views.Favorite.as_view() request = self.factory.post("") @@ -60,7 +61,7 @@ class InteractionViews(TestCase): self.assertEqual(notification.user, self.local_user) self.assertEqual(notification.related_user, self.remote_user) - def test_unfavorite(self, _): + def test_unfavorite(self, *_): """unfav a status""" view = views.Unfavorite.as_view() request = self.factory.post("") @@ -77,7 +78,7 @@ class InteractionViews(TestCase): self.assertEqual(models.Favorite.objects.count(), 0) self.assertEqual(models.Notification.objects.count(), 0) - def test_boost(self, _): + def test_boost(self, *_): """boost a status""" view = views.Boost.as_view() request = self.factory.post("") @@ -99,7 +100,7 @@ class InteractionViews(TestCase): self.assertEqual(notification.related_user, self.remote_user) self.assertEqual(notification.related_status, status) - def test_self_boost(self, _): + def test_self_boost(self, *_): """boost your own status""" view = views.Boost.as_view() request = self.factory.post("") @@ -123,7 +124,7 @@ class InteractionViews(TestCase): self.assertFalse(models.Notification.objects.exists()) - def test_boost_unlisted(self, _): + def test_boost_unlisted(self, *_): """boost a status""" view = views.Boost.as_view() request = self.factory.post("") @@ -138,7 +139,7 @@ class InteractionViews(TestCase): boost = models.Boost.objects.get() self.assertEqual(boost.privacy, "unlisted") - def test_boost_private(self, _): + def test_boost_private(self, *_): """boost a status""" view = views.Boost.as_view() request = self.factory.post("") @@ -151,7 +152,7 @@ class InteractionViews(TestCase): view(request, status.id) self.assertFalse(models.Boost.objects.exists()) - def test_boost_twice(self, _): + def test_boost_twice(self, *_): """boost a status""" view = views.Boost.as_view() request = self.factory.post("") @@ -163,13 +164,17 @@ class InteractionViews(TestCase): view(request, status.id) self.assertEqual(models.Boost.objects.count(), 1) - def test_unboost(self, _): + @patch("bookwyrm.activitystreams.ActivityStream.add_status") + def test_unboost(self, *_): """undo a boost""" view = views.Unboost.as_view() request = self.factory.post("") request.user = self.remote_user - with patch("bookwyrm.activitystreams.ActivityStream.add_status"): - status = models.Status.objects.create(user=self.local_user, content="hi") + status = models.Status.objects.create(user=self.local_user, content="hi") + + with patch( + "bookwyrm.activitystreams.ActivityStream.remove_object_from_related_stores" + ): views.Boost.as_view()(request, status.id) self.assertEqual(models.Boost.objects.count(), 1) diff --git a/bookwyrm/tests/views/test_reading.py b/bookwyrm/tests/views/test_reading.py index 1ffdde732..ec0d1339b 100644 --- a/bookwyrm/tests/views/test_reading.py +++ b/bookwyrm/tests/views/test_reading.py @@ -58,7 +58,7 @@ class ReadingViews(TestCase): ) request.user = self.local_user with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): - views.start_reading(request, self.book.id) + views.ReadingStatus.as_view()(request, "start", self.book.id) self.assertEqual(shelf.books.get(), self.book) @@ -88,7 +88,7 @@ class ReadingViews(TestCase): request = self.factory.post("") request.user = self.local_user with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): - views.start_reading(request, self.book.id) + views.ReadingStatus.as_view()(request, "start", self.book.id) self.assertFalse(to_read_shelf.books.exists()) self.assertEqual(shelf.books.get(), self.book) @@ -114,7 +114,7 @@ class ReadingViews(TestCase): request.user = self.local_user with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"): - views.finish_reading(request, self.book.id) + views.ReadingStatus.as_view()(request, "finish", self.book.id) self.assertEqual(shelf.books.get(), self.book) diff --git a/bookwyrm/tests/views/test_readthrough.py b/bookwyrm/tests/views/test_readthrough.py index a0050a82d..ed4795700 100644 --- a/bookwyrm/tests/views/test_readthrough.py +++ b/bookwyrm/tests/views/test_readthrough.py @@ -35,7 +35,7 @@ class ReadThrough(TestCase): self.assertEqual(self.edition.readthrough_set.count(), 0) self.client.post( - "/start-reading/{}".format(self.edition.id), + "/reading-status/start/{}".format(self.edition.id), { "start_date": "2020-11-27", }, @@ -56,10 +56,9 @@ class ReadThrough(TestCase): self.assertEqual(self.edition.readthrough_set.count(), 0) self.client.post( - "/start-reading/{}".format(self.edition.id), + "/reading-status/start/{}".format(self.edition.id), { "start_date": "2020-11-27", - "progress": 50, }, ) @@ -68,15 +67,8 @@ class ReadThrough(TestCase): self.assertEqual( readthroughs[0].start_date, datetime(2020, 11, 27, tzinfo=timezone.utc) ) - self.assertEqual(readthroughs[0].progress, 50) self.assertEqual(readthroughs[0].finish_date, None) - progress_updates = readthroughs[0].progressupdate_set.all() - self.assertEqual(len(progress_updates), 1) - self.assertEqual(progress_updates[0].mode, models.ProgressMode.PAGE) - self.assertEqual(progress_updates[0].progress, 50) - self.assertEqual(delay_mock.call_count, 1) - # Update progress self.client.post( "/edit-readthrough", @@ -89,9 +81,9 @@ class ReadThrough(TestCase): progress_updates = ( readthroughs[0].progressupdate_set.order_by("updated_date").all() ) - self.assertEqual(len(progress_updates), 2) - self.assertEqual(progress_updates[1].mode, models.ProgressMode.PAGE) - self.assertEqual(progress_updates[1].progress, 100) + self.assertEqual(len(progress_updates), 1) + self.assertEqual(progress_updates[0].mode, models.ProgressMode.PAGE) + self.assertEqual(progress_updates[0].progress, 100) # Edit doesn't publish anything self.assertEqual(delay_mock.call_count, 1) diff --git a/bookwyrm/tests/views/test_user.py b/bookwyrm/tests/views/test_user.py index 27607f790..49f297330 100644 --- a/bookwyrm/tests/views/test_user.py +++ b/bookwyrm/tests/views/test_user.py @@ -1,17 +1,13 @@ """ test for app action functionality """ -import pathlib from unittest.mock import patch -from PIL import Image from django.contrib.auth.models import AnonymousUser -from django.core.files.base import ContentFile -from django.core.files.uploadedfile import SimpleUploadedFile from django.http.response import Http404 from django.template.response import TemplateResponse from django.test import TestCase from django.test.client import RequestFactory -from bookwyrm import forms, models, views +from bookwyrm import models, views from bookwyrm.activitypub import ActivitypubResponse @@ -139,74 +135,4 @@ class UserViews(TestCase): with patch("bookwyrm.views.user.is_api_request") as is_api: is_api.return_value = False with self.assertRaises(Http404): - view(request, "rat") - - def test_edit_user_page(self): - """there are so many views, this just makes sure it LOADS""" - view = views.EditUser.as_view() - request = self.factory.get("") - request.user = self.local_user - result = view(request) - self.assertIsInstance(result, TemplateResponse) - result.render() - self.assertEqual(result.status_code, 200) - - def test_edit_user(self): - """use a form to update a user""" - view = views.EditUser.as_view() - form = forms.EditUserForm(instance=self.local_user) - form.data["name"] = "New Name" - form.data["email"] = "wow@email.com" - form.data["preferred_timezone"] = "UTC" - request = self.factory.post("", form.data) - request.user = self.local_user - - self.assertIsNone(self.local_user.name) - with patch("bookwyrm.preview_images.generate_user_preview_image_task.delay"): - with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.delay" - ) as delay_mock: - view(request) - self.assertEqual(delay_mock.call_count, 1) - self.assertEqual(self.local_user.name, "New Name") - self.assertEqual(self.local_user.email, "wow@email.com") - - def test_edit_user_avatar(self): - """use a form to update a user""" - view = views.EditUser.as_view() - form = forms.EditUserForm(instance=self.local_user) - form.data["name"] = "New Name" - form.data["email"] = "wow@email.com" - form.data["preferred_timezone"] = "UTC" - image_file = pathlib.Path(__file__).parent.joinpath( - "../../static/images/no_cover.jpg" - ) - form.data["avatar"] = SimpleUploadedFile( - image_file, open(image_file, "rb").read(), content_type="image/jpeg" - ) - request = self.factory.post("", form.data) - request.user = self.local_user - - with patch("bookwyrm.preview_images.generate_user_preview_image_task.delay"): - with patch( - "bookwyrm.models.activitypub_mixin.broadcast_task.delay" - ) as delay_mock: - view(request) - self.assertEqual(delay_mock.call_count, 1) - self.assertEqual(self.local_user.name, "New Name") - self.assertEqual(self.local_user.email, "wow@email.com") - self.assertIsNotNone(self.local_user.avatar) - self.assertEqual(self.local_user.avatar.width, 120) - self.assertEqual(self.local_user.avatar.height, 120) - - def test_crop_avatar(self): - """reduce that image size""" - image_file = pathlib.Path(__file__).parent.joinpath( - "../../static/images/no_cover.jpg" - ) - image = Image.open(image_file) - - result = views.user.crop_avatar(image) - self.assertIsInstance(result, ContentFile) - image_result = Image.open(result) - self.assertEqual(image_result.size, (120, 120)) + view(request, "rat") \ No newline at end of file diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py index cca9396f7..bfdcd9fc0 100644 --- a/bookwyrm/urls.py +++ b/bookwyrm/urls.py @@ -223,7 +223,7 @@ urlpatterns = [ re_path( r"^list/(?P\d+)/curate/?$", views.Curate.as_view(), name="list-curate" ), - # Uyser books + # User books re_path(r"%s/books/?$" % user_path, views.Shelf.as_view(), name="user-shelves"), re_path( r"^%s/(helf|books)/(?P[\w-]+)(.json)?/?$" % user_path, @@ -253,6 +253,7 @@ urlpatterns = [ views.ChangePassword.as_view(), name="prefs-password", ), + re_path(r"^preferences/delete/?$", views.DeleteUser.as_view(), name="prefs-delete"), re_path(r"^preferences/block/?$", views.Block.as_view(), name="prefs-block"), re_path(r"^block/(?P\d+)/?$", views.Block.as_view()), re_path(r"^unblock/(?P\d+)/?$", views.unblock), @@ -315,8 +316,12 @@ urlpatterns = [ re_path(r"^delete-readthrough/?$", views.delete_readthrough), re_path(r"^create-readthrough/?$", views.create_readthrough), re_path(r"^delete-progressupdate/?$", views.delete_progressupdate), - re_path(r"^start-reading/(?P\d+)/?$", views.start_reading), - re_path(r"^finish-reading/(?P\d+)/?$", views.finish_reading), + # shelve actions + re_path( + r"^reading-status/(?Pwant|start|finish)/(?P\d+)/?$", + views.ReadingStatus.as_view(), + name="reading-status", + ), # following re_path(r"^follow/?$", views.follow, name="follow"), re_path(r"^unfollow/?$", views.unfollow, name="unfollow"), diff --git a/bookwyrm/views/__init__.py b/bookwyrm/views/__init__.py index 8bfaa7dac..41bb64e54 100644 --- a/bookwyrm/views/__init__.py +++ b/bookwyrm/views/__init__.py @@ -6,6 +6,7 @@ from .block import Block, unblock from .books import Book, EditBook, ConfirmEditBook, Editions from .books import upload_cover, add_description, switch_edition, resolve_book from .directory import Directory +from .edit_user import EditUser, DeleteUser from .federation import Federation, FederatedServer from .federation import AddFederatedServer, ImportServerBlocklist from .federation import block_server, unblock_server @@ -24,8 +25,9 @@ from .landing import About, Home, Discover from .list import Lists, List, Curate, UserLists from .notifications import Notifications from .outbox import Outbox -from .reading import edit_readthrough, create_readthrough, delete_readthrough -from .reading import start_reading, finish_reading, delete_progressupdate +from .reading import edit_readthrough, create_readthrough +from .reading import delete_readthrough, delete_progressupdate +from .reading import ReadingStatus from .reports import Report, Reports, make_report, resolve_report, suspend_user from .rss_feed import RssFeed from .password import PasswordResetRequest, PasswordReset, ChangePassword @@ -36,6 +38,6 @@ from .shelf import shelve, unshelve from .site import Site from .status import CreateStatus, DeleteStatus, DeleteAndRedraft from .updates import get_notification_count, get_unread_status_count -from .user import User, EditUser, Followers, Following +from .user import User, Followers, Following from .user_admin import UserAdmin, UserAdminList from .wellknown import * diff --git a/bookwyrm/views/edit_user.py b/bookwyrm/views/edit_user.py new file mode 100644 index 000000000..c74b00c9d --- /dev/null +++ b/bookwyrm/views/edit_user.py @@ -0,0 +1,113 @@ +""" edit or delete ones 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 +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 EditUser(View): + """edit user view""" + + def get(self, request): + """edit profile page for a user""" + data = { + "form": forms.EditUserForm(instance=request.user), + "user": request.user, + } + return TemplateResponse(request, "preferences/edit_user.html", data) + + def post(self, request): + """les get fancy with images""" + form = forms.EditUserForm(request.POST, request.FILES, instance=request.user) + if not form.is_valid(): + data = {"form": form, "user": request.user} + return TemplateResponse(request, "preferences/edit_user.html", data) + + user = 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) + form.is_valid() + # 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) + + +def save_user_form(form): + """special handling for the user form""" + user = form.save(commit=False) + + if "avatar" in form.files: + # crop and resize avatar upload + image = Image.open(form.files["avatar"]) + image = crop_avatar(image) + + # set the name to a hash + extension = form.files["avatar"].name.split(".")[-1] + filename = "%s.%s" % (uuid4(), extension) + user.avatar.save(filename, image, save=False) + user.save() + return user + + +def crop_avatar(image): + """reduce the size and make an avatar square""" + target_size = 120 + width, height = image.size + thumbnail_scale = ( + height / (width / target_size) + if height > width + else width / (height / target_size) + ) + image.thumbnail([thumbnail_scale, thumbnail_scale]) + width, height = image.size + + width_diff = width - target_size + height_diff = height - target_size + cropped = image.crop( + ( + int(width_diff / 2), + int(height_diff / 2), + int(width - (width_diff / 2)), + int(height - (height_diff / 2)), + ) + ) + output = BytesIO() + cropped.save(output, format=image.format) + return ContentFile(output.getvalue()) diff --git a/bookwyrm/views/get_started.py b/bookwyrm/views/get_started.py index 7eae94831..7f6151728 100644 --- a/bookwyrm/views/get_started.py +++ b/bookwyrm/views/get_started.py @@ -14,7 +14,7 @@ from django.views import View from bookwyrm import forms, models from bookwyrm.connectors import connector_manager from .helpers import get_suggested_users -from .user import save_user_form +from .edit_user import save_user_form # pylint: disable= no-self-use diff --git a/bookwyrm/views/import_data.py b/bookwyrm/views/import_data.py index 62dcce73b..b2b88a2eb 100644 --- a/bookwyrm/views/import_data.py +++ b/bookwyrm/views/import_data.py @@ -78,13 +78,15 @@ class ImportStatus(View): def get(self, request, job_id): """status of an import job""" - job = models.ImportJob.objects.get(id=job_id) + job = get_object_or_404(models.ImportJob, id=job_id) if job.user != request.user: raise PermissionDenied + try: task = app.AsyncResult(job.task_id) except ValueError: task = None + items = job.items.order_by("index").all() failed_items = [i for i in items if i.fail_reason] items = [i for i in items if not i.fail_reason] diff --git a/bookwyrm/views/invite.py b/bookwyrm/views/invite.py index 92f930f45..3b9fd17c5 100644 --- a/bookwyrm/views/invite.py +++ b/bookwyrm/views/invite.py @@ -37,8 +37,12 @@ class ManageInvites(View): PAGE_LENGTH, ) + page = paginated.get_page(request.GET.get("page")) data = { - "invites": paginated.get_page(request.GET.get("page")), + "invites": page, + "page_range": paginated.get_elided_page_range( + page.number, on_each_side=2, on_ends=1 + ), "form": forms.CreateInviteForm(), } return TemplateResponse(request, "settings/manage_invites.html", data) @@ -118,15 +122,16 @@ class ManageInviteRequests(View): reduce(operator.or_, (Q(**f) for f in filters)) ).distinct() - paginated = Paginator( - requests, - PAGE_LENGTH, - ) + paginated = Paginator(requests, PAGE_LENGTH) + page = paginated.get_page(request.GET.get("page")) data = { "ignored": ignored, "count": paginated.count, - "requests": paginated.get_page(request.GET.get("page")), + "requests": page, + "page_range": paginated.get_elided_page_range( + page.number, on_each_side=2, on_ends=1 + ), "sort": sort, } return TemplateResponse(request, "settings/manage_invite_requests.html", data) diff --git a/bookwyrm/views/reading.py b/bookwyrm/views/reading.py index 65ca717d4..1c897ab38 100644 --- a/bookwyrm/views/reading.py +++ b/bookwyrm/views/reading.py @@ -7,95 +7,79 @@ from dateutil.parser import ParserError from django.contrib.auth.decorators import login_required from django.http import HttpResponseBadRequest, HttpResponseNotFound 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 bookwyrm import models from .helpers import get_edition, handle_reading_status -from .shelf import handle_unshelve -# pylint: disable= no-self-use -@login_required -@require_POST -def start_reading(request, book_id): - """begin reading a book""" - book = get_edition(book_id) - reading_shelf = models.Shelf.objects.filter( - identifier=models.Shelf.READING, user=request.user - ).first() +@method_decorator(login_required, name="dispatch") +# pylint: disable=no-self-use +class ReadingStatus(View): + """consider reading a book""" - # create a readthrough - readthrough = update_readthrough(request, book=book) - if readthrough: - readthrough.save() + def get(self, request, status, book_id): + """modal page""" + book = get_edition(book_id) + template = { + "want": "want.html", + "start": "start.html", + "finish": "finish.html", + }.get(status) + if not template: + return HttpResponseNotFound() + return TemplateResponse(request, f"reading_progress/{template}", {"book": book}) - # create a progress update if we have a page - readthrough.create_update() + def post(self, request, status, book_id): + """desire a book""" + identifier = { + "want": models.Shelf.TO_READ, + "start": models.Shelf.READING, + "finish": models.Shelf.READ_FINISHED, + }.get(status) + if not identifier: + return HttpResponseBadRequest() - current_status_shelfbook = ( - models.ShelfBook.objects.select_related("shelf") - .filter( - shelf__identifier__in=models.Shelf.READ_STATUS_IDENTIFIERS, - user=request.user, - book=book, + 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() ) - .first() - ) - if current_status_shelfbook is not None: - if current_status_shelfbook.shelf.identifier != models.Shelf.READING: - handle_unshelve(book, current_status_shelfbook.shelf) - else: # It already was on the shelf - return redirect(request.headers.get("Referer", "/")) + if current_status_shelfbook is not None: + if current_status_shelfbook.shelf.identifier != desired_shelf.identifier: + current_status_shelfbook.delete() + else: # It already was on the shelf + return redirect(request.headers.get("Referer", "/")) - models.ShelfBook.objects.create(book=book, shelf=reading_shelf, user=request.user) - - # post about it (if you want) - if request.POST.get("post-status"): - privacy = request.POST.get("privacy") - handle_reading_status(request.user, reading_shelf, book, privacy) - - return redirect(request.headers.get("Referer", "/")) - - -@login_required -@require_POST -def finish_reading(request, book_id): - """a user completed a book, yay""" - book = get_edition(book_id) - finished_read_shelf = models.Shelf.objects.filter( - identifier=models.Shelf.READ_FINISHED, user=request.user - ).first() - - # update or create a readthrough - readthrough = update_readthrough(request, book=book) - if readthrough: - readthrough.save() - - current_status_shelfbook = ( - models.ShelfBook.objects.select_related("shelf") - .filter( - shelf__identifier__in=models.Shelf.READ_STATUS_IDENTIFIERS, - user=request.user, - book=book, + models.ShelfBook.objects.create( + book=book, shelf=desired_shelf, user=request.user ) - .first() - ) - if current_status_shelfbook is not None: - if current_status_shelfbook.shelf.identifier != models.Shelf.READ_FINISHED: - handle_unshelve(book, current_status_shelfbook.shelf) - else: # It already was on the shelf - return redirect(request.headers.get("Referer", "/")) - models.ShelfBook.objects.create( - book=book, shelf=finished_read_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() - # post about it (if you want) - if request.POST.get("post-status"): - privacy = request.POST.get("privacy") - handle_reading_status(request.user, finished_read_shelf, book, privacy) + # post about it (if you want) + if request.POST.get("post-status"): + privacy = request.POST.get("privacy") + handle_reading_status(request.user, desired_shelf, book, privacy) - return redirect(request.headers.get("Referer", "/")) + return redirect(request.headers.get("Referer", "/")) @login_required diff --git a/bookwyrm/views/shelf.py b/bookwyrm/views/shelf.py index 538a8e343..17efec686 100644 --- a/bookwyrm/views/shelf.py +++ b/bookwyrm/views/shelf.py @@ -20,7 +20,7 @@ from .helpers import is_api_request, get_edition, get_user_from_username from .helpers import handle_reading_status, privacy_filter -# pylint: disable= no-self-use +# pylint: disable=no-self-use class Shelf(View): """shelf page""" @@ -178,11 +178,6 @@ def shelve(request): models.ShelfBook.objects.create( book=book, shelf=desired_shelf, user=request.user ) - if desired_shelf.identifier == models.Shelf.TO_READ and request.POST.get( - "post-status" - ): - privacy = request.POST.get("privacy") or desired_shelf.privacy - handle_reading_status(request.user, desired_shelf, book, privacy=privacy) else: try: models.ShelfBook.objects.create( @@ -206,7 +201,6 @@ def unshelve(request): return redirect(request.headers.get("Referer", "/")) -# pylint: disable=unused-argument def handle_unshelve(book, shelf): """unshelve a book""" row = models.ShelfBook.objects.get(book=book, shelf=shelf) diff --git a/bookwyrm/views/user.py b/bookwyrm/views/user.py index d186fe97f..f62913a93 100644 --- a/bookwyrm/views/user.py +++ b/bookwyrm/views/user.py @@ -1,25 +1,17 @@ """ non-interactive pages """ -from io import BytesIO -from uuid import uuid4 -from PIL import Image - -from django.contrib.auth.decorators import login_required -from django.core.files.base import ContentFile from django.core.paginator import Paginator -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.views import View -from bookwyrm import forms, models +from bookwyrm import models from bookwyrm.activitypub import ActivitypubResponse from bookwyrm.settings import PAGE_LENGTH from .helpers import get_user_from_username, is_api_request from .helpers import privacy_filter -# pylint: disable= no-self-use +# pylint: disable=no-self-use class User(View): """user profile page""" @@ -122,71 +114,3 @@ class Following(View): "follow_list": paginated.get_page(request.GET.get("page")), } return TemplateResponse(request, "user/relationships/following.html", data) - - -@method_decorator(login_required, name="dispatch") -class EditUser(View): - """edit user view""" - - def get(self, request): - """edit profile page for a user""" - data = { - "form": forms.EditUserForm(instance=request.user), - "user": request.user, - } - return TemplateResponse(request, "preferences/edit_user.html", data) - - def post(self, request): - """les get fancy with images""" - form = forms.EditUserForm(request.POST, request.FILES, instance=request.user) - if not form.is_valid(): - data = {"form": form, "user": request.user} - return TemplateResponse(request, "preferences/edit_user.html", data) - - user = save_user_form(form) - - return redirect(user.local_path) - - -def save_user_form(form): - """special handling for the user form""" - user = form.save(commit=False) - - if "avatar" in form.files: - # crop and resize avatar upload - image = Image.open(form.files["avatar"]) - image = crop_avatar(image) - - # set the name to a hash - extension = form.files["avatar"].name.split(".")[-1] - filename = "%s.%s" % (uuid4(), extension) - user.avatar.save(filename, image, save=False) - user.save() - return user - - -def crop_avatar(image): - """reduce the size and make an avatar square""" - target_size = 120 - width, height = image.size - thumbnail_scale = ( - height / (width / target_size) - if height > width - else width / (height / target_size) - ) - image.thumbnail([thumbnail_scale, thumbnail_scale]) - width, height = image.size - - width_diff = width - target_size - height_diff = height - target_size - cropped = image.crop( - ( - int(width_diff / 2), - int(height_diff / 2), - int(width - (width_diff / 2)), - int(height - (height_diff / 2)), - ) - ) - output = BytesIO() - cropped.save(output, format=image.format) - return ContentFile(output.getvalue()) diff --git a/bw-dev b/bw-dev index 5ef049f12..cd3321ade 100755 --- a/bw-dev +++ b/bw-dev @@ -84,13 +84,13 @@ case "$CMD" in runweb coverage run --source='.' --omit="*/test*,celerywyrm*,bookwyrm/migrations/*" manage.py test "$@" ;; pytest) - runweb pytest --no-cov-on-fail "$@" + execweb pytest --no-cov-on-fail "$@" ;; collectstatic) runweb python manage.py collectstatic --no-input ;; makemessages) - runweb django-admin makemessages --no-wrap --ignore=venv $@ + runweb django-admin makemessages --no-wrap --ignore=venv --all $@ ;; compilemessages) runweb django-admin compilemessages --ignore venv $@ diff --git a/celerywyrm/settings.py b/celerywyrm/settings.py index e4fa73ca2..107a39572 100644 --- a/celerywyrm/settings.py +++ b/celerywyrm/settings.py @@ -1,10 +1,10 @@ """ bookwyrm settings and configuration """ from bookwyrm.settings import * -CELERY_BROKER_URL = env("CELERY_BROKER") +CELERY_BROKER_URL = CELERY_BROKER CELERY_ACCEPT_CONTENT = ["json"] CELERY_TASK_SERIALIZER = "json" -CELERY_RESULT_BACKEND = "redis" +FLOWER_PORT = env("FLOWER_PORT") INSTALLED_APPS = INSTALLED_APPS + [ "celerywyrm", diff --git a/docker-compose.yml b/docker-compose.yml index 18f836502..49d02e706 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -74,10 +74,10 @@ services: restart: on-failure flower: build: . - command: flower --port=${FLOWER_PORT} + command: flower -A celerywyrm env_file: .env - environment: - - CELERY_BROKER_URL=${CELERY_BROKER} + volumes: + - .:/app networks: - main depends_on: diff --git a/locale/de_DE/LC_MESSAGES/django.mo b/locale/de_DE/LC_MESSAGES/django.mo index 089ac656a..dde00be62 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 40f770b56..3125d147c 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-05-20 14:40-0700\n" +"POT-Creation-Date: 2021-06-06 20:52+0000\n" "PO-Revision-Date: 2021-03-02 17:19-0800\n" "Last-Translator: Mouse Reeve \n" "Language-Team: English \n" @@ -62,12 +62,12 @@ msgid "Book Title" msgstr "Titel" #: bookwyrm/forms.py:301 bookwyrm/templates/snippets/create_status_form.html:34 -#: bookwyrm/templates/user/shelf/shelf.html:84 -#: bookwyrm/templates/user/shelf/shelf.html:115 +#: bookwyrm/templates/user/shelf/shelf.html:85 +#: bookwyrm/templates/user/shelf/shelf.html:116 msgid "Rating" msgstr "" -#: bookwyrm/forms.py:303 bookwyrm/templates/lists/list.html:101 +#: bookwyrm/forms.py:303 bookwyrm/templates/lists/list.html:107 msgid "Sort By" msgstr "" @@ -83,41 +83,41 @@ msgstr "Zu lesen angefangen" msgid "Descending" msgstr "Zu lesen angefangen" -#: bookwyrm/models/fields.py:24 +#: bookwyrm/models/fields.py:25 #, python-format msgid "%(value)s is not a valid remote_id" msgstr "%(value)s ist keine gültige remote_id" -#: bookwyrm/models/fields.py:33 bookwyrm/models/fields.py:42 +#: bookwyrm/models/fields.py:34 bookwyrm/models/fields.py:43 #, python-format msgid "%(value)s is not a valid username" msgstr "%(value)s ist kein gültiger Username" -#: bookwyrm/models/fields.py:165 bookwyrm/templates/layout.html:155 +#: bookwyrm/models/fields.py:166 bookwyrm/templates/layout.html:152 msgid "username" msgstr "Username" -#: bookwyrm/models/fields.py:170 +#: bookwyrm/models/fields.py:171 msgid "A user with that username already exists." msgstr "Dieser Benutzename ist bereits vergeben." -#: bookwyrm/settings.py:155 +#: bookwyrm/settings.py:156 msgid "English" msgstr "Englisch" -#: bookwyrm/settings.py:156 +#: bookwyrm/settings.py:157 msgid "German" msgstr "Deutsch" -#: bookwyrm/settings.py:157 +#: bookwyrm/settings.py:158 msgid "Spanish" msgstr "Spanisch" -#: bookwyrm/settings.py:158 +#: bookwyrm/settings.py:159 msgid "French" msgstr "Französisch" -#: bookwyrm/settings.py:159 +#: bookwyrm/settings.py:160 msgid "Simplified Chinese" msgstr "Vereinfachtes Chinesisch" @@ -266,7 +266,7 @@ msgstr "" #: bookwyrm/templates/book/edit_book.html:263 #: bookwyrm/templates/lists/form.html:42 #: bookwyrm/templates/preferences/edit_user.html:70 -#: bookwyrm/templates/settings/announcement_form.html:65 +#: bookwyrm/templates/settings/announcement_form.html:69 #: bookwyrm/templates/settings/edit_server.html:68 #: bookwyrm/templates/settings/federated_server.html:98 #: bookwyrm/templates/settings/site.html:97 @@ -398,7 +398,7 @@ msgstr "Themen" msgid "Places" msgstr "Orte" -#: bookwyrm/templates/book/book.html:276 bookwyrm/templates/layout.html:64 +#: bookwyrm/templates/book/book.html:276 bookwyrm/templates/layout.html:61 #: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12 #: bookwyrm/templates/search/layout.html:25 #: bookwyrm/templates/search/layout.html:50 @@ -414,7 +414,7 @@ msgstr "Zur Liste" #: bookwyrm/templates/book/book.html:297 #: bookwyrm/templates/book/cover_modal.html:31 -#: bookwyrm/templates/lists/list.html:164 +#: bookwyrm/templates/lists/list.html:179 msgid "Add" msgstr "Hinzufügen" @@ -559,7 +559,7 @@ msgid "John Doe, Jane Smith" msgstr "" #: bookwyrm/templates/book/edit_book.html:183 -#: bookwyrm/templates/user/shelf/shelf.html:77 +#: bookwyrm/templates/user/shelf/shelf.html:78 msgid "Cover" msgstr "" @@ -688,7 +688,7 @@ msgstr "Föderiert" #: bookwyrm/templates/directory/directory.html:4 #: bookwyrm/templates/directory/directory.html:9 -#: bookwyrm/templates/layout.html:92 +#: bookwyrm/templates/layout.html:64 msgid "Directory" msgstr "" @@ -902,7 +902,7 @@ msgid "Direct Messages with %(username)s" msgstr "Direktnachrichten mit %(username)s" #: bookwyrm/templates/feed/direct_messages.html:10 -#: bookwyrm/templates/layout.html:87 +#: bookwyrm/templates/layout.html:92 msgid "Direct Messages" msgstr "Direktnachrichten" @@ -960,7 +960,6 @@ msgid "Updates" msgstr "" #: bookwyrm/templates/feed/feed_layout.html:10 -#: bookwyrm/templates/layout.html:58 #: bookwyrm/templates/user/shelf/books_header.html:3 msgid "Your books" msgstr "Deine Bücher" @@ -1022,7 +1021,7 @@ msgid "What are you reading?" msgstr "Zu lesen angefangen" #: bookwyrm/templates/get_started/books.html:9 -#: bookwyrm/templates/lists/list.html:120 +#: bookwyrm/templates/lists/list.html:135 msgid "Search for a book" msgstr "Nach einem Buch suchen" @@ -1042,7 +1041,7 @@ msgstr "" #: bookwyrm/templates/get_started/users.html:18 #: bookwyrm/templates/get_started/users.html:19 #: bookwyrm/templates/layout.html:37 bookwyrm/templates/layout.html:38 -#: bookwyrm/templates/lists/list.html:124 +#: bookwyrm/templates/lists/list.html:139 #: bookwyrm/templates/search/layout.html:4 #: bookwyrm/templates/search/layout.html:9 msgid "Search" @@ -1061,7 +1060,7 @@ msgid "Popular on %(site_name)s" msgstr "Über %(site_name)s" #: bookwyrm/templates/get_started/books.html:58 -#: bookwyrm/templates/lists/list.html:137 +#: bookwyrm/templates/lists/list.html:152 msgid "No books found" msgstr "Keine Bücher gefunden" @@ -1184,7 +1183,7 @@ msgid "%(username)s's %(year)s Books" msgstr "%(username)ss %(year)s Bücher" #: bookwyrm/templates/import.html:5 bookwyrm/templates/import.html:9 -#: bookwyrm/templates/layout.html:97 +#: bookwyrm/templates/user/shelf/shelf.html:40 msgid "Import Books" msgstr "Bücher importieren" @@ -1271,14 +1270,14 @@ msgstr "Buch" #: bookwyrm/templates/import_status.html:114 #: bookwyrm/templates/snippets/create_status_form.html:13 -#: bookwyrm/templates/user/shelf/shelf.html:78 -#: bookwyrm/templates/user/shelf/shelf.html:98 +#: bookwyrm/templates/user/shelf/shelf.html:79 +#: bookwyrm/templates/user/shelf/shelf.html:99 msgid "Title" msgstr "Titel" #: bookwyrm/templates/import_status.html:117 -#: bookwyrm/templates/user/shelf/shelf.html:79 -#: bookwyrm/templates/user/shelf/shelf.html:101 +#: bookwyrm/templates/user/shelf/shelf.html:80 +#: bookwyrm/templates/user/shelf/shelf.html:102 msgid "Author" msgstr "Autor*in" @@ -1320,15 +1319,21 @@ msgstr "Suche nach Buch oder Benutzer*in" msgid "Main navigation menu" msgstr "Navigationshauptmenü" -#: bookwyrm/templates/layout.html:61 +#: bookwyrm/templates/layout.html:58 msgid "Feed" msgstr "" -#: bookwyrm/templates/layout.html:102 +#: bookwyrm/templates/layout.html:87 +#, fuzzy +#| msgid "Your books" +msgid "Your Books" +msgstr "Deine Bücher" + +#: bookwyrm/templates/layout.html:97 msgid "Settings" msgstr "Einstellungen" -#: bookwyrm/templates/layout.html:111 +#: bookwyrm/templates/layout.html:106 #: bookwyrm/templates/settings/admin_layout.html:31 #: bookwyrm/templates/settings/manage_invite_requests.html:15 #: bookwyrm/templates/settings/manage_invites.html:3 @@ -1336,45 +1341,47 @@ msgstr "Einstellungen" msgid "Invites" msgstr "Einladungen" -#: bookwyrm/templates/layout.html:118 +#: bookwyrm/templates/layout.html:113 msgid "Admin" msgstr "" -#: bookwyrm/templates/layout.html:125 +#: bookwyrm/templates/layout.html:120 msgid "Log out" msgstr "Abmelden" -#: bookwyrm/templates/layout.html:133 bookwyrm/templates/layout.html:134 +#: bookwyrm/templates/layout.html:128 bookwyrm/templates/layout.html:129 #: bookwyrm/templates/notifications.html:6 #: bookwyrm/templates/notifications.html:11 msgid "Notifications" msgstr "Benachrichtigungen" -#: bookwyrm/templates/layout.html:154 bookwyrm/templates/layout.html:158 +#: bookwyrm/templates/layout.html:151 bookwyrm/templates/layout.html:155 #: bookwyrm/templates/login.html:17 #: bookwyrm/templates/snippets/register_form.html:4 msgid "Username:" msgstr "" -#: bookwyrm/templates/layout.html:159 +#: bookwyrm/templates/layout.html:156 msgid "password" msgstr "Passwort" -#: bookwyrm/templates/layout.html:160 bookwyrm/templates/login.html:36 +#: bookwyrm/templates/layout.html:157 bookwyrm/templates/login.html:36 msgid "Forgot your password?" msgstr "Passwort vergessen?" -#: bookwyrm/templates/layout.html:163 bookwyrm/templates/login.html:10 +#: bookwyrm/templates/layout.html:160 bookwyrm/templates/login.html:10 #: bookwyrm/templates/login.html:33 msgid "Log in" msgstr "Anmelden" -#: bookwyrm/templates/layout.html:171 +#: bookwyrm/templates/layout.html:168 msgid "Join" msgstr "" #: bookwyrm/templates/layout.html:206 -msgid "About this server" +#, fuzzy +#| msgid "About this server" +msgid "About this instance" msgstr "Über diesen Server" #: bookwyrm/templates/layout.html:210 @@ -1438,7 +1445,7 @@ msgid "Discard" msgstr "Ablehnen" #: bookwyrm/templates/lists/edit_form.html:5 -#: bookwyrm/templates/lists/list_layout.html:17 +#: bookwyrm/templates/lists/list_layout.html:16 msgid "Edit List" msgstr "Liste bearbeiten" @@ -1487,63 +1494,64 @@ msgstr "Alle können Bücher hinzufügen" msgid "This list is currently empty" msgstr "Diese Liste ist momentan leer" -#: bookwyrm/templates/lists/list.html:65 +#: bookwyrm/templates/lists/list.html:66 #, fuzzy, python-format #| msgid "Direct Messages with %(username)s" msgid "Added by %(username)s" msgstr "Direktnachrichten mit %(username)s" -#: bookwyrm/templates/lists/list.html:77 -#, fuzzy -#| msgid "Started" -msgid "Set" -msgstr "Gestartet" - -#: bookwyrm/templates/lists/list.html:80 +#: bookwyrm/templates/lists/list.html:74 #, fuzzy #| msgid "List curation:" msgid "List position" msgstr "Listenkuratierung:" -#: bookwyrm/templates/lists/list.html:86 +#: bookwyrm/templates/lists/list.html:81 +#, fuzzy +#| msgid "Started" +msgid "Set" +msgstr "Gestartet" + +#: bookwyrm/templates/lists/list.html:89 #: bookwyrm/templates/snippets/shelf_selector.html:26 msgid "Remove" msgstr "Entfernen" -#: bookwyrm/templates/lists/list.html:99 bookwyrm/templates/lists/list.html:111 +#: bookwyrm/templates/lists/list.html:103 +#: bookwyrm/templates/lists/list.html:120 #, fuzzy #| msgid "Your Lists" msgid "Sort List" msgstr "Deine Listen" -#: bookwyrm/templates/lists/list.html:105 +#: bookwyrm/templates/lists/list.html:113 #, fuzzy #| msgid "List curation:" msgid "Direction" msgstr "Listenkuratierung:" -#: bookwyrm/templates/lists/list.html:116 +#: bookwyrm/templates/lists/list.html:127 msgid "Add Books" msgstr "Bücher hinzufügen" -#: bookwyrm/templates/lists/list.html:116 +#: bookwyrm/templates/lists/list.html:129 msgid "Suggest Books" msgstr "Bücher vorschlagen" -#: bookwyrm/templates/lists/list.html:125 +#: bookwyrm/templates/lists/list.html:140 msgid "search" msgstr "suchen" -#: bookwyrm/templates/lists/list.html:131 +#: bookwyrm/templates/lists/list.html:146 msgid "Clear search" msgstr "Suche leeren" -#: bookwyrm/templates/lists/list.html:136 +#: bookwyrm/templates/lists/list.html:151 #, 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:164 +#: bookwyrm/templates/lists/list.html:179 msgid "Suggest" msgstr "Vorschlagen" @@ -1643,7 +1651,7 @@ msgstr "Lösen" #: bookwyrm/templates/moderation/reports.html:6 #, fuzzy, python-format #| msgid "Lists: %(username)s" -msgid "Reports: %(server_name)s" +msgid "Reports: %(instance_name)s" msgstr "Listen: %(username)s" #: bookwyrm/templates/moderation/reports.html:8 @@ -1657,7 +1665,7 @@ msgstr "Aktuelle Importe" #: bookwyrm/templates/moderation/reports.html:14 #, fuzzy, python-format #| msgid "Lists: %(username)s" -msgid "Reports: %(server_name)s" +msgid "Reports: %(instance_name)s" msgstr "Listen: %(username)s" #: bookwyrm/templates/moderation/reports.html:28 @@ -1863,6 +1871,26 @@ msgstr "Profil" msgid "Relationships" msgstr "Beziehungen" +#: bookwyrm/templates/rss/title.html:5 +#: bookwyrm/templates/snippets/status/status_header.html:35 +msgid "rated" +msgstr "" + +#: bookwyrm/templates/rss/title.html:7 +#: bookwyrm/templates/snippets/status/status_header.html:37 +msgid "reviewed" +msgstr "bewertete" + +#: bookwyrm/templates/rss/title.html:9 +#: bookwyrm/templates/snippets/status/status_header.html:39 +msgid "commented on" +msgstr "kommentierte" + +#: bookwyrm/templates/rss/title.html:11 +#: bookwyrm/templates/snippets/status/status_header.html:41 +msgid "quoted" +msgstr "zitierte" + #: bookwyrm/templates/search/book.html:64 #, fuzzy #| msgid "Show results from other catalogues" @@ -1922,7 +1950,9 @@ msgstr "Nutzer*innen verwalten" #: bookwyrm/templates/settings/admin_layout.html:39 #: bookwyrm/templates/settings/federation.html:3 #: bookwyrm/templates/settings/federation.html:5 -msgid "Federated Servers" +#, fuzzy +#| msgid "Federated Servers" +msgid "Federated Instances" msgstr "Föderierende Server" #: bookwyrm/templates/settings/admin_layout.html:44 @@ -1976,6 +2006,7 @@ msgid "Back to list" msgstr "Zurück zu den Meldungen" #: bookwyrm/templates/settings/announcement.html:11 +#: bookwyrm/templates/settings/announcement_form.html:6 #, fuzzy #| msgid "Announcements" msgid "Edit Announcement" @@ -2017,7 +2048,7 @@ msgstr "Geburtsdatum:" msgid "Active:" msgstr "Aktivität" -#: bookwyrm/templates/settings/announcement_form.html:5 +#: bookwyrm/templates/settings/announcement_form.html:8 #: bookwyrm/templates/settings/announcements.html:8 #, fuzzy #| msgid "Announcements" @@ -2076,15 +2107,15 @@ msgstr "Aktivität" #: bookwyrm/templates/settings/server_blocklist.html:3 #: bookwyrm/templates/settings/server_blocklist.html:20 #, fuzzy -#| msgid "Add cover" -msgid "Add server" -msgstr "Cover hinzufügen" +#| 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 server list" +msgid "Back to instance list" msgstr "Zurück zu den Meldungen" #: bookwyrm/templates/settings/edit_server.html:16 @@ -2213,8 +2244,10 @@ msgstr "" #: bookwyrm/templates/settings/federation.html:19 #: bookwyrm/templates/user_admin/server_filter.html:5 -msgid "Server name" -msgstr "Servername" +#, fuzzy +#| msgid "Instance Name:" +msgid "Instance name" +msgstr "Instanzname" #: bookwyrm/templates/settings/federation.html:23 #, fuzzy @@ -2353,7 +2386,7 @@ msgid "Import Blocklist" msgstr "Bücher importieren" #: bookwyrm/templates/settings/server_blocklist.html:26 -#: bookwyrm/templates/snippets/goal_progress.html:5 +#: bookwyrm/templates/snippets/goal_progress.html:7 msgid "Success!" msgstr "Erfolg!" @@ -2446,15 +2479,15 @@ msgstr "Cover hinzufügen" msgid "%(title)s by " msgstr "%(title)s von " -#: bookwyrm/templates/snippets/boost_button.html:9 -#: bookwyrm/templates/snippets/boost_button.html:10 +#: bookwyrm/templates/snippets/boost_button.html:20 +#: bookwyrm/templates/snippets/boost_button.html:21 #, fuzzy #| msgid "boosted" msgid "Boost" msgstr "teilt" -#: bookwyrm/templates/snippets/boost_button.html:16 -#: bookwyrm/templates/snippets/boost_button.html:17 +#: bookwyrm/templates/snippets/boost_button.html:33 +#: bookwyrm/templates/snippets/boost_button.html:34 #, fuzzy #| msgid "Un-boost status" msgid "Un-boost" @@ -2554,13 +2587,13 @@ msgstr "Diese Lesedaten löschen?" msgid "You are deleting this readthrough and its %(count)s associated progress updates." msgstr "Du löscht diesen Leseforschritt und %(count)s zugehörige Fortschrittsupdates." -#: bookwyrm/templates/snippets/fav_button.html:9 -#: bookwyrm/templates/snippets/fav_button.html:11 +#: bookwyrm/templates/snippets/fav_button.html:10 +#: bookwyrm/templates/snippets/fav_button.html:12 msgid "Like" msgstr "" -#: bookwyrm/templates/snippets/fav_button.html:17 #: bookwyrm/templates/snippets/fav_button.html:18 +#: bookwyrm/templates/snippets/fav_button.html:19 #, fuzzy #| msgid "Un-like status" msgid "Un-like" @@ -2609,6 +2642,14 @@ msgstr "Annehmen" msgid "No rating" msgstr "Kein Rating" +#: bookwyrm/templates/snippets/form_rate_stars.html:44 +#: bookwyrm/templates/snippets/stars.html:7 +#, python-format +msgid "%(rating)s star" +msgid_plural "%(rating)s stars" +msgstr[0] "" +msgstr[1] "" + #: bookwyrm/templates/snippets/generated_status/goal.html:1 #, python-format msgid "set a goal to read %(counter)s book in %(year)s" @@ -2664,17 +2705,17 @@ msgstr "Posten" msgid "Set goal" msgstr "Ziel setzen" -#: bookwyrm/templates/snippets/goal_progress.html:7 +#: bookwyrm/templates/snippets/goal_progress.html:9 #, python-format msgid "%(percent)s%% complete!" msgstr "%(percent)s%% komplett!" -#: bookwyrm/templates/snippets/goal_progress.html:10 +#: bookwyrm/templates/snippets/goal_progress.html:12 #, python-format msgid "You've read %(read_count)s of %(goal_count)s books." msgstr "Du hast %(read_count)s von %(goal_count)s Büchern gelesen." -#: bookwyrm/templates/snippets/goal_progress.html:12 +#: bookwyrm/templates/snippets/goal_progress.html:14 #, python-format msgid "%(username)s has read %(read_count)s of %(goal_count)s books." msgstr "%(username)s hat %(read_count)s von %(goal_count)s Büchern gelesen." @@ -2787,26 +2828,6 @@ msgstr "Registrieren" msgid "Report" msgstr "Importieren" -#: bookwyrm/templates/snippets/rss_title.html:5 -#: bookwyrm/templates/snippets/status/status_header.html:35 -msgid "rated" -msgstr "" - -#: bookwyrm/templates/snippets/rss_title.html:7 -#: bookwyrm/templates/snippets/status/status_header.html:37 -msgid "reviewed" -msgstr "bewertete" - -#: bookwyrm/templates/snippets/rss_title.html:9 -#: bookwyrm/templates/snippets/status/status_header.html:39 -msgid "commented on" -msgstr "kommentierte" - -#: bookwyrm/templates/snippets/rss_title.html:11 -#: bookwyrm/templates/snippets/status/status_header.html:41 -msgid "quoted" -msgstr "zitierte" - #: bookwyrm/templates/snippets/search_result_text.html:36 msgid "Import book" msgstr "Buch importieren" @@ -2989,7 +3010,7 @@ msgstr "Regal bearbeiten" msgid "Update shelf" msgstr "Regal aktualisieren" -#: bookwyrm/templates/user/shelf/shelf.html:25 bookwyrm/views/shelf.py:51 +#: bookwyrm/templates/user/shelf/shelf.html:25 bookwyrm/views/shelf.py:56 #, fuzzy #| msgid "books" msgid "All books" @@ -2999,30 +3020,30 @@ msgstr "Bücher" msgid "Create shelf" msgstr "Regal erstellen" -#: bookwyrm/templates/user/shelf/shelf.html:61 +#: bookwyrm/templates/user/shelf/shelf.html:62 msgid "Edit shelf" msgstr "Regal bearbeiten" -#: bookwyrm/templates/user/shelf/shelf.html:80 -#: bookwyrm/templates/user/shelf/shelf.html:104 +#: bookwyrm/templates/user/shelf/shelf.html:81 +#: bookwyrm/templates/user/shelf/shelf.html:105 msgid "Shelved" msgstr "Ins Regal gestellt" -#: bookwyrm/templates/user/shelf/shelf.html:81 -#: bookwyrm/templates/user/shelf/shelf.html:108 +#: bookwyrm/templates/user/shelf/shelf.html:82 +#: bookwyrm/templates/user/shelf/shelf.html:109 msgid "Started" msgstr "Gestartet" -#: bookwyrm/templates/user/shelf/shelf.html:82 -#: bookwyrm/templates/user/shelf/shelf.html:111 +#: bookwyrm/templates/user/shelf/shelf.html:83 +#: bookwyrm/templates/user/shelf/shelf.html:112 msgid "Finished" msgstr "Abgeschlossen" -#: bookwyrm/templates/user/shelf/shelf.html:137 +#: bookwyrm/templates/user/shelf/shelf.html:138 msgid "This shelf is empty." msgstr "Dieses Regal ist leer." -#: bookwyrm/templates/user/shelf/shelf.html:143 +#: bookwyrm/templates/user/shelf/shelf.html:144 msgid "Delete shelf" msgstr "Regal löschen" @@ -3084,9 +3105,10 @@ msgid "Back to users" msgstr "Zurück zu den Meldungen" #: bookwyrm/templates/user_admin/user_admin.html:7 -#, python-format -msgid "Users: %(server_name)s" -msgstr "" +#, 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 @@ -3107,9 +3129,9 @@ msgstr "" #: bookwyrm/templates/user_admin/user_admin.html:38 #, fuzzy -#| msgid "Remove" -msgid "Remote server" -msgstr "Entfernen" +#| msgid "Instance Name:" +msgid "Remote instance" +msgstr "Instanzname" #: bookwyrm/templates/user_admin/user_admin.html:47 #, fuzzy @@ -3158,6 +3180,10 @@ msgstr "" msgid "Access level:" msgstr "" +#: bookwyrm/templates/widgets/clearable_file_input_with_warning.html:3 +msgid "File exceeds maximum size: 10MB" +msgstr "" + #: bookwyrm/views/import_data.py:67 #, fuzzy #| msgid "Email address:" @@ -3175,6 +3201,27 @@ msgstr "Dieser Benutzename ist bereits vergeben." msgid "A password reset link sent to %s" msgstr "" +#, fuzzy +#~| msgid "Lists: %(username)s" +#~ msgid "Reports: %(server_name)s" +#~ msgstr "Listen: %(username)s" + +#~ msgid "Federated Servers" +#~ msgstr "Föderierende Server" + +#~ msgid "Server name" +#~ msgstr "Servername" + +#, fuzzy +#~| msgid "Add cover" +#~ msgid "Add server" +#~ msgstr "Cover hinzufügen" + +#, fuzzy +#~| msgid "Remove" +#~ msgid "Remote server" +#~ msgstr "Entfernen" + #, fuzzy #~| msgid "Book" #~ msgid "BookWyrm\\" @@ -3225,12 +3272,12 @@ msgstr "" #~ msgid "Enter a number." #~ msgstr "Seriennummer:" -#, fuzzy, python-format +#, fuzzy #~| msgid "A user with that username already exists." #~ msgid "%(model_name)s with this %(field_labels)s already exists." #~ msgstr "Dieser Benutzename ist bereits vergeben." -#, fuzzy, python-format +#, fuzzy #~| msgid "%(value)s is not a valid remote_id" #~ msgid "Value %(value)r is not a valid choice." #~ msgstr "%(value)s ist keine gültige remote_id" @@ -3240,7 +3287,7 @@ msgstr "" #~ msgid "This field cannot be null." #~ msgstr "Dieses Regal ist leer." -#, fuzzy, python-format +#, fuzzy #~| msgid "A user with that username already exists." #~ msgid "%(model_name)s with this %(field_label)s already exists." #~ msgstr "Dieser Benutzename ist bereits vergeben." @@ -3250,7 +3297,7 @@ msgstr "" #~ msgid "Comma-separated integers" #~ msgstr "Keine aktiven Einladungen" -#, fuzzy, python-format +#, fuzzy #~| msgid "%(value)s is not a valid username" #~ msgid "“%(value)s” value must be a decimal number." #~ msgstr "%(value)s ist kein gültiger Username" @@ -3270,7 +3317,7 @@ msgstr "" #~ msgid "Email address" #~ msgstr "E-Mail Adresse" -#, fuzzy, python-format +#, fuzzy #~| msgid "%(value)s is not a valid username" #~ msgid "“%(value)s” value must be a float." #~ msgstr "%(value)s ist kein gültiger Username" @@ -3300,7 +3347,7 @@ msgstr "" #~ msgid "Positive small integer" #~ msgstr "Keine aktiven Einladungen" -#, fuzzy, python-format +#, fuzzy #~| msgid "%(value)s is not a valid username" #~ msgid "“%(value)s” is not a valid UUID." #~ msgstr "%(value)s ist kein gültiger Username" @@ -3315,12 +3362,12 @@ msgstr "" #~ msgid "One-to-one relationship" #~ msgstr "Beziehungen" -#, fuzzy, python-format +#, fuzzy #~| msgid "Relationships" #~ msgid "%(from)s-%(to)s relationship" #~ msgstr "Beziehungen" -#, fuzzy, python-format +#, fuzzy #~| msgid "Relationships" #~ msgid "%(from)s-%(to)s relationships" #~ msgstr "Beziehungen" @@ -3375,7 +3422,7 @@ msgstr "" #~ msgid "Enter a valid UUID." #~ msgstr "E-Mail Adresse" -#, fuzzy, python-format +#, fuzzy #~| msgid "%(value)s is not a valid username" #~ msgid "“%(pk)s” is not a valid value." #~ msgstr "%(value)s ist kein gültiger Username" @@ -3439,12 +3486,12 @@ msgstr "" #~ msgid "This is not a valid IPv6 address." #~ msgstr "E-Mail Adresse" -#, fuzzy, python-format +#, fuzzy #~| msgid "No books found matching the query \"%(query)s\"" #~ msgid "No %(verbose_name)s found matching the query" #~ msgstr "Keine passenden Bücher zu \"%(query)s\" gefunden" -#, fuzzy, python-format +#, fuzzy #~| msgid "%(value)s is not a valid username" #~ msgid "“%(path)s” does not exist" #~ msgstr "%(value)s ist kein gültiger Username" @@ -3463,11 +3510,9 @@ msgstr "" #~ msgid "Matching Users" #~ msgstr "Passende Nutzer*innen" -#, python-format #~ msgid "Set a reading goal for %(year)s" #~ msgstr "Leseziel für %(year)s setzen" -#, python-format #~ msgid "by %(author)s" #~ msgstr "von %(author)s" @@ -3477,17 +3522,17 @@ msgstr "" #~ msgid "Reactivate user" #~ msgstr "Nutzer:in reaktivieren" -#, fuzzy, python-format +#, fuzzy #~| msgid "Direct Messages with %(username)s" #~ msgid "replied to %(username)s's review" #~ msgstr "Direktnachrichten mit %(username)s" -#, fuzzy, python-format +#, fuzzy #~| msgid "replied to your status" #~ msgid "replied to %(username)s's comment" #~ msgstr "hat auf deinen Status geantwortet" -#, fuzzy, python-format +#, fuzzy #~| msgid "replied to your status" #~ msgid "replied to %(username)s's quote" #~ msgstr "hat auf deinen Status geantwortet" @@ -3498,7 +3543,6 @@ msgstr "" #~ msgid "Add tag" #~ msgstr "Tag hinzufügen" -#, python-format #~ msgid "Books tagged \"%(tag.name)s\"" #~ msgstr "Mit \"%(tag.name)s\" markierte Bücher" @@ -3507,7 +3551,7 @@ msgstr "" #~ msgid "Getting Started" #~ msgstr "Gestartet" -#, fuzzy, python-format +#, fuzzy #~| msgid "No users found for \"%(query)s\"" #~ msgid "No users were found for \"%(query)s\"" #~ msgstr "Keine Nutzer*innen für \"%(query)s\" gefunden" @@ -3515,7 +3559,7 @@ msgstr "" #~ msgid "Your lists" #~ msgstr "Deine Listen" -#, fuzzy, python-format +#, fuzzy #~| msgid "See all %(size)s" #~ msgid "See all %(size)s lists" #~ msgstr "Alle %(size)s anzeigen" @@ -3538,14 +3582,12 @@ msgstr "" #~ msgid "Your Shelves" #~ msgstr "Deine Regale" -#, python-format #~ msgid "%(username)s: Shelves" #~ msgstr "%(username)s: Regale" #~ msgid "Shelves" #~ msgstr "Regale" -#, python-format #~ msgid "See all %(shelf_count)s shelves" #~ msgstr "Alle %(shelf_count)s Regale anzeigen" diff --git a/locale/en_US/LC_MESSAGES/django.po b/locale/en_US/LC_MESSAGES/django.po index 1fa5eb304..8c36a2cb3 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-05-20 14:40-0700\n" +"POT-Creation-Date: 2021-06-06 20:52+0000\n" "PO-Revision-Date: 2021-02-28 17:19-0800\n" "Last-Translator: Mouse Reeve \n" "Language-Team: English \n" @@ -56,12 +56,12 @@ msgid "Book Title" msgstr "" #: bookwyrm/forms.py:301 bookwyrm/templates/snippets/create_status_form.html:34 -#: bookwyrm/templates/user/shelf/shelf.html:84 -#: bookwyrm/templates/user/shelf/shelf.html:115 +#: bookwyrm/templates/user/shelf/shelf.html:85 +#: bookwyrm/templates/user/shelf/shelf.html:116 msgid "Rating" msgstr "" -#: bookwyrm/forms.py:303 bookwyrm/templates/lists/list.html:101 +#: bookwyrm/forms.py:303 bookwyrm/templates/lists/list.html:107 msgid "Sort By" msgstr "" @@ -73,41 +73,41 @@ msgstr "" msgid "Descending" msgstr "" -#: bookwyrm/models/fields.py:24 +#: bookwyrm/models/fields.py:25 #, python-format msgid "%(value)s is not a valid remote_id" msgstr "" -#: bookwyrm/models/fields.py:33 bookwyrm/models/fields.py:42 +#: bookwyrm/models/fields.py:34 bookwyrm/models/fields.py:43 #, python-format msgid "%(value)s is not a valid username" msgstr "" -#: bookwyrm/models/fields.py:165 bookwyrm/templates/layout.html:155 +#: bookwyrm/models/fields.py:166 bookwyrm/templates/layout.html:152 msgid "username" msgstr "" -#: bookwyrm/models/fields.py:170 +#: bookwyrm/models/fields.py:171 msgid "A user with that username already exists." msgstr "" -#: bookwyrm/settings.py:155 +#: bookwyrm/settings.py:156 msgid "English" msgstr "" -#: bookwyrm/settings.py:156 +#: bookwyrm/settings.py:157 msgid "German" msgstr "" -#: bookwyrm/settings.py:157 +#: bookwyrm/settings.py:158 msgid "Spanish" msgstr "" -#: bookwyrm/settings.py:158 +#: bookwyrm/settings.py:159 msgid "French" msgstr "" -#: bookwyrm/settings.py:159 +#: bookwyrm/settings.py:160 msgid "Simplified Chinese" msgstr "" @@ -248,7 +248,7 @@ msgstr "" #: bookwyrm/templates/book/edit_book.html:263 #: bookwyrm/templates/lists/form.html:42 #: bookwyrm/templates/preferences/edit_user.html:70 -#: bookwyrm/templates/settings/announcement_form.html:65 +#: bookwyrm/templates/settings/announcement_form.html:69 #: bookwyrm/templates/settings/edit_server.html:68 #: bookwyrm/templates/settings/federated_server.html:98 #: bookwyrm/templates/settings/site.html:97 @@ -367,7 +367,7 @@ msgstr "" msgid "Places" msgstr "" -#: bookwyrm/templates/book/book.html:276 bookwyrm/templates/layout.html:64 +#: bookwyrm/templates/book/book.html:276 bookwyrm/templates/layout.html:61 #: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12 #: bookwyrm/templates/search/layout.html:25 #: bookwyrm/templates/search/layout.html:50 @@ -381,7 +381,7 @@ msgstr "" #: bookwyrm/templates/book/book.html:297 #: bookwyrm/templates/book/cover_modal.html:31 -#: bookwyrm/templates/lists/list.html:164 +#: bookwyrm/templates/lists/list.html:179 msgid "Add" msgstr "" @@ -511,7 +511,7 @@ msgid "John Doe, Jane Smith" msgstr "" #: bookwyrm/templates/book/edit_book.html:183 -#: bookwyrm/templates/user/shelf/shelf.html:77 +#: bookwyrm/templates/user/shelf/shelf.html:78 msgid "Cover" msgstr "" @@ -630,7 +630,7 @@ msgstr "" #: bookwyrm/templates/directory/directory.html:4 #: bookwyrm/templates/directory/directory.html:9 -#: bookwyrm/templates/layout.html:92 +#: bookwyrm/templates/layout.html:64 msgid "Directory" msgstr "" @@ -831,7 +831,7 @@ msgid "Direct Messages with %(username)s" msgstr "" #: bookwyrm/templates/feed/direct_messages.html:10 -#: bookwyrm/templates/layout.html:87 +#: bookwyrm/templates/layout.html:92 msgid "Direct Messages" msgstr "" @@ -887,7 +887,6 @@ msgid "Updates" msgstr "" #: bookwyrm/templates/feed/feed_layout.html:10 -#: bookwyrm/templates/layout.html:58 #: bookwyrm/templates/user/shelf/books_header.html:3 msgid "Your books" msgstr "" @@ -942,7 +941,7 @@ msgid "What are you reading?" msgstr "" #: bookwyrm/templates/get_started/books.html:9 -#: bookwyrm/templates/lists/list.html:120 +#: bookwyrm/templates/lists/list.html:135 msgid "Search for a book" msgstr "" @@ -962,7 +961,7 @@ msgstr "" #: bookwyrm/templates/get_started/users.html:18 #: bookwyrm/templates/get_started/users.html:19 #: bookwyrm/templates/layout.html:37 bookwyrm/templates/layout.html:38 -#: bookwyrm/templates/lists/list.html:124 +#: bookwyrm/templates/lists/list.html:139 #: bookwyrm/templates/search/layout.html:4 #: bookwyrm/templates/search/layout.html:9 msgid "Search" @@ -978,7 +977,7 @@ msgid "Popular on %(site_name)s" msgstr "" #: bookwyrm/templates/get_started/books.html:58 -#: bookwyrm/templates/lists/list.html:137 +#: bookwyrm/templates/lists/list.html:152 msgid "No books found" msgstr "" @@ -1090,7 +1089,7 @@ msgid "%(username)s's %(year)s Books" msgstr "" #: bookwyrm/templates/import.html:5 bookwyrm/templates/import.html:9 -#: bookwyrm/templates/layout.html:97 +#: bookwyrm/templates/user/shelf/shelf.html:40 msgid "Import Books" msgstr "" @@ -1175,14 +1174,14 @@ msgstr "" #: bookwyrm/templates/import_status.html:114 #: bookwyrm/templates/snippets/create_status_form.html:13 -#: bookwyrm/templates/user/shelf/shelf.html:78 -#: bookwyrm/templates/user/shelf/shelf.html:98 +#: bookwyrm/templates/user/shelf/shelf.html:79 +#: bookwyrm/templates/user/shelf/shelf.html:99 msgid "Title" msgstr "" #: bookwyrm/templates/import_status.html:117 -#: bookwyrm/templates/user/shelf/shelf.html:79 -#: bookwyrm/templates/user/shelf/shelf.html:101 +#: bookwyrm/templates/user/shelf/shelf.html:80 +#: bookwyrm/templates/user/shelf/shelf.html:102 msgid "Author" msgstr "" @@ -1224,15 +1223,19 @@ msgstr "" msgid "Main navigation menu" msgstr "" -#: bookwyrm/templates/layout.html:61 +#: bookwyrm/templates/layout.html:58 msgid "Feed" msgstr "" -#: bookwyrm/templates/layout.html:102 +#: bookwyrm/templates/layout.html:87 +msgid "Your Books" +msgstr "" + +#: bookwyrm/templates/layout.html:97 msgid "Settings" msgstr "" -#: bookwyrm/templates/layout.html:111 +#: bookwyrm/templates/layout.html:106 #: bookwyrm/templates/settings/admin_layout.html:31 #: bookwyrm/templates/settings/manage_invite_requests.html:15 #: bookwyrm/templates/settings/manage_invites.html:3 @@ -1240,45 +1243,45 @@ msgstr "" msgid "Invites" msgstr "" -#: bookwyrm/templates/layout.html:118 +#: bookwyrm/templates/layout.html:113 msgid "Admin" msgstr "" -#: bookwyrm/templates/layout.html:125 +#: bookwyrm/templates/layout.html:120 msgid "Log out" msgstr "" -#: bookwyrm/templates/layout.html:133 bookwyrm/templates/layout.html:134 +#: bookwyrm/templates/layout.html:128 bookwyrm/templates/layout.html:129 #: bookwyrm/templates/notifications.html:6 #: bookwyrm/templates/notifications.html:11 msgid "Notifications" msgstr "" -#: bookwyrm/templates/layout.html:154 bookwyrm/templates/layout.html:158 +#: bookwyrm/templates/layout.html:151 bookwyrm/templates/layout.html:155 #: bookwyrm/templates/login.html:17 #: bookwyrm/templates/snippets/register_form.html:4 msgid "Username:" msgstr "" -#: bookwyrm/templates/layout.html:159 +#: bookwyrm/templates/layout.html:156 msgid "password" msgstr "" -#: bookwyrm/templates/layout.html:160 bookwyrm/templates/login.html:36 +#: bookwyrm/templates/layout.html:157 bookwyrm/templates/login.html:36 msgid "Forgot your password?" msgstr "" -#: bookwyrm/templates/layout.html:163 bookwyrm/templates/login.html:10 +#: bookwyrm/templates/layout.html:160 bookwyrm/templates/login.html:10 #: bookwyrm/templates/login.html:33 msgid "Log in" msgstr "" -#: bookwyrm/templates/layout.html:171 +#: bookwyrm/templates/layout.html:168 msgid "Join" msgstr "" #: bookwyrm/templates/layout.html:206 -msgid "About this server" +msgid "About this instance" msgstr "" #: bookwyrm/templates/layout.html:210 @@ -1338,7 +1341,7 @@ msgid "Discard" msgstr "" #: bookwyrm/templates/lists/edit_form.html:5 -#: bookwyrm/templates/lists/list_layout.html:17 +#: bookwyrm/templates/lists/list_layout.html:16 msgid "Edit List" msgstr "" @@ -1385,54 +1388,55 @@ msgstr "" msgid "This list is currently empty" msgstr "" -#: bookwyrm/templates/lists/list.html:65 +#: bookwyrm/templates/lists/list.html:66 #, python-format msgid "Added by %(username)s" msgstr "" -#: bookwyrm/templates/lists/list.html:77 -msgid "Set" -msgstr "" - -#: bookwyrm/templates/lists/list.html:80 +#: bookwyrm/templates/lists/list.html:74 msgid "List position" msgstr "" -#: bookwyrm/templates/lists/list.html:86 +#: bookwyrm/templates/lists/list.html:81 +msgid "Set" +msgstr "" + +#: bookwyrm/templates/lists/list.html:89 #: bookwyrm/templates/snippets/shelf_selector.html:26 msgid "Remove" msgstr "" -#: bookwyrm/templates/lists/list.html:99 bookwyrm/templates/lists/list.html:111 +#: bookwyrm/templates/lists/list.html:103 +#: bookwyrm/templates/lists/list.html:120 msgid "Sort List" msgstr "" -#: bookwyrm/templates/lists/list.html:105 +#: bookwyrm/templates/lists/list.html:113 msgid "Direction" msgstr "" -#: bookwyrm/templates/lists/list.html:116 +#: bookwyrm/templates/lists/list.html:127 msgid "Add Books" msgstr "" -#: bookwyrm/templates/lists/list.html:116 +#: bookwyrm/templates/lists/list.html:129 msgid "Suggest Books" msgstr "" -#: bookwyrm/templates/lists/list.html:125 +#: bookwyrm/templates/lists/list.html:140 msgid "search" msgstr "" -#: bookwyrm/templates/lists/list.html:131 +#: bookwyrm/templates/lists/list.html:146 msgid "Clear search" msgstr "" -#: bookwyrm/templates/lists/list.html:136 +#: bookwyrm/templates/lists/list.html:151 #, python-format msgid "No books found matching the query \"%(query)s\"" msgstr "" -#: bookwyrm/templates/lists/list.html:164 +#: bookwyrm/templates/lists/list.html:179 msgid "Suggest" msgstr "" @@ -1523,7 +1527,7 @@ msgstr "" #: bookwyrm/templates/moderation/reports.html:6 #, python-format -msgid "Reports: %(server_name)s" +msgid "Reports: %(instance_name)s" msgstr "" #: bookwyrm/templates/moderation/reports.html:8 @@ -1534,7 +1538,7 @@ msgstr "" #: bookwyrm/templates/moderation/reports.html:14 #, python-format -msgid "Reports: %(server_name)s" +msgid "Reports: %(instance_name)s" msgstr "" #: bookwyrm/templates/moderation/reports.html:28 @@ -1733,6 +1737,26 @@ msgstr "" msgid "Relationships" msgstr "" +#: bookwyrm/templates/rss/title.html:5 +#: bookwyrm/templates/snippets/status/status_header.html:35 +msgid "rated" +msgstr "" + +#: bookwyrm/templates/rss/title.html:7 +#: bookwyrm/templates/snippets/status/status_header.html:37 +msgid "reviewed" +msgstr "" + +#: bookwyrm/templates/rss/title.html:9 +#: bookwyrm/templates/snippets/status/status_header.html:39 +msgid "commented on" +msgstr "" + +#: bookwyrm/templates/rss/title.html:11 +#: bookwyrm/templates/snippets/status/status_header.html:41 +msgid "quoted" +msgstr "" + #: bookwyrm/templates/search/book.html:64 msgid "Load results from other catalogues" msgstr "" @@ -1783,7 +1807,7 @@ msgstr "" #: bookwyrm/templates/settings/admin_layout.html:39 #: bookwyrm/templates/settings/federation.html:3 #: bookwyrm/templates/settings/federation.html:5 -msgid "Federated Servers" +msgid "Federated Instances" msgstr "" #: bookwyrm/templates/settings/admin_layout.html:44 @@ -1833,6 +1857,7 @@ msgid "Back to list" msgstr "" #: bookwyrm/templates/settings/announcement.html:11 +#: bookwyrm/templates/settings/announcement_form.html:6 msgid "Edit Announcement" msgstr "" @@ -1866,7 +1891,7 @@ msgstr "" msgid "Active:" msgstr "" -#: bookwyrm/templates/settings/announcement_form.html:5 +#: bookwyrm/templates/settings/announcement_form.html:8 #: bookwyrm/templates/settings/announcements.html:8 msgid "Create Announcement" msgstr "" @@ -1910,12 +1935,12 @@ msgstr "" #: bookwyrm/templates/settings/federation.html:10 #: bookwyrm/templates/settings/server_blocklist.html:3 #: bookwyrm/templates/settings/server_blocklist.html:20 -msgid "Add server" +msgid "Add instance" msgstr "" #: bookwyrm/templates/settings/edit_server.html:7 #: bookwyrm/templates/settings/server_blocklist.html:7 -msgid "Back to server list" +msgid "Back to instance list" msgstr "" #: bookwyrm/templates/settings/edit_server.html:16 @@ -2022,7 +2047,7 @@ msgstr "" #: bookwyrm/templates/settings/federation.html:19 #: bookwyrm/templates/user_admin/server_filter.html:5 -msgid "Server name" +msgid "Instance name" msgstr "" #: bookwyrm/templates/settings/federation.html:23 @@ -2144,7 +2169,7 @@ msgid "Import Blocklist" msgstr "" #: bookwyrm/templates/settings/server_blocklist.html:26 -#: bookwyrm/templates/snippets/goal_progress.html:5 +#: bookwyrm/templates/snippets/goal_progress.html:7 msgid "Success!" msgstr "" @@ -2230,13 +2255,13 @@ msgstr "" msgid "%(title)s by " msgstr "" -#: bookwyrm/templates/snippets/boost_button.html:9 -#: bookwyrm/templates/snippets/boost_button.html:10 +#: bookwyrm/templates/snippets/boost_button.html:20 +#: bookwyrm/templates/snippets/boost_button.html:21 msgid "Boost" msgstr "" -#: bookwyrm/templates/snippets/boost_button.html:16 -#: bookwyrm/templates/snippets/boost_button.html:17 +#: bookwyrm/templates/snippets/boost_button.html:33 +#: bookwyrm/templates/snippets/boost_button.html:34 msgid "Un-boost" msgstr "" @@ -2326,13 +2351,13 @@ msgstr "" msgid "You are deleting this readthrough and its %(count)s associated progress updates." msgstr "" -#: bookwyrm/templates/snippets/fav_button.html:9 -#: bookwyrm/templates/snippets/fav_button.html:11 +#: bookwyrm/templates/snippets/fav_button.html:10 +#: bookwyrm/templates/snippets/fav_button.html:12 msgid "Like" msgstr "" -#: bookwyrm/templates/snippets/fav_button.html:17 #: bookwyrm/templates/snippets/fav_button.html:18 +#: bookwyrm/templates/snippets/fav_button.html:19 msgid "Un-like" msgstr "" @@ -2373,6 +2398,14 @@ msgstr "" msgid "No rating" msgstr "" +#: bookwyrm/templates/snippets/form_rate_stars.html:44 +#: bookwyrm/templates/snippets/stars.html:7 +#, python-format +msgid "%(rating)s star" +msgid_plural "%(rating)s stars" +msgstr[0] "" +msgstr[1] "" + #: bookwyrm/templates/snippets/generated_status/goal.html:1 #, python-format msgid "set a goal to read %(counter)s book in %(year)s" @@ -2427,17 +2460,17 @@ msgstr "" msgid "Set goal" msgstr "" -#: bookwyrm/templates/snippets/goal_progress.html:7 +#: bookwyrm/templates/snippets/goal_progress.html:9 #, python-format msgid "%(percent)s%% complete!" msgstr "" -#: bookwyrm/templates/snippets/goal_progress.html:10 +#: bookwyrm/templates/snippets/goal_progress.html:12 #, python-format msgid "You've read %(read_count)s of %(goal_count)s books." msgstr "" -#: bookwyrm/templates/snippets/goal_progress.html:12 +#: bookwyrm/templates/snippets/goal_progress.html:14 #, python-format msgid "%(username)s has read %(read_count)s of %(goal_count)s books." msgstr "" @@ -2546,26 +2579,6 @@ msgstr "" msgid "Report" msgstr "" -#: bookwyrm/templates/snippets/rss_title.html:5 -#: bookwyrm/templates/snippets/status/status_header.html:35 -msgid "rated" -msgstr "" - -#: bookwyrm/templates/snippets/rss_title.html:7 -#: bookwyrm/templates/snippets/status/status_header.html:37 -msgid "reviewed" -msgstr "" - -#: bookwyrm/templates/snippets/rss_title.html:9 -#: bookwyrm/templates/snippets/status/status_header.html:39 -msgid "commented on" -msgstr "" - -#: bookwyrm/templates/snippets/rss_title.html:11 -#: bookwyrm/templates/snippets/status/status_header.html:41 -msgid "quoted" -msgstr "" - #: bookwyrm/templates/snippets/search_result_text.html:36 msgid "Import book" msgstr "" @@ -2735,7 +2748,7 @@ msgstr "" msgid "Update shelf" msgstr "" -#: bookwyrm/templates/user/shelf/shelf.html:25 bookwyrm/views/shelf.py:51 +#: bookwyrm/templates/user/shelf/shelf.html:25 bookwyrm/views/shelf.py:56 msgid "All books" msgstr "" @@ -2743,30 +2756,30 @@ msgstr "" msgid "Create shelf" msgstr "" -#: bookwyrm/templates/user/shelf/shelf.html:61 +#: bookwyrm/templates/user/shelf/shelf.html:62 msgid "Edit shelf" msgstr "" -#: bookwyrm/templates/user/shelf/shelf.html:80 -#: bookwyrm/templates/user/shelf/shelf.html:104 +#: bookwyrm/templates/user/shelf/shelf.html:81 +#: bookwyrm/templates/user/shelf/shelf.html:105 msgid "Shelved" msgstr "" -#: bookwyrm/templates/user/shelf/shelf.html:81 -#: bookwyrm/templates/user/shelf/shelf.html:108 +#: bookwyrm/templates/user/shelf/shelf.html:82 +#: bookwyrm/templates/user/shelf/shelf.html:109 msgid "Started" msgstr "" -#: bookwyrm/templates/user/shelf/shelf.html:82 -#: bookwyrm/templates/user/shelf/shelf.html:111 +#: bookwyrm/templates/user/shelf/shelf.html:83 +#: bookwyrm/templates/user/shelf/shelf.html:112 msgid "Finished" msgstr "" -#: bookwyrm/templates/user/shelf/shelf.html:137 +#: bookwyrm/templates/user/shelf/shelf.html:138 msgid "This shelf is empty." msgstr "" -#: bookwyrm/templates/user/shelf/shelf.html:143 +#: bookwyrm/templates/user/shelf/shelf.html:144 msgid "Delete shelf" msgstr "" @@ -2825,7 +2838,7 @@ msgstr "" #: bookwyrm/templates/user_admin/user_admin.html:7 #, python-format -msgid "Users: %(server_name)s" +msgid "Users: %(instance_name)s" msgstr "" #: bookwyrm/templates/user_admin/user_admin.html:22 @@ -2842,7 +2855,7 @@ msgid "Last Active" msgstr "" #: bookwyrm/templates/user_admin/user_admin.html:38 -msgid "Remote server" +msgid "Remote instance" msgstr "" #: bookwyrm/templates/user_admin/user_admin.html:47 @@ -2886,6 +2899,10 @@ msgstr "" msgid "Access level:" msgstr "" +#: bookwyrm/templates/widgets/clearable_file_input_with_warning.html:3 +msgid "File exceeds maximum size: 10MB" +msgstr "" + #: bookwyrm/views/import_data.py:67 msgid "Not a valid csv file" msgstr "" diff --git a/locale/es/LC_MESSAGES/django.mo b/locale/es/LC_MESSAGES/django.mo index 1377b5092..54adfb570 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 4f60dfb8c..c9a19a4df 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-05-20 14:40-0700\n" +"POT-Creation-Date: 2021-06-06 20:52+0000\n" "PO-Revision-Date: 2021-03-19 11:49+0800\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -56,12 +56,12 @@ msgid "Book Title" msgstr "Título" #: bookwyrm/forms.py:301 bookwyrm/templates/snippets/create_status_form.html:34 -#: bookwyrm/templates/user/shelf/shelf.html:84 -#: bookwyrm/templates/user/shelf/shelf.html:115 +#: bookwyrm/templates/user/shelf/shelf.html:85 +#: bookwyrm/templates/user/shelf/shelf.html:116 msgid "Rating" msgstr "Calificación" -#: bookwyrm/forms.py:303 bookwyrm/templates/lists/list.html:101 +#: bookwyrm/forms.py:303 bookwyrm/templates/lists/list.html:107 msgid "Sort By" msgstr "Ordenar por" @@ -73,41 +73,41 @@ msgstr "Ascendente" msgid "Descending" msgstr "Descendente" -#: bookwyrm/models/fields.py:24 +#: bookwyrm/models/fields.py:25 #, python-format msgid "%(value)s is not a valid remote_id" msgstr "%(value)s no es un remote_id válido" -#: bookwyrm/models/fields.py:33 bookwyrm/models/fields.py:42 +#: bookwyrm/models/fields.py:34 bookwyrm/models/fields.py:43 #, python-format msgid "%(value)s is not a valid username" msgstr "%(value)s no es un usuario válido" -#: bookwyrm/models/fields.py:165 bookwyrm/templates/layout.html:155 +#: bookwyrm/models/fields.py:166 bookwyrm/templates/layout.html:152 msgid "username" msgstr "nombre de usuario" -#: bookwyrm/models/fields.py:170 +#: bookwyrm/models/fields.py:171 msgid "A user with that username already exists." msgstr "Ya existe un usuario con ese nombre." -#: bookwyrm/settings.py:155 +#: bookwyrm/settings.py:156 msgid "English" msgstr "Inglés" -#: bookwyrm/settings.py:156 +#: bookwyrm/settings.py:157 msgid "German" msgstr "Aléman" -#: bookwyrm/settings.py:157 +#: bookwyrm/settings.py:158 msgid "Spanish" msgstr "Español" -#: bookwyrm/settings.py:158 +#: bookwyrm/settings.py:159 msgid "French" msgstr "Francés" -#: bookwyrm/settings.py:159 +#: bookwyrm/settings.py:160 msgid "Simplified Chinese" msgstr "Chino simplificado" @@ -139,15 +139,15 @@ msgstr "Editar Autor/Autora" #: bookwyrm/templates/author/author.html:32 #: bookwyrm/templates/author/edit_author.html:38 msgid "Aliases:" -msgstr "" +msgstr "Aliases:" #: bookwyrm/templates/author/author.html:38 msgid "Born:" -msgstr "" +msgstr "Nacido:" #: bookwyrm/templates/author/author.html:44 msgid "Died:" -msgstr "" +msgstr "Muerto:" #: bookwyrm/templates/author/author.html:51 msgid "Wikipedia" @@ -160,10 +160,8 @@ msgstr "Ver en OpenLibrary" #: bookwyrm/templates/author/author.html:60 #: bookwyrm/templates/book/book.html:81 -#, fuzzy -#| msgid "View on OpenLibrary" msgid "View on Inventaire" -msgstr "Ver en OpenLibrary" +msgstr "Ver en Inventaire" #: bookwyrm/templates/author/author.html:74 #, python-format @@ -205,10 +203,8 @@ msgstr "Nombre:" #: bookwyrm/templates/book/edit_book.html:132 #: bookwyrm/templates/book/edit_book.html:141 #: bookwyrm/templates/book/edit_book.html:178 -#, fuzzy -#| msgid "Separate multiple publishers with commas." msgid "Separate multiple values with commas." -msgstr "Separar varios editores con comas." +msgstr "Separar varios valores con comas." #: bookwyrm/templates/author/edit_author.html:46 msgid "Bio:" @@ -236,10 +232,8 @@ msgstr "Clave OpenLibrary:" #: bookwyrm/templates/author/edit_author.html:79 #: bookwyrm/templates/book/edit_book.html:243 -#, fuzzy -#| msgid "View on OpenLibrary" msgid "Inventaire ID:" -msgstr "Ver en OpenLibrary" +msgstr "ID Inventaire:" #: bookwyrm/templates/author/edit_author.html:84 msgid "Librarything key:" @@ -254,7 +248,7 @@ msgstr "Clave Goodreads:" #: bookwyrm/templates/book/edit_book.html:263 #: bookwyrm/templates/lists/form.html:42 #: bookwyrm/templates/preferences/edit_user.html:70 -#: bookwyrm/templates/settings/announcement_form.html:65 +#: bookwyrm/templates/settings/announcement_form.html:69 #: bookwyrm/templates/settings/edit_server.html:68 #: bookwyrm/templates/settings/federated_server.html:98 #: bookwyrm/templates/settings/site.html:97 @@ -350,28 +344,20 @@ msgid "You don't have any reading activity for this book." msgstr "No tienes ninguna actividad de lectura para este libro." #: bookwyrm/templates/book/book.html:200 -#, fuzzy -#| msgid "Review" msgid "Reviews" -msgstr "Reseña" +msgstr "Reseñas" #: bookwyrm/templates/book/book.html:205 -#, fuzzy -#| msgid "Your shelves" msgid "Your reviews" -msgstr "Tus estantes" +msgstr "Tus reseñas" #: bookwyrm/templates/book/book.html:211 -#, fuzzy -#| msgid "Your Account" msgid "Your comments" -msgstr "Tu cuenta" +msgstr "Tus comentarios" #: bookwyrm/templates/book/book.html:217 -#, fuzzy -#| msgid "Your books" msgid "Your quotes" -msgstr "Tus libros" +msgstr "Tus citas" #: bookwyrm/templates/book/book.html:253 msgid "Subjects" @@ -381,7 +367,7 @@ msgstr "Sujetos" msgid "Places" msgstr "Lugares" -#: bookwyrm/templates/book/book.html:276 bookwyrm/templates/layout.html:64 +#: bookwyrm/templates/book/book.html:276 bookwyrm/templates/layout.html:61 #: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12 #: bookwyrm/templates/search/layout.html:25 #: bookwyrm/templates/search/layout.html:50 @@ -395,7 +381,7 @@ msgstr "Agregar a lista" #: bookwyrm/templates/book/book.html:297 #: bookwyrm/templates/book/cover_modal.html:31 -#: bookwyrm/templates/lists/list.html:164 +#: bookwyrm/templates/lists/list.html:179 msgid "Add" msgstr "Agregar" @@ -492,10 +478,8 @@ msgid "Series number:" msgstr "Número de serie:" #: bookwyrm/templates/book/edit_book.html:130 -#, fuzzy -#| msgid "Language:" msgid "Languages:" -msgstr "Idioma:" +msgstr "Idiomas:" #: bookwyrm/templates/book/edit_book.html:139 msgid "Publisher:" @@ -527,7 +511,7 @@ msgid "John Doe, Jane Smith" msgstr "Juan Nadie, Natalia Natalia" #: bookwyrm/templates/book/edit_book.html:183 -#: bookwyrm/templates/user/shelf/shelf.html:77 +#: bookwyrm/templates/user/shelf/shelf.html:78 msgid "Cover" msgstr "Portada:" @@ -557,10 +541,8 @@ msgid "ISBN 10:" msgstr "ISBN 10:" #: bookwyrm/templates/book/edit_book.html:238 -#, fuzzy -#| msgid "Openlibrary key:" msgid "Openlibrary ID:" -msgstr "Clave OpenLibrary:" +msgstr "ID OpenLibrary:" #: bookwyrm/templates/book/editions.html:4 #, python-format @@ -648,7 +630,7 @@ msgstr "Comunidad federalizada" #: bookwyrm/templates/directory/directory.html:4 #: bookwyrm/templates/directory/directory.html:9 -#: bookwyrm/templates/layout.html:92 +#: bookwyrm/templates/layout.html:64 msgid "Directory" msgstr "Directorio" @@ -849,7 +831,7 @@ msgid "Direct Messages with %(username)s" msgstr "Mensajes directos con %(username)s" #: bookwyrm/templates/feed/direct_messages.html:10 -#: bookwyrm/templates/layout.html:87 +#: bookwyrm/templates/layout.html:92 msgid "Direct Messages" msgstr "Mensajes directos" @@ -905,7 +887,6 @@ msgid "Updates" msgstr "Actualizaciones" #: bookwyrm/templates/feed/feed_layout.html:10 -#: bookwyrm/templates/layout.html:58 #: bookwyrm/templates/user/shelf/books_header.html:3 msgid "Your books" msgstr "Tus libros" @@ -960,7 +941,7 @@ msgid "What are you reading?" msgstr "¿Qué estás leyendo?" #: bookwyrm/templates/get_started/books.html:9 -#: bookwyrm/templates/lists/list.html:120 +#: bookwyrm/templates/lists/list.html:135 msgid "Search for a book" msgstr "Buscar libros" @@ -980,7 +961,7 @@ msgstr "Puedes agregar libros cuando comiences a usar %(site_name)s." #: bookwyrm/templates/get_started/users.html:18 #: bookwyrm/templates/get_started/users.html:19 #: bookwyrm/templates/layout.html:37 bookwyrm/templates/layout.html:38 -#: bookwyrm/templates/lists/list.html:124 +#: bookwyrm/templates/lists/list.html:139 #: bookwyrm/templates/search/layout.html:4 #: bookwyrm/templates/search/layout.html:9 msgid "Search" @@ -996,7 +977,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:137 +#: bookwyrm/templates/lists/list.html:152 msgid "No books found" msgstr "No se encontró ningún libro" @@ -1108,7 +1089,7 @@ msgid "%(username)s's %(year)s Books" msgstr "Los libros de %(username)s para %(year)s" #: bookwyrm/templates/import.html:5 bookwyrm/templates/import.html:9 -#: bookwyrm/templates/layout.html:97 +#: bookwyrm/templates/user/shelf/shelf.html:40 msgid "Import Books" msgstr "Importar libros" @@ -1193,14 +1174,14 @@ msgstr "Libro" #: bookwyrm/templates/import_status.html:114 #: bookwyrm/templates/snippets/create_status_form.html:13 -#: bookwyrm/templates/user/shelf/shelf.html:78 -#: bookwyrm/templates/user/shelf/shelf.html:98 +#: bookwyrm/templates/user/shelf/shelf.html:79 +#: bookwyrm/templates/user/shelf/shelf.html:99 msgid "Title" msgstr "Título" #: bookwyrm/templates/import_status.html:117 -#: bookwyrm/templates/user/shelf/shelf.html:79 -#: bookwyrm/templates/user/shelf/shelf.html:101 +#: bookwyrm/templates/user/shelf/shelf.html:80 +#: bookwyrm/templates/user/shelf/shelf.html:102 msgid "Author" msgstr "Autor/Autora" @@ -1242,15 +1223,19 @@ msgstr "Buscar un libro o un usuario" msgid "Main navigation menu" msgstr "Menú de navigación central" -#: bookwyrm/templates/layout.html:61 +#: bookwyrm/templates/layout.html:58 msgid "Feed" msgstr "Actividad" -#: bookwyrm/templates/layout.html:102 +#: bookwyrm/templates/layout.html:87 +msgid "Your Books" +msgstr "Tus libros" + +#: bookwyrm/templates/layout.html:97 msgid "Settings" msgstr "Configuración" -#: bookwyrm/templates/layout.html:111 +#: bookwyrm/templates/layout.html:106 #: bookwyrm/templates/settings/admin_layout.html:31 #: bookwyrm/templates/settings/manage_invite_requests.html:15 #: bookwyrm/templates/settings/manage_invites.html:3 @@ -1258,45 +1243,47 @@ msgstr "Configuración" msgid "Invites" msgstr "Invitaciones" -#: bookwyrm/templates/layout.html:118 +#: bookwyrm/templates/layout.html:113 msgid "Admin" msgstr "Admin" -#: bookwyrm/templates/layout.html:125 +#: bookwyrm/templates/layout.html:120 msgid "Log out" msgstr "Cerrar sesión" -#: bookwyrm/templates/layout.html:133 bookwyrm/templates/layout.html:134 +#: bookwyrm/templates/layout.html:128 bookwyrm/templates/layout.html:129 #: bookwyrm/templates/notifications.html:6 #: bookwyrm/templates/notifications.html:11 msgid "Notifications" msgstr "Notificaciones" -#: bookwyrm/templates/layout.html:154 bookwyrm/templates/layout.html:158 +#: bookwyrm/templates/layout.html:151 bookwyrm/templates/layout.html:155 #: bookwyrm/templates/login.html:17 #: bookwyrm/templates/snippets/register_form.html:4 msgid "Username:" msgstr "Nombre de usuario:" -#: bookwyrm/templates/layout.html:159 +#: bookwyrm/templates/layout.html:156 msgid "password" msgstr "contraseña" -#: bookwyrm/templates/layout.html:160 bookwyrm/templates/login.html:36 +#: bookwyrm/templates/layout.html:157 bookwyrm/templates/login.html:36 msgid "Forgot your password?" msgstr "¿Olvidaste tu contraseña?" -#: bookwyrm/templates/layout.html:163 bookwyrm/templates/login.html:10 +#: bookwyrm/templates/layout.html:160 bookwyrm/templates/login.html:10 #: bookwyrm/templates/login.html:33 msgid "Log in" msgstr "Iniciar sesión" -#: bookwyrm/templates/layout.html:171 +#: bookwyrm/templates/layout.html:168 msgid "Join" msgstr "Unirse" #: bookwyrm/templates/layout.html:206 -msgid "About this server" +#, fuzzy +#| msgid "About this server" +msgid "About this instance" msgstr "Sobre este servidor" #: bookwyrm/templates/layout.html:210 @@ -1304,8 +1291,6 @@ msgid "Contact site admin" msgstr "Contactarse con administradores del sitio" #: bookwyrm/templates/layout.html:214 -#, fuzzy -#| msgid "Django Documentation" msgid "Documentation" msgstr "Documentación de Django" @@ -1358,7 +1343,7 @@ msgid "Discard" msgstr "Desechar" #: bookwyrm/templates/lists/edit_form.html:5 -#: bookwyrm/templates/lists/list_layout.html:17 +#: bookwyrm/templates/lists/list_layout.html:16 msgid "Edit List" msgstr "Editar lista" @@ -1395,66 +1380,65 @@ msgstr "Cualquer usuario puede agregar libros a esta lista" #: bookwyrm/templates/lists/list.html:20 msgid "You successfully suggested a book for this list!" -msgstr "" +msgstr "¡Has sugerido un libro para esta lista exitosamente!" #: bookwyrm/templates/lists/list.html:22 -#, fuzzy -#| msgid "Anyone can add books to this list" msgid "You successfully added a book to this list!" -msgstr "Cualquer usuario puede agregar libros a esta lista" +msgstr "¡Has agregado un libro a esta lista exitosamente!" #: bookwyrm/templates/lists/list.html:28 msgid "This list is currently empty" msgstr "Esta lista está vacia" -#: bookwyrm/templates/lists/list.html:65 +#: bookwyrm/templates/lists/list.html:66 #, python-format msgid "Added by %(username)s" msgstr "Agregado por %(username)s" -#: bookwyrm/templates/lists/list.html:77 -msgid "Set" -msgstr "Establecido" - -#: bookwyrm/templates/lists/list.html:80 +#: bookwyrm/templates/lists/list.html:74 msgid "List position" msgstr "Posición" -#: bookwyrm/templates/lists/list.html:86 +#: bookwyrm/templates/lists/list.html:81 +msgid "Set" +msgstr "Establecido" + +#: bookwyrm/templates/lists/list.html:89 #: bookwyrm/templates/snippets/shelf_selector.html:26 msgid "Remove" msgstr "Quitar" -#: bookwyrm/templates/lists/list.html:99 bookwyrm/templates/lists/list.html:111 +#: bookwyrm/templates/lists/list.html:103 +#: bookwyrm/templates/lists/list.html:120 msgid "Sort List" msgstr "Ordena la lista" -#: bookwyrm/templates/lists/list.html:105 +#: bookwyrm/templates/lists/list.html:113 msgid "Direction" msgstr "Dirección" -#: bookwyrm/templates/lists/list.html:116 +#: bookwyrm/templates/lists/list.html:127 msgid "Add Books" msgstr "Agregar libros" -#: bookwyrm/templates/lists/list.html:116 +#: bookwyrm/templates/lists/list.html:129 msgid "Suggest Books" msgstr "Sugerir libros" -#: bookwyrm/templates/lists/list.html:125 +#: bookwyrm/templates/lists/list.html:140 msgid "search" msgstr "buscar" -#: bookwyrm/templates/lists/list.html:131 +#: bookwyrm/templates/lists/list.html:146 msgid "Clear search" msgstr "Borrar búsqueda" -#: bookwyrm/templates/lists/list.html:136 +#: bookwyrm/templates/lists/list.html:151 #, 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:164 +#: bookwyrm/templates/lists/list.html:179 msgid "Suggest" msgstr "Sugerir" @@ -1545,8 +1529,8 @@ msgstr "Resolver" #: bookwyrm/templates/moderation/reports.html:6 #, python-format -msgid "Reports: %(server_name)s" -msgstr "Informes: %(server_name)s" +msgid "Reports: %(instance_name)s" +msgstr "Informes: %(instance_name)s" #: bookwyrm/templates/moderation/reports.html:8 #: bookwyrm/templates/moderation/reports.html:17 @@ -1556,8 +1540,8 @@ msgstr "Informes" #: bookwyrm/templates/moderation/reports.html:14 #, python-format -msgid "Reports: %(server_name)s" -msgstr "Informes: %(server_name)s" +msgid "Reports: %(instance_name)s" +msgstr "Informes: %(instance_name)s" #: bookwyrm/templates/moderation/reports.html:28 msgid "Resolved" @@ -1573,13 +1557,11 @@ msgstr "Borrar notificaciones" #: bookwyrm/templates/notifications.html:25 msgid "All" -msgstr "" +msgstr "Todas" #: bookwyrm/templates/notifications.html:29 -#, fuzzy -#| msgid "More options" msgid "Mentions" -msgstr "Más opciones" +msgstr "Menciones" #: bookwyrm/templates/notifications.html:70 #, python-format @@ -1680,10 +1662,9 @@ msgid " suggested adding %(book_title)s t msgstr " sugirió agregar %(book_title)s a tu lista \"%(list_name)s\"" #: bookwyrm/templates/notifications.html:128 -#, fuzzy, python-format -#| msgid "Your import completed." +#, python-format msgid "Your import completed." -msgstr "Tu importación ha terminado." +msgstr "Tu importación ha terminado." #: bookwyrm/templates/notifications.html:131 #, python-format @@ -1758,31 +1739,45 @@ msgstr "Perfil" msgid "Relationships" msgstr "Relaciones" +#: bookwyrm/templates/rss/title.html:5 +#: bookwyrm/templates/snippets/status/status_header.html:35 +msgid "rated" +msgstr "calificó" + +#: bookwyrm/templates/rss/title.html:7 +#: bookwyrm/templates/snippets/status/status_header.html:37 +msgid "reviewed" +msgstr "reseñó" + +#: bookwyrm/templates/rss/title.html:9 +#: bookwyrm/templates/snippets/status/status_header.html:39 +msgid "commented on" +msgstr "comentó en" + +#: bookwyrm/templates/rss/title.html:11 +#: bookwyrm/templates/snippets/status/status_header.html:41 +msgid "quoted" +msgstr "citó" + #: bookwyrm/templates/search/book.html:64 -#, fuzzy -#| msgid "Show results from other catalogues" msgid "Load results from other catalogues" -msgstr "Mostrar resultados de otros catálogos" +msgstr "Cargar resultados de otros catálogos" #: bookwyrm/templates/search/book.html:68 msgid "Manually add book" -msgstr "" +msgstr "Agregar libro a mano" #: bookwyrm/templates/search/book.html:73 msgid "Log in to import or add books." -msgstr "" +msgstr "Iniciar una sesión para importar o agregar libros" #: bookwyrm/templates/search/layout.html:16 -#, fuzzy -#| msgid "Search for a user" msgid "Search query" -msgstr "Buscar un usuario" +msgstr "Búsqueda" #: bookwyrm/templates/search/layout.html:19 -#, fuzzy -#| msgid "Search" msgid "Search type" -msgstr "Buscar" +msgstr "Tipo de búsqueda" #: bookwyrm/templates/search/layout.html:21 #: bookwyrm/templates/search/layout.html:42 @@ -1799,10 +1794,9 @@ msgid "Users" msgstr "Usuarios" #: bookwyrm/templates/search/layout.html:58 -#, fuzzy, python-format -#| msgid "No lists found for \"%(query)s\"" +#, python-format msgid "No results found for \"%(query)s\"" -msgstr "No se encontró ningúna lista correspondiente a \"%(query)s\"" +msgstr "No se encontró ningún resultado correspondiente a \"%(query)s\"" #: bookwyrm/templates/settings/admin_layout.html:4 msgid "Administration" @@ -1815,7 +1809,9 @@ msgstr "Administrar usuarios" #: bookwyrm/templates/settings/admin_layout.html:39 #: bookwyrm/templates/settings/federation.html:3 #: bookwyrm/templates/settings/federation.html:5 -msgid "Federated Servers" +#, fuzzy +#| msgid "Federated Servers" +msgid "Federated Instances" msgstr "Servidores federalizados" #: bookwyrm/templates/settings/admin_layout.html:44 @@ -1856,23 +1852,18 @@ msgstr "Registración" #: bookwyrm/templates/settings/announcement.html:3 #: bookwyrm/templates/settings/announcement.html:6 -#, fuzzy -#| msgid "Announcements" msgid "Announcement" -msgstr "Anuncios" +msgstr "Anuncio" #: bookwyrm/templates/settings/announcement.html:7 #: bookwyrm/templates/settings/federated_server.html:13 -#, fuzzy -#| msgid "Back to server list" msgid "Back to list" msgstr "Volver a la lista de servidores" #: bookwyrm/templates/settings/announcement.html:11 -#, fuzzy -#| msgid "Announcements" +#: bookwyrm/templates/settings/announcement_form.html:6 msgid "Edit Announcement" -msgstr "Anuncios" +msgstr "Editar anuncio" #: bookwyrm/templates/settings/announcement.html:20 #: bookwyrm/templates/snippets/delete_readthrough_modal.html:15 @@ -1882,64 +1873,48 @@ msgstr "Eliminar" #: bookwyrm/templates/settings/announcement.html:35 msgid "Visible:" -msgstr "" +msgstr "Visible:" #: bookwyrm/templates/settings/announcement.html:38 msgid "True" -msgstr "" +msgstr "Verdadero" #: bookwyrm/templates/settings/announcement.html:40 msgid "False" -msgstr "" +msgstr "Falso" #: bookwyrm/templates/settings/announcement.html:47 -#, fuzzy -#| msgid "Birth date:" msgid "Start date:" -msgstr "Fecha de nacimiento:" +msgstr "Fecha de inicio:" #: bookwyrm/templates/settings/announcement.html:54 -#, fuzzy -#| msgid "Birth date:" msgid "End date:" -msgstr "Fecha de nacimiento:" +msgstr "Fecha final:" #: bookwyrm/templates/settings/announcement.html:60 -#, fuzzy -#| msgid "Active" msgid "Active:" -msgstr "Activ@" +msgstr "Activ@:" -#: bookwyrm/templates/settings/announcement_form.html:5 +#: bookwyrm/templates/settings/announcement_form.html:8 #: bookwyrm/templates/settings/announcements.html:8 -#, fuzzy -#| msgid "Announcements" msgid "Create Announcement" -msgstr "Anuncios" +msgstr "Crear anuncio" #: bookwyrm/templates/settings/announcements.html:22 -#, fuzzy -#| msgid "Date Added" msgid "Date added" msgstr "Fecha agregada" #: bookwyrm/templates/settings/announcements.html:26 -#, fuzzy -#| msgid "reviewed" msgid "Preview" -msgstr "reseñó" +msgstr "Vista preliminar" #: bookwyrm/templates/settings/announcements.html:30 -#, fuzzy -#| msgid "Started" msgid "Start date" -msgstr "Empezado" +msgstr "Fecha de inicio" #: bookwyrm/templates/settings/announcements.html:34 -#, fuzzy -#| msgid "Edit read dates" msgid "End date" -msgstr "Editar fechas de lectura" +msgstr "Fecha final" #: bookwyrm/templates/settings/announcements.html:38 #: bookwyrm/templates/settings/federation.html:30 @@ -1950,16 +1925,12 @@ msgid "Status" msgstr "Status" #: bookwyrm/templates/settings/announcements.html:48 -#, fuzzy -#| msgid "Inactive" msgid "active" -msgstr "Inactiv@" +msgstr "activo" #: bookwyrm/templates/settings/announcements.html:48 -#, fuzzy -#| msgid "Inactive" msgid "inactive" -msgstr "Inactiv@" +msgstr "inactivo" #: bookwyrm/templates/settings/edit_server.html:3 #: bookwyrm/templates/settings/edit_server.html:6 @@ -1968,12 +1939,16 @@ msgstr "Inactiv@" #: bookwyrm/templates/settings/federation.html:10 #: bookwyrm/templates/settings/server_blocklist.html:3 #: bookwyrm/templates/settings/server_blocklist.html:20 -msgid "Add server" -msgstr "Agregar servidor" +#, fuzzy +#| msgid "View instance" +msgid "Add instance" +msgstr "Ver instancia" #: bookwyrm/templates/settings/edit_server.html:7 #: bookwyrm/templates/settings/server_blocklist.html:7 -msgid "Back to server list" +#, fuzzy +#| msgid "Back to server list" +msgid "Back to instance list" msgstr "Volver a la lista de servidores" #: bookwyrm/templates/settings/edit_server.html:16 @@ -2080,8 +2055,10 @@ msgstr "Todos los usuarios en esta instancia serán re-activados." #: bookwyrm/templates/settings/federation.html:19 #: bookwyrm/templates/user_admin/server_filter.html:5 -msgid "Server name" -msgstr "Nombre de servidor" +#, fuzzy +#| msgid "Instance Name:" +msgid "Instance name" +msgstr "Nombre de instancia:" #: bookwyrm/templates/settings/federation.html:23 msgid "Date federated" @@ -2202,7 +2179,7 @@ msgid "Import Blocklist" msgstr "Importar lista de bloqueo" #: bookwyrm/templates/settings/server_blocklist.html:26 -#: bookwyrm/templates/snippets/goal_progress.html:5 +#: bookwyrm/templates/snippets/goal_progress.html:7 msgid "Success!" msgstr "¡Meta logrado!" @@ -2260,7 +2237,7 @@ msgstr "Correo electrónico de administradorx:" #: bookwyrm/templates/settings/site.html:73 msgid "Additional info:" -msgstr "" +msgstr "Más informacion:" #: bookwyrm/templates/settings/site.html:83 msgid "Allow registration:" @@ -2275,10 +2252,9 @@ msgid "Registration closed text:" msgstr "Texto de registración cerrada:" #: bookwyrm/templates/snippets/announcement.html:31 -#, fuzzy, python-format -#| msgid "Added by %(username)s" +#, python-format msgid "Posted by %(username)s" -msgstr "Agregado por %(username)s" +msgstr "Publicado por %(username)s" #: bookwyrm/templates/snippets/book_cover.html:31 msgid "No cover" @@ -2289,19 +2265,15 @@ msgstr "Sin portada" msgid "%(title)s by " msgstr "%(title)s por " -#: bookwyrm/templates/snippets/boost_button.html:9 -#: bookwyrm/templates/snippets/boost_button.html:10 -#, fuzzy -#| msgid "boosted" +#: bookwyrm/templates/snippets/boost_button.html:20 +#: bookwyrm/templates/snippets/boost_button.html:21 msgid "Boost" -msgstr "respaldó" +msgstr "Respaldar" -#: bookwyrm/templates/snippets/boost_button.html:16 -#: bookwyrm/templates/snippets/boost_button.html:17 -#, fuzzy -#| msgid "Un-boost status" +#: bookwyrm/templates/snippets/boost_button.html:33 +#: bookwyrm/templates/snippets/boost_button.html:34 msgid "Un-boost" -msgstr "Status de des-respaldo" +msgstr "Des-respaldar" #: bookwyrm/templates/snippets/content_warning_field.html:3 msgid "Spoiler alert:" @@ -2339,10 +2311,8 @@ msgid "Reply" msgstr "Respuesta" #: bookwyrm/templates/snippets/create_status_form.html:56 -#, fuzzy -#| msgid "Footer Content" msgid "Content" -msgstr "Contenido del pie de página" +msgstr "Contenido" #: bookwyrm/templates/snippets/create_status_form.html:80 #: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:16 @@ -2391,17 +2361,15 @@ msgstr "¿Eliminar estas fechas de lectura?" msgid "You are deleting this readthrough and its %(count)s associated progress updates." msgstr "Estás eliminando esta lectura y sus %(count)s actualizaciones de progreso asociados." -#: bookwyrm/templates/snippets/fav_button.html:9 -#: bookwyrm/templates/snippets/fav_button.html:11 +#: bookwyrm/templates/snippets/fav_button.html:10 +#: bookwyrm/templates/snippets/fav_button.html:12 msgid "Like" -msgstr "" +msgstr "Me gusta" -#: bookwyrm/templates/snippets/fav_button.html:17 #: bookwyrm/templates/snippets/fav_button.html:18 -#, fuzzy -#| msgid "Un-like status" +#: bookwyrm/templates/snippets/fav_button.html:19 msgid "Un-like" -msgstr "Quitar me gusta de status" +msgstr "Quitar me gusta" #: bookwyrm/templates/snippets/filters_panel/filters_panel.html:7 msgid "Show filters" @@ -2440,6 +2408,14 @@ msgstr "Aceptar" msgid "No rating" msgstr "No calificación" +#: bookwyrm/templates/snippets/form_rate_stars.html:44 +#: bookwyrm/templates/snippets/stars.html:7 +#, python-format +msgid "%(rating)s star" +msgid_plural "%(rating)s stars" +msgstr[0] "%(rating)s estrella" +msgstr[1] "%(rating)s estrellas" + #: bookwyrm/templates/snippets/generated_status/goal.html:1 #, python-format msgid "set a goal to read %(counter)s book in %(year)s" @@ -2494,17 +2470,17 @@ msgstr "Compartir con tu feed" msgid "Set goal" msgstr "Establecer meta" -#: bookwyrm/templates/snippets/goal_progress.html:7 +#: bookwyrm/templates/snippets/goal_progress.html:9 #, python-format msgid "%(percent)s%% complete!" msgstr "%(percent)s%% terminado!" -#: bookwyrm/templates/snippets/goal_progress.html:10 +#: bookwyrm/templates/snippets/goal_progress.html:12 #, python-format msgid "You've read %(read_count)s of %(goal_count)s books." msgstr "Has leído %(read_count)s de %(goal_count)s libros." -#: bookwyrm/templates/snippets/goal_progress.html:12 +#: bookwyrm/templates/snippets/goal_progress.html:14 #, python-format msgid "%(username)s has read %(read_count)s of %(goal_count)s books." msgstr "%(username)s ha leído %(read_count)s de %(goal_count)s libros." @@ -2614,26 +2590,6 @@ msgstr "Inscribirse" msgid "Report" msgstr "Reportar" -#: bookwyrm/templates/snippets/rss_title.html:5 -#: bookwyrm/templates/snippets/status/status_header.html:35 -msgid "rated" -msgstr "calificó" - -#: bookwyrm/templates/snippets/rss_title.html:7 -#: bookwyrm/templates/snippets/status/status_header.html:37 -msgid "reviewed" -msgstr "reseñó" - -#: bookwyrm/templates/snippets/rss_title.html:9 -#: bookwyrm/templates/snippets/status/status_header.html:39 -msgid "commented on" -msgstr "comentó en" - -#: bookwyrm/templates/snippets/rss_title.html:11 -#: bookwyrm/templates/snippets/status/status_header.html:41 -msgid "quoted" -msgstr "citó" - #: bookwyrm/templates/snippets/search_result_text.html:36 msgid "Import book" msgstr "Importar libro" @@ -2706,7 +2662,7 @@ msgstr "Eliminar status" #: bookwyrm/templates/snippets/status/layout.html:51 #: bookwyrm/templates/snippets/status/layout.html:52 msgid "Boost status" -msgstr "Status de respaldo" +msgstr "Respaldar status" #: bookwyrm/templates/snippets/status/layout.html:55 #: bookwyrm/templates/snippets/status/layout.html:56 @@ -2803,7 +2759,7 @@ msgstr "Editar estante" msgid "Update shelf" msgstr "Actualizar estante" -#: bookwyrm/templates/user/shelf/shelf.html:25 bookwyrm/views/shelf.py:51 +#: bookwyrm/templates/user/shelf/shelf.html:25 bookwyrm/views/shelf.py:56 msgid "All books" msgstr "Todos los libros" @@ -2811,30 +2767,30 @@ msgstr "Todos los libros" msgid "Create shelf" msgstr "Crear estante" -#: bookwyrm/templates/user/shelf/shelf.html:61 +#: bookwyrm/templates/user/shelf/shelf.html:62 msgid "Edit shelf" msgstr "Editar estante" -#: bookwyrm/templates/user/shelf/shelf.html:80 -#: bookwyrm/templates/user/shelf/shelf.html:104 +#: bookwyrm/templates/user/shelf/shelf.html:81 +#: bookwyrm/templates/user/shelf/shelf.html:105 msgid "Shelved" msgstr "Archivado" -#: bookwyrm/templates/user/shelf/shelf.html:81 -#: bookwyrm/templates/user/shelf/shelf.html:108 +#: bookwyrm/templates/user/shelf/shelf.html:82 +#: bookwyrm/templates/user/shelf/shelf.html:109 msgid "Started" msgstr "Empezado" -#: bookwyrm/templates/user/shelf/shelf.html:82 -#: bookwyrm/templates/user/shelf/shelf.html:111 +#: bookwyrm/templates/user/shelf/shelf.html:83 +#: bookwyrm/templates/user/shelf/shelf.html:112 msgid "Finished" msgstr "Terminado" -#: bookwyrm/templates/user/shelf/shelf.html:137 +#: bookwyrm/templates/user/shelf/shelf.html:138 msgid "This shelf is empty." msgstr "Este estante está vacio." -#: bookwyrm/templates/user/shelf/shelf.html:143 +#: bookwyrm/templates/user/shelf/shelf.html:144 msgid "Delete shelf" msgstr "Eliminar estante" @@ -2881,13 +2837,11 @@ msgid "%(counter)s following" msgstr "%(counter)s siguiendo" #: bookwyrm/templates/user/user_preview.html:26 -#, fuzzy, python-format -#| msgid "%(mutuals)s follower you follow" -#| msgid_plural "%(mutuals)s followers you follow" +#, python-format msgid "%(mutuals_display)s follower you follow" msgid_plural "%(mutuals_display)s followers you follow" -msgstr[0] "%(mutuals)s seguidor que sigues" -msgstr[1] "%(mutuals)s seguidores que sigues" +msgstr[0] "%(mutuals_display)s seguidor que sigues" +msgstr[1] "%(mutuals_display)s seguidores que sigues" #: bookwyrm/templates/user_admin/user.html:9 msgid "Back to users" @@ -2895,8 +2849,8 @@ msgstr "Volver a usuarios" #: bookwyrm/templates/user_admin/user_admin.html:7 #, python-format -msgid "Users: %(server_name)s" -msgstr "Usuarios %(server_name)s" +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 @@ -2912,8 +2866,10 @@ msgid "Last Active" msgstr "Actividad reciente" #: bookwyrm/templates/user_admin/user_admin.html:38 -msgid "Remote server" -msgstr "Quitar servidor" +#, fuzzy +#| msgid "View instance" +msgid "Remote instance" +msgstr "Ver instancia" #: bookwyrm/templates/user_admin/user_admin.html:47 msgid "Active" @@ -2956,11 +2912,13 @@ msgstr "Des-suspender usuario" msgid "Access level:" msgstr "Nivel de acceso:" +#: bookwyrm/templates/widgets/clearable_file_input_with_warning.html:3 +msgid "File exceeds maximum size: 10MB" +msgstr "" + #: bookwyrm/views/import_data.py:67 -#, fuzzy -#| msgid "Enter a valid value." msgid "Not a valid csv file" -msgstr "Ingrese un valor válido." +msgstr "No un archivo csv válido" #: bookwyrm/views/password.py:32 msgid "No user with that email address was found." @@ -2971,6 +2929,18 @@ msgstr "No se pudo encontrar un usuario con esa dirección de correo electrónic msgid "A password reset link sent to %s" msgstr "Un enlace para reestablecer tu contraseña se enviará a %s" +#~ msgid "Federated Servers" +#~ msgstr "Servidores federalizados" + +#~ msgid "Server name" +#~ msgstr "Nombre de servidor" + +#~ msgid "Add server" +#~ msgstr "Agregar servidor" + +#~ msgid "Remote server" +#~ msgstr "Quitar servidor" + #, fuzzy #~| msgid "BookWyrm users" #~ msgid "BookWyrm\\" @@ -2981,7 +2951,6 @@ msgstr "Un enlace para reestablecer tu contraseña se enviará a %s" #~ msgid "Show" #~ msgstr "Mostrar más" -#, python-format #~ msgid "ambiguous option: %(option)s could match %(matches)s" #~ msgstr "opción ambiguo: %(option)s pudiera coincidir con %(matches)s" @@ -3033,25 +3002,20 @@ msgstr "Un enlace para reestablecer tu contraseña se enviará a %s" #~ msgid "Enter only digits separated by commas." #~ msgstr "Ingrese solo digitos separados por comas." -#, python-format #~ msgid "Ensure this value is %(limit_value)s (it is %(show_value)s)." #~ msgstr "Asegura que este valor es %(limit_value)s (es %(show_value)s)." -#, python-format #~ msgid "Ensure this value is less than or equal to %(limit_value)s." #~ msgstr "Asegura que este valor es menor que o iguala a %(limit_value)s." -#, python-format #~ msgid "Ensure this value is greater than or equal to %(limit_value)s." #~ msgstr "Asegura que este valor es más que o que iguala a %(limit_value)s." -#, python-format #~ msgid "Ensure this value has at least %(limit_value)d character (it has %(show_value)d)." #~ msgid_plural "Ensure this value has at least %(limit_value)d characters (it has %(show_value)d)." #~ msgstr[0] "Verifica que este valor tiene por lo menos %(limit_value)d carácter. (Tiene %(show_value)d).)" #~ msgstr[1] "Verifica que este valor tiene por lo menos %(limit_value)d caracteres. (Tiene %(show_value)d).)" -#, python-format #~ msgid "Ensure this value has at most %(limit_value)d character (it has %(show_value)d)." #~ msgid_plural "Ensure this value has at most %(limit_value)d characters (it has %(show_value)d)." #~ msgstr[0] "Verifica que este valor tiene a lo sumo %(limit_value)d carácter. (Tiene %(show_value)d).)" @@ -3060,26 +3024,22 @@ msgstr "Un enlace para reestablecer tu contraseña se enviará a %s" #~ msgid "Enter a number." #~ msgstr "Ingrese un número." -#, python-format #~ msgid "Ensure that there are no more than %(max)s digit in total." #~ msgid_plural "Ensure that there are no more than %(max)s digits in total." #~ msgstr[0] "Verifica que no hay más que %(max)s digito en total." #~ msgstr[1] "Verifica que no hay más que %(max)s digitos en total." # is -#, python-format #~ msgid "Ensure that there are no more than %(max)s decimal place." #~ msgid_plural "Ensure that there are no more than %(max)s decimal places." #~ msgstr[0] "Verifica que no hay más que %(max)s cifra decimal." #~ msgstr[1] "Verifica que no hay más que %(max)s cifras decimales." -#, python-format #~ msgid "Ensure that there are no more than %(max)s digit before the decimal point." #~ msgid_plural "Ensure that there are no more than %(max)s digits before the decimal point." #~ msgstr[0] "Verifica que no hay más que %(max)s digito antes de la coma decimal." #~ msgstr[1] "Verifica que no hay más que %(max)s digitos antes de la coma decimal." -#, python-format #~ msgid "File extension “%(extension)s” is not allowed. Allowed extensions are: %(allowed_extensions)s." #~ msgstr "No se permite la extensión de archivo “%(extension)s”. Extensiones permitidas son: %(allowed_extensions)s." @@ -3089,11 +3049,9 @@ msgstr "Un enlace para reestablecer tu contraseña se enviará a %s" #~ msgid "and" #~ msgstr "y" -#, python-format #~ msgid "%(model_name)s with this %(field_labels)s already exists." #~ msgstr "Ya existe %(model_name)s con este %(field_labels)s." -#, python-format #~ msgid "Value %(value)r is not a valid choice." #~ msgstr "El valor %(value)s no es una opción válida." @@ -3103,67 +3061,56 @@ msgstr "Un enlace para reestablecer tu contraseña se enviará a %s" #~ msgid "This field cannot be blank." #~ msgstr "Este campo no puede ser vacio." -#, fuzzy, python-format +#, fuzzy #~| msgid "%(model_name)s with this %(field_label)s already exists." #~ msgid "%(model_name)s with this %(field_label)s already exists." #~ msgstr "Ya existe %(model_name)s con este %(field_labels)s." -#, python-format #~ msgid "%(field_label)s must be unique for %(date_field_label)s %(lookup_type)s." #~ msgstr "%(field_label)s deben ser unicos por %(date_field_label)s %(lookup_type)s." -#, python-format #~ msgid "Field of type: %(field_type)s" #~ msgstr "Campo de tipo: %(field_type)s" -#, python-format #~ msgid "“%(value)s” value must be either True or False." #~ msgstr "“%(value)s” valor debe ser o verdadero o falso." -#, python-format #~ msgid "“%(value)s” value must be either True, False, or None." #~ msgstr "%(value)s” valor debe ser o True, False, o None." #~ msgid "Boolean (Either True or False)" #~ msgstr "Booleano (O True O False)" -#, python-format #~ msgid "String (up to %(max_length)s)" #~ msgstr "Cadena (máximo de %(max_length)s caracteres)" #~ msgid "Comma-separated integers" #~ msgstr "Enteros separados por comas" -#, python-format #~ msgid "“%(value)s” value has an invalid date format. It must be in YYYY-MM-DD format." #~ msgstr "“%(value)s” valor tiene un formato de fecha inválido. Hay que estar de formato YYYY-MM-DD." -#, python-format #~ msgid "“%(value)s” value has the correct format (YYYY-MM-DD) but it is an invalid date." #~ msgstr "“%(value)s” valor tiene el formato correcto (YYYY-MM-DD) pero la fecha es invalida." #~ msgid "Date (without time)" #~ msgstr "Fecha (sin la hora)" -#, python-format #~ msgid "“%(value)s” value has an invalid format. It must be in YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ] format." #~ msgstr "“%(value)s” valor tiene un formato invalido. Debe estar en formato YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]." -#, python-format #~ msgid "“%(value)s” value has the correct format (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) but it is an invalid date/time." #~ msgstr "“%(value)s” valor tiene el formato correcto (YYYY-MM-DD HH:MM[:ss[.uuuuuu]][TZ]) pero es una fecha/hora invalida." #~ msgid "Date (with time)" #~ msgstr "Fecha (con la hora)" -#, python-format #~ msgid "“%(value)s” value must be a decimal number." #~ msgstr "El valor de “%(value)s” debe ser un número decimal." #~ msgid "Decimal number" #~ msgstr "Número decimal" -#, python-format #~ msgid "“%(value)s” value has an invalid format. It must be in [DD] [[HH:]MM:]ss[.uuuuuu] format." #~ msgstr "“%(value)s” valor tiene un formato invalido. Debe estar en formato [DD] [[HH:]MM:]ss[.uuuuuu]." @@ -3176,14 +3123,12 @@ msgstr "Un enlace para reestablecer tu contraseña se enviará a %s" #~ msgid "File path" #~ msgstr "Ruta de archivo" -#, python-format #~ msgid "“%(value)s” value must be a float." #~ msgstr "%(value)s no es un usuario válido" #~ msgid "Floating point number" #~ msgstr "Número de coma flotante" -#, python-format #~ msgid "“%(value)s” value must be an integer." #~ msgstr "“%(value)s” valor debe ser un entero." @@ -3199,7 +3144,6 @@ msgstr "Un enlace para reestablecer tu contraseña se enviará a %s" #~ msgid "IP address" #~ msgstr "Dirección IP" -#, python-format #~ msgid "“%(value)s” value must be either None, True or False." #~ msgstr "Valor “%(value)s” debe ser o None, True, o False." @@ -3212,7 +3156,6 @@ msgstr "Un enlace para reestablecer tu contraseña se enviará a %s" #~ msgid "Positive small integer" #~ msgstr "Entero positivo pequeño " -#, python-format #~ msgid "Slug (up to %(max_length)s)" #~ msgstr "Slug (máximo de %(max_length)s)" @@ -3222,11 +3165,9 @@ msgstr "Un enlace para reestablecer tu contraseña se enviará a %s" #~ msgid "Text" #~ msgstr "Texto" -#, python-format #~ msgid "“%(value)s” value has an invalid format. It must be in HH:MM[:ss[.uuuuuu]] format." #~ msgstr "“%(value)s” valor tiene un formato invalido. Debe estar en formato HH:MM[:ss[.uuuuuu]]." -#, python-format #~ msgid "“%(value)s” value has the correct format (HH:MM[:ss[.uuuuuu]]) but it is an invalid time." #~ msgstr "“%(value)s” valor tiene el formato correcto (HH:MM[:ss[.uuuuuu]]) pero es una hora invalida." @@ -3239,7 +3180,6 @@ msgstr "Un enlace para reestablecer tu contraseña se enviará a %s" #~ msgid "Raw binary data" #~ msgstr "Datos binarios sin procesar" -#, python-format #~ msgid "“%(value)s” is not a valid UUID." #~ msgstr "%(value)s no es una UUID válida." @@ -3252,7 +3192,6 @@ msgstr "Un enlace para reestablecer tu contraseña se enviará a %s" #~ msgid "Image" #~ msgstr "Imágen" -#, python-format #~ msgid "%(model)s instance with %(field)s %(value)r does not exist." #~ msgstr "%(model)s instancia con %(field)s %(value)r no existe." @@ -3262,11 +3201,9 @@ msgstr "Un enlace para reestablecer tu contraseña se enviará a %s" #~ msgid "One-to-one relationship" #~ msgstr "Relación uno-a-uno" -#, python-format #~ msgid "%(from)s-%(to)s relationship" #~ msgstr "relación %(from)s-%(to)s" -#, python-format #~ msgid "%(from)s-%(to)s relationships" #~ msgstr "relaciones %(from)s-%(to)s" @@ -3291,7 +3228,6 @@ msgstr "Un enlace para reestablecer tu contraseña se enviará a %s" #~ msgid "Enter a valid duration." #~ msgstr "Ingrese una duración válida." -#, python-brace-format #~ msgid "The number of days must be between {min_days} and {max_days}." #~ msgstr "El número de dias debe ser entre {min_days} y {max_days}." @@ -3304,7 +3240,6 @@ msgstr "Un enlace para reestablecer tu contraseña se enviará a %s" #~ msgid "The submitted file is empty." #~ msgstr "El archivo enviado está vacio." -#, python-format #~ msgid "Ensure this filename has at most %(max)d character (it has %(length)d)." #~ msgid_plural "Ensure this filename has at most %(max)d characters (it has %(length)d)." #~ msgstr[0] "Verifica que este nombre de archivo no tiene más que %(max)d carácter. (Tiene %(length)d)." @@ -3316,7 +3251,6 @@ msgstr "Un enlace para reestablecer tu contraseña se enviará a %s" #~ msgid "Upload a valid image. The file you uploaded was either not an image or a corrupted image." #~ msgstr "Subir una imagen válida. El archivo que subiste o no fue imagen o fue corrupto." -#, python-format #~ msgid "Select a valid choice. %(value)s is not one of the available choices." #~ msgstr "Selecciona una opción válida. %(value)s no es una de las opciones disponibles." @@ -3332,20 +3266,17 @@ msgstr "Un enlace para reestablecer tu contraseña se enviará a %s" #~ msgid ":" #~ msgstr ":" -#, python-format #~ msgid "(Hidden field %(name)s) %(error)s" #~ msgstr "(Campo oculto %(name)s) %(error)s" #~ msgid "ManagementForm data is missing or has been tampered with" #~ msgstr "Datos de ManagementForm está ausento o ha sido corrompido" -#, python-format #~ msgid "Please submit %d or fewer forms." #~ msgid_plural "Please submit %d or fewer forms." #~ msgstr[0] "Por favor, enviar %d o menos formularios." #~ msgstr[1] "Por favor, enviar %d o menos formularios." -#, python-format #~ msgid "Please submit %d or more forms." #~ msgid_plural "Please submit %d or more forms." #~ msgstr[0] "Por favor, enviar %d o más formularios." @@ -3358,15 +3289,12 @@ msgstr "Un enlace para reestablecer tu contraseña se enviará a %s" # if verb # msgstr "Pedido" # if noun -#, python-format #~ msgid "Please correct the duplicate data for %(field)s." #~ msgstr "Por favor corrige los datos duplicados en %(field)s." -#, python-format #~ msgid "Please correct the duplicate data for %(field)s, which must be unique." #~ msgstr "Por favor corrige los datos duplicados en %(field)s, los cuales deben ser unicos." -#, python-format #~ msgid "Please correct the duplicate data for %(field_name)s which must be unique for the %(lookup)s in %(date_field)s." #~ msgstr "Por favor corrige los datos duplicados en %(field_name)s los cuales deben ser unicos por el %(lookup)s en %(date_field)s." @@ -3379,11 +3307,9 @@ msgstr "Un enlace para reestablecer tu contraseña se enviará a %s" #~ msgid "Select a valid choice. That choice is not one of the available choices." #~ msgstr "Selecciona una opción válida. Esa opción no es una de las opciones disponibles." -#, python-format #~ msgid "“%(pk)s” is not a valid value." #~ msgstr "“%(pk)s” no es un valor válido." -#, python-format #~ msgid "%(datetime)s couldn’t be interpreted in time zone %(current_timezone)s; it may be ambiguous or it may not exist." #~ msgstr "%(datetime)s no se pudo interpretar en la zona horaria %(current_timezone)s; puede ser ambiguo o puede que no exista." @@ -3408,29 +3334,23 @@ msgstr "Un enlace para reestablecer tu contraseña se enviará a %s" #~ msgid "yes,no,maybe" #~ msgstr "sí,no,quizás" -#, python-format #~ msgid "%(size)d byte" #~ msgid_plural "%(size)d bytes" #~ msgstr[0] "%(size)d byte" #~ msgstr[1] "%(size)d bytes" -#, python-format #~ msgid "%s KB" #~ msgstr "%s KB" -#, python-format #~ msgid "%s MB" #~ msgstr "%s MB" -#, python-format #~ msgid "%s GB" #~ msgstr "%s GB" -#, python-format #~ msgid "%s TB" #~ msgstr "%s TB" -#, python-format #~ msgid "%s PB" #~ msgstr "%s PB" @@ -3665,7 +3585,6 @@ msgstr "Un enlace para reestablecer tu contraseña se enviará a %s" #~ msgid "This is not a valid IPv6 address." #~ msgstr "Esta no es una dirección IPv6 válida." -#, python-format #~ msgctxt "String to return when truncating text" #~ msgid "%(truncated_text)s…" #~ msgstr "%(truncated_text)s…" @@ -3676,37 +3595,31 @@ msgstr "Un enlace para reestablecer tu contraseña se enviará a %s" #~ msgid ", " #~ msgstr ", " -#, python-format #~ msgid "%d year" #~ msgid_plural "%d years" #~ msgstr[0] "%d año" #~ msgstr[1] "%d años" -#, python-format #~ msgid "%d month" #~ msgid_plural "%d months" #~ msgstr[0] "%d mes" #~ msgstr[1] "%d meses" -#, python-format #~ msgid "%d week" #~ msgid_plural "%d weeks" #~ msgstr[0] "%d semana" #~ msgstr[1] "%d semanas" -#, python-format #~ msgid "%d day" #~ msgid_plural "%d days" #~ msgstr[0] "%d día" #~ msgstr[1] "%d días" -#, python-format #~ msgid "%d hour" #~ msgid_plural "%d hours" #~ msgstr[0] "%d hora" #~ msgstr[1] "%d horas" -#, python-format #~ msgid "%d minute" #~ msgid_plural "%d minutes" #~ msgstr[0] "%d minuto" @@ -3757,55 +3670,45 @@ msgstr "Un enlace para reestablecer tu contraseña se enviará a %s" #~ msgid "No week specified" #~ msgstr "Ninguna semana fue especificado" -#, python-format #~ msgid "No %(verbose_name_plural)s available" #~ msgstr "No %(verbose_name_plural)s disponible" -#, python-format #~ msgid "Future %(verbose_name_plural)s not available because %(class_name)s.allow_future is False." #~ msgstr "%(verbose_name_plural)s del futuro no está disponible porque %(class_name)s.allow_future es False." -#, python-format #~ msgid "Invalid date string “%(datestr)s” given format “%(format)s”" #~ msgstr "Cadena de fecha invalida “%(datestr)s” dado el formato “%(format)s”" -#, python-format #~ msgid "No %(verbose_name)s found matching the query" #~ msgstr "No se encontró ningún %(verbose_name)s correspondiente a la búsqueda" #~ msgid "Page is not “last”, nor can it be converted to an int." #~ msgstr "Página no es “last”, ni puede ser convertido en un int." -#, python-format #~ msgid "Invalid page (%(page_number)s): %(message)s" #~ msgstr "Página invalida (%(page_number)s): %(message)s" -#, python-format #~ msgid "Empty list and “%(class_name)s.allow_empty” is False." #~ msgstr "Lista vacia y “%(class_name)s.allow_empty” es False." #~ msgid "Directory indexes are not allowed here." #~ msgstr "Indices directorios no se permiten aquí." -#, python-format #~ msgid "“%(path)s” does not exist" #~ msgstr "“%(path)s” no existe" -#, python-format #~ msgid "Index of %(directory)s" #~ msgstr "Indice de %(directory)s" #~ msgid "Django: the Web framework for perfectionists with deadlines." #~ msgstr "Django: el estructura Web para perfeccionistas con fechas límites." -#, python-format #~ msgid "View release notes for Django %(version)s" #~ msgstr "Ver notas de lanzamiento por Django %(version)s" #~ msgid "The install worked successfully! Congratulations!" #~ msgstr "¡La instalación fue exitoso! ¡Felicidades!" -#, python-format #~ msgid "You are seeing this page because DEBUG=True is in your settings file and you have not configured any URLs." #~ msgstr "Estás viendo esta pagina porque DEBUG=True está en tu archivo de configuración y no has configurado ningún URL." @@ -3827,15 +3730,12 @@ msgstr "Un enlace para reestablecer tu contraseña se enviará a %s" #~ msgid "Connect, get help, or contribute" #~ msgstr "Conectarse, encontrar ayuda, o contribuir" -#, python-format #~ msgid "Attempting to connect to qpid with SASL mechanism %s" #~ msgstr "Intentando conectar con qpid con mecanismo SASL %s" -#, python-format #~ msgid "Connected to qpid with SASL mechanism %s" #~ msgstr "Conectado con qpid con mecanismo SASL %s" -#, python-format #~ msgid "Unable to connect to qpid with SASL mechanism %s" #~ msgstr "No se pudo conectar con qpid con mecanismo SASL %s" @@ -3848,7 +3748,6 @@ msgstr "Un enlace para reestablecer tu contraseña se enviará a %s" #~ msgid "1 hour ago" #~ msgstr "Hace 1 hora" -#, python-format #~ msgid "%(time)s" #~ msgstr "%(time)s" @@ -3857,45 +3756,36 @@ msgstr "Un enlace para reestablecer tu contraseña se enviará a %s" # TODO cc @mouse this could be grammatically incorrect if the time said 1 o'clock # a working clock is broken twice a day! -#, python-format #~ msgid "yesterday at %(time)s" #~ msgstr "ayer a las %(time)s" -#, python-format #~ msgid "%(weekday)s" #~ msgstr "%(weekday)s" # TODO cc @mouse this could be grammatically incorrect if the time said 1 o'clock # a working clock is broken twice a day! -#, python-format #~ msgid "%(weekday)s at %(time)s" #~ msgstr "%(weekday)s a las %(time)s" -#, python-format #~ msgid "%(month_name)s %(day)s" #~ msgstr "%(day)s %(month_name)s" # TODO cc @mouse this could be grammatically incorrect if the time said 1 o'clock # a working clock is broken twice a day! -#, python-format #~ msgid "%(month_name)s %(day)s at %(time)s" #~ msgstr "%(day)s %(month_name)s a las %(time)s" -#, python-format #~ msgid "%(month_name)s %(day)s, %(year)s" #~ msgstr "%(day)s %(month_name)s, %(year)s" # TODO cc @mouse this could be grammatically incorrect if the time said 1 o'clock # a working clock is broken twice a day! -#, python-format #~ msgid "%(month_name)s %(day)s, %(year)s at %(time)s" #~ msgstr "%(day)s %(month_name)s, %(year)s a las %(time)s" -#, python-format #~ msgid "%(weekday)s, %(month_name)s %(day)s" #~ msgstr "%(weekday)s, %(day)s %(month_name)s" -#, python-format #~ msgid "%(commas)s and %(last)s" #~ msgstr "%(commas)s y %(last)s" @@ -3924,29 +3814,18 @@ msgstr "Un enlace para reestablecer tu contraseña se enviará a %s" #~ msgid "Matching Users" #~ msgstr "Usuarios correspondientes" -#, python-format #~ msgid "Set a reading goal for %(year)s" #~ msgstr "Establecer una meta de lectura para %(year)s" -#, python-format #~ msgid "by %(author)s" #~ msgstr "por %(author)s" -#, python-format -#~ msgid "%(rating)s star" -#~ msgid_plural "%(rating)s stars" -#~ msgstr[0] "%(rating)s estrella" -#~ msgstr[1] "%(rating)s estrellas" - -#, python-format #~ msgid "replied to %(username)s's review" #~ msgstr "respondió a la reseña de %(username)s " -#, python-format #~ msgid "replied to %(username)s's comment" #~ msgstr "respondió al comentario de %(username)s " -#, python-format #~ msgid "replied to %(username)s's quote" #~ msgstr "respondió a la cita de %(username)s " diff --git a/locale/fr_FR/LC_MESSAGES/django.mo b/locale/fr_FR/LC_MESSAGES/django.mo index 8d377f420..3d622ac66 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 577614544..d29afc1cf 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-05-20 14:40-0700\n" +"POT-Creation-Date: 2021-06-09 16:46+0000\n" "PO-Revision-Date: 2021-04-05 12:44+0100\n" "Last-Translator: Fabien Basmaison \n" "Language-Team: Mouse Reeve \n" @@ -49,71 +49,65 @@ msgstr "Sans limite" #: bookwyrm/forms.py:299 msgid "List Order" -msgstr "" +msgstr "Ordre de la liste" #: bookwyrm/forms.py:300 -#, fuzzy -#| msgid "Title" msgid "Book Title" -msgstr "Titre" +msgstr "Titre du livre" #: bookwyrm/forms.py:301 bookwyrm/templates/snippets/create_status_form.html:34 -#: bookwyrm/templates/user/shelf/shelf.html:84 -#: bookwyrm/templates/user/shelf/shelf.html:115 +#: bookwyrm/templates/user/shelf/shelf.html:85 +#: bookwyrm/templates/user/shelf/shelf.html:116 msgid "Rating" msgstr "Note" -#: bookwyrm/forms.py:303 bookwyrm/templates/lists/list.html:101 +#: bookwyrm/forms.py:303 bookwyrm/templates/lists/list.html:107 msgid "Sort By" -msgstr "" +msgstr "Trier par" #: bookwyrm/forms.py:307 -#, fuzzy -#| msgid "Sorted ascending" msgid "Ascending" -msgstr "Trié par ordre croissant" +msgstr "Ordre croissant" #: bookwyrm/forms.py:308 -#, fuzzy -#| msgid "Sorted ascending" msgid "Descending" -msgstr "Trié par ordre croissant" +msgstr "Ordre décroissant" -#: bookwyrm/models/fields.py:24 +#: bookwyrm/models/fields.py:25 #, python-format msgid "%(value)s is not a valid remote_id" msgstr "%(value)s n’est pas une remote_id valide." -#: bookwyrm/models/fields.py:33 bookwyrm/models/fields.py:42 +#: bookwyrm/models/fields.py:34 bookwyrm/models/fields.py:43 #, python-format msgid "%(value)s is not a valid username" msgstr "%(value)s n’est pas un nom de compte valide." -#: bookwyrm/models/fields.py:165 bookwyrm/templates/layout.html:155 +#: bookwyrm/models/fields.py:166 bookwyrm/templates/layout.html:152 msgid "username" msgstr "nom du compte :" -#: bookwyrm/models/fields.py:170 +#: bookwyrm/models/fields.py:171 msgid "A user with that username already exists." msgstr "Ce nom est déjà associé à un compte." -#: bookwyrm/settings.py:155 +#: bookwyrm/settings.py:156 msgid "English" msgstr "English" -#: bookwyrm/settings.py:156 +#: bookwyrm/settings.py:157 msgid "German" msgstr "Deutsch" -#: bookwyrm/settings.py:157 +#: bookwyrm/settings.py:158 msgid "Spanish" msgstr "Español" -#: bookwyrm/settings.py:158 +#: bookwyrm/settings.py:159 msgid "French" msgstr "Français" -#: bookwyrm/settings.py:159 +#: bookwyrm/settings.py:160 msgid "Simplified Chinese" msgstr "简化字" @@ -142,36 +136,42 @@ msgstr "Une erreur s’est produite ; désolé !" msgid "Edit Author" msgstr "Modifier l’auteur ou autrice" -#: bookwyrm/templates/author/author.html:32 -#: bookwyrm/templates/author/edit_author.html:38 +#: bookwyrm/templates/author/author.html:34 +#: bookwyrm/templates/author/edit_author.html:41 msgid "Aliases:" -msgstr "" +msgstr "Pseudonymes :" -#: bookwyrm/templates/author/author.html:38 +#: bookwyrm/templates/author/author.html:45 msgid "Born:" -msgstr "" +msgstr "Naissance :" -#: bookwyrm/templates/author/author.html:44 +#: bookwyrm/templates/author/author.html:52 msgid "Died:" -msgstr "" +msgstr "Décès :" -#: bookwyrm/templates/author/author.html:51 +#: bookwyrm/templates/author/author.html:61 msgid "Wikipedia" msgstr "Wikipedia" -#: bookwyrm/templates/author/author.html:55 -#: bookwyrm/templates/book/book.html:78 +#: bookwyrm/templates/author/author.html:69 +#: bookwyrm/templates/book/book.html:87 msgid "View on OpenLibrary" msgstr "Voir sur OpenLibrary" -#: bookwyrm/templates/author/author.html:60 -#: bookwyrm/templates/book/book.html:81 -#, fuzzy -#| msgid "View on OpenLibrary" +#: bookwyrm/templates/author/author.html:77 +#: bookwyrm/templates/book/book.html:90 msgid "View on Inventaire" -msgstr "Voir sur OpenLibrary" +msgstr "Voir sur Inventaire" -#: bookwyrm/templates/author/author.html:74 +#: bookwyrm/templates/author/author.html:85 +msgid "View on LibraryThing" +msgstr "Voir sur LibraryThing" + +#: bookwyrm/templates/author/author.html:93 +msgid "View on Goodreads" +msgstr "Voir sur Goodreads" + +#: bookwyrm/templates/author/author.html:108 #, python-format msgid "Books by %(name)s" msgstr "Livres par %(name)s" @@ -181,89 +181,85 @@ msgid "Edit Author:" msgstr "Modifier l’auteur ou l’autrice :" #: bookwyrm/templates/author/edit_author.html:13 -#: bookwyrm/templates/book/edit_book.html:18 +#: bookwyrm/templates/book/edit_book.html:19 msgid "Added:" -msgstr "AJouté :" +msgstr "Ajouté :" #: bookwyrm/templates/author/edit_author.html:14 -#: bookwyrm/templates/book/edit_book.html:19 +#: bookwyrm/templates/book/edit_book.html:24 msgid "Updated:" msgstr "Mis à jour :" #: bookwyrm/templates/author/edit_author.html:15 -#: bookwyrm/templates/book/edit_book.html:20 +#: bookwyrm/templates/book/edit_book.html:30 msgid "Last edited by:" msgstr "Dernière modification par :" #: bookwyrm/templates/author/edit_author.html:31 -#: bookwyrm/templates/book/edit_book.html:90 +#: bookwyrm/templates/book/edit_book.html:117 msgid "Metadata" msgstr "Métadonnées" -#: bookwyrm/templates/author/edit_author.html:32 +#: bookwyrm/templates/author/edit_author.html:33 #: bookwyrm/templates/lists/form.html:8 #: bookwyrm/templates/user/shelf/create_shelf_form.html:13 #: bookwyrm/templates/user/shelf/edit_shelf_form.html:14 msgid "Name:" msgstr "Nom :" -#: bookwyrm/templates/author/edit_author.html:40 -#: bookwyrm/templates/book/edit_book.html:132 -#: bookwyrm/templates/book/edit_book.html:141 -#: bookwyrm/templates/book/edit_book.html:178 -#, fuzzy -#| msgid "Separate multiple publishers with commas." +#: bookwyrm/templates/author/edit_author.html:43 +#: bookwyrm/templates/book/edit_book.html:162 +#: bookwyrm/templates/book/edit_book.html:171 +#: bookwyrm/templates/book/edit_book.html:214 msgid "Separate multiple values with commas." -msgstr "Séparez plusieurs éditeurs par une virgule." +msgstr "Séparez plusieurs valeurs par une virgule." -#: bookwyrm/templates/author/edit_author.html:46 +#: bookwyrm/templates/author/edit_author.html:50 msgid "Bio:" msgstr "Bio :" -#: bookwyrm/templates/author/edit_author.html:51 +#: bookwyrm/templates/author/edit_author.html:57 msgid "Wikipedia link:" msgstr "Wikipedia :" -#: bookwyrm/templates/author/edit_author.html:57 +#: bookwyrm/templates/author/edit_author.html:63 msgid "Birth date:" msgstr "Date de naissance :" -#: bookwyrm/templates/author/edit_author.html:65 +#: bookwyrm/templates/author/edit_author.html:71 msgid "Death date:" msgstr "Date de décès :" -#: bookwyrm/templates/author/edit_author.html:73 +#: bookwyrm/templates/author/edit_author.html:79 msgid "Author Identifiers" msgstr "Identifiants de l’auteur ou autrice" -#: bookwyrm/templates/author/edit_author.html:74 +#: bookwyrm/templates/author/edit_author.html:81 msgid "Openlibrary key:" msgstr "Clé Openlibrary :" -#: bookwyrm/templates/author/edit_author.html:79 -#: bookwyrm/templates/book/edit_book.html:243 -#, fuzzy -#| msgid "View on OpenLibrary" +#: bookwyrm/templates/author/edit_author.html:89 +#: bookwyrm/templates/book/edit_book.html:293 msgid "Inventaire ID:" -msgstr "Voir sur OpenLibrary" +msgstr "Identifiant Inventaire :" -#: bookwyrm/templates/author/edit_author.html:84 +#: bookwyrm/templates/author/edit_author.html:97 msgid "Librarything key:" msgstr "Clé Librarything :" -#: bookwyrm/templates/author/edit_author.html:89 +#: bookwyrm/templates/author/edit_author.html:105 msgid "Goodreads key:" msgstr "Clé Goodreads :" -#: bookwyrm/templates/author/edit_author.html:98 -#: bookwyrm/templates/book/book.html:124 -#: bookwyrm/templates/book/edit_book.html:263 +#: bookwyrm/templates/author/edit_author.html:116 +#: bookwyrm/templates/book/book.html:133 +#: bookwyrm/templates/book/edit_book.html:321 #: bookwyrm/templates/lists/form.html:42 #: bookwyrm/templates/preferences/edit_user.html:70 -#: bookwyrm/templates/settings/announcement_form.html:65 +#: bookwyrm/templates/settings/announcement_form.html:69 #: bookwyrm/templates/settings/edit_server.html:68 #: bookwyrm/templates/settings/federated_server.html:98 -#: bookwyrm/templates/settings/site.html:97 +#: bookwyrm/templates/settings/site.html:101 #: bookwyrm/templates/snippets/readthrough.html:77 #: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:42 #: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:42 @@ -272,10 +268,10 @@ msgstr "Clé Goodreads :" msgid "Save" msgstr "Enregistrer" -#: bookwyrm/templates/author/edit_author.html:99 -#: bookwyrm/templates/book/book.html:125 bookwyrm/templates/book/book.html:174 +#: bookwyrm/templates/author/edit_author.html:117 +#: bookwyrm/templates/book/book.html:134 bookwyrm/templates/book/book.html:183 #: bookwyrm/templates/book/cover_modal.html:32 -#: bookwyrm/templates/book/edit_book.html:264 +#: bookwyrm/templates/book/edit_book.html:322 #: bookwyrm/templates/moderation/report_modal.html:34 #: bookwyrm/templates/settings/federated_server.html:99 #: bookwyrm/templates/snippets/delete_readthrough_modal.html:17 @@ -288,106 +284,98 @@ msgstr "Enregistrer" msgid "Cancel" msgstr "Annuler" -#: bookwyrm/templates/book/book.html:31 +#: bookwyrm/templates/book/book.html:40 #: bookwyrm/templates/discover/large-book.html:25 #: bookwyrm/templates/discover/small-book.html:19 msgid "by" msgstr "par" -#: bookwyrm/templates/book/book.html:39 bookwyrm/templates/book/book.html:40 +#: bookwyrm/templates/book/book.html:48 bookwyrm/templates/book/book.html:49 msgid "Edit Book" msgstr "Modifier le livre" -#: bookwyrm/templates/book/book.html:57 +#: bookwyrm/templates/book/book.html:66 #: bookwyrm/templates/book/cover_modal.html:5 msgid "Add cover" msgstr "Ajouter une couverture" -#: bookwyrm/templates/book/book.html:61 +#: bookwyrm/templates/book/book.html:70 msgid "Failed to load cover" msgstr "La couverture n’a pu être chargée" -#: bookwyrm/templates/book/book.html:101 +#: bookwyrm/templates/book/book.html:110 #, python-format msgid "(%(review_count)s review)" msgid_plural "(%(review_count)s reviews)" msgstr[0] "(%(review_count)s critique)" msgstr[1] "(%(review_count)s critiques)" -#: bookwyrm/templates/book/book.html:113 +#: bookwyrm/templates/book/book.html:122 msgid "Add Description" msgstr "Ajouter une description" -#: bookwyrm/templates/book/book.html:120 -#: bookwyrm/templates/book/edit_book.html:108 +#: bookwyrm/templates/book/book.html:129 +#: bookwyrm/templates/book/edit_book.html:136 #: bookwyrm/templates/lists/form.html:12 msgid "Description:" msgstr "Description :" -#: bookwyrm/templates/book/book.html:134 +#: bookwyrm/templates/book/book.html:143 #, python-format msgid "%(count)s editions" msgstr "%(count)s éditions" -#: bookwyrm/templates/book/book.html:142 +#: bookwyrm/templates/book/book.html:151 #, python-format msgid "This edition is on your %(shelf_name)s shelf." msgstr "Cette édition est sur votre étagère %(shelf_name)s." -#: bookwyrm/templates/book/book.html:148 +#: bookwyrm/templates/book/book.html:157 #, python-format msgid "A different edition of this book is on your %(shelf_name)s shelf." msgstr "Une édition différente de ce livre existe sur votre étagère %(shelf_name)s." -#: bookwyrm/templates/book/book.html:159 +#: bookwyrm/templates/book/book.html:168 msgid "Your reading activity" msgstr "Votre activité de lecture" -#: bookwyrm/templates/book/book.html:162 +#: bookwyrm/templates/book/book.html:171 msgid "Add read dates" msgstr "Ajouter des dates de lecture" -#: bookwyrm/templates/book/book.html:171 +#: bookwyrm/templates/book/book.html:180 msgid "Create" msgstr "Créer" -#: bookwyrm/templates/book/book.html:181 +#: bookwyrm/templates/book/book.html:190 msgid "You don't have any reading activity for this book." msgstr "Vous n’avez aucune activité de lecture pour ce livre" -#: bookwyrm/templates/book/book.html:200 -#, fuzzy -#| msgid "Review" +#: bookwyrm/templates/book/book.html:209 msgid "Reviews" -msgstr "Critique" +msgstr "Critiques" -#: bookwyrm/templates/book/book.html:205 -#, fuzzy -#| msgid "Your shelves" +#: bookwyrm/templates/book/book.html:214 msgid "Your reviews" -msgstr "Vos étagères" +msgstr "Vos critiques" -#: bookwyrm/templates/book/book.html:211 -#, fuzzy -#| msgid "Your Account" +#: bookwyrm/templates/book/book.html:220 msgid "Your comments" -msgstr "Votre compte" +msgstr "Vos commentaires" -#: bookwyrm/templates/book/book.html:217 -#, fuzzy -#| msgid "Your books" +#: bookwyrm/templates/book/book.html:226 msgid "Your quotes" -msgstr "Vos livres" +msgstr "Vos citations" -#: bookwyrm/templates/book/book.html:253 +#: bookwyrm/templates/book/book.html:262 msgid "Subjects" msgstr "Sujets" -#: bookwyrm/templates/book/book.html:265 +#: bookwyrm/templates/book/book.html:274 msgid "Places" msgstr "Lieux" -#: bookwyrm/templates/book/book.html:276 bookwyrm/templates/layout.html:64 +#: bookwyrm/templates/book/book.html:285 bookwyrm/templates/layout.html:61 #: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12 #: bookwyrm/templates/search/layout.html:25 #: bookwyrm/templates/search/layout.html:50 @@ -395,13 +383,13 @@ msgstr "Lieux" msgid "Lists" msgstr "Listes" -#: bookwyrm/templates/book/book.html:287 +#: bookwyrm/templates/book/book.html:296 msgid "Add to list" msgstr "Ajouter à la liste" -#: bookwyrm/templates/book/book.html:297 +#: bookwyrm/templates/book/book.html:306 #: bookwyrm/templates/book/cover_modal.html:31 -#: bookwyrm/templates/lists/list.html:164 +#: bookwyrm/templates/lists/list.html:179 msgid "Add" msgstr "Ajouter" @@ -410,22 +398,22 @@ msgid "ISBN:" msgstr "ISBN :" #: bookwyrm/templates/book/book_identifiers.html:14 -#: bookwyrm/templates/book/edit_book.html:248 +#: bookwyrm/templates/book/edit_book.html:301 msgid "OCLC Number:" msgstr "Numéro OCLC :" #: bookwyrm/templates/book/book_identifiers.html:21 -#: bookwyrm/templates/book/edit_book.html:253 +#: bookwyrm/templates/book/edit_book.html:309 msgid "ASIN:" msgstr "ASIN :" #: bookwyrm/templates/book/cover_modal.html:17 -#: bookwyrm/templates/book/edit_book.html:192 +#: bookwyrm/templates/book/edit_book.html:229 msgid "Upload cover:" msgstr "Charger une couverture :" #: bookwyrm/templates/book/cover_modal.html:23 -#: bookwyrm/templates/book/edit_book.html:198 +#: bookwyrm/templates/book/edit_book.html:235 msgid "Load cover from url:" msgstr "Charger la couverture depuis une URL :" @@ -440,133 +428,134 @@ msgstr "Modifier « %(book_title)s »" msgid "Add Book" msgstr "Ajouter un livre" -#: bookwyrm/templates/book/edit_book.html:40 +#: bookwyrm/templates/book/edit_book.html:54 msgid "Confirm Book Info" msgstr "Confirmer les informations de ce livre" -#: bookwyrm/templates/book/edit_book.html:47 +#: bookwyrm/templates/book/edit_book.html:62 #, python-format msgid "Is \"%(name)s\" an existing author?" -msgstr "Est‑ce que l’auteur ou l’autrice « %(name)s » existe déjà ?" +msgstr "Est‑ce que l’auteur/autrice « %(name)s » existe déjà ?" -#: bookwyrm/templates/book/edit_book.html:52 +#: bookwyrm/templates/book/edit_book.html:71 #, python-format msgid "Author of %(book_title)s" -msgstr "Commencer « %(book_title)s »" +msgstr "Auteur/autrice de %(book_title)s" -#: bookwyrm/templates/book/edit_book.html:55 +#: bookwyrm/templates/book/edit_book.html:75 msgid "This is a new author" msgstr "Il s’agit d’un nouvel auteur ou d’une nouvelle autrice." -#: bookwyrm/templates/book/edit_book.html:61 +#: bookwyrm/templates/book/edit_book.html:82 #, python-format msgid "Creating a new author: %(name)s" -msgstr "Création d’un nouvel auteur ou d’une nouvelle autrice : %(name)s" +msgstr "Création d’un nouvel auteur/autrice : %(name)s" -#: bookwyrm/templates/book/edit_book.html:67 +#: bookwyrm/templates/book/edit_book.html:89 msgid "Is this an edition of an existing work?" msgstr "Est‑ce l’édition d’un ouvrage existant ?" -#: bookwyrm/templates/book/edit_book.html:71 +#: bookwyrm/templates/book/edit_book.html:97 msgid "This is a new work" msgstr "Il s’agit d’un nouvel ouvrage." -#: bookwyrm/templates/book/edit_book.html:77 +#: bookwyrm/templates/book/edit_book.html:104 #: bookwyrm/templates/password_reset.html:30 msgid "Confirm" msgstr "Confirmer" -#: bookwyrm/templates/book/edit_book.html:79 +#: bookwyrm/templates/book/edit_book.html:106 #: bookwyrm/templates/feed/status.html:8 msgid "Back" msgstr "Retour" -#: bookwyrm/templates/book/edit_book.html:93 +#: bookwyrm/templates/book/edit_book.html:120 msgid "Title:" msgstr "Titre :" -#: bookwyrm/templates/book/edit_book.html:101 +#: bookwyrm/templates/book/edit_book.html:128 msgid "Subtitle:" msgstr "Sous‑titre :" -#: bookwyrm/templates/book/edit_book.html:114 +#: bookwyrm/templates/book/edit_book.html:144 msgid "Series:" msgstr "Série :" -#: bookwyrm/templates/book/edit_book.html:122 +#: bookwyrm/templates/book/edit_book.html:152 msgid "Series number:" msgstr "Numéro dans la série :" -#: bookwyrm/templates/book/edit_book.html:130 -#, fuzzy -#| msgid "Language:" +#: bookwyrm/templates/book/edit_book.html:160 msgid "Languages:" -msgstr "Langue :" +msgstr "Langues :" -#: bookwyrm/templates/book/edit_book.html:139 +#: bookwyrm/templates/book/edit_book.html:169 msgid "Publisher:" msgstr "Éditeur :" -#: bookwyrm/templates/book/edit_book.html:148 +#: bookwyrm/templates/book/edit_book.html:178 msgid "First published date:" msgstr "Première date de publication :" -#: bookwyrm/templates/book/edit_book.html:156 +#: bookwyrm/templates/book/edit_book.html:186 msgid "Published date:" msgstr "Date de publication :" -#: bookwyrm/templates/book/edit_book.html:165 +#: bookwyrm/templates/book/edit_book.html:195 msgid "Authors" msgstr "Auteurs ou autrices" -#: bookwyrm/templates/book/edit_book.html:171 +#: bookwyrm/templates/book/edit_book.html:202 #, python-format -msgid "Remove %(name)s" -msgstr "Supprimer %(name)s" +msgid "Remove %(name)s" +msgstr "Retirer %(name)s" -#: bookwyrm/templates/book/edit_book.html:176 +#: bookwyrm/templates/book/edit_book.html:205 +#, python-format +msgid "Author page for %(name)s" +msgstr "Page de %(name)s" + +#: bookwyrm/templates/book/edit_book.html:212 msgid "Add Authors:" msgstr "Ajouter des auteurs ou autrices :" -#: bookwyrm/templates/book/edit_book.html:177 +#: bookwyrm/templates/book/edit_book.html:213 msgid "John Doe, Jane Smith" msgstr "Claude Dupont, Dominique Durand" -#: bookwyrm/templates/book/edit_book.html:183 -#: bookwyrm/templates/user/shelf/shelf.html:77 +#: bookwyrm/templates/book/edit_book.html:220 +#: bookwyrm/templates/user/shelf/shelf.html:78 msgid "Cover" msgstr "Couverture" -#: bookwyrm/templates/book/edit_book.html:211 +#: bookwyrm/templates/book/edit_book.html:248 msgid "Physical Properties" msgstr "Propriétés physiques" -#: bookwyrm/templates/book/edit_book.html:212 +#: bookwyrm/templates/book/edit_book.html:250 #: bookwyrm/templates/book/format_filter.html:5 msgid "Format:" msgstr "Format :" -#: bookwyrm/templates/book/edit_book.html:220 +#: bookwyrm/templates/book/edit_book.html:258 msgid "Pages:" msgstr "Pages :" -#: bookwyrm/templates/book/edit_book.html:227 +#: bookwyrm/templates/book/edit_book.html:267 msgid "Book Identifiers" msgstr "Identifiants du livre" -#: bookwyrm/templates/book/edit_book.html:228 +#: bookwyrm/templates/book/edit_book.html:269 msgid "ISBN 13:" msgstr "ISBN 13 :" -#: bookwyrm/templates/book/edit_book.html:233 +#: bookwyrm/templates/book/edit_book.html:277 msgid "ISBN 10:" msgstr "ISBN 10 :" -#: bookwyrm/templates/book/edit_book.html:238 -#, fuzzy -#| msgid "Openlibrary key:" +#: bookwyrm/templates/book/edit_book.html:285 msgid "Openlibrary ID:" -msgstr "Clé Openlibrary :" +msgstr "Identifiant Openlibrary :" #: bookwyrm/templates/book/editions.html:4 #, python-format @@ -605,7 +594,7 @@ msgstr "%(pages)s pages" #: bookwyrm/templates/book/publisher_info.html:38 #, python-format msgid "%(languages)s language" -msgstr "%(languages)s langues" +msgstr "Langue : %(languages)s" #: bookwyrm/templates/book/publisher_info.html:64 #, python-format @@ -654,7 +643,7 @@ msgstr "Communauté fédérée" #: bookwyrm/templates/directory/directory.html:4 #: bookwyrm/templates/directory/directory.html:9 -#: bookwyrm/templates/layout.html:92 +#: bookwyrm/templates/layout.html:64 msgid "Directory" msgstr "Répertoire" @@ -671,7 +660,7 @@ msgstr "Vous pouvez décider de ne plus y figurer à n’importe quel moment dep #: bookwyrm/templates/snippets/announcement.html:34 #: bookwyrm/templates/snippets/goal_card.html:22 msgid "Dismiss message" -msgstr "Rejeter le message" +msgstr "Fermer le message" #: bookwyrm/templates/directory/sort_filter.html:5 msgid "Order by" @@ -688,8 +677,8 @@ msgstr "Actif récemment" #: bookwyrm/templates/directory/user_card.html:33 msgid "follower you follow" msgid_plural "followers you follow" -msgstr[0] "compte auquel vous êtes abonné(e)" -msgstr[1] "comptes auxquels vous êtes abonné(e)" +msgstr[0] "compte que vous suivez" +msgstr[1] "comptes que vous suivez" #: bookwyrm/templates/directory/user_card.html:40 msgid "book on your shelves" @@ -855,7 +844,7 @@ msgid "Direct Messages with %(username)s" msgstr "Messages directs avec %(username)s" #: bookwyrm/templates/feed/direct_messages.html:10 -#: bookwyrm/templates/layout.html:87 +#: bookwyrm/templates/layout.html:92 msgid "Direct Messages" msgstr "Messages directs" @@ -911,7 +900,6 @@ msgid "Updates" msgstr "Mises à jour" #: bookwyrm/templates/feed/feed_layout.html:10 -#: bookwyrm/templates/layout.html:58 #: bookwyrm/templates/user/shelf/books_header.html:3 msgid "Your books" msgstr "Vos livres" @@ -928,7 +916,7 @@ msgstr "À lire" #: bookwyrm/templates/feed/feed_layout.html:24 #: bookwyrm/templates/user/shelf/shelf.html:29 msgid "Currently Reading" -msgstr "En train de lire" +msgstr "Lectures en cours" #: bookwyrm/templates/feed/feed_layout.html:25 #: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:13 @@ -946,8 +934,8 @@ msgstr "Défi lecture pour %(year)s" #, python-format msgid "%(mutuals)s follower you follow" msgid_plural "%(mutuals)s followers you follow" -msgstr[0] "%(mutuals)s abonnement auxquel vous êtes abonné(e)" -msgstr[1] "%(mutuals)s abonnements auxquels vous êtes abonné(e)" +msgstr[0] "%(mutuals)s abonné(e) que vous suivez" +msgstr[1] "%(mutuals)s abonné(e)s que vous suivez" #: bookwyrm/templates/feed/suggested_users.html:19 #, python-format @@ -966,7 +954,7 @@ msgid "What are you reading?" msgstr "Que lisez‑vous ?" #: bookwyrm/templates/get_started/books.html:9 -#: bookwyrm/templates/lists/list.html:120 +#: bookwyrm/templates/lists/list.html:135 msgid "Search for a book" msgstr "Chercher un livre" @@ -986,7 +974,7 @@ msgstr "Vous pourrez ajouter des livres lorsque vous commencerez à utiliser %(s #: bookwyrm/templates/get_started/users.html:18 #: bookwyrm/templates/get_started/users.html:19 #: bookwyrm/templates/layout.html:37 bookwyrm/templates/layout.html:38 -#: bookwyrm/templates/lists/list.html:124 +#: bookwyrm/templates/lists/list.html:139 #: bookwyrm/templates/search/layout.html:4 #: bookwyrm/templates/search/layout.html:9 msgid "Search" @@ -1002,7 +990,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:137 +#: bookwyrm/templates/lists/list.html:152 msgid "No books found" msgstr "Aucun livre trouvé" @@ -1014,7 +1002,7 @@ msgstr "Enregistrer & continuer" #: bookwyrm/templates/get_started/layout.html:14 #, python-format msgid "Welcome to %(site_name)s!" -msgstr "Bienvenu(e) sur %(site_name)s !" +msgstr "Bienvenue sur %(site_name)s !" #: bookwyrm/templates/get_started/layout.html:16 msgid "These are some first steps to get you started." @@ -1114,7 +1102,7 @@ msgid "%(username)s's %(year)s Books" msgstr "Livres de %(username)s en %(year)s" #: bookwyrm/templates/import.html:5 bookwyrm/templates/import.html:9 -#: bookwyrm/templates/layout.html:97 +#: bookwyrm/templates/user/shelf/shelf.html:40 msgid "Import Books" msgstr "Importer des livres" @@ -1152,65 +1140,70 @@ msgstr "Aucune importation récente" msgid "Import Status" msgstr "Statut de l’importation" -#: bookwyrm/templates/import_status.html:12 +#: bookwyrm/templates/import_status.html:13 msgid "Import started:" -msgstr "Importation en cours :" +msgstr "Début de l’importation :" -#: bookwyrm/templates/import_status.html:16 +#: bookwyrm/templates/import_status.html:18 msgid "Import completed:" -msgstr "Importation terminé :" +msgstr "Fin de l’importation :" -#: bookwyrm/templates/import_status.html:19 +#: bookwyrm/templates/import_status.html:23 msgid "TASK FAILED" msgstr "la tâche a échoué" -#: bookwyrm/templates/import_status.html:25 +#: bookwyrm/templates/import_status.html:30 msgid "Import still in progress." msgstr "L’importation est toujours en cours" -#: bookwyrm/templates/import_status.html:27 +#: bookwyrm/templates/import_status.html:32 msgid "(Hit reload to update!)" -msgstr "(Rechargez la page pour mettre à jour !" +msgstr "(Rechargez la page pour la mettre à jour !)" -#: bookwyrm/templates/import_status.html:34 +#: bookwyrm/templates/import_status.html:39 msgid "Failed to load" -msgstr "Items non importés" +msgstr "Éléments non importés" -#: bookwyrm/templates/import_status.html:43 +#: bookwyrm/templates/import_status.html:48 #, python-format msgid "Jump to the bottom of the list to select the %(failed_count)s items which failed to import." msgstr "Sauter en bas de liste pour sélectionner les %(failed_count)s items n’ayant pu être importés." -#: bookwyrm/templates/import_status.html:78 +#: bookwyrm/templates/import_status.html:60 +#, python-format +msgid "Line %(index)s: %(title)s by %(author)s" +msgstr "Ligne %(index)s : %(title)s par %(author)s" + +#: bookwyrm/templates/import_status.html:80 msgid "Select all" msgstr "Tout sélectionner" -#: bookwyrm/templates/import_status.html:81 +#: bookwyrm/templates/import_status.html:83 msgid "Retry items" -msgstr "Essayer d’importer les items sélectionnés de nouveau" +msgstr "Réessayer l’importation de ces éléments" -#: bookwyrm/templates/import_status.html:107 +#: bookwyrm/templates/import_status.html:109 msgid "Successfully imported" msgstr "Importation réussie" -#: bookwyrm/templates/import_status.html:111 +#: bookwyrm/templates/import_status.html:113 msgid "Book" msgstr "Livre" -#: bookwyrm/templates/import_status.html:114 +#: bookwyrm/templates/import_status.html:116 #: bookwyrm/templates/snippets/create_status_form.html:13 -#: bookwyrm/templates/user/shelf/shelf.html:78 -#: bookwyrm/templates/user/shelf/shelf.html:98 +#: bookwyrm/templates/user/shelf/shelf.html:79 +#: bookwyrm/templates/user/shelf/shelf.html:99 msgid "Title" msgstr "Titre" -#: bookwyrm/templates/import_status.html:117 -#: bookwyrm/templates/user/shelf/shelf.html:79 -#: bookwyrm/templates/user/shelf/shelf.html:101 +#: bookwyrm/templates/import_status.html:119 +#: bookwyrm/templates/user/shelf/shelf.html:80 +#: bookwyrm/templates/user/shelf/shelf.html:102 msgid "Author" -msgstr "Auteur ou autrice" +msgstr "Auteur/autrice" -#: bookwyrm/templates/import_status.html:140 +#: bookwyrm/templates/import_status.html:142 msgid "Imported" msgstr "Importé" @@ -1248,15 +1241,19 @@ msgstr "Chercher un livre ou un compte" msgid "Main navigation menu" msgstr "Menu de navigation principal " -#: bookwyrm/templates/layout.html:61 +#: bookwyrm/templates/layout.html:58 msgid "Feed" msgstr "Fil d’actualité" -#: bookwyrm/templates/layout.html:102 +#: bookwyrm/templates/layout.html:87 +msgid "Your Books" +msgstr "Vos Livres" + +#: bookwyrm/templates/layout.html:97 msgid "Settings" msgstr "Paramètres" -#: bookwyrm/templates/layout.html:111 +#: bookwyrm/templates/layout.html:106 #: bookwyrm/templates/settings/admin_layout.html:31 #: bookwyrm/templates/settings/manage_invite_requests.html:15 #: bookwyrm/templates/settings/manage_invites.html:3 @@ -1264,56 +1261,54 @@ msgstr "Paramètres" msgid "Invites" msgstr "Invitations" -#: bookwyrm/templates/layout.html:118 +#: bookwyrm/templates/layout.html:113 msgid "Admin" msgstr "Admin" -#: bookwyrm/templates/layout.html:125 +#: bookwyrm/templates/layout.html:120 msgid "Log out" msgstr "Se déconnecter" -#: bookwyrm/templates/layout.html:133 bookwyrm/templates/layout.html:134 +#: bookwyrm/templates/layout.html:128 bookwyrm/templates/layout.html:129 #: bookwyrm/templates/notifications.html:6 #: bookwyrm/templates/notifications.html:11 msgid "Notifications" msgstr "Notifications" -#: bookwyrm/templates/layout.html:154 bookwyrm/templates/layout.html:158 +#: bookwyrm/templates/layout.html:151 bookwyrm/templates/layout.html:155 #: bookwyrm/templates/login.html:17 #: bookwyrm/templates/snippets/register_form.html:4 msgid "Username:" msgstr "Nom du compte :" -#: bookwyrm/templates/layout.html:159 +#: bookwyrm/templates/layout.html:156 msgid "password" msgstr "Mot de passe" -#: bookwyrm/templates/layout.html:160 bookwyrm/templates/login.html:36 +#: bookwyrm/templates/layout.html:157 bookwyrm/templates/login.html:36 msgid "Forgot your password?" msgstr "Mot de passe oublié ?" -#: bookwyrm/templates/layout.html:163 bookwyrm/templates/login.html:10 +#: bookwyrm/templates/layout.html:160 bookwyrm/templates/login.html:10 #: bookwyrm/templates/login.html:33 msgid "Log in" msgstr "Se connecter" -#: bookwyrm/templates/layout.html:171 +#: bookwyrm/templates/layout.html:168 msgid "Join" msgstr "Rejoindre" #: bookwyrm/templates/layout.html:206 -msgid "About this server" -msgstr "À propos de ce serveur" +msgid "About this instance" +msgstr "À propos de cette instance" #: bookwyrm/templates/layout.html:210 msgid "Contact site admin" msgstr "Contacter l’administrateur du site" #: bookwyrm/templates/layout.html:214 -#, fuzzy -#| msgid "List curation:" msgid "Documentation" -msgstr "Modération de la liste :" +msgstr "Documentation" #: bookwyrm/templates/layout.html:221 #, python-format @@ -1364,7 +1359,7 @@ msgid "Discard" msgstr "Rejeter" #: bookwyrm/templates/lists/edit_form.html:5 -#: bookwyrm/templates/lists/list_layout.html:17 +#: bookwyrm/templates/lists/list_layout.html:16 msgid "Edit List" msgstr "Modifier la liste" @@ -1378,7 +1373,7 @@ msgstr "Fermée" #: bookwyrm/templates/lists/form.html:22 msgid "Only you can add and remove books to this list" -msgstr "Vous seul(e) pouvez ajouter ou retirer des livres dans cette liste" +msgstr "Vous seulement pouvez ajouter ou retirer des livres dans cette liste" #: bookwyrm/templates/lists/form.html:26 msgid "Curated" @@ -1401,74 +1396,65 @@ msgstr "N’importe qui peut suggérer des livres" #: bookwyrm/templates/lists/list.html:20 msgid "You successfully suggested a book for this list!" -msgstr "" +msgstr "Vous avez suggéré un livre à cette liste !" #: bookwyrm/templates/lists/list.html:22 -#, fuzzy -#| msgid "Anyone can add books to this list" msgid "You successfully added a book to this list!" -msgstr "N’importe qui peut suggérer des livres" +msgstr "Vous avez ajouté un livre à cette liste !" #: bookwyrm/templates/lists/list.html:28 msgid "This list is currently empty" -msgstr "Cette liste est vide actuellement" +msgstr "Cette liste est actuellement vide" -#: bookwyrm/templates/lists/list.html:65 +#: bookwyrm/templates/lists/list.html:66 #, python-format msgid "Added by %(username)s" -msgstr "Ajoutée par %(username)s" +msgstr "Ajouté par %(username)s" -#: bookwyrm/templates/lists/list.html:77 -#, fuzzy -#| msgid "Sent" -msgid "Set" -msgstr "Envoyé(e)s" - -#: bookwyrm/templates/lists/list.html:80 -#, fuzzy -#| msgid "List curation:" +#: bookwyrm/templates/lists/list.html:74 msgid "List position" -msgstr "Modération de la liste :" +msgstr "Position" -#: bookwyrm/templates/lists/list.html:86 +#: bookwyrm/templates/lists/list.html:81 +msgid "Set" +msgstr "Appliquer" + +#: bookwyrm/templates/lists/list.html:89 #: bookwyrm/templates/snippets/shelf_selector.html:26 msgid "Remove" -msgstr "Supprimer" +msgstr "Retirer" -#: bookwyrm/templates/lists/list.html:99 bookwyrm/templates/lists/list.html:111 -#, fuzzy -#| msgid "Your Lists" +#: bookwyrm/templates/lists/list.html:103 +#: bookwyrm/templates/lists/list.html:120 msgid "Sort List" -msgstr "Vos listes" +msgstr "Trier la liste" -#: bookwyrm/templates/lists/list.html:105 -#, fuzzy -#| msgid "Directory" +#: bookwyrm/templates/lists/list.html:113 msgid "Direction" -msgstr "Répertoire" +msgstr "Direction" -#: bookwyrm/templates/lists/list.html:116 +#: bookwyrm/templates/lists/list.html:127 msgid "Add Books" msgstr "Ajouter des livres" -#: bookwyrm/templates/lists/list.html:116 +#: bookwyrm/templates/lists/list.html:129 msgid "Suggest Books" msgstr "Suggérer des livres" -#: bookwyrm/templates/lists/list.html:125 +#: bookwyrm/templates/lists/list.html:140 msgid "search" -msgstr "Chercher" +msgstr "chercher" -#: bookwyrm/templates/lists/list.html:131 +#: bookwyrm/templates/lists/list.html:146 msgid "Clear search" msgstr "Vider la requête" -#: bookwyrm/templates/lists/list.html:136 +#: bookwyrm/templates/lists/list.html:151 #, 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:164 +#: bookwyrm/templates/lists/list.html:179 msgid "Suggest" msgstr "Suggérer" @@ -1523,10 +1509,8 @@ msgid "No statuses reported" msgstr "Aucun statut signalé" #: bookwyrm/templates/moderation/report.html:53 -#, fuzzy -#| msgid "Statuses has been deleted" msgid "Status has been deleted" -msgstr "Les statuts ont été supprimés" +msgstr "Le statut a été supprimé" #: bookwyrm/templates/moderation/report_modal.html:6 #, python-format @@ -1561,8 +1545,8 @@ msgstr "Résoudre" #: bookwyrm/templates/moderation/reports.html:6 #, python-format -msgid "Reports: %(server_name)s" -msgstr "Signalements : %(server_name)s" +msgid "Reports: %(instance_name)s" +msgstr "Signalements : %(instance_name)s" #: bookwyrm/templates/moderation/reports.html:8 #: bookwyrm/templates/moderation/reports.html:17 @@ -1572,8 +1556,8 @@ msgstr "Signalements" #: bookwyrm/templates/moderation/reports.html:14 #, python-format -msgid "Reports: %(server_name)s" -msgstr "Signalements: %(server_name)s" +msgid "Reports: %(instance_name)s" +msgstr "Signalements : %(instance_name)s" #: bookwyrm/templates/moderation/reports.html:28 msgid "Resolved" @@ -1589,13 +1573,11 @@ msgstr "Supprimer les notifications" #: bookwyrm/templates/notifications.html:25 msgid "All" -msgstr "" +msgstr "Toutes" #: bookwyrm/templates/notifications.html:29 -#, fuzzy -#| msgid "More options" msgid "Mentions" -msgstr "Plus d’options" +msgstr "Mentions" #: bookwyrm/templates/notifications.html:70 #, python-format @@ -1659,7 +1641,7 @@ msgstr "a répondu à votre %(book_title)s t msgstr " a suggégré l’ajout de %(book_title)s à votre liste « %(list_name)s »" #: bookwyrm/templates/notifications.html:128 -#, fuzzy, python-format -#| msgid "Your import completed." +#, python-format msgid "Your import completed." -msgstr "Votre importation est terminée." +msgstr "Votre importation est terminée." #: bookwyrm/templates/notifications.html:131 #, python-format @@ -1774,31 +1755,45 @@ msgstr "Profil" msgid "Relationships" msgstr "Relations" +#: bookwyrm/templates/rss/title.html:5 +#: bookwyrm/templates/snippets/status/status_header.html:35 +msgid "rated" +msgstr "a noté" + +#: bookwyrm/templates/rss/title.html:7 +#: bookwyrm/templates/snippets/status/status_header.html:37 +msgid "reviewed" +msgstr "a écrit une critique de" + +#: bookwyrm/templates/rss/title.html:9 +#: bookwyrm/templates/snippets/status/status_header.html:39 +msgid "commented on" +msgstr "a commenté" + +#: bookwyrm/templates/rss/title.html:11 +#: bookwyrm/templates/snippets/status/status_header.html:41 +msgid "quoted" +msgstr "a cité" + #: bookwyrm/templates/search/book.html:64 -#, fuzzy -#| msgid "Show results from other catalogues" msgid "Load results from other catalogues" -msgstr "Montrer les résultats d’autres catalogues" +msgstr "Charger les résultats d’autres catalogues" #: bookwyrm/templates/search/book.html:68 msgid "Manually add book" -msgstr "" +msgstr "Ajouter un livre manuellement" #: bookwyrm/templates/search/book.html:73 msgid "Log in to import or add books." -msgstr "" +msgstr "Authentifiez-vous pour importer ou ajouter des livres." #: bookwyrm/templates/search/layout.html:16 -#, fuzzy -#| msgid "Search for a user" msgid "Search query" -msgstr "Chercher un compte" +msgstr "Requête" #: bookwyrm/templates/search/layout.html:19 -#, fuzzy -#| msgid "Search" msgid "Search type" -msgstr "Chercher" +msgstr "Type de recherche" #: bookwyrm/templates/search/layout.html:21 #: bookwyrm/templates/search/layout.html:42 @@ -1815,10 +1810,9 @@ msgid "Users" msgstr "Comptes" #: bookwyrm/templates/search/layout.html:58 -#, fuzzy, python-format -#| msgid "No lists found for \"%(query)s\"" +#, python-format msgid "No results found for \"%(query)s\"" -msgstr "Aucune liste trouvée pour « %(query)s »" +msgstr "Aucun résultat pour « %(query)s »" #: bookwyrm/templates/settings/admin_layout.html:4 msgid "Administration" @@ -1831,8 +1825,8 @@ msgstr "Gérer les comptes" #: bookwyrm/templates/settings/admin_layout.html:39 #: bookwyrm/templates/settings/federation.html:3 #: bookwyrm/templates/settings/federation.html:5 -msgid "Federated Servers" -msgstr "Serveurs fédérés" +msgid "Federated Instances" +msgstr "Instances fédérées" #: bookwyrm/templates/settings/admin_layout.html:44 msgid "Instance Settings" @@ -1868,27 +1862,22 @@ msgstr "Contenu du pied de page" #: bookwyrm/templates/settings/admin_layout.html:58 #: bookwyrm/templates/settings/site.html:81 msgid "Registration" -msgstr "Enregistrement" +msgstr "Inscription" #: bookwyrm/templates/settings/announcement.html:3 #: bookwyrm/templates/settings/announcement.html:6 -#, fuzzy -#| msgid "Announcements" msgid "Announcement" -msgstr "Annonces" +msgstr "Annonce" #: bookwyrm/templates/settings/announcement.html:7 #: bookwyrm/templates/settings/federated_server.html:13 -#, fuzzy -#| msgid "Back to server list" msgid "Back to list" -msgstr "Retour à la liste des serveurs" +msgstr "Retour à la liste" #: bookwyrm/templates/settings/announcement.html:11 -#, fuzzy -#| msgid "Announcements" +#: bookwyrm/templates/settings/announcement_form.html:6 msgid "Edit Announcement" -msgstr "Annonces" +msgstr "Modifier l’annonce" #: bookwyrm/templates/settings/announcement.html:20 #: bookwyrm/templates/snippets/delete_readthrough_modal.html:15 @@ -1898,64 +1887,48 @@ msgstr "Supprimer" #: bookwyrm/templates/settings/announcement.html:35 msgid "Visible:" -msgstr "" +msgstr "Visible :" #: bookwyrm/templates/settings/announcement.html:38 msgid "True" -msgstr "" +msgstr "Vrai" #: bookwyrm/templates/settings/announcement.html:40 msgid "False" -msgstr "" +msgstr "Faux" #: bookwyrm/templates/settings/announcement.html:47 -#, fuzzy -#| msgid "Birth date:" msgid "Start date:" -msgstr "Date de naissance :" +msgstr "Date de début :" #: bookwyrm/templates/settings/announcement.html:54 -#, fuzzy -#| msgid "Birth date:" msgid "End date:" -msgstr "Date de naissance :" +msgstr "Date de fin :" #: bookwyrm/templates/settings/announcement.html:60 -#, fuzzy -#| msgid "Active" msgid "Active:" -msgstr "Actif" +msgstr "Active :" -#: bookwyrm/templates/settings/announcement_form.html:5 +#: bookwyrm/templates/settings/announcement_form.html:8 #: bookwyrm/templates/settings/announcements.html:8 -#, fuzzy -#| msgid "Announcements" msgid "Create Announcement" -msgstr "Annonces" +msgstr "Ajouter une annonce" #: bookwyrm/templates/settings/announcements.html:22 -#, fuzzy -#| msgid "Date Added" msgid "Date added" msgstr "Date d’ajout" #: bookwyrm/templates/settings/announcements.html:26 -#, fuzzy -#| msgid "reviewed" msgid "Preview" -msgstr "a écrit une critique de" +msgstr "Aperçu" #: bookwyrm/templates/settings/announcements.html:30 -#, fuzzy -#| msgid "Started" msgid "Start date" -msgstr "Commencé" +msgstr "Date de début" #: bookwyrm/templates/settings/announcements.html:34 -#, fuzzy -#| msgid "Edit read dates" msgid "End date" -msgstr "Modifier les date de lecture" +msgstr "Date de fin" #: bookwyrm/templates/settings/announcements.html:38 #: bookwyrm/templates/settings/federation.html:30 @@ -1966,16 +1939,12 @@ msgid "Status" msgstr "Statut" #: bookwyrm/templates/settings/announcements.html:48 -#, fuzzy -#| msgid "Inactive" msgid "active" -msgstr "Inactif" +msgstr "active" #: bookwyrm/templates/settings/announcements.html:48 -#, fuzzy -#| msgid "Inactive" msgid "inactive" -msgstr "Inactif" +msgstr "inactive" #: bookwyrm/templates/settings/edit_server.html:3 #: bookwyrm/templates/settings/edit_server.html:6 @@ -1984,28 +1953,22 @@ msgstr "Inactif" #: bookwyrm/templates/settings/federation.html:10 #: bookwyrm/templates/settings/server_blocklist.html:3 #: bookwyrm/templates/settings/server_blocklist.html:20 -#, fuzzy -#| msgid "Add cover" -msgid "Add server" -msgstr "Ajouter une couverture" +msgid "Add instance" +msgstr "Ajouter une instance" #: bookwyrm/templates/settings/edit_server.html:7 #: bookwyrm/templates/settings/server_blocklist.html:7 -msgid "Back to server list" -msgstr "Retour à la liste des serveurs" +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 -#, fuzzy -#| msgid "Import book" msgid "Import block list" -msgstr "Importer le livre" +msgstr "Importer une liste de blocage" #: bookwyrm/templates/settings/edit_server.html:30 -#, fuzzy -#| msgid "Instance Name:" msgid "Instance:" -msgstr "Nom de l’instance :" +msgstr "Instance :" #: bookwyrm/templates/settings/edit_server.html:37 #: bookwyrm/templates/settings/federated_server.html:31 @@ -2015,10 +1978,8 @@ msgstr "Statut :" #: bookwyrm/templates/settings/edit_server.html:41 #: bookwyrm/templates/settings/federated_server.html:10 -#, fuzzy -#| msgid "Block" msgid "Blocked" -msgstr "Bloquer" +msgstr "Bloqué" #: bookwyrm/templates/settings/edit_server.html:48 #: bookwyrm/templates/settings/federated_server.html:23 @@ -2034,7 +1995,7 @@ msgstr "Description :" #: bookwyrm/templates/settings/edit_server.html:64 msgid "Notes:" -msgstr "" +msgstr "Remarques :" #: bookwyrm/templates/settings/federated_server.html:19 msgid "Details" @@ -2073,13 +2034,11 @@ msgstr "Bloqués par nous :" #: bookwyrm/templates/settings/federated_server.html:82 #: bookwyrm/templates/user_admin/user_info.html:39 msgid "Notes" -msgstr "" +msgstr "Remarques" #: bookwyrm/templates/settings/federated_server.html:85 -#, fuzzy -#| msgid "Edit Book" msgid "Edit" -msgstr "Modifier le livre" +msgstr "Modifier" #: bookwyrm/templates/settings/federated_server.html:105 #: bookwyrm/templates/user_admin/user_moderation_actions.html:3 @@ -2093,7 +2052,7 @@ msgstr "Bloquer" #: bookwyrm/templates/settings/federated_server.html:110 msgid "All users from this instance will be deactivated." -msgstr "" +msgstr "Tous les comptes de cette instance seront désactivés." #: bookwyrm/templates/settings/federated_server.html:115 #: bookwyrm/templates/snippets/block_button.html:10 @@ -2102,12 +2061,12 @@ msgstr "Débloquer" #: bookwyrm/templates/settings/federated_server.html:116 msgid "All users from this instance will be re-activated." -msgstr "" +msgstr "Tous les comptes de cette instance seront réactivés." #: bookwyrm/templates/settings/federation.html:19 #: bookwyrm/templates/user_admin/server_filter.html:5 -msgid "Server name" -msgstr "Nom du serveur" +msgid "Instance name" +msgstr "Nom de l’instance" #: bookwyrm/templates/settings/federation.html:23 msgid "Date federated" @@ -2122,7 +2081,7 @@ msgstr "Logiciel" #: bookwyrm/templates/settings/manage_invite_requests.html:25 #: bookwyrm/templates/settings/manage_invites.html:11 msgid "Invite Requests" -msgstr "Invitations" +msgstr "Demandes d’invitation" #: bookwyrm/templates/settings/manage_invite_requests.html:23 msgid "Ignored Invite Requests" @@ -2224,25 +2183,21 @@ msgid "No active invites" msgstr "Aucune invitation active" #: bookwyrm/templates/settings/server_blocklist.html:6 -#, fuzzy -#| msgid "Import Books" msgid "Import Blocklist" -msgstr "Importer des livres" +msgstr "Importer une liste de blocage" #: bookwyrm/templates/settings/server_blocklist.html:26 -#: bookwyrm/templates/snippets/goal_progress.html:5 +#: bookwyrm/templates/snippets/goal_progress.html:7 msgid "Success!" msgstr "Bravo !" #: bookwyrm/templates/settings/server_blocklist.html:30 -#, fuzzy -#| msgid "Successfully imported" msgid "Successfully blocked:" -msgstr "Importation réussie" +msgstr "Blocage réussi :" #: bookwyrm/templates/settings/server_blocklist.html:32 msgid "Failed:" -msgstr "" +msgstr "Échec :" #: bookwyrm/templates/settings/site.html:15 msgid "Instance Name:" @@ -2290,48 +2245,43 @@ msgstr "Email de l’administrateur :" #: bookwyrm/templates/settings/site.html:73 msgid "Additional info:" -msgstr "" +msgstr "Infos supplémentaires :" -#: bookwyrm/templates/settings/site.html:83 -msgid "Allow registration:" -msgstr "Autoriser l’enregistrement :" - -#: bookwyrm/templates/settings/site.html:87 -msgid "Allow invite requests:" -msgstr "Autoriser les demandes d’invitation :" +#: bookwyrm/templates/settings/site.html:85 +msgid "Allow registration" +msgstr "Autoriser les inscriptions" #: bookwyrm/templates/settings/site.html:91 +msgid "Allow invite requests" +msgstr "Autoriser les demandes d’invitation" + +#: bookwyrm/templates/settings/site.html:95 msgid "Registration closed text:" -msgstr "Texte affiché lorsque les enregistrements sont clos :" +msgstr "Texte affiché lorsque les inscriptions sont closes :" #: bookwyrm/templates/snippets/announcement.html:31 -#, fuzzy, python-format -#| msgid "Added by %(username)s" +#, python-format msgid "Posted by %(username)s" -msgstr "Ajoutée par %(username)s" +msgstr "Publiée par %(username)s" #: bookwyrm/templates/snippets/book_cover.html:31 msgid "No cover" -msgstr "Aucune couverture" +msgstr "Pas de couverture" #: bookwyrm/templates/snippets/book_titleby.html:4 #, python-format msgid "%(title)s by " msgstr "%(title)s par " -#: bookwyrm/templates/snippets/boost_button.html:9 -#: bookwyrm/templates/snippets/boost_button.html:10 -#, fuzzy -#| msgid "boosted" +#: bookwyrm/templates/snippets/boost_button.html:20 +#: bookwyrm/templates/snippets/boost_button.html:21 msgid "Boost" -msgstr "partagé" +msgstr "Partager" -#: bookwyrm/templates/snippets/boost_button.html:16 -#: bookwyrm/templates/snippets/boost_button.html:17 -#, fuzzy -#| msgid "Un-boost status" +#: bookwyrm/templates/snippets/boost_button.html:33 +#: bookwyrm/templates/snippets/boost_button.html:34 msgid "Un-boost" -msgstr "Annuler le partage du statut" +msgstr "Annuler le partage" #: bookwyrm/templates/snippets/content_warning_field.html:3 msgid "Spoiler alert:" @@ -2369,10 +2319,8 @@ msgid "Reply" msgstr "Répondre" #: bookwyrm/templates/snippets/create_status_form.html:56 -#, fuzzy -#| msgid "Footer Content" msgid "Content" -msgstr "Contenu du pied de page" +msgstr "Contenu" #: bookwyrm/templates/snippets/create_status_form.html:80 #: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:16 @@ -2421,17 +2369,15 @@ msgstr "Supprimer ces dates de lecture ?" msgid "You are deleting this readthrough and its %(count)s associated progress updates." msgstr "Vous avez supprimé ce résumé et ses %(count)s progressions associées." -#: bookwyrm/templates/snippets/fav_button.html:9 -#: bookwyrm/templates/snippets/fav_button.html:11 +#: bookwyrm/templates/snippets/fav_button.html:10 +#: bookwyrm/templates/snippets/fav_button.html:12 msgid "Like" -msgstr "" +msgstr "Ajouter aux favoris" -#: bookwyrm/templates/snippets/fav_button.html:17 #: bookwyrm/templates/snippets/fav_button.html:18 -#, fuzzy -#| msgid "Un-like status" +#: bookwyrm/templates/snippets/fav_button.html:19 msgid "Un-like" -msgstr "Retirer le statut des favoris" +msgstr "Retirer des favoris" #: bookwyrm/templates/snippets/filters_panel/filters_panel.html:7 msgid "Show filters" @@ -2470,6 +2416,14 @@ msgstr "Accepter" msgid "No rating" msgstr "Aucune note" +#: bookwyrm/templates/snippets/form_rate_stars.html:44 +#: bookwyrm/templates/snippets/stars.html:7 +#, python-format +msgid "%(rating)s star" +msgid_plural "%(rating)s stars" +msgstr[0] "%(rating)s étoile" +msgstr[1] "%(rating)s étoiles" + #: bookwyrm/templates/snippets/generated_status/goal.html:1 #, python-format msgid "set a goal to read %(counter)s book in %(year)s" @@ -2524,17 +2478,17 @@ msgstr "Publier sur le fil d’actualité" msgid "Set goal" msgstr "Valider ce défi" -#: bookwyrm/templates/snippets/goal_progress.html:7 +#: bookwyrm/templates/snippets/goal_progress.html:9 #, python-format msgid "%(percent)s%% complete!" msgstr "%(percent)s%% terminé !" -#: bookwyrm/templates/snippets/goal_progress.html:10 +#: bookwyrm/templates/snippets/goal_progress.html:12 #, python-format msgid "You've read %(read_count)s of %(goal_count)s books." msgstr "Vous avez lu %(read_count)s sur %(goal_count)s livres." -#: bookwyrm/templates/snippets/goal_progress.html:12 +#: bookwyrm/templates/snippets/goal_progress.html:14 #, python-format msgid "%(username)s has read %(read_count)s of %(goal_count)s books." msgstr "%(username)s a lu %(read_count)s sur %(goal_count)s livres." @@ -2581,7 +2535,7 @@ msgstr "Confidentialité du statut" #: bookwyrm/templates/user/relationships/followers.html:6 #: bookwyrm/templates/user/relationships/layout.html:11 msgid "Followers" -msgstr "Abonnements" +msgstr "Abonné(e)s" #: bookwyrm/templates/snippets/rate_action.html:4 msgid "Leave a rating" @@ -2643,26 +2597,6 @@ msgstr "S’enregistrer" msgid "Report" msgstr "Signaler" -#: bookwyrm/templates/snippets/rss_title.html:5 -#: bookwyrm/templates/snippets/status/status_header.html:35 -msgid "rated" -msgstr "a noté" - -#: bookwyrm/templates/snippets/rss_title.html:7 -#: bookwyrm/templates/snippets/status/status_header.html:37 -msgid "reviewed" -msgstr "a écrit une critique de" - -#: bookwyrm/templates/snippets/rss_title.html:9 -#: bookwyrm/templates/snippets/status/status_header.html:39 -msgid "commented on" -msgstr "a commenté" - -#: bookwyrm/templates/snippets/rss_title.html:11 -#: bookwyrm/templates/snippets/status/status_header.html:41 -msgid "quoted" -msgstr "a cité" - #: bookwyrm/templates/snippets/search_result_text.html:36 msgid "Import book" msgstr "Importer le livre" @@ -2711,7 +2645,7 @@ msgstr "Commencer « %(book_title)s »" #: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:5 #, python-format msgid "Want to Read \"%(book_title)s\"" -msgstr "A envie de lire « %(book_title)s »" +msgstr "Ajouter « %(book_title)s » aux envies de lecture" #: bookwyrm/templates/snippets/status/content_status.html:71 #: bookwyrm/templates/snippets/trimmed_text.html:15 @@ -2744,7 +2678,7 @@ msgstr "Ajouter le statut aux favoris" #: bookwyrm/templates/snippets/status/status.html:10 msgid "boosted" -msgstr "partagé" +msgstr "a partagé" #: bookwyrm/templates/snippets/status/status_header.html:45 #, python-format @@ -2807,12 +2741,12 @@ msgstr "%(username)s n’a pas d’abonné(e)" #: bookwyrm/templates/user/relationships/following.html:6 #: bookwyrm/templates/user/relationships/layout.html:15 msgid "Following" -msgstr "Abonné(e) à" +msgstr "Comptes suivis" #: bookwyrm/templates/user/relationships/following.html:12 #, python-format msgid "%(username)s isn't following any users" -msgstr "%(username)s n’est abonné(e) à personne" +msgstr "%(username)s ne suit personne" #: bookwyrm/templates/user/shelf/books_header.html:5 #, python-format @@ -2822,7 +2756,7 @@ 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 l’étagère" +msgstr "Créer une étagère" #: bookwyrm/templates/user/shelf/edit_shelf_form.html:5 msgid "Edit Shelf" @@ -2832,38 +2766,38 @@ msgstr "Modifier l’étagère" msgid "Update shelf" msgstr "Mettre l’étagère à jour" -#: bookwyrm/templates/user/shelf/shelf.html:25 bookwyrm/views/shelf.py:51 +#: bookwyrm/templates/user/shelf/shelf.html:25 bookwyrm/views/shelf.py:56 msgid "All books" msgstr "Tous les livres" #: bookwyrm/templates/user/shelf/shelf.html:38 msgid "Create shelf" -msgstr "Créer l’étagère" +msgstr "Créer une étagère" -#: bookwyrm/templates/user/shelf/shelf.html:61 +#: bookwyrm/templates/user/shelf/shelf.html:62 msgid "Edit shelf" msgstr "Modifier l’étagère" -#: bookwyrm/templates/user/shelf/shelf.html:80 -#: bookwyrm/templates/user/shelf/shelf.html:104 -msgid "Shelved" -msgstr "Ajouté à une étagère" - #: bookwyrm/templates/user/shelf/shelf.html:81 -#: bookwyrm/templates/user/shelf/shelf.html:108 +#: bookwyrm/templates/user/shelf/shelf.html:105 +msgid "Shelved" +msgstr "Date d’ajout" + +#: bookwyrm/templates/user/shelf/shelf.html:82 +#: bookwyrm/templates/user/shelf/shelf.html:109 msgid "Started" msgstr "Commencé" -#: bookwyrm/templates/user/shelf/shelf.html:82 -#: bookwyrm/templates/user/shelf/shelf.html:111 +#: bookwyrm/templates/user/shelf/shelf.html:83 +#: bookwyrm/templates/user/shelf/shelf.html:112 msgid "Finished" msgstr "Terminé" -#: bookwyrm/templates/user/shelf/shelf.html:137 +#: bookwyrm/templates/user/shelf/shelf.html:138 msgid "This shelf is empty." msgstr "Cette étagère est vide" -#: bookwyrm/templates/user/shelf/shelf.html:143 +#: bookwyrm/templates/user/shelf/shelf.html:144 msgid "Delete shelf" msgstr "Supprimer l’étagère" @@ -2895,14 +2829,14 @@ msgstr "Aucune activité pour l’instant !" #: bookwyrm/templates/user/user_preview.html:15 #, python-format msgid "Joined %(date)s" -msgstr "Enregistré(e) %(date)s" +msgstr "A rejoint ce serveur %(date)s" #: bookwyrm/templates/user/user_preview.html:19 #, python-format msgid "%(counter)s follower" msgid_plural "%(counter)s followers" -msgstr[0] "%(counter)s abonnement" -msgstr[1] "%(counter)s abonnements" +msgstr[0] "%(counter)s abonné(e)" +msgstr[1] "%(counter)s abonné(e)s" #: bookwyrm/templates/user/user_preview.html:20 #, python-format @@ -2910,24 +2844,20 @@ msgid "%(counter)s following" msgstr "%(counter)s abonnements" #: bookwyrm/templates/user/user_preview.html:26 -#, fuzzy, python-format -#| msgid "%(mutuals)s follower you follow" -#| msgid_plural "%(mutuals)s followers you follow" +#, python-format msgid "%(mutuals_display)s follower you follow" msgid_plural "%(mutuals_display)s followers you follow" -msgstr[0] "%(mutuals)s abonnement auxquel vous êtes abonné(e)" -msgstr[1] "%(mutuals)s abonnements auxquels vous êtes abonné(e)" +msgstr[0] "%(mutuals_display)s abonné(e) que vous suivez" +msgstr[1] "%(mutuals_display)s abonné(e)s que vous suivez" #: bookwyrm/templates/user_admin/user.html:9 -#, fuzzy -#| msgid "Back to reports" msgid "Back to users" -msgstr "Retour aux signalements" +msgstr "Retour aux comptes" #: bookwyrm/templates/user_admin/user_admin.html:7 #, python-format -msgid "Users: %(server_name)s" -msgstr "Comptes : %(server_name)s" +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 @@ -2943,8 +2873,8 @@ msgid "Last Active" msgstr "Dernière activité" #: bookwyrm/templates/user_admin/user_admin.html:38 -msgid "Remote server" -msgstr "Serveur distant" +msgid "Remote instance" +msgstr "Instance distante" #: bookwyrm/templates/user_admin/user_admin.html:47 msgid "Active" @@ -2960,42 +2890,45 @@ msgid "Not set" msgstr "Non défini" #: bookwyrm/templates/user_admin/user_info.html:5 -#, fuzzy -#| msgid "Details" msgid "User details" -msgstr "Détails" +msgstr "Détails du compte" #: bookwyrm/templates/user_admin/user_info.html:14 msgid "View user profile" msgstr "Voir le profil" #: bookwyrm/templates/user_admin/user_info.html:20 -#, fuzzy -#| msgid "Instance Settings" msgid "Instance details" -msgstr "Paramètres de l’instance" +msgstr "Détails de l’instance" #: bookwyrm/templates/user_admin/user_info.html:46 msgid "View instance" -msgstr "" +msgstr "Voir l’instance" #: bookwyrm/templates/user_admin/user_moderation_actions.html:11 msgid "Suspend user" -msgstr "" +msgstr "Suspendre le compte" #: bookwyrm/templates/user_admin/user_moderation_actions.html:13 msgid "Un-suspend user" -msgstr "" +msgstr "Rétablir le compte" #: bookwyrm/templates/user_admin/user_moderation_actions.html:21 msgid "Access level:" -msgstr "" +msgstr "Niveau d’accès :" + +#: bookwyrm/templates/widgets/clearable_file_input_with_warning.html:22 +msgid "File exceeds maximum size: 10MB" +msgstr "Ce fichier dépasse la taille limite : 10 Mo" + +#: bookwyrm/templatetags/utilities.py:30 +#, python-format +msgid "%(title)s: %(subtitle)s" +msgstr "%(title)s (%(subtitle)s)" #: bookwyrm/views/import_data.py:67 -#, fuzzy -#| msgid "Email address:" msgid "Not a valid csv file" -msgstr "Adresse email :" +msgstr "Fichier CSV non valide" #: bookwyrm/views/password.py:32 msgid "No user with that email address was found." @@ -3056,12 +2989,12 @@ msgstr "Un lien de réinitialisation a été envoyé à %s." #~ msgid "Enter a number." #~ msgstr "Numéro dans la série :" -#, fuzzy, python-format +#, fuzzy #~| msgid "A user with this email already exists." #~ msgid "%(model_name)s with this %(field_labels)s already exists." #~ msgstr "Cet email est déjà associé à un compte." -#, fuzzy, python-format +#, fuzzy #~| msgid "%(value)s is not a valid remote_id" #~ msgid "Value %(value)r is not a valid choice." #~ msgstr "%(value)s n’est pas une remote_id valide." @@ -3071,7 +3004,7 @@ msgstr "Un lien de réinitialisation a été envoyé à %s." #~ msgid "This field cannot be null." #~ msgstr "Cette étagère est vide" -#, fuzzy, python-format +#, fuzzy #~| msgid "A user with this email already exists." #~ msgid "%(model_name)s with this %(field_label)s already exists." #~ msgstr "Cet email est déjà associé à un compte." @@ -3121,7 +3054,7 @@ msgstr "Un lien de réinitialisation a été envoyé à %s." #~ msgid "Positive small integer" #~ msgstr "Aucune invitation active" -#, fuzzy, python-format +#, fuzzy #~| msgid "%(value)s is not a valid username" #~ msgid "“%(value)s” is not a valid UUID." #~ msgstr "%(value)s n’est pas un nom de compte valide." @@ -3136,12 +3069,12 @@ msgstr "Un lien de réinitialisation a été envoyé à %s." #~ msgid "One-to-one relationship" #~ msgstr "Relations" -#, fuzzy, python-format +#, fuzzy #~| msgid "Relationships" #~ msgid "%(from)s-%(to)s relationship" #~ msgstr "Relations" -#, fuzzy, python-format +#, fuzzy #~| msgid "Relationships" #~ msgid "%(from)s-%(to)s relationships" #~ msgstr "Relations" @@ -3201,7 +3134,7 @@ msgstr "Un lien de réinitialisation a été envoyé à %s." #~ msgid "Order" #~ msgstr "Trier par" -#, fuzzy, python-format +#, fuzzy #~| msgid "%(value)s is not a valid username" #~ msgid "“%(pk)s” is not a valid value." #~ msgstr "%(value)s n’est pas un nom de compte valide." @@ -3265,7 +3198,7 @@ msgstr "Un lien de réinitialisation a été envoyé à %s." #~ msgid "This is not a valid IPv6 address." #~ msgstr "Adresse email :" -#, fuzzy, python-format +#, fuzzy #~| msgid "No books found matching the query \"%(query)s\"" #~ msgid "No %(verbose_name)s found matching the query" #~ msgstr "Aucun livre trouvé pour la requête « %(query)s »" @@ -3284,11 +3217,9 @@ msgstr "Un lien de réinitialisation a été envoyé à %s." #~ msgid "Matching Users" #~ msgstr "Comptes correspondants" -#, python-format #~ msgid "Set a reading goal for %(year)s" #~ msgstr "Définir un défi lecture pour %(year)s" -#, python-format #~ msgid "by %(author)s" #~ msgstr "par %(author)s" @@ -3298,21 +3229,12 @@ msgstr "Un lien de réinitialisation a été envoyé à %s." #~ msgid "Reactivate user" #~ msgstr "Réactiver le compte" -#, python-format -#~ msgid "%(rating)s star" -#~ msgid_plural "%(rating)s stars" -#~ msgstr[0] "%(rating)s étoile" -#~ msgstr[1] "%(rating)s étoiles" - -#, python-format #~ msgid "replied to %(username)s's review" #~ msgstr "a répondu à la critique de %(username)s" -#, python-format #~ msgid "replied to %(username)s's comment" #~ msgstr "a répondu au commentaire de %(username)s" -#, python-format #~ msgid "replied to %(username)s's quote" #~ msgstr "a répondu à la citation de %(username)s" @@ -3322,7 +3244,6 @@ msgstr "Un lien de réinitialisation a été envoyé à %s." #~ msgid "Add tag" #~ msgstr "Ajouter un tag" -#, python-format #~ msgid "Books tagged \"%(tag.name)s\"" #~ msgstr "Livres tagués « %(tag.name)s »" diff --git a/locale/zh_Hans/LC_MESSAGES/django.mo b/locale/zh_Hans/LC_MESSAGES/django.mo index 17b3df695..5e5b36dcb 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 0ec8b1d88..4106db438 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-05-20 14:40-0700\n" +"POT-Creation-Date: 2021-06-06 20:52+0000\n" "PO-Revision-Date: 2021-03-20 00:56+0000\n" "Last-Translator: Kana \n" "Language-Team: Mouse Reeve \n" @@ -58,12 +58,12 @@ msgid "Book Title" msgstr "标题" #: bookwyrm/forms.py:301 bookwyrm/templates/snippets/create_status_form.html:34 -#: bookwyrm/templates/user/shelf/shelf.html:84 -#: bookwyrm/templates/user/shelf/shelf.html:115 +#: bookwyrm/templates/user/shelf/shelf.html:85 +#: bookwyrm/templates/user/shelf/shelf.html:116 msgid "Rating" msgstr "评价" -#: bookwyrm/forms.py:303 bookwyrm/templates/lists/list.html:101 +#: bookwyrm/forms.py:303 bookwyrm/templates/lists/list.html:107 msgid "Sort By" msgstr "" @@ -79,41 +79,41 @@ msgstr "升序排序" msgid "Descending" msgstr "升序排序" -#: bookwyrm/models/fields.py:24 +#: bookwyrm/models/fields.py:25 #, python-format msgid "%(value)s is not a valid remote_id" msgstr "%(value)s 不是有效的 remote_id" -#: bookwyrm/models/fields.py:33 bookwyrm/models/fields.py:42 +#: bookwyrm/models/fields.py:34 bookwyrm/models/fields.py:43 #, python-format msgid "%(value)s is not a valid username" msgstr "%(value)s 不是有效的用户名" -#: bookwyrm/models/fields.py:165 bookwyrm/templates/layout.html:155 +#: bookwyrm/models/fields.py:166 bookwyrm/templates/layout.html:152 msgid "username" msgstr "用户名" -#: bookwyrm/models/fields.py:170 +#: bookwyrm/models/fields.py:171 msgid "A user with that username already exists." msgstr "已经存在使用该用户名的用户。" -#: bookwyrm/settings.py:155 +#: bookwyrm/settings.py:156 msgid "English" msgstr "English(英语)" -#: bookwyrm/settings.py:156 +#: bookwyrm/settings.py:157 msgid "German" msgstr "Deutsch(德语)" -#: bookwyrm/settings.py:157 +#: bookwyrm/settings.py:158 msgid "Spanish" msgstr "Español(西班牙语)" -#: bookwyrm/settings.py:158 +#: bookwyrm/settings.py:159 msgid "French" msgstr "Français(法语)" -#: bookwyrm/settings.py:159 +#: bookwyrm/settings.py:160 msgid "Simplified Chinese" msgstr "简体中文" @@ -260,7 +260,7 @@ msgstr "Goodreads key:" #: bookwyrm/templates/book/edit_book.html:263 #: bookwyrm/templates/lists/form.html:42 #: bookwyrm/templates/preferences/edit_user.html:70 -#: bookwyrm/templates/settings/announcement_form.html:65 +#: bookwyrm/templates/settings/announcement_form.html:69 #: bookwyrm/templates/settings/edit_server.html:68 #: bookwyrm/templates/settings/federated_server.html:98 #: bookwyrm/templates/settings/site.html:97 @@ -386,7 +386,7 @@ msgstr "主题" msgid "Places" msgstr "地点" -#: bookwyrm/templates/book/book.html:276 bookwyrm/templates/layout.html:64 +#: bookwyrm/templates/book/book.html:276 bookwyrm/templates/layout.html:61 #: bookwyrm/templates/lists/lists.html:5 bookwyrm/templates/lists/lists.html:12 #: bookwyrm/templates/search/layout.html:25 #: bookwyrm/templates/search/layout.html:50 @@ -400,7 +400,7 @@ msgstr "添加到列表" #: bookwyrm/templates/book/book.html:297 #: bookwyrm/templates/book/cover_modal.html:31 -#: bookwyrm/templates/lists/list.html:164 +#: bookwyrm/templates/lists/list.html:179 msgid "Add" msgstr "添加" @@ -532,7 +532,7 @@ msgid "John Doe, Jane Smith" msgstr "张三, 李四" #: bookwyrm/templates/book/edit_book.html:183 -#: bookwyrm/templates/user/shelf/shelf.html:77 +#: bookwyrm/templates/user/shelf/shelf.html:78 msgid "Cover" msgstr "封面" @@ -655,7 +655,7 @@ msgstr "跨站社区" #: bookwyrm/templates/directory/directory.html:4 #: bookwyrm/templates/directory/directory.html:9 -#: bookwyrm/templates/layout.html:92 +#: bookwyrm/templates/layout.html:64 msgid "Directory" msgstr "目录" @@ -854,7 +854,7 @@ msgid "Direct Messages with %(username)s" msgstr "与 %(username)s 私信" #: bookwyrm/templates/feed/direct_messages.html:10 -#: bookwyrm/templates/layout.html:87 +#: bookwyrm/templates/layout.html:92 msgid "Direct Messages" msgstr "私信" @@ -910,7 +910,6 @@ msgid "Updates" msgstr "更新" #: bookwyrm/templates/feed/feed_layout.html:10 -#: bookwyrm/templates/layout.html:58 #: bookwyrm/templates/user/shelf/books_header.html:3 msgid "Your books" msgstr "你的书目" @@ -963,7 +962,7 @@ msgid "What are you reading?" msgstr "你在阅读什么?" #: bookwyrm/templates/get_started/books.html:9 -#: bookwyrm/templates/lists/list.html:120 +#: bookwyrm/templates/lists/list.html:135 msgid "Search for a book" msgstr "搜索书目" @@ -983,7 +982,7 @@ msgstr "你可以在开始使用 %(site_name)s 后添加书目。" #: bookwyrm/templates/get_started/users.html:18 #: bookwyrm/templates/get_started/users.html:19 #: bookwyrm/templates/layout.html:37 bookwyrm/templates/layout.html:38 -#: bookwyrm/templates/lists/list.html:124 +#: bookwyrm/templates/lists/list.html:139 #: bookwyrm/templates/search/layout.html:4 #: bookwyrm/templates/search/layout.html:9 msgid "Search" @@ -999,7 +998,7 @@ msgid "Popular on %(site_name)s" msgstr "%(site_name)s 上的热门" #: bookwyrm/templates/get_started/books.html:58 -#: bookwyrm/templates/lists/list.html:137 +#: bookwyrm/templates/lists/list.html:152 msgid "No books found" msgstr "没有找到书目" @@ -1111,7 +1110,7 @@ msgid "%(username)s's %(year)s Books" msgstr "%(username)s 在 %(year)s 的书目" #: bookwyrm/templates/import.html:5 bookwyrm/templates/import.html:9 -#: bookwyrm/templates/layout.html:97 +#: bookwyrm/templates/user/shelf/shelf.html:40 msgid "Import Books" msgstr "导入书目" @@ -1196,14 +1195,14 @@ msgstr "书目" #: bookwyrm/templates/import_status.html:114 #: bookwyrm/templates/snippets/create_status_form.html:13 -#: bookwyrm/templates/user/shelf/shelf.html:78 -#: bookwyrm/templates/user/shelf/shelf.html:98 +#: bookwyrm/templates/user/shelf/shelf.html:79 +#: bookwyrm/templates/user/shelf/shelf.html:99 msgid "Title" msgstr "标题" #: bookwyrm/templates/import_status.html:117 -#: bookwyrm/templates/user/shelf/shelf.html:79 -#: bookwyrm/templates/user/shelf/shelf.html:101 +#: bookwyrm/templates/user/shelf/shelf.html:80 +#: bookwyrm/templates/user/shelf/shelf.html:102 msgid "Author" msgstr "作者" @@ -1245,15 +1244,21 @@ msgstr "搜索书目或用户" msgid "Main navigation menu" msgstr "主导航菜单" -#: bookwyrm/templates/layout.html:61 +#: bookwyrm/templates/layout.html:58 msgid "Feed" msgstr "动态" -#: bookwyrm/templates/layout.html:102 +#: bookwyrm/templates/layout.html:87 +#, fuzzy +#| msgid "Your books" +msgid "Your Books" +msgstr "你的书目" + +#: bookwyrm/templates/layout.html:97 msgid "Settings" msgstr "设置" -#: bookwyrm/templates/layout.html:111 +#: bookwyrm/templates/layout.html:106 #: bookwyrm/templates/settings/admin_layout.html:31 #: bookwyrm/templates/settings/manage_invite_requests.html:15 #: bookwyrm/templates/settings/manage_invites.html:3 @@ -1261,45 +1266,47 @@ msgstr "设置" msgid "Invites" msgstr "邀请" -#: bookwyrm/templates/layout.html:118 +#: bookwyrm/templates/layout.html:113 msgid "Admin" msgstr "管理员" -#: bookwyrm/templates/layout.html:125 +#: bookwyrm/templates/layout.html:120 msgid "Log out" msgstr "登出" -#: bookwyrm/templates/layout.html:133 bookwyrm/templates/layout.html:134 +#: bookwyrm/templates/layout.html:128 bookwyrm/templates/layout.html:129 #: bookwyrm/templates/notifications.html:6 #: bookwyrm/templates/notifications.html:11 msgid "Notifications" msgstr "通知" -#: bookwyrm/templates/layout.html:154 bookwyrm/templates/layout.html:158 +#: bookwyrm/templates/layout.html:151 bookwyrm/templates/layout.html:155 #: bookwyrm/templates/login.html:17 #: bookwyrm/templates/snippets/register_form.html:4 msgid "Username:" msgstr "用户名:" -#: bookwyrm/templates/layout.html:159 +#: bookwyrm/templates/layout.html:156 msgid "password" msgstr "密码" -#: bookwyrm/templates/layout.html:160 bookwyrm/templates/login.html:36 +#: bookwyrm/templates/layout.html:157 bookwyrm/templates/login.html:36 msgid "Forgot your password?" msgstr "忘记了密码?" -#: bookwyrm/templates/layout.html:163 bookwyrm/templates/login.html:10 +#: bookwyrm/templates/layout.html:160 bookwyrm/templates/login.html:10 #: bookwyrm/templates/login.html:33 msgid "Log in" msgstr "登录" -#: bookwyrm/templates/layout.html:171 +#: bookwyrm/templates/layout.html:168 msgid "Join" msgstr "加入" #: bookwyrm/templates/layout.html:206 -msgid "About this server" +#, fuzzy +#| msgid "About this server" +msgid "About this instance" msgstr "关于本服务器" #: bookwyrm/templates/layout.html:210 @@ -1361,7 +1368,7 @@ msgid "Discard" msgstr "削除" #: bookwyrm/templates/lists/edit_form.html:5 -#: bookwyrm/templates/lists/list_layout.html:17 +#: bookwyrm/templates/lists/list_layout.html:16 msgid "Edit List" msgstr "编辑列表" @@ -1410,62 +1417,63 @@ msgstr "任何人都可以向此列表中添加书目" msgid "This list is currently empty" msgstr "此列表当前是空的" -#: bookwyrm/templates/lists/list.html:65 +#: bookwyrm/templates/lists/list.html:66 #, python-format msgid "Added by %(username)s" msgstr "由 %(username)s 添加" -#: bookwyrm/templates/lists/list.html:77 -#, fuzzy -#| msgid "Sent" -msgid "Set" -msgstr "已发送" - -#: bookwyrm/templates/lists/list.html:80 +#: bookwyrm/templates/lists/list.html:74 #, fuzzy #| msgid "List curation:" msgid "List position" msgstr "列表策展:" -#: bookwyrm/templates/lists/list.html:86 +#: bookwyrm/templates/lists/list.html:81 +#, fuzzy +#| msgid "Sent" +msgid "Set" +msgstr "已发送" + +#: bookwyrm/templates/lists/list.html:89 #: bookwyrm/templates/snippets/shelf_selector.html:26 msgid "Remove" msgstr "移除" -#: bookwyrm/templates/lists/list.html:99 bookwyrm/templates/lists/list.html:111 +#: bookwyrm/templates/lists/list.html:103 +#: bookwyrm/templates/lists/list.html:120 #, fuzzy #| msgid "Your Lists" msgid "Sort List" msgstr "你的列表" -#: bookwyrm/templates/lists/list.html:105 +#: bookwyrm/templates/lists/list.html:113 #, fuzzy #| msgid "Directory" msgid "Direction" msgstr "目录" -#: bookwyrm/templates/lists/list.html:116 +#: bookwyrm/templates/lists/list.html:127 msgid "Add Books" msgstr "添加书目" -#: bookwyrm/templates/lists/list.html:116 +#: bookwyrm/templates/lists/list.html:129 msgid "Suggest Books" msgstr "推荐书目" -#: bookwyrm/templates/lists/list.html:125 +#: bookwyrm/templates/lists/list.html:140 msgid "search" msgstr "搜索" -#: bookwyrm/templates/lists/list.html:131 +#: bookwyrm/templates/lists/list.html:146 msgid "Clear search" msgstr "清除搜索" -#: bookwyrm/templates/lists/list.html:136 +#: bookwyrm/templates/lists/list.html:151 #, python-format msgid "No books found matching the query \"%(query)s\"" msgstr "没有符合 \"%(query)s\" 请求的书目" -#: bookwyrm/templates/lists/list.html:164 +#: bookwyrm/templates/lists/list.html:179 msgid "Suggest" msgstr "推荐" @@ -1558,8 +1566,8 @@ msgstr "已解决" #: bookwyrm/templates/moderation/reports.html:6 #, python-format -msgid "Reports: %(server_name)s" -msgstr "报告: %(server_name)s" +msgid "Reports: %(instance_name)s" +msgstr "报告: %(instance_name)s" #: bookwyrm/templates/moderation/reports.html:8 #: bookwyrm/templates/moderation/reports.html:17 @@ -1569,8 +1577,8 @@ msgstr "报告" #: bookwyrm/templates/moderation/reports.html:14 #, python-format -msgid "Reports: %(server_name)s" -msgstr "报告: %(server_name)s" +msgid "Reports: %(instance_name)s" +msgstr "报告: %(instance_name)s" #: bookwyrm/templates/moderation/reports.html:28 msgid "Resolved" @@ -1771,6 +1779,26 @@ msgstr "个人资料" msgid "Relationships" msgstr "关系" +#: bookwyrm/templates/rss/title.html:5 +#: bookwyrm/templates/snippets/status/status_header.html:35 +msgid "rated" +msgstr "评价了" + +#: bookwyrm/templates/rss/title.html:7 +#: bookwyrm/templates/snippets/status/status_header.html:37 +msgid "reviewed" +msgstr "写了书评给" + +#: bookwyrm/templates/rss/title.html:9 +#: bookwyrm/templates/snippets/status/status_header.html:39 +msgid "commented on" +msgstr "评论了" + +#: bookwyrm/templates/rss/title.html:11 +#: bookwyrm/templates/snippets/status/status_header.html:41 +msgid "quoted" +msgstr "引用了" + #: bookwyrm/templates/search/book.html:64 #, fuzzy #| msgid "Show results from other catalogues" @@ -1828,7 +1856,9 @@ msgstr "管理用户" #: bookwyrm/templates/settings/admin_layout.html:39 #: bookwyrm/templates/settings/federation.html:3 #: bookwyrm/templates/settings/federation.html:5 -msgid "Federated Servers" +#, fuzzy +#| msgid "Federated Servers" +msgid "Federated Instances" msgstr "互联的服务器" #: bookwyrm/templates/settings/admin_layout.html:44 @@ -1882,6 +1912,7 @@ msgid "Back to list" msgstr "回到服务器列表" #: bookwyrm/templates/settings/announcement.html:11 +#: bookwyrm/templates/settings/announcement_form.html:6 #, fuzzy #| msgid "Announcements" msgid "Edit Announcement" @@ -1923,7 +1954,7 @@ msgstr "出生日期:" msgid "Active:" msgstr "活跃" -#: bookwyrm/templates/settings/announcement_form.html:5 +#: bookwyrm/templates/settings/announcement_form.html:8 #: bookwyrm/templates/settings/announcements.html:8 #, fuzzy #| msgid "Announcements" @@ -1982,13 +2013,15 @@ msgstr "停用" #: bookwyrm/templates/settings/server_blocklist.html:3 #: bookwyrm/templates/settings/server_blocklist.html:20 #, fuzzy -#| msgid "Add cover" -msgid "Add server" -msgstr "添加封面" +#| msgid "Instance Name:" +msgid "Add instance" +msgstr "实例名称" #: bookwyrm/templates/settings/edit_server.html:7 #: bookwyrm/templates/settings/server_blocklist.html:7 -msgid "Back to server list" +#, fuzzy +#| msgid "Back to server list" +msgid "Back to instance list" msgstr "回到服务器列表" #: bookwyrm/templates/settings/edit_server.html:16 @@ -2103,8 +2136,10 @@ msgstr "" #: bookwyrm/templates/settings/federation.html:19 #: bookwyrm/templates/user_admin/server_filter.html:5 -msgid "Server name" -msgstr "服务器名称" +#, fuzzy +#| msgid "Instance Name:" +msgid "Instance name" +msgstr "实例名称" #: bookwyrm/templates/settings/federation.html:23 msgid "Date federated" @@ -2231,7 +2266,7 @@ msgid "Import Blocklist" msgstr "导入书目" #: bookwyrm/templates/settings/server_blocklist.html:26 -#: bookwyrm/templates/snippets/goal_progress.html:5 +#: bookwyrm/templates/snippets/goal_progress.html:7 msgid "Success!" msgstr "成功!" @@ -2320,15 +2355,15 @@ msgstr "没有封面" msgid "%(title)s by " msgstr "%(title)s 来自" -#: bookwyrm/templates/snippets/boost_button.html:9 -#: bookwyrm/templates/snippets/boost_button.html:10 +#: bookwyrm/templates/snippets/boost_button.html:20 +#: bookwyrm/templates/snippets/boost_button.html:21 #, fuzzy #| msgid "boosted" msgid "Boost" msgstr "转发了" -#: bookwyrm/templates/snippets/boost_button.html:16 -#: bookwyrm/templates/snippets/boost_button.html:17 +#: bookwyrm/templates/snippets/boost_button.html:33 +#: bookwyrm/templates/snippets/boost_button.html:34 #, fuzzy #| msgid "Un-boost status" msgid "Un-boost" @@ -2422,13 +2457,13 @@ msgstr "删除这些阅读日期吗?" msgid "You are deleting this readthrough and its %(count)s associated progress updates." msgstr "你正要删除这篇阅读经过以及与之相关的 %(count)s 次进度更新。" -#: bookwyrm/templates/snippets/fav_button.html:9 -#: bookwyrm/templates/snippets/fav_button.html:11 +#: bookwyrm/templates/snippets/fav_button.html:10 +#: bookwyrm/templates/snippets/fav_button.html:12 msgid "Like" msgstr "" -#: bookwyrm/templates/snippets/fav_button.html:17 #: bookwyrm/templates/snippets/fav_button.html:18 +#: bookwyrm/templates/snippets/fav_button.html:19 #, fuzzy #| msgid "Un-like status" msgid "Un-like" @@ -2471,6 +2506,13 @@ msgstr "接受" msgid "No rating" msgstr "没有评价" +#: bookwyrm/templates/snippets/form_rate_stars.html:44 +#: bookwyrm/templates/snippets/stars.html:7 +#, python-format +msgid "%(rating)s star" +msgid_plural "%(rating)s stars" +msgstr[0] "" + #: bookwyrm/templates/snippets/generated_status/goal.html:1 #, python-format msgid "set a goal to read %(counter)s book in %(year)s" @@ -2522,17 +2564,17 @@ msgstr "发布到消息流中" msgid "Set goal" msgstr "设置目标" -#: bookwyrm/templates/snippets/goal_progress.html:7 +#: bookwyrm/templates/snippets/goal_progress.html:9 #, python-format msgid "%(percent)s%% complete!" msgstr "完成了 %(percent)s%% !" -#: bookwyrm/templates/snippets/goal_progress.html:10 +#: bookwyrm/templates/snippets/goal_progress.html:12 #, python-format msgid "You've read %(read_count)s of %(goal_count)s books." msgstr "你已经阅读了 %(goal_count)s 本书中的 %(read_count)s 本。" -#: bookwyrm/templates/snippets/goal_progress.html:12 +#: bookwyrm/templates/snippets/goal_progress.html:14 #, python-format msgid "%(username)s has read %(read_count)s of %(goal_count)s books." msgstr "%(username)s 已经阅读了 %(goal_count)s 本书中的 %(read_count)s 本。" @@ -2641,26 +2683,6 @@ msgstr "注册" msgid "Report" msgstr "报告" -#: bookwyrm/templates/snippets/rss_title.html:5 -#: bookwyrm/templates/snippets/status/status_header.html:35 -msgid "rated" -msgstr "评价了" - -#: bookwyrm/templates/snippets/rss_title.html:7 -#: bookwyrm/templates/snippets/status/status_header.html:37 -msgid "reviewed" -msgstr "写了书评给" - -#: bookwyrm/templates/snippets/rss_title.html:9 -#: bookwyrm/templates/snippets/status/status_header.html:39 -msgid "commented on" -msgstr "评论了" - -#: bookwyrm/templates/snippets/rss_title.html:11 -#: bookwyrm/templates/snippets/status/status_header.html:41 -msgid "quoted" -msgstr "引用了" - #: bookwyrm/templates/snippets/search_result_text.html:36 msgid "Import book" msgstr "导入书目" @@ -2832,7 +2854,7 @@ msgstr "编辑书架" msgid "Update shelf" msgstr "更新书架" -#: bookwyrm/templates/user/shelf/shelf.html:25 bookwyrm/views/shelf.py:51 +#: bookwyrm/templates/user/shelf/shelf.html:25 bookwyrm/views/shelf.py:56 msgid "All books" msgstr "所有书目" @@ -2840,30 +2862,30 @@ msgstr "所有书目" msgid "Create shelf" msgstr "创建书架" -#: bookwyrm/templates/user/shelf/shelf.html:61 +#: bookwyrm/templates/user/shelf/shelf.html:62 msgid "Edit shelf" msgstr "编辑书架" -#: bookwyrm/templates/user/shelf/shelf.html:80 -#: bookwyrm/templates/user/shelf/shelf.html:104 +#: bookwyrm/templates/user/shelf/shelf.html:81 +#: bookwyrm/templates/user/shelf/shelf.html:105 msgid "Shelved" msgstr "上架时间" -#: bookwyrm/templates/user/shelf/shelf.html:81 -#: bookwyrm/templates/user/shelf/shelf.html:108 +#: bookwyrm/templates/user/shelf/shelf.html:82 +#: bookwyrm/templates/user/shelf/shelf.html:109 msgid "Started" msgstr "开始时间" -#: bookwyrm/templates/user/shelf/shelf.html:82 -#: bookwyrm/templates/user/shelf/shelf.html:111 +#: bookwyrm/templates/user/shelf/shelf.html:83 +#: bookwyrm/templates/user/shelf/shelf.html:112 msgid "Finished" msgstr "完成时间" -#: bookwyrm/templates/user/shelf/shelf.html:137 +#: bookwyrm/templates/user/shelf/shelf.html:138 msgid "This shelf is empty." msgstr "此书架是空的。" -#: bookwyrm/templates/user/shelf/shelf.html:143 +#: bookwyrm/templates/user/shelf/shelf.html:144 msgid "Delete shelf" msgstr "删除书架" @@ -2924,8 +2946,8 @@ msgstr "回到报告" #: bookwyrm/templates/user_admin/user_admin.html:7 #, python-format -msgid "Users: %(server_name)s" -msgstr "用户: %(server_name)s" +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 @@ -2941,7 +2963,7 @@ msgid "Last Active" msgstr "最后或缺" #: bookwyrm/templates/user_admin/user_admin.html:38 -msgid "Remote server" +msgid "Remote instance" msgstr "移除服务器" #: bookwyrm/templates/user_admin/user_admin.html:47 @@ -2989,6 +3011,10 @@ msgstr "" msgid "Access level:" msgstr "" +#: bookwyrm/templates/widgets/clearable_file_input_with_warning.html:3 +msgid "File exceeds maximum size: 10MB" +msgstr "" + #: bookwyrm/views/import_data.py:67 #, fuzzy #| msgid "Email address:" @@ -3004,6 +3030,23 @@ msgstr "没有找到使用该邮箱的用户。" msgid "A password reset link sent to %s" msgstr "密码重置连接已发送给 %s" +#~ msgid "Reports: %(server_name)s" +#~ msgstr "报告: %(server_name)s" + +#~ msgid "Federated Servers" +#~ msgstr "互联的服务器" + +#~ msgid "Server name" +#~ msgstr "服务器名称" + +#, fuzzy +#~| msgid "Add cover" +#~ msgid "Add server" +#~ msgstr "添加封面" + +#~ msgid "Remote server" +#~ msgstr "移除服务器" + #, fuzzy #~| msgid "BookWyrm users" #~ msgid "BookWyrm\\" @@ -3054,12 +3097,12 @@ msgstr "密码重置连接已发送给 %s" #~ msgid "Enter a number." #~ msgstr "系列编号:" -#, fuzzy, python-format +#, fuzzy #~| msgid "A user with this email already exists." #~ msgid "%(model_name)s with this %(field_labels)s already exists." #~ msgstr "已经存在使用该邮箱的用户。" -#, fuzzy, python-format +#, fuzzy #~| msgid "%(value)s is not a valid remote_id" #~ msgid "Value %(value)r is not a valid choice." #~ msgstr "%(value)s 不是有效的 remote_id" @@ -3069,7 +3112,7 @@ msgstr "密码重置连接已发送给 %s" #~ msgid "This field cannot be null." #~ msgstr "此书架是空的。" -#, fuzzy, python-format +#, fuzzy #~| msgid "A user with this email already exists." #~ msgid "%(model_name)s with this %(field_label)s already exists." #~ msgstr "已经存在使用该邮箱的用户。" @@ -3119,7 +3162,7 @@ msgstr "密码重置连接已发送给 %s" #~ msgid "Positive small integer" #~ msgstr "无有效的邀请" -#, fuzzy, python-format +#, fuzzy #~| msgid "%(value)s is not a valid username" #~ msgid "“%(value)s” is not a valid UUID." #~ msgstr "%(value)s 不是有效的用户名" @@ -3134,12 +3177,12 @@ msgstr "密码重置连接已发送给 %s" #~ msgid "One-to-one relationship" #~ msgstr "关系" -#, fuzzy, python-format +#, fuzzy #~| msgid "Relationships" #~ msgid "%(from)s-%(to)s relationship" #~ msgstr "关系" -#, fuzzy, python-format +#, fuzzy #~| msgid "Relationships" #~ msgid "%(from)s-%(to)s relationships" #~ msgstr "关系" @@ -3199,7 +3242,7 @@ msgstr "密码重置连接已发送给 %s" #~ msgid "Order" #~ msgstr "排列顺序" -#, fuzzy, python-format +#, fuzzy #~| msgid "%(value)s is not a valid username" #~ msgid "“%(pk)s” is not a valid value." #~ msgstr "%(value)s 不是有效的用户名" @@ -3263,7 +3306,7 @@ msgstr "密码重置连接已发送给 %s" #~ msgid "This is not a valid IPv6 address." #~ msgstr "邮箱地址:" -#, fuzzy, python-format +#, fuzzy #~| msgid "No books found matching the query \"%(query)s\"" #~ msgid "No %(verbose_name)s found matching the query" #~ msgstr "没有符合 \"%(query)s\" 请求的书目" @@ -3282,11 +3325,9 @@ msgstr "密码重置连接已发送给 %s" #~ msgid "Matching Users" #~ msgstr "匹配的用户" -#, python-format #~ msgid "Set a reading goal for %(year)s" #~ msgstr "设定 %(year)s 的阅读目标" -#, python-format #~ msgid "by %(author)s" #~ msgstr "由 %(author)s 所著" @@ -3299,15 +3340,12 @@ msgstr "密码重置连接已发送给 %s" #~ msgid "Date" #~ msgstr "日期" -#, python-format #~ msgid "replied to %(username)s's review" #~ msgstr "回复了 %(username)s书评" -#, python-format #~ msgid "replied to %(username)s's comment" #~ msgstr "恢复了 %(username)s评论" -#, python-format #~ msgid "replied to %(username)s's quote" #~ msgstr "回复了 %(username)s引用" @@ -3317,7 +3355,6 @@ msgstr "密码重置连接已发送给 %s" #~ msgid "Add tag" #~ msgstr "添加标签" -#, python-format #~ msgid "Books tagged \"%(tag.name)s\"" #~ msgstr "标有 \"%(tag.name)s\" 标签的书" diff --git a/nginx/development b/nginx/development index d38982870..05b27c2b1 100644 --- a/nginx/development +++ b/nginx/development @@ -1,3 +1,5 @@ +include /etc/nginx/conf.d/server_config; + upstream web { server web:8000; } diff --git a/nginx/production b/nginx/production index c5d83cbf6..54c84af45 100644 --- a/nginx/production +++ b/nginx/production @@ -1,3 +1,5 @@ +include /etc/nginx/conf.d/server_config; + upstream web { server web:8000; } diff --git a/nginx/server_config b/nginx/server_config new file mode 100644 index 000000000..c9aad8e4a --- /dev/null +++ b/nginx/server_config @@ -0,0 +1 @@ +client_max_body_size 10m; diff --git a/requirements.txt b/requirements.txt index 5c4c6466e..6d29982e9 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ celery==4.4.2 colorthief==0.2.1 -Django==3.2.0 +Django==3.2.4 django-model-utils==4.0.0 environs==7.2.0 flower==0.9.4 diff --git a/yarn.lock b/yarn.lock index 21730a685..7686fd113 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2042,9 +2042,9 @@ to-regex-range@^5.0.1: is-number "^7.0.0" trim-newlines@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.0.tgz#79726304a6a898aa8373427298d54c2ee8b1cb30" - integrity sha512-C4+gOpvmxaSMKuEf9Qc134F1ZuOHVXKRbtEflf4NTtuuJDEIJ9p5PXsalL8SkeRw+qit1Mo+yuvMPAKwWg/1hA== + version "3.0.1" + resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144" + integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== trough@^1.0.0: version "1.0.5"
diff --git a/bookwyrm/templates/layout.html b/bookwyrm/templates/layout.html index 6e0c42348..03496f523 100644 --- a/bookwyrm/templates/layout.html +++ b/bookwyrm/templates/layout.html @@ -204,7 +204,7 @@

- {% trans "About this server" %} + {% trans "About this instance" %}

{% if site.admin_email %}

diff --git a/bookwyrm/templates/moderation/reports.html b/bookwyrm/templates/moderation/reports.html index f9d9d99b6..95a276af4 100644 --- a/bookwyrm/templates/moderation/reports.html +++ b/bookwyrm/templates/moderation/reports.html @@ -3,7 +3,7 @@ {% block title %} {% if server %} -{% blocktrans with server_name=server.server_name %}Reports: {{ server_name }}{% endblocktrans %} +{% blocktrans with instance_name=server.server_name %}Reports: {{ instance_name }}{% endblocktrans %} {% else %} {% trans "Reports" %} {% endif %} @@ -11,7 +11,7 @@ {% block header %} {% if server %} -{% blocktrans with server_name=server.server_name %}Reports: {{ server_name }}{% endblocktrans %} +{% blocktrans with instance_name=server.server_name %}Reports: {{ instance_name }}{% endblocktrans %} Clear filters {% else %} {% trans "Reports" %} diff --git a/bookwyrm/templates/notifications.html b/bookwyrm/templates/notifications.html index a51b2fdb0..ae5cd67b1 100644 --- a/bookwyrm/templates/notifications.html +++ b/bookwyrm/templates/notifications.html @@ -56,7 +56,7 @@ {% endif %}

-
+

{# DESCRIPTION #} @@ -137,7 +137,7 @@ {# PREVIEW #}

-
+
{% include 'snippets/status_preview.html' with status=related_status %}
diff --git a/bookwyrm/templates/preferences/blocks.html b/bookwyrm/templates/preferences/blocks.html index 24866fa35..699bfb7e1 100644 --- a/bookwyrm/templates/preferences/blocks.html +++ b/bookwyrm/templates/preferences/blocks.html @@ -1,4 +1,4 @@ -{% extends 'preferences/preferences_layout.html' %} +{% extends 'preferences/layout.html' %} {% load i18n %} {% block title %}{% trans "Blocked Users" %}{{ author.name }}{% endblock %} diff --git a/bookwyrm/templates/preferences/change_password.html b/bookwyrm/templates/preferences/change_password.html index 9f5b7e8b9..f6f1be09d 100644 --- a/bookwyrm/templates/preferences/change_password.html +++ b/bookwyrm/templates/preferences/change_password.html @@ -1,4 +1,4 @@ -{% extends 'preferences/preferences_layout.html' %} +{% extends 'preferences/layout.html' %} {% load i18n %} {% block title %}{% trans "Change Password" %}{% endblock %} diff --git a/bookwyrm/templates/preferences/delete_user.html b/bookwyrm/templates/preferences/delete_user.html new file mode 100644 index 000000000..63bd2f860 --- /dev/null +++ b/bookwyrm/templates/preferences/delete_user.html @@ -0,0 +1,30 @@ +{% extends 'preferences/layout.html' %} +{% load i18n %} + +{% block title %}{% trans "Delete Account" %}{% endblock %} + +{% block header %} +{% trans "Delete Account" %} +{% endblock %} + +{% block panel %} +
+

{% trans "Permanently delete account" %}

+

+ {% trans "Deleting your account cannot be undone. The username will not be available to register in the future." %} +

+ +
+ {% csrf_token %} +
+ + + {% for error in form.password.errors %} +

{{ error | escape }}

+ {% endfor %} +
+ +
+
+{% endblock %} + diff --git a/bookwyrm/templates/preferences/edit_user.html b/bookwyrm/templates/preferences/edit_user.html index 597a8ef0d..9e2af7bee 100644 --- a/bookwyrm/templates/preferences/edit_user.html +++ b/bookwyrm/templates/preferences/edit_user.html @@ -1,4 +1,4 @@ -{% extends 'preferences/preferences_layout.html' %} +{% extends 'preferences/layout.html' %} {% load i18n %} {% block title %}{% trans "Edit Profile" %}{% endblock %} diff --git a/bookwyrm/templates/preferences/preferences_layout.html b/bookwyrm/templates/preferences/layout.html similarity index 84% rename from bookwyrm/templates/preferences/preferences_layout.html rename to bookwyrm/templates/preferences/layout.html index baf87e478..758be9e55 100644 --- a/bookwyrm/templates/preferences/preferences_layout.html +++ b/bookwyrm/templates/preferences/layout.html @@ -18,6 +18,10 @@ {% url 'prefs-password' as url %} {% trans "Change Password" %} +
  • + {% url 'prefs-delete' as url %} + {% trans "Delete Account" %} +
  • {% endif %} diff --git a/bookwyrm/templates/settings/edit_server.html b/bookwyrm/templates/settings/edit_server.html index c5702c848..55346a526 100644 --- a/bookwyrm/templates/settings/edit_server.html +++ b/bookwyrm/templates/settings/edit_server.html @@ -1,10 +1,10 @@ {% extends 'settings/admin_layout.html' %} {% load i18n %} -{% block title %}{% trans "Add server" %}{% endblock %} +{% block title %}{% trans "Add instance" %}{% endblock %} {% block header %} -{% trans "Add server" %} -{% trans "Back to server list" %} +{% trans "Add instance" %} +{% trans "Back to instance list" %} {% endblock %} {% block panel %} @@ -17,7 +17,7 @@ {% url 'settings-add-federated-server' as url %}
  • - {% trans "Add server" %} + {% trans "Add instance" %}
  • @@ -26,14 +26,14 @@ {% csrf_token %}
    -
    +
    {% for error in form.server_name.errors %}

    {{ error | escape }}

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

    {{ error | escape }}

    {% endfor %}
    -
    +
    {% for error in form.application_version.errors %} @@ -60,10 +60,10 @@
    -

    +

    -

    +
    diff --git a/bookwyrm/templates/settings/federation.html b/bookwyrm/templates/settings/federation.html index bf1986725..e0a9ba73a 100644 --- a/bookwyrm/templates/settings/federation.html +++ b/bookwyrm/templates/settings/federation.html @@ -1,13 +1,13 @@ {% extends 'settings/admin_layout.html' %} {% load i18n %} -{% block title %}{% trans "Federated Servers" %}{% endblock %} +{% block title %}{% trans "Federated Instances" %}{% endblock %} -{% block header %}{% trans "Federated Servers" %}{% endblock %} +{% block header %}{% trans "Federated Instances" %}{% endblock %} {% block edit-button %} - - {% trans "Add server" %} + + {% trans "Add instance" %} {% endblock %} @@ -16,7 +16,7 @@
    - {% trans "Server name" as text %} + {% trans "Instance name" as text %} {% include 'snippets/table-sort-header.html' with field="server_name" sort=sort text=text %} diff --git a/bookwyrm/templates/settings/server_blocklist.html b/bookwyrm/templates/settings/server_blocklist.html index 0de49acd7..171cf1339 100644 --- a/bookwyrm/templates/settings/server_blocklist.html +++ b/bookwyrm/templates/settings/server_blocklist.html @@ -1,10 +1,10 @@ {% extends 'settings/admin_layout.html' %} {% load i18n %} -{% block title %}{% trans "Add server" %}{% endblock %} +{% block title %}{% trans "Add instance" %}{% endblock %} {% block header %} {% trans "Import Blocklist" %} -{% trans "Back to server list" %} +{% trans "Back to instance list" %} {% endblock %} {% block panel %} @@ -17,7 +17,7 @@ {% url 'settings-add-federated-server' as url %}
  • - {% trans "Add server" %} + {% trans "Add instance" %}
  • @@ -51,7 +51,7 @@
     [
         {
    -        "instance": "example.server.com",
    +        "instance": "example.instance.com",
             "url": "https://link.to.more/info"
         },
         ...
    diff --git a/bookwyrm/templates/settings/site.html b/bookwyrm/templates/settings/site.html
    index 1b9424527..d36371a41 100644
    --- a/bookwyrm/templates/settings/site.html
    +++ b/bookwyrm/templates/settings/site.html
    @@ -11,23 +11,23 @@
         {% csrf_token %}
         

    {% trans "Instance Info" %}

    -
    +
    {{ site_form.name }}
    -
    +
    {{ site_form.instance_tagline }}
    -
    +
    {{ site_form.instance_description }}
    -
    +
    {{ site_form.code_of_conduct }}
    -
    +
    {{ site_form.privacy_policy }}
    @@ -57,19 +57,19 @@
    - {% trans "Remote server" as text %} + {% trans "Remote instance" as text %} {% include 'snippets/table-sort-header.html' with field="federated_server__server_name" sort=sort text=text %}