Merge branch 'main' into production

This commit is contained in:
Mouse Reeve 2021-08-17 15:09:38 -07:00
commit 376adc0a9a
51 changed files with 1001 additions and 644 deletions

View file

@ -106,8 +106,10 @@ class ActivityObject:
value = field.default
setattr(self, field.name, value)
# pylint: disable=too-many-locals,too-many-branches
def to_model(self, model=None, instance=None, allow_create=True, save=True):
# pylint: disable=too-many-locals,too-many-branches,too-many-arguments
def to_model(
self, model=None, instance=None, allow_create=True, save=True, overwrite=True
):
"""convert from an activity to a model instance"""
model = model or get_model_from_type(self.type)
@ -129,9 +131,12 @@ class ActivityObject:
# keep track of what we've changed
update_fields = []
# sets field on the model using the activity value
for field in instance.simple_fields:
try:
changed = field.set_field_from_activity(instance, self)
changed = field.set_field_from_activity(
instance, self, overwrite=overwrite
)
if changed:
update_fields.append(field.name)
except AttributeError as e:
@ -140,7 +145,9 @@ class ActivityObject:
# image fields have to be set after other fields because they can save
# too early and jank up users
for field in instance.image_fields:
changed = field.set_field_from_activity(instance, self, save=save)
changed = field.set_field_from_activity(
instance, self, save=save, overwrite=overwrite
)
if changed:
update_fields.append(field.name)

View file

@ -59,6 +59,9 @@ class Comment(Note):
"""like a note but with a book"""
inReplyToBook: str
readingStatus: str = None
progress: int = None
progressMode: str = None
type: str = "Comment"

View file

@ -139,7 +139,7 @@ class AbstractConnector(AbstractMinimalConnector):
**dict_from_mappings(work_data, self.book_mappings)
)
# this will dedupe automatically
work = work_activity.to_model(model=models.Work)
work = work_activity.to_model(model=models.Work, overwrite=False)
for author in self.get_authors_from_data(work_data):
work.authors.add(author)
@ -156,7 +156,7 @@ class AbstractConnector(AbstractMinimalConnector):
mapped_data = dict_from_mappings(edition_data, self.book_mappings)
mapped_data["work"] = work.remote_id
edition_activity = activitypub.Edition(**mapped_data)
edition = edition_activity.to_model(model=models.Edition)
edition = edition_activity.to_model(model=models.Edition, overwrite=False)
edition.connector = self.connector
edition.save()
@ -182,7 +182,7 @@ class AbstractConnector(AbstractMinimalConnector):
return None
# this will dedupe
return activity.to_model(model=models.Author)
return activity.to_model(model=models.Author, overwrite=False)
@abstractmethod
def is_work_data(self, data):

View file

@ -86,6 +86,7 @@ class CommentForm(CustomForm):
"privacy",
"progress",
"progress_mode",
"reading_status",
]

View file

@ -0,0 +1,56 @@
# Generated by Django 3.2.4 on 2021-08-16 20:22
import bookwyrm.models.fields
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("bookwyrm", "0082_auto_20210806_2324"),
]
operations = [
migrations.AddField(
model_name="comment",
name="reading_status",
field=bookwyrm.models.fields.CharField(
blank=True,
choices=[
("to-read", "Toread"),
("reading", "Reading"),
("read", "Read"),
],
max_length=255,
null=True,
),
),
migrations.AddField(
model_name="quotation",
name="reading_status",
field=bookwyrm.models.fields.CharField(
blank=True,
choices=[
("to-read", "Toread"),
("reading", "Reading"),
("read", "Read"),
],
max_length=255,
null=True,
),
),
migrations.AddField(
model_name="review",
name="reading_status",
field=bookwyrm.models.fields.CharField(
blank=True,
choices=[
("to-read", "Toread"),
("reading", "Reading"),
("read", "Read"),
],
max_length=255,
null=True,
),
),
]

View file

@ -0,0 +1,56 @@
# Generated by Django 3.2.4 on 2021-08-17 19:16
import bookwyrm.models.fields
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("bookwyrm", "0083_auto_20210816_2022"),
]
operations = [
migrations.AlterField(
model_name="comment",
name="reading_status",
field=bookwyrm.models.fields.CharField(
blank=True,
choices=[
("to-read", "To-Read"),
("reading", "Reading"),
("read", "Read"),
],
max_length=255,
null=True,
),
),
migrations.AlterField(
model_name="quotation",
name="reading_status",
field=bookwyrm.models.fields.CharField(
blank=True,
choices=[
("to-read", "To-Read"),
("reading", "Reading"),
("read", "Read"),
],
max_length=255,
null=True,
),
),
migrations.AlterField(
model_name="review",
name="reading_status",
field=bookwyrm.models.fields.CharField(
blank=True,
choices=[
("to-read", "To-Read"),
("reading", "Reading"),
("read", "Read"),
],
max_length=255,
null=True,
),
),
]

View file

@ -66,7 +66,7 @@ class ActivitypubFieldMixin:
self.activitypub_field = activitypub_field
super().__init__(*args, **kwargs)
def set_field_from_activity(self, instance, data):
def set_field_from_activity(self, instance, data, overwrite=True):
"""helper function for assinging a value to the field. Returns if changed"""
try:
value = getattr(data, self.get_activitypub_field())
@ -79,8 +79,15 @@ class ActivitypubFieldMixin:
if formatted is None or formatted is MISSING or formatted == {}:
return False
current_value = (
getattr(instance, self.name) if hasattr(instance, self.name) else None
)
# if we're not in overwrite mode, only continue updating the field if its unset
if current_value and not overwrite:
return False
# the field is unchanged
if hasattr(instance, self.name) and getattr(instance, self.name) == formatted:
if current_value == formatted:
return False
setattr(instance, self.name, formatted)
@ -210,7 +217,10 @@ class PrivacyField(ActivitypubFieldMixin, models.CharField):
)
# pylint: disable=invalid-name
def set_field_from_activity(self, instance, data):
def set_field_from_activity(self, instance, data, overwrite=True):
if not overwrite:
return False
original = getattr(instance, self.name)
to = data.to
cc = data.cc
@ -273,8 +283,11 @@ class ManyToManyField(ActivitypubFieldMixin, models.ManyToManyField):
self.link_only = link_only
super().__init__(*args, **kwargs)
def set_field_from_activity(self, instance, data):
def set_field_from_activity(self, instance, data, overwrite=True):
"""helper function for assinging a value to the field"""
if not overwrite and getattr(instance, self.name).exists():
return False
value = getattr(data, self.get_activitypub_field())
formatted = self.field_from_activity(value)
if formatted is None or formatted is MISSING:
@ -377,13 +390,16 @@ class ImageField(ActivitypubFieldMixin, models.ImageField):
super().__init__(*args, **kwargs)
# pylint: disable=arguments-differ
def set_field_from_activity(self, instance, data, save=True):
def set_field_from_activity(self, instance, data, save=True, overwrite=True):
"""helper function for assinging a value to the field"""
value = getattr(data, self.get_activitypub_field())
formatted = self.field_from_activity(value)
if formatted is None or formatted is MISSING:
return False
if not overwrite and hasattr(instance, self.name):
return False
getattr(instance, self.name).save(*formatted, save=save)
return True

View file

@ -235,12 +235,31 @@ class GeneratedNote(Status):
pure_type = "Note"
class Comment(Status):
"""like a review but without a rating and transient"""
ReadingStatusChoices = models.TextChoices(
"ReadingStatusChoices", ["to-read", "reading", "read"]
)
class BookStatus(Status):
"""Shared fields for comments, quotes, reviews"""
book = fields.ForeignKey(
"Edition", on_delete=models.PROTECT, activitypub_field="inReplyToBook"
)
pure_type = "Note"
reading_status = fields.CharField(
max_length=255, choices=ReadingStatusChoices.choices, null=True, blank=True
)
class Meta:
"""not a real model, sorry"""
abstract = True
class Comment(BookStatus):
"""like a review but without a rating and transient"""
# this is it's own field instead of a foreign key to the progress update
# so that the update can be deleted without impacting the status
@ -265,16 +284,12 @@ class Comment(Status):
)
activity_serializer = activitypub.Comment
pure_type = "Note"
class Quotation(Status):
class Quotation(BookStatus):
"""like a review but without a rating and transient"""
quote = fields.HtmlField()
book = fields.ForeignKey(
"Edition", on_delete=models.PROTECT, activitypub_field="inReplyToBook"
)
@property
def pure_content(self):
@ -289,16 +304,12 @@ class Quotation(Status):
)
activity_serializer = activitypub.Quotation
pure_type = "Note"
class Review(Status):
class Review(BookStatus):
"""a book review"""
name = fields.CharField(max_length=255, null=True)
book = fields.ForeignKey(
"Edition", on_delete=models.PROTECT, activitypub_field="inReplyToBook"
)
rating = fields.DecimalField(
default=None,
null=True,

View file

@ -138,8 +138,11 @@ let BookWyrm = new class {
* @return {undefined}
*/
toggleAction(event) {
event.preventDefault();
let trigger = event.currentTarget;
if (!trigger.dataset.allowDefault || event.currentTarget == event.target) {
event.preventDefault();
}
let pressed = trigger.getAttribute('aria-pressed') === 'false';
let targetId = trigger.dataset.controls;
@ -177,6 +180,13 @@ let BookWyrm = new class {
this.toggleCheckbox(checkbox, pressed);
}
// Toggle form disabled, if appropriate
let disable = trigger.dataset.disables;
if (disable) {
this.toggleDisabled(disable, !pressed);
}
// Set focus, if appropriate.
let focus = trigger.dataset.focusTarget;
@ -227,6 +237,17 @@ let BookWyrm = new class {
document.getElementById(checkbox).checked = !!pressed;
}
/**
* Enable or disable a form element or fieldset
*
* @param {string} form_element - id of the element
* @param {boolean} pressed - Is the trigger pressed?
* @return {undefined}
*/
toggleDisabled(form_element, pressed) {
document.getElementById(form_element).disabled = !!pressed;
}
/**
* Give the focus to an element.
* Only move the focus based on user interactions.

View file

@ -1,6 +1,7 @@
{% extends 'snippets/filters_panel/filters_panel.html' %}
{% block filter_fields %}
{% include 'book/search_filter.html' %}
{% include 'book/language_filter.html' %}
{% include 'book/format_filter.html' %}
{% endblock %}

View file

@ -0,0 +1,8 @@
{% extends 'snippets/filters_panel/filter_field.html' %}
{% load i18n %}
{% block filter %}
<label class="label" for="id_search">{% trans "Search editions" %}</label>
<input type="text" class="input" name="q" value="{{ request.GET.q|default:'' }}" id="id_search">
{% endblock %}

View file

@ -9,6 +9,6 @@ Finish "{{ book_title }}"
{% block content %}
{% include "snippets/shelve_button/finish_reading_modal.html" with book=book active=True %}
{% include "snippets/reading_modals/finish_reading_modal.html" with book=book active=True %}
{% endblock %}

View file

@ -9,6 +9,6 @@ Start "{{ book_title }}"
{% block content %}
{% include "snippets/shelve_button/start_reading_modal.html" with book=book active=True %}
{% include "snippets/reading_modals/start_reading_modal.html" with book=book active=True %}
{% endblock %}

View file

@ -9,6 +9,6 @@ Want to Read "{{ book_title }}"
{% block content %}
{% include "snippets/shelve_button/want_to_read_modal.html" with book=book active=True %}
{% include "snippets/reading_modals/want_to_read_modal.html" with book=book active=True %}
{% endblock %}

View file

@ -14,6 +14,6 @@ draft: an existing Status object that is providing default values for input fiel
id="id_content_{{ type }}_{{ book.id }}{{ reply_parent.id }}"
placeholder="{{ placeholder }}"
aria-label="{% if reply_parent %}{% trans 'Reply' %}{% else %}{% trans 'Content' %}{% endif %}"
{% if type != "quotation" %}required{% endif %}
{% if not optional and type != "quotation" %}required{% endif %}
>{% if reply_parent %}{{ reply_parent|mentions:request.user }}{% endif %}{% if mention %}@{{ mention|username }} {% endif %}{{ draft.content|default:'' }}</textarea>

View file

@ -0,0 +1,36 @@
{% extends 'snippets/reading_modals/layout.html' %}
{% load i18n %}
{% load utilities %}
{% block modal-title %}
{% blocktrans trimmed with book_title=book|book_title %}
Finish "<em>{{ book_title }}</em>"
{% endblocktrans %}
{% endblock %}
{% block modal-form-open %}
<form name="finish-reading" action="{% url 'reading-status' 'finish' book.id %}" method="post">
{% csrf_token %}
<input type="hidden" name="reading_status" value="read">
{% endblock %}
{% block reading-dates %}
<div class="columns">
<div class="column is-half">
<div class="field">
<label class="label" for="finish_id_start_date_{{ uuid }}">
{% trans "Started reading" %}
</label>
<input type="date" name="start_date" class="input" id="finish_id_start_date_{{ uuid }}" value="{{ readthrough.start_date | date:"Y-m-d" }}">
</div>
</div>
<div class="column is-half">
<div class="field">
<label class="label" for="id_finish_date_{{ uuid }}">
{% trans "Finished reading" %}
</label>
<input type="date" name="finish_date" class="input" id="id_finish_date_{{ uuid }}" value="{% now "Y-m-d" %}">
</div>
</div>
</div>
{% endblock %}

View file

@ -0,0 +1,15 @@
{% extends "snippets/create_status/layout.html" %}
{% load i18n %}
{% block form_open %}{% endblock %}
{% block content_label %}
{% trans "Comment:" %}
<span class="help mt-0 has-text-weight-normal">{% trans "(Optional)" %}</span>
{% endblock %}
{% block initial_fields %}
<input type="hidden" name="user" value="{{ request.user.id }}">
<input type="hidden" name="mention_books" value="{{ book.id }}">
<input type="hidden" name="book" value="{{ book.id }}">
{% endblock %}

View file

@ -0,0 +1,28 @@
{% extends 'components/modal.html' %}
{% load i18n %}
{% load utilities %}
{% block modal-body %}
{% block reading-dates %}{% endblock %}
{% with 0|uuid as local_uuid %}
<div class="is-flex is-justify-content-space-between">
<label for="post_status_{{ local_uuid }}_{{ uuid }}" data-controls="reading_content_{{ local_uuid }}_{{ uuid }}" data-controls-checkbox="post_status_{{ local_uuid }}_{{ uuid }}" data-disables="reading_content_fieldset_{{ local_uuid }}_{{ uuid }}" aria-pressed="true" data-allow-default="true">
<input type="checkbox" name="post-status" class="checkbox" id="post_status_{{ local_uuid }}_{{ uuid }}" checked>
{% trans "Post to feed" %}
</label>
<div class="is-hidden" id="hide_reading_content_{{ local_uuid }}_{{ uuid }}">
<button class="button is-link" type="submit">{% trans "Save" %}</button>
</div>
</div>
<div id="reading_content_{{ local_uuid }}_{{ uuid }}">
<hr aria-hidden="true">
<fieldset id="reading_content_fieldset_{{ local_uuid }}_{{ uuid }}">
{% include "snippets/reading_modals/form.html" with optional=True %}
</fieldset>
</div>
{% endwith %}
{% endblock %}

View file

@ -0,0 +1,24 @@
{% extends 'snippets/reading_modals/layout.html' %}
{% load i18n %}
{% load utilities %}
{% block modal-title %}
{% blocktrans trimmed with book_title=book|book_title %}
Start "<em>{{ book_title }}</em>"
{% endblocktrans %}
{% endblock %}
{% block modal-form-open %}
<form name="start-reading" action="{% url 'reading-status' 'start' book.id %}" method="post">
<input type="hidden" name="reading_status" value="reading">
{% csrf_token %}
{% endblock %}
{% block reading-dates %}
<div class="field">
<label class="label" for="start_id_start_date_{{ uuid }}">
{% trans "Started reading" %}
</label>
<input type="date" name="start_date" class="input" id="start_id_start_date_{{ uuid }}" value="{% now "Y-m-d" %}">
</div>
{% endblock %}

View file

@ -0,0 +1,15 @@
{% extends 'snippets/reading_modals/layout.html' %}
{% load i18n %}
{% load utilities %}
{% block modal-title %}
{% blocktrans trimmed with book_title=book|book_title %}
Want to Read "<em>{{ book_title }}</em>"
{% endblocktrans %}
{% endblock %}
{% block modal-form-open %}
<form name="shelve" action="{% url 'reading-status' 'want' book.id %}" method="post">
<input type="hidden" name="reading_status" value="to-read">
{% csrf_token %}
{% endblock %}

View file

@ -1,48 +0,0 @@
{% extends 'components/modal.html' %}
{% load i18n %}
{% block modal-title %}
{% blocktrans with book_title=book.title %}Finish "<em>{{ book_title }}</em>"{% endblocktrans %}
{% endblock %}
{% block modal-form-open %}
<form name="finish-reading" action="{% url 'reading-status' 'finish' book.id %}" method="post">
{% endblock %}
{% block modal-body %}
<section class="modal-card-body">
{% csrf_token %}
<input type="hidden" name="id" value="{{ readthrough.id }}">
<div class="field">
<label class="label" for="finish_id_start_date-{{ uuid }}">
{% trans "Started reading" %}
</label>
<input type="date" name="start_date" class="input" id="finish_id_start_date-{{ uuid }}" value="{{ readthrough.start_date | date:"Y-m-d" }}">
</div>
<div class="field">
<label class="label" for="id_finish_date-{{ uuid }}">
{% trans "Finished reading" %}
</label>
<input type="date" name="finish_date" class="input" id="id_finish_date-{{ uuid }}" value="{% now "Y-m-d" %}">
</div>
</section>
{% endblock %}
{% block modal-footer %}
<div class="columns">
<div class="column field">
<label for="post_status-{{ uuid }}">
<input type="checkbox" name="post-status" class="checkbox" id="post_status-{{ uuid }}" checked>
{% trans "Post to feed" %}
</label>
{% include 'snippets/privacy_select.html' %}
</div>
<div class="column has-text-right">
<button type="submit" class="button is-success">{% trans "Save" %}</button>
{% trans "Cancel" as button_text %}
{% include 'snippets/toggle/close_button.html' with text=button_text controls_text="finish-reading" controls_uid=uuid %}
</div>
</div>
{% endblock %}
{% block modal-form-close %}</form>{% endblock %}

View file

@ -19,13 +19,13 @@
{% endif %}
</div>
{% include 'snippets/shelve_button/want_to_read_modal.html' with book=active_shelf.book controls_text="want_to_read" controls_uid=uuid %}
{% include 'snippets/reading_modals/want_to_read_modal.html' with book=active_shelf.book controls_text="want_to_read" controls_uid=uuid %}
{% include 'snippets/shelve_button/start_reading_modal.html' with book=active_shelf.book controls_text="start_reading" controls_uid=uuid %}
{% include 'snippets/reading_modals/start_reading_modal.html' with book=active_shelf.book controls_text="start_reading" controls_uid=uuid %}
{% include 'snippets/shelve_button/finish_reading_modal.html' with book=active_shelf.book controls_text="finish_reading" controls_uid=uuid readthrough=readthrough %}
{% include 'snippets/reading_modals/finish_reading_modal.html' with book=active_shelf.book controls_text="finish_reading" controls_uid=uuid readthrough=readthrough %}
{% include 'snippets/shelve_button/progress_update_modal.html' with book=active_shelf_book.book controls_text="progress_update" controls_uid=uuid readthrough=readthrough %}
{% include 'snippets/reading_modals/progress_update_modal.html' with book=active_shelf_book.book controls_text="progress_update" controls_uid=uuid readthrough=readthrough %}
{% endwith %}
{% endif %}

View file

@ -1,42 +0,0 @@
{% extends 'components/modal.html' %}
{% load i18n %}
{% block modal-title %}
{% blocktrans trimmed with book_title=book.title %}
Start "<em>{{ book_title }}</em>"
{% endblocktrans %}
{% endblock %}
{% block modal-form-open %}
<form name="start-reading" action="{% url 'reading-status' 'start' book.id %}" method="post">
{% endblock %}
{% block modal-body %}
<section class="modal-card-body">
{% csrf_token %}
<div class="field">
<label class="label" for="start_id_start_date-{{ uuid }}">
{% trans "Started reading" %}
</label>
<input type="date" name="start_date" class="input" id="start_id_start_date-{{ uuid }}" value="{% now "Y-m-d" %}">
</div>
</section>
{% endblock %}
{% block modal-footer %}
<div class="columns">
<div class="column field">
<label for="post_status_start-{{ uuid }}">
<input type="checkbox" name="post-status" class="checkbox" id="post_status_start-{{ uuid }}" checked>
{% trans "Post to feed" %}
</label>
{% include 'snippets/privacy_select.html' %}
</div>
<div class="column has-text-right">
<button class="button is-success" type="submit">{% trans "Save" %}</button>
{% trans "Cancel" as button_text %}
{% include 'snippets/toggle/toggle_button.html' with text=button_text controls_text="start-reading" controls_uid=uuid %}
</div>
</div>
{% endblock %}
{% block modal-form-close %}</form>{% endblock %}

View file

@ -1,33 +0,0 @@
{% extends 'components/modal.html' %}
{% load i18n %}
{% block modal-title %}
{% blocktrans with book_title=book.title %}Want to Read "<em>{{ book_title }}</em>"{% endblocktrans %}
{% endblock %}
{% block modal-form-open %}
<form name="shelve" action="{% url 'reading-status' 'want' book.id %}" method="post">
{% csrf_token %}
<input type="hidden" name="book" value="{{ active_shelf.book.id }}">
<input type="hidden" name="shelf" value="to-read">
{% endblock %}
{% block modal-footer %}
<div class="columns">
<div class="column field">
<label for="post_status_want-{{ uuid }}">
<input type="checkbox" name="post-status" class="checkbox" id="post_status_want-{{ uuid }}" checked>
{% trans "Post to feed" %}
</label>
{% include 'snippets/privacy_select.html' %}
</div>
<div class="column">
<button class="button is-success" type="submit">
<span>{% trans "Want to read" %}</span>
</button>
{% trans "Cancel" as button_text %}
{% include 'snippets/toggle/toggle_button.html' with text=button_text controls_text="want-to-read" controls_uid=uuid %}
</div>
</div>
{% endblock %}
{% block modal-form-close %}</form>{% endblock %}

View file

@ -1,2 +1,2 @@
{% load i18n %}{% load utilities %}
{% blocktrans with book_path=book.local_path book=status.book|book_title %}commented on <a href="{{ book_path }}">{{ book }}</a>{% endblocktrans %}
{% blocktrans with book_path=status.book.local_path book=status.book|book_title %}commented on <a href="{{ book_path }}">{{ book }}</a>{% endblocktrans %}

View file

@ -1,7 +1,8 @@
{% spaceless %}
{% load i18n %}{% load utilities %}
{% load i18n %}
{% load utilities %}
{% load status_display %}
{% with book=status.mention_books.first %}
{% load_book status as book %}
{% blocktrans with book_path=book.remote_id book=book|book_title %}finished reading <a href="{{ book_path }}">{{ book }}</a>{% endblocktrans %}
{% endwith %}
{% endspaceless %}

View file

@ -1,9 +1,8 @@
{% spaceless %}
{% load i18n %}
{% load utilities %}
{% load status_display %}
{% with book=status.mention_books.first %}
{% load_book status as book %}
{% blocktrans with book_path=book.remote_id book=book|book_title %}started reading <a href="{{ book_path }}">{{ book }}</a>{% endblocktrans %}
{% endwith %}
{% endspaceless %}

View file

@ -1,8 +1,8 @@
{% spaceless %}
{% load i18n %}
{% load utilities %}
{% load status_display %}
{% with book=status.mention_books.first %}
{% load_book status as book %}
{% blocktrans with book_path=book.remote_id book=book|book_title %}<a href="{{ user_path }}">{{ username }}</a> wants to read <a href="{{ book_path }}">{{ book }}</a>{% endblocktrans %}
{% endwith %}
{% endspaceless %}

0
bookwyrm/templates/user/layout.html Normal file → Executable file
View file

0
bookwyrm/templates/user/lists.html Normal file → Executable file
View file

View file

@ -1,4 +1,4 @@
{% extends 'user/layout.html' %}
{% extends 'layout.html' %}
{% load bookwyrm_tags %}
{% load utilities %}
{% load humanize %}
@ -8,15 +8,17 @@
{% include 'user/shelf/books_header.html' %}
{% endblock %}
{% block header %}
<header class="columns">
{% block opengraph_images %}
{% include 'snippets/opengraph_images.html' with image=user.preview_image %}
{% endblock %}
{% block content %}
<header class="block">
<h1 class="title">
{% include 'user/shelf/books_header.html' %}
</h1>
</header>
{% endblock %}
{% block tabs %}
<div class="block columns">
<div class="column">
<div class="tabs">
@ -41,9 +43,7 @@
</div>
{% endif %}
</div>
{% endblock %}
{% block panel %}
<div class="block">
{% include 'user/shelf/create_shelf_form.html' with controls_text='create_shelf_form' %}
</div>

0
bookwyrm/templates/user/user.html Normal file → Executable file
View file

0
bookwyrm/templates/user/user_preview.html Normal file → Executable file
View file

View file

@ -70,7 +70,13 @@ def get_header_template(status):
"""get the path for the status template"""
if isinstance(status, models.Boost):
status = status.boosted_status
filename = "snippets/status/headers/{:s}.html".format(status.status_type.lower())
try:
header_type = status.reading_status
if not header_type:
raise AttributeError()
except AttributeError:
header_type = status.status_type.lower()
filename = f"snippets/status/headers/{header_type}.html"
header_template = select_template([filename, "snippets/status/headers/note.html"])
return header_template.render({"status": status})

View file

@ -77,6 +77,33 @@ class InboxCreate(TestCase):
views.inbox.activity_task(activity)
self.assertEqual(models.Status.objects.count(), 1)
@patch("bookwyrm.activitystreams.ActivityStream.add_status")
def test_create_comment_with_reading_status(self, *_):
"""the "it justs works" mode"""
datafile = pathlib.Path(__file__).parent.joinpath("../../data/ap_comment.json")
status_data = json.loads(datafile.read_bytes())
status_data["readingStatus"] = "to-read"
models.Edition.objects.create(
title="Test Book", remote_id="https://example.com/book/1"
)
activity = self.create_json
activity["object"] = status_data
with patch("bookwyrm.activitystreams.ActivityStream.add_status") as redis_mock:
views.inbox.activity_task(activity)
self.assertTrue(redis_mock.called)
status = models.Comment.objects.get()
self.assertEqual(status.remote_id, "https://example.com/user/mouse/comment/6")
self.assertEqual(status.content, "commentary")
self.assertEqual(status.reading_status, "to-read")
self.assertEqual(status.user, self.local_user)
# while we're here, lets ensure we avoid dupes
views.inbox.activity_task(activity)
self.assertEqual(models.Status.objects.count(), 1)
def test_create_status_remote_note_with_mention(self, _):
"""should only create it under the right circumstances"""
self.assertFalse(

View file

@ -280,49 +280,6 @@ class BookViews(TestCase):
self.assertEqual(book.authors.first().name, "Sappho")
self.assertEqual(book.authors.first(), book.parent_work.authors.first())
@patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
def test_switch_edition(self, _):
"""updates user's relationships to a book"""
work = models.Work.objects.create(title="test work")
edition1 = models.Edition.objects.create(title="first ed", parent_work=work)
edition2 = models.Edition.objects.create(title="second ed", parent_work=work)
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
shelf = models.Shelf.objects.create(name="Test Shelf", user=self.local_user)
models.ShelfBook.objects.create(
book=edition1,
user=self.local_user,
shelf=shelf,
)
models.ReadThrough.objects.create(user=self.local_user, book=edition1)
self.assertEqual(models.ShelfBook.objects.get().book, edition1)
self.assertEqual(models.ReadThrough.objects.get().book, edition1)
request = self.factory.post("", {"edition": edition2.id})
request.user = self.local_user
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
views.switch_edition(request)
self.assertEqual(models.ShelfBook.objects.get().book, edition2)
self.assertEqual(models.ReadThrough.objects.get().book, edition2)
def test_editions_page(self):
"""there are so many views, this just makes sure it LOADS"""
view = views.Editions.as_view()
request = self.factory.get("")
with patch("bookwyrm.views.books.is_api_request") as is_api:
is_api.return_value = False
result = view(request, self.work.id)
self.assertIsInstance(result, TemplateResponse)
result.render()
self.assertEqual(result.status_code, 200)
request = self.factory.get("")
with patch("bookwyrm.views.books.is_api_request") as is_api:
is_api.return_value = True
result = view(request, self.work.id)
self.assertIsInstance(result, ActivitypubResponse)
self.assertEqual(result.status_code, 200)
def test_upload_cover_file(self):
"""add a cover via file upload"""
self.assertFalse(self.book.cover)

View file

@ -0,0 +1,126 @@
""" test for app action functionality """
from unittest.mock import patch
from django.template.response import TemplateResponse
from django.test import TestCase
from django.test.client import RequestFactory
from bookwyrm import models, views
from bookwyrm.activitypub import ActivitypubResponse
class BookViews(TestCase):
"""books books books"""
def setUp(self):
"""we need basic test data and mocks"""
self.factory = RequestFactory()
with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"):
self.local_user = models.User.objects.create_user(
"mouse@local.com",
"mouse@mouse.com",
"mouseword",
local=True,
localname="mouse",
remote_id="https://example.com/users/mouse",
)
self.work = models.Work.objects.create(title="Test Work")
self.book = models.Edition.objects.create(
title="Example Edition",
remote_id="https://example.com/book/1",
parent_work=self.work,
physical_format="paperback",
)
models.SiteSettings.objects.create()
def test_editions_page(self):
"""there are so many views, this just makes sure it LOADS"""
view = views.Editions.as_view()
request = self.factory.get("")
with patch("bookwyrm.views.editions.is_api_request") as is_api:
is_api.return_value = False
result = view(request, self.work.id)
self.assertIsInstance(result, TemplateResponse)
result.render()
self.assertEqual(result.status_code, 200)
self.assertTrue("paperback" in result.context_data["formats"])
def test_editions_page_filtered(self):
"""editions view with filters"""
models.Edition.objects.create(
title="Fish",
physical_format="okay",
parent_work=self.work,
)
view = views.Editions.as_view()
request = self.factory.get("")
with patch("bookwyrm.views.editions.is_api_request") as is_api:
is_api.return_value = False
result = view(request, self.work.id)
self.assertIsInstance(result, TemplateResponse)
result.render()
self.assertEqual(result.status_code, 200)
self.assertEqual(len(result.context_data["editions"].object_list), 2)
self.assertEqual(len(result.context_data["formats"]), 2)
self.assertTrue("paperback" in result.context_data["formats"])
self.assertTrue("okay" in result.context_data["formats"])
request = self.factory.get("", {"q": "fish"})
with patch("bookwyrm.views.editions.is_api_request") as is_api:
is_api.return_value = False
result = view(request, self.work.id)
result.render()
self.assertEqual(result.status_code, 200)
self.assertEqual(len(result.context_data["editions"].object_list), 1)
request = self.factory.get("", {"q": "okay"})
with patch("bookwyrm.views.editions.is_api_request") as is_api:
is_api.return_value = False
result = view(request, self.work.id)
result.render()
self.assertEqual(result.status_code, 200)
self.assertEqual(len(result.context_data["editions"].object_list), 1)
request = self.factory.get("", {"format": "okay"})
with patch("bookwyrm.views.editions.is_api_request") as is_api:
is_api.return_value = False
result = view(request, self.work.id)
result.render()
self.assertEqual(result.status_code, 200)
self.assertEqual(len(result.context_data["editions"].object_list), 1)
def test_editions_page_api(self):
"""there are so many views, this just makes sure it LOADS"""
view = views.Editions.as_view()
request = self.factory.get("")
with patch("bookwyrm.views.editions.is_api_request") as is_api:
is_api.return_value = True
result = view(request, self.work.id)
self.assertIsInstance(result, ActivitypubResponse)
self.assertEqual(result.status_code, 200)
@patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
def test_switch_edition(self, _):
"""updates user's relationships to a book"""
work = models.Work.objects.create(title="test work")
edition1 = models.Edition.objects.create(title="first ed", parent_work=work)
edition2 = models.Edition.objects.create(title="second ed", parent_work=work)
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
shelf = models.Shelf.objects.create(name="Test Shelf", user=self.local_user)
models.ShelfBook.objects.create(
book=edition1,
user=self.local_user,
shelf=shelf,
)
models.ReadThrough.objects.create(user=self.local_user, book=edition1)
self.assertEqual(models.ShelfBook.objects.get().book, edition1)
self.assertEqual(models.ReadThrough.objects.get().book, edition1)
request = self.factory.post("", {"edition": edition2.id})
request.user = self.local_user
with patch("bookwyrm.models.activitypub_mixin.broadcast_task.delay"):
views.switch_edition(request)
self.assertEqual(models.ShelfBook.objects.get().book, edition2)
self.assertEqual(models.ReadThrough.objects.get().book, edition2)

View file

@ -4,11 +4,12 @@ from .authentication import Login, Register, Logout
from .authentication import ConfirmEmail, ConfirmEmailCode, resend_link
from .author import Author, EditAuthor
from .block import Block, unblock
from .books import Book, EditBook, ConfirmEditBook, Editions
from .books import upload_cover, add_description, switch_edition, resolve_book
from .books import Book, EditBook, ConfirmEditBook
from .books import upload_cover, add_description, resolve_book
from .directory import Directory
from .discover import Discover
from .edit_user import EditUser, DeleteUser
from .editions import Editions, switch_edition
from .federation import Federation, FederatedServer
from .federation import AddFederatedServer, ImportServerBlocklist
from .federation import block_server, unblock_server

View file

@ -24,7 +24,7 @@ from bookwyrm.settings import PAGE_LENGTH
from .helpers import is_api_request, get_edition, privacy_filter
# pylint: disable= no-self-use
# pylint: disable=no-self-use
class Book(View):
"""a book! this is the stuff"""
@ -270,37 +270,6 @@ class ConfirmEditBook(View):
return redirect("/book/%s" % book.id)
class Editions(View):
"""list of editions"""
def get(self, request, book_id):
"""list of editions of a book"""
work = get_object_or_404(models.Work, id=book_id)
if is_api_request(request):
return ActivitypubResponse(work.to_edition_list(**request.GET))
filters = {}
if request.GET.get("language"):
filters["languages__contains"] = [request.GET.get("language")]
if request.GET.get("format"):
filters["physical_format__iexact"] = request.GET.get("format")
editions = work.editions.order_by("-edition_rank")
languages = set(sum([e.languages for e in editions], []))
paginated = Paginator(editions.filter(**filters), PAGE_LENGTH)
data = {
"editions": paginated.get_page(request.GET.get("page")),
"work": work,
"languages": languages,
"formats": set(
e.physical_format.lower() for e in editions if e.physical_format
),
}
return TemplateResponse(request, "book/editions.html", data)
@login_required
@require_POST
def upload_cover(request, book_id):
@ -363,33 +332,3 @@ def resolve_book(request):
book = connector.get_or_create_book(remote_id)
return redirect("book", book.id)
@login_required
@require_POST
@transaction.atomic
def switch_edition(request):
"""switch your copy of a book to a different edition"""
edition_id = request.POST.get("edition")
new_edition = get_object_or_404(models.Edition, id=edition_id)
shelfbooks = models.ShelfBook.objects.filter(
book__parent_work=new_edition.parent_work, shelf__user=request.user
)
for shelfbook in shelfbooks.all():
with transaction.atomic():
models.ShelfBook.objects.create(
created_date=shelfbook.created_date,
user=shelfbook.user,
shelf=shelfbook.shelf,
book=new_edition,
)
shelfbook.delete()
readthroughs = models.ReadThrough.objects.filter(
book__parent_work=new_edition.parent_work, user=request.user
)
for readthrough in readthroughs.all():
readthrough.book = new_edition
readthrough.save()
return redirect("/book/%d" % new_edition.id)

View file

@ -0,0 +1,99 @@
""" the good stuff! the books! """
from functools import reduce
import operator
from django.contrib.auth.decorators import login_required
from django.core.paginator import Paginator
from django.db import transaction
from django.db.models import Q
from django.shortcuts import get_object_or_404, redirect
from django.template.response import TemplateResponse
from django.views import View
from django.views.decorators.http import require_POST
from bookwyrm import models
from bookwyrm.activitypub import ActivitypubResponse
from bookwyrm.settings import PAGE_LENGTH
from .helpers import is_api_request
# pylint: disable=no-self-use
class Editions(View):
"""list of editions"""
def get(self, request, book_id):
"""list of editions of a book"""
work = get_object_or_404(models.Work, id=book_id)
if is_api_request(request):
return ActivitypubResponse(work.to_edition_list(**request.GET))
filters = {}
if request.GET.get("language"):
filters["languages__contains"] = [request.GET.get("language")]
if request.GET.get("format"):
filters["physical_format__iexact"] = request.GET.get("format")
editions = work.editions.order_by("-edition_rank")
languages = set(sum(editions.values_list("languages", flat=True), []))
editions = editions.filter(**filters)
query = request.GET.get("q")
if query:
searchable_array_fields = ["languages", "publishers"]
searchable_fields = [
"title",
"physical_format",
"isbn_10",
"isbn_13",
"oclc_number",
"asin",
]
search_filter_entries = [
{f"{f}__icontains": query} for f in searchable_fields
] + [{f"{f}__iexact": query} for f in searchable_array_fields]
editions = editions.filter(
reduce(operator.or_, (Q(**f) for f in search_filter_entries))
)
paginated = Paginator(editions, PAGE_LENGTH)
data = {
"editions": paginated.get_page(request.GET.get("page")),
"work": work,
"languages": languages,
"formats": set(
e.physical_format.lower() for e in editions if e.physical_format
),
}
return TemplateResponse(request, "book/editions.html", data)
@login_required
@require_POST
@transaction.atomic
def switch_edition(request):
"""switch your copy of a book to a different edition"""
edition_id = request.POST.get("edition")
new_edition = get_object_or_404(models.Edition, id=edition_id)
shelfbooks = models.ShelfBook.objects.filter(
book__parent_work=new_edition.parent_work, shelf__user=request.user
)
for shelfbook in shelfbooks.all():
with transaction.atomic():
models.ShelfBook.objects.create(
created_date=shelfbook.created_date,
user=shelfbook.user,
shelf=shelfbook.shelf,
book=new_edition,
)
shelfbook.delete()
readthroughs = models.ReadThrough.objects.filter(
book__parent_work=new_edition.parent_work, user=request.user
)
for readthrough in readthroughs.all():
readthrough.book = new_edition
readthrough.save()
return redirect("/book/%d" % new_edition.id)

View file

@ -5,7 +5,7 @@ from django.core.exceptions import PermissionDenied
from django.shortcuts import redirect
from django.template.response import TemplateResponse
from django.utils.decorators import method_decorator
from django.utils.translation import gettext as _
from django.utils.translation import gettext_lazy as _
from django.views import View
from bookwyrm import models

View file

@ -12,7 +12,7 @@ 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 bookwyrm import forms, models
from .helpers import get_edition, handle_reading_status
@ -76,8 +76,17 @@ class ReadingStatus(View):
# 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)
# is it a comment?
if request.POST.get("content"):
form = forms.CommentForm(request.POST)
if form.is_valid():
form.save()
else:
# uh oh
raise Exception(form.errors)
else:
privacy = request.POST.get("privacy")
handle_reading_status(request.user, desired_shelf, book, privacy)
return redirect(request.headers.get("Referer", "/"))

View file

@ -9,7 +9,7 @@ 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.utils.translation import gettext as _
from django.utils.translation import gettext_lazy as _
from django.views import View
from django.views.decorators.http import require_POST

View file

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.0.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-08-13 02:21+0000\n"
"POT-Creation-Date: 2021-08-16 21:26+0000\n"
"PO-Revision-Date: 2021-03-02 17:19-0800\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: English <LL@li.org>\n"
@ -18,67 +18,67 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: bookwyrm/forms.py:232
#: bookwyrm/forms.py:233
#, fuzzy
#| msgid "A user with that username already exists."
msgid "A user with this email already exists."
msgstr "Dieser Benutzename ist bereits vergeben."
#: bookwyrm/forms.py:246
#: bookwyrm/forms.py:247
msgid "One Day"
msgstr "Ein Tag"
#: bookwyrm/forms.py:247
#: bookwyrm/forms.py:248
msgid "One Week"
msgstr "Eine Woche"
#: bookwyrm/forms.py:248
#: bookwyrm/forms.py:249
msgid "One Month"
msgstr "Ein Monat"
#: bookwyrm/forms.py:249
#: bookwyrm/forms.py:250
msgid "Does Not Expire"
msgstr "Läuft nicht aus"
#: bookwyrm/forms.py:254
#: bookwyrm/forms.py:255
#, python-format
msgid "%(count)d uses"
msgstr "%(count)d Benutzungen"
#: bookwyrm/forms.py:257
#: bookwyrm/forms.py:258
#, fuzzy
#| msgid "Unlisted"
msgid "Unlimited"
msgstr "Ungelistet"
#: bookwyrm/forms.py:307
#: bookwyrm/forms.py:308
msgid "List Order"
msgstr ""
#: bookwyrm/forms.py:308
#: bookwyrm/forms.py:309
#, fuzzy
#| msgid "Title"
msgid "Book Title"
msgstr "Titel"
#: bookwyrm/forms.py:309
#: bookwyrm/forms.py:310
#: bookwyrm/templates/snippets/create_status/review.html:25
#: bookwyrm/templates/user/shelf/shelf.html:85
#: bookwyrm/templates/user/shelf/shelf.html:116
msgid "Rating"
msgstr ""
#: bookwyrm/forms.py:311 bookwyrm/templates/lists/list.html:107
#: bookwyrm/forms.py:312 bookwyrm/templates/lists/list.html:107
msgid "Sort By"
msgstr ""
#: bookwyrm/forms.py:315
#: bookwyrm/forms.py:316
#, fuzzy
#| msgid "Started reading"
msgid "Ascending"
msgstr "Zu lesen angefangen"
#: bookwyrm/forms.py:316
#: bookwyrm/forms.py:317
#, fuzzy
#| msgid "Started reading"
msgid "Descending"
@ -308,9 +308,8 @@ msgstr ""
#: bookwyrm/templates/settings/edit_server.html:68
#: bookwyrm/templates/settings/federated_server.html:98
#: bookwyrm/templates/settings/site.html:108
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:42
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:42
#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:36
#: bookwyrm/templates/snippets/reading_modals/layout.html:16
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:42
#: bookwyrm/templates/user_admin/user_moderation_actions.html:45
msgid "Save"
msgstr "Speichern"
@ -324,10 +323,7 @@ msgstr "Speichern"
#: bookwyrm/templates/settings/federated_server.html:99
#: bookwyrm/templates/snippets/delete_readthrough_modal.html:17
#: bookwyrm/templates/snippets/goal_form.html:32
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:43
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:43
#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:37
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:28
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:43
msgid "Cancel"
msgstr "Abbrechen"
@ -2709,24 +2705,24 @@ msgid "Some thoughts on the book"
msgstr ""
#: bookwyrm/templates/snippets/create_status/comment.html:26
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:16
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:16
msgid "Progress:"
msgstr "Fortschritt:"
#: bookwyrm/templates/snippets/create_status/comment.html:34
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:30
#: bookwyrm/templates/snippets/readthrough_form.html:22
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:30
msgid "pages"
msgstr "Seiten"
#: bookwyrm/templates/snippets/create_status/comment.html:35
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:31
#: bookwyrm/templates/snippets/readthrough_form.html:23
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:31
msgid "percent"
msgstr "Prozent"
#: bookwyrm/templates/snippets/create_status/comment.html:41
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:36
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:36
#, python-format
msgid "of %(pages)s pages"
msgstr "von %(pages)s Seiten"
@ -2757,6 +2753,7 @@ msgid "Include spoiler alert"
msgstr "Spoileralarm aktivieren"
#: bookwyrm/templates/snippets/create_status/layout.html:38
#: bookwyrm/templates/snippets/reading_modals/form.html:7
#, fuzzy
#| msgid "Comment"
msgid "Comment:"
@ -2926,9 +2923,7 @@ msgid "Goal privacy:"
msgstr "Sichtbarkeit des Ziels"
#: bookwyrm/templates/snippets/goal_form.html:26
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:37
#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:31
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:20
#: bookwyrm/templates/snippets/reading_modals/layout.html:13
msgid "Post to feed"
msgstr "Posten"
@ -3005,21 +3000,47 @@ msgstr "Raten"
msgid "Rate"
msgstr ""
#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:6
#, python-format
msgid "Finish \"<em>%(book_title)s</em>\""
msgstr "\"<em>%(book_title)s</em>\" abschließen"
#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:22
#: bookwyrm/templates/snippets/reading_modals/start_reading_modal.html:20
#: bookwyrm/templates/snippets/readthrough_form.html:7
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:19
#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:19
msgid "Started reading"
msgstr "Zu lesen angefangen"
#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:30
#: bookwyrm/templates/snippets/readthrough_form.html:30
msgid "Finished reading"
msgstr "Lesen abgeschlossen"
#: bookwyrm/templates/snippets/reading_modals/form.html:8
msgid "(Optional)"
msgstr ""
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:5
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:45
#, fuzzy
#| msgid "Progress"
msgid "Update progress"
msgstr "Fortschritt"
#: bookwyrm/templates/snippets/reading_modals/start_reading_modal.html:6
#, python-format
msgid "Start \"<em>%(book_title)s</em>\""
msgstr "\"<em>%(book_title)s</em>\" beginnen"
#: bookwyrm/templates/snippets/reading_modals/want_to_read_modal.html:6
#, python-format
msgid "Want to Read \"<em>%(book_title)s</em>\""
msgstr "\"<em>%(book_title)s</em>\" auf Leseliste setzen"
#: bookwyrm/templates/snippets/readthrough_form.html:14
msgid "Progress"
msgstr "Fortschritt"
#: bookwyrm/templates/snippets/readthrough_form.html:30
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:25
msgid "Finished reading"
msgstr "Lesen abgeschlossen"
#: bookwyrm/templates/snippets/register_form.html:32
msgid "Sign Up"
msgstr "Registrieren"
@ -3040,18 +3061,6 @@ msgstr "Buch importieren"
msgid "Move book"
msgstr "Deine Bücher"
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:5
#, python-format
msgid "Finish \"<em>%(book_title)s</em>\""
msgstr "\"<em>%(book_title)s</em>\" abschließen"
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:5
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:45
#, fuzzy
#| msgid "Progress"
msgid "Update progress"
msgstr "Fortschritt"
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown.html:5
msgid "More shelves"
msgstr "Mehr Regale"
@ -3065,7 +3074,6 @@ msgid "Finish reading"
msgstr "Lesen abschließen"
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:25
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:26
msgid "Want to read"
msgstr "Auf Leseliste setzen"
@ -3075,16 +3083,6 @@ msgstr "Auf Leseliste setzen"
msgid "Remove from %(name)s"
msgstr "Listen: %(username)s"
#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:5
#, python-format
msgid "Start \"<em>%(book_title)s</em>\""
msgstr "\"<em>%(book_title)s</em>\" beginnen"
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:5
#, python-format
msgid "Want to Read \"<em>%(book_title)s</em>\""
msgstr "\"<em>%(book_title)s</em>\" auf Leseliste setzen"
#: bookwyrm/templates/snippets/status/content_status.html:72
#: bookwyrm/templates/snippets/trimmed_text.html:17
msgid "Show more"
@ -3123,13 +3121,13 @@ msgstr "Direktnachrichten mit <a href=\"%(path)s\">%(username)s</a>"
msgid "rated <a href=\"%(book_path)s\">%(book)s</a>:"
msgstr "Direktnachrichten mit <a href=\"%(path)s\">%(username)s</a>"
#: bookwyrm/templates/snippets/status/headers/read.html:5
#: bookwyrm/templates/snippets/status/headers/read.html:7
#, fuzzy, python-format
#| msgid "Editions of <a href=\"%(work_path)s\">\"%(work_title)s\"</a>"
msgid "finished reading <a href=\"%(book_path)s\">%(book)s</a>"
msgstr "Editionen von <a href=\"%(work_path)s\">\"%(work_title)s\"</a>"
#: bookwyrm/templates/snippets/status/headers/reading.html:6
#: bookwyrm/templates/snippets/status/headers/reading.html:7
#, fuzzy, python-format
#| msgid "Direct Messages with <a href=\"%(path)s\">%(username)s</a>"
msgid "started reading <a href=\"%(book_path)s\">%(book)s</a>"
@ -3141,7 +3139,7 @@ msgstr "Direktnachrichten mit <a href=\"%(path)s\">%(username)s</a>"
msgid "reviewed <a href=\"%(book_path)s\">%(book)s</a>"
msgstr "Direktnachrichten mit <a href=\"%(path)s\">%(username)s</a>"
#: bookwyrm/templates/snippets/status/headers/to_read.html:6
#: bookwyrm/templates/snippets/status/headers/to_read.html:7
#, fuzzy, python-format
#| msgid "<a href=\"%(related_path)s\">replied</a> to your <a href=\"%(parent_path)s\">status</a>"
msgid "<a href=\"%(user_path)s\">%(username)s</a> wants to read <a href=\"%(book_path)s\">%(book)s</a>"
@ -3485,6 +3483,11 @@ msgstr "Dieser Benutzename ist bereits vergeben."
msgid "A password reset link sent to %s"
msgstr ""
#: bookwyrm/views/rss_feed.py:34
#, python-brace-format
msgid "Status updates from {obj.display_name}"
msgstr ""
#, fuzzy
#~| msgid "Federated Servers"
#~ msgid "Federated Timeline"

View file

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.0.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-08-13 02:21+0000\n"
"POT-Creation-Date: 2021-08-16 21:26+0000\n"
"PO-Revision-Date: 2021-02-28 17:19-0800\n"
"Last-Translator: Mouse Reeve <mousereeve@riseup.net>\n"
"Language-Team: English <LL@li.org>\n"
@ -18,59 +18,59 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: bookwyrm/forms.py:232
#: bookwyrm/forms.py:233
msgid "A user with this email already exists."
msgstr ""
#: bookwyrm/forms.py:246
#: bookwyrm/forms.py:247
msgid "One Day"
msgstr ""
#: bookwyrm/forms.py:247
#: bookwyrm/forms.py:248
msgid "One Week"
msgstr ""
#: bookwyrm/forms.py:248
#: bookwyrm/forms.py:249
msgid "One Month"
msgstr ""
#: bookwyrm/forms.py:249
#: bookwyrm/forms.py:250
msgid "Does Not Expire"
msgstr ""
#: bookwyrm/forms.py:254
#: bookwyrm/forms.py:255
#, python-format
msgid "%(count)d uses"
msgstr ""
#: bookwyrm/forms.py:257
#: bookwyrm/forms.py:258
msgid "Unlimited"
msgstr ""
#: bookwyrm/forms.py:307
#: bookwyrm/forms.py:308
msgid "List Order"
msgstr ""
#: bookwyrm/forms.py:308
#: bookwyrm/forms.py:309
msgid "Book Title"
msgstr ""
#: bookwyrm/forms.py:309
#: bookwyrm/forms.py:310
#: bookwyrm/templates/snippets/create_status/review.html:25
#: bookwyrm/templates/user/shelf/shelf.html:85
#: bookwyrm/templates/user/shelf/shelf.html:116
msgid "Rating"
msgstr ""
#: bookwyrm/forms.py:311 bookwyrm/templates/lists/list.html:107
#: bookwyrm/forms.py:312 bookwyrm/templates/lists/list.html:107
msgid "Sort By"
msgstr ""
#: bookwyrm/forms.py:315
#: bookwyrm/forms.py:316
msgid "Ascending"
msgstr ""
#: bookwyrm/forms.py:316
#: bookwyrm/forms.py:317
msgid "Descending"
msgstr ""
@ -284,9 +284,8 @@ msgstr ""
#: bookwyrm/templates/settings/edit_server.html:68
#: bookwyrm/templates/settings/federated_server.html:98
#: bookwyrm/templates/settings/site.html:108
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:42
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:42
#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:36
#: bookwyrm/templates/snippets/reading_modals/layout.html:16
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:42
#: bookwyrm/templates/user_admin/user_moderation_actions.html:45
msgid "Save"
msgstr ""
@ -300,10 +299,7 @@ msgstr ""
#: bookwyrm/templates/settings/federated_server.html:99
#: bookwyrm/templates/snippets/delete_readthrough_modal.html:17
#: bookwyrm/templates/snippets/goal_form.html:32
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:43
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:43
#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:37
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:28
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:43
msgid "Cancel"
msgstr ""
@ -2450,24 +2446,24 @@ msgid "Some thoughts on the book"
msgstr ""
#: bookwyrm/templates/snippets/create_status/comment.html:26
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:16
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:16
msgid "Progress:"
msgstr ""
#: bookwyrm/templates/snippets/create_status/comment.html:34
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:30
#: bookwyrm/templates/snippets/readthrough_form.html:22
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:30
msgid "pages"
msgstr ""
#: bookwyrm/templates/snippets/create_status/comment.html:35
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:31
#: bookwyrm/templates/snippets/readthrough_form.html:23
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:31
msgid "percent"
msgstr ""
#: bookwyrm/templates/snippets/create_status/comment.html:41
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:36
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:36
#, python-format
msgid "of %(pages)s pages"
msgstr ""
@ -2496,6 +2492,7 @@ msgid "Include spoiler alert"
msgstr ""
#: bookwyrm/templates/snippets/create_status/layout.html:38
#: bookwyrm/templates/snippets/reading_modals/form.html:7
msgid "Comment:"
msgstr ""
@ -2646,9 +2643,7 @@ msgid "Goal privacy:"
msgstr ""
#: bookwyrm/templates/snippets/goal_form.html:26
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:37
#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:31
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:20
#: bookwyrm/templates/snippets/reading_modals/layout.html:13
msgid "Post to feed"
msgstr ""
@ -2723,21 +2718,45 @@ msgstr ""
msgid "Rate"
msgstr ""
#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:6
#, python-format
msgid "Finish \"<em>%(book_title)s</em>\""
msgstr ""
#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:22
#: bookwyrm/templates/snippets/reading_modals/start_reading_modal.html:20
#: bookwyrm/templates/snippets/readthrough_form.html:7
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:19
#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:19
msgid "Started reading"
msgstr ""
#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:30
#: bookwyrm/templates/snippets/readthrough_form.html:30
msgid "Finished reading"
msgstr ""
#: bookwyrm/templates/snippets/reading_modals/form.html:8
msgid "(Optional)"
msgstr ""
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:5
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:45
msgid "Update progress"
msgstr ""
#: bookwyrm/templates/snippets/reading_modals/start_reading_modal.html:6
#, python-format
msgid "Start \"<em>%(book_title)s</em>\""
msgstr ""
#: bookwyrm/templates/snippets/reading_modals/want_to_read_modal.html:6
#, python-format
msgid "Want to Read \"<em>%(book_title)s</em>\""
msgstr ""
#: bookwyrm/templates/snippets/readthrough_form.html:14
msgid "Progress"
msgstr ""
#: bookwyrm/templates/snippets/readthrough_form.html:30
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:25
msgid "Finished reading"
msgstr ""
#: bookwyrm/templates/snippets/register_form.html:32
msgid "Sign Up"
msgstr ""
@ -2754,16 +2773,6 @@ msgstr ""
msgid "Move book"
msgstr ""
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:5
#, python-format
msgid "Finish \"<em>%(book_title)s</em>\""
msgstr ""
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:5
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:45
msgid "Update progress"
msgstr ""
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown.html:5
msgid "More shelves"
msgstr ""
@ -2777,7 +2786,6 @@ msgid "Finish reading"
msgstr ""
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:25
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:26
msgid "Want to read"
msgstr ""
@ -2786,16 +2794,6 @@ msgstr ""
msgid "Remove from %(name)s"
msgstr ""
#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:5
#, python-format
msgid "Start \"<em>%(book_title)s</em>\""
msgstr ""
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:5
#, python-format
msgid "Want to Read \"<em>%(book_title)s</em>\""
msgstr ""
#: bookwyrm/templates/snippets/status/content_status.html:72
#: bookwyrm/templates/snippets/trimmed_text.html:17
msgid "Show more"
@ -2830,12 +2828,12 @@ msgstr ""
msgid "rated <a href=\"%(book_path)s\">%(book)s</a>:"
msgstr ""
#: bookwyrm/templates/snippets/status/headers/read.html:5
#: bookwyrm/templates/snippets/status/headers/read.html:7
#, python-format
msgid "finished reading <a href=\"%(book_path)s\">%(book)s</a>"
msgstr ""
#: bookwyrm/templates/snippets/status/headers/reading.html:6
#: bookwyrm/templates/snippets/status/headers/reading.html:7
#, python-format
msgid "started reading <a href=\"%(book_path)s\">%(book)s</a>"
msgstr ""
@ -2845,7 +2843,7 @@ msgstr ""
msgid "reviewed <a href=\"%(book_path)s\">%(book)s</a>"
msgstr ""
#: bookwyrm/templates/snippets/status/headers/to_read.html:6
#: bookwyrm/templates/snippets/status/headers/to_read.html:7
#, python-format
msgid "<a href=\"%(user_path)s\">%(username)s</a> wants to read <a href=\"%(book_path)s\">%(book)s</a>"
msgstr ""
@ -3153,3 +3151,8 @@ msgstr ""
#, python-format
msgid "A password reset link sent to %s"
msgstr ""
#: bookwyrm/views/rss_feed.py:34
#, python-brace-format
msgid "Status updates from {obj.display_name}"
msgstr ""

View file

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.0.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-08-13 02:21+0000\n"
"POT-Creation-Date: 2021-08-16 21:26+0000\n"
"PO-Revision-Date: 2021-03-19 11:49+0800\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -18,59 +18,59 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: bookwyrm/forms.py:232
#: bookwyrm/forms.py:233
msgid "A user with this email already exists."
msgstr "Ya existe un usuario con ese correo electrónico."
#: bookwyrm/forms.py:246
#: bookwyrm/forms.py:247
msgid "One Day"
msgstr "Un día"
#: bookwyrm/forms.py:247
#: bookwyrm/forms.py:248
msgid "One Week"
msgstr "Una semana"
#: bookwyrm/forms.py:248
#: bookwyrm/forms.py:249
msgid "One Month"
msgstr "Un mes"
#: bookwyrm/forms.py:249
#: bookwyrm/forms.py:250
msgid "Does Not Expire"
msgstr "Nunca se vence"
#: bookwyrm/forms.py:254
#: bookwyrm/forms.py:255
#, python-format
msgid "%(count)d uses"
msgstr "%(count)d usos"
#: bookwyrm/forms.py:257
#: bookwyrm/forms.py:258
msgid "Unlimited"
msgstr "Sin límite"
#: bookwyrm/forms.py:307
#: bookwyrm/forms.py:308
msgid "List Order"
msgstr "Orden de la lista"
#: bookwyrm/forms.py:308
#: bookwyrm/forms.py:309
msgid "Book Title"
msgstr "Título"
#: bookwyrm/forms.py:309
#: bookwyrm/forms.py:310
#: bookwyrm/templates/snippets/create_status/review.html:25
#: bookwyrm/templates/user/shelf/shelf.html:85
#: bookwyrm/templates/user/shelf/shelf.html:116
msgid "Rating"
msgstr "Calificación"
#: bookwyrm/forms.py:311 bookwyrm/templates/lists/list.html:107
#: bookwyrm/forms.py:312 bookwyrm/templates/lists/list.html:107
msgid "Sort By"
msgstr "Ordenar por"
#: bookwyrm/forms.py:315
#: bookwyrm/forms.py:316
msgid "Ascending"
msgstr "Ascendente"
#: bookwyrm/forms.py:316
#: bookwyrm/forms.py:317
msgid "Descending"
msgstr "Descendente"
@ -284,9 +284,8 @@ msgstr "Clave Goodreads:"
#: bookwyrm/templates/settings/edit_server.html:68
#: bookwyrm/templates/settings/federated_server.html:98
#: bookwyrm/templates/settings/site.html:108
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:42
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:42
#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:36
#: bookwyrm/templates/snippets/reading_modals/layout.html:16
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:42
#: bookwyrm/templates/user_admin/user_moderation_actions.html:45
msgid "Save"
msgstr "Guardar"
@ -300,10 +299,7 @@ msgstr "Guardar"
#: bookwyrm/templates/settings/federated_server.html:99
#: bookwyrm/templates/snippets/delete_readthrough_modal.html:17
#: bookwyrm/templates/snippets/goal_form.html:32
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:43
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:43
#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:37
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:28
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:43
msgid "Cancel"
msgstr "Cancelar"
@ -2451,24 +2447,24 @@ msgid "Some thoughts on the book"
msgstr "Algunos pensamientos sobre el libro"
#: bookwyrm/templates/snippets/create_status/comment.html:26
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:16
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:16
msgid "Progress:"
msgstr "Progreso:"
#: bookwyrm/templates/snippets/create_status/comment.html:34
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:30
#: bookwyrm/templates/snippets/readthrough_form.html:22
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:30
msgid "pages"
msgstr "páginas"
#: bookwyrm/templates/snippets/create_status/comment.html:35
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:31
#: bookwyrm/templates/snippets/readthrough_form.html:23
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:31
msgid "percent"
msgstr "por ciento"
#: bookwyrm/templates/snippets/create_status/comment.html:41
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:36
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:36
#, python-format
msgid "of %(pages)s pages"
msgstr "de %(pages)s páginas"
@ -2497,6 +2493,7 @@ msgid "Include spoiler alert"
msgstr "Incluir alerta de spoiler"
#: bookwyrm/templates/snippets/create_status/layout.html:38
#: bookwyrm/templates/snippets/reading_modals/form.html:7
msgid "Comment:"
msgstr "Comentario:"
@ -2647,9 +2644,7 @@ msgid "Goal privacy:"
msgstr "Privacidad de meta:"
#: bookwyrm/templates/snippets/goal_form.html:26
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:37
#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:31
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:20
#: bookwyrm/templates/snippets/reading_modals/layout.html:13
msgid "Post to feed"
msgstr "Compartir con tu feed"
@ -2725,21 +2720,45 @@ msgstr "Da una calificación"
msgid "Rate"
msgstr "Calificar"
#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:6
#, python-format
msgid "Finish \"<em>%(book_title)s</em>\""
msgstr "Terminar \"<em>%(book_title)s</em>\""
#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:22
#: bookwyrm/templates/snippets/reading_modals/start_reading_modal.html:20
#: bookwyrm/templates/snippets/readthrough_form.html:7
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:19
#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:19
msgid "Started reading"
msgstr "Lectura se empezó"
#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:30
#: bookwyrm/templates/snippets/readthrough_form.html:30
msgid "Finished reading"
msgstr "Lectura se terminó"
#: bookwyrm/templates/snippets/reading_modals/form.html:8
msgid "(Optional)"
msgstr ""
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:5
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:45
msgid "Update progress"
msgstr "Progreso de actualización"
#: bookwyrm/templates/snippets/reading_modals/start_reading_modal.html:6
#, python-format
msgid "Start \"<em>%(book_title)s</em>\""
msgstr "Empezar \"<em>%(book_title)s</em>\""
#: bookwyrm/templates/snippets/reading_modals/want_to_read_modal.html:6
#, python-format
msgid "Want to Read \"<em>%(book_title)s</em>\""
msgstr "Quiero leer \"<em>%(book_title)s</em>\""
#: bookwyrm/templates/snippets/readthrough_form.html:14
msgid "Progress"
msgstr "Progreso"
#: bookwyrm/templates/snippets/readthrough_form.html:30
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:25
msgid "Finished reading"
msgstr "Lectura se terminó"
#: bookwyrm/templates/snippets/register_form.html:32
msgid "Sign Up"
msgstr "Inscribirse"
@ -2756,16 +2775,6 @@ msgstr "Importar libro"
msgid "Move book"
msgstr "Mover libro"
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:5
#, python-format
msgid "Finish \"<em>%(book_title)s</em>\""
msgstr "Terminar \"<em>%(book_title)s</em>\""
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:5
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:45
msgid "Update progress"
msgstr "Progreso de actualización"
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown.html:5
msgid "More shelves"
msgstr "Más estantes"
@ -2779,7 +2788,6 @@ msgid "Finish reading"
msgstr "Terminar de leer"
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:25
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:26
msgid "Want to read"
msgstr "Quiero leer"
@ -2788,16 +2796,6 @@ msgstr "Quiero leer"
msgid "Remove from %(name)s"
msgstr "Quitar de %(name)s"
#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:5
#, python-format
msgid "Start \"<em>%(book_title)s</em>\""
msgstr "Empezar \"<em>%(book_title)s</em>\""
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:5
#, python-format
msgid "Want to Read \"<em>%(book_title)s</em>\""
msgstr "Quiero leer \"<em>%(book_title)s</em>\""
#: bookwyrm/templates/snippets/status/content_status.html:72
#: bookwyrm/templates/snippets/trimmed_text.html:17
msgid "Show more"
@ -2832,12 +2830,12 @@ msgstr "citó a <a href=\"%(book_path)s\">%(book)s</a>"
msgid "rated <a href=\"%(book_path)s\">%(book)s</a>:"
msgstr "calificó <a href=\"%(book_path)s\">%(book)s</a>:"
#: bookwyrm/templates/snippets/status/headers/read.html:5
#: bookwyrm/templates/snippets/status/headers/read.html:7
#, python-format
msgid "finished reading <a href=\"%(book_path)s\">%(book)s</a>"
msgstr "terminó de leer <a href=\"%(book_path)s\">%(book)s</a>"
#: bookwyrm/templates/snippets/status/headers/reading.html:6
#: bookwyrm/templates/snippets/status/headers/reading.html:7
#, python-format
msgid "started reading <a href=\"%(book_path)s\">%(book)s</a>"
msgstr "empezó a leer <a href=\"%(book_path)s\">%(book)s</a>"
@ -2847,7 +2845,7 @@ msgstr "empezó a leer <a href=\"%(book_path)s\">%(book)s</a>"
msgid "reviewed <a href=\"%(book_path)s\">%(book)s</a>"
msgstr "reseñó a <a href=\"%(book_path)s\">%(book)s</a>"
#: bookwyrm/templates/snippets/status/headers/to_read.html:6
#: bookwyrm/templates/snippets/status/headers/to_read.html:7
#, python-format
msgid "<a href=\"%(user_path)s\">%(username)s</a> wants to read <a href=\"%(book_path)s\">%(book)s</a>"
msgstr "<a href=\"%(user_path)s\">%(username)s</a> quiere leer <a href=\"%(book_path)s\">%(book)s</a>"
@ -3156,6 +3154,11 @@ 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"
#: bookwyrm/views/rss_feed.py:34
#, python-brace-format
msgid "Status updates from {obj.display_name}"
msgstr ""
#~ msgid "Local Timeline"
#~ msgstr "Línea temporal local"

View file

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.1.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-08-13 02:21+0000\n"
"POT-Creation-Date: 2021-08-16 21:26+0000\n"
"PO-Revision-Date: 2021-04-05 12:44+0100\n"
"Last-Translator: Fabien Basmaison <contact@arkhi.org>\n"
"Language-Team: Mouse Reeve <LL@li.org>\n"
@ -18,59 +18,59 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#: bookwyrm/forms.py:232
#: bookwyrm/forms.py:233
msgid "A user with this email already exists."
msgstr "Cet email est déjà associé à un compte."
#: bookwyrm/forms.py:246
#: bookwyrm/forms.py:247
msgid "One Day"
msgstr "Un jour"
#: bookwyrm/forms.py:247
#: bookwyrm/forms.py:248
msgid "One Week"
msgstr "Une semaine"
#: bookwyrm/forms.py:248
#: bookwyrm/forms.py:249
msgid "One Month"
msgstr "Un mois"
#: bookwyrm/forms.py:249
#: bookwyrm/forms.py:250
msgid "Does Not Expire"
msgstr "Sans expiration"
#: bookwyrm/forms.py:254
#: bookwyrm/forms.py:255
#, python-format
msgid "%(count)d uses"
msgstr "%(count)d utilisations"
#: bookwyrm/forms.py:257
#: bookwyrm/forms.py:258
msgid "Unlimited"
msgstr "Sans limite"
#: bookwyrm/forms.py:307
#: bookwyrm/forms.py:308
msgid "List Order"
msgstr "Ordre de la liste"
#: bookwyrm/forms.py:308
#: bookwyrm/forms.py:309
msgid "Book Title"
msgstr "Titre du livre"
#: bookwyrm/forms.py:309
#: bookwyrm/forms.py:310
#: bookwyrm/templates/snippets/create_status/review.html:25
#: bookwyrm/templates/user/shelf/shelf.html:85
#: bookwyrm/templates/user/shelf/shelf.html:116
msgid "Rating"
msgstr "Note"
#: bookwyrm/forms.py:311 bookwyrm/templates/lists/list.html:107
#: bookwyrm/forms.py:312 bookwyrm/templates/lists/list.html:107
msgid "Sort By"
msgstr "Trier par"
#: bookwyrm/forms.py:315
#: bookwyrm/forms.py:316
msgid "Ascending"
msgstr "Ordre croissant"
#: bookwyrm/forms.py:316
#: bookwyrm/forms.py:317
msgid "Descending"
msgstr "Ordre décroissant"
@ -288,9 +288,8 @@ msgstr "Clé Goodreads:"
#: bookwyrm/templates/settings/edit_server.html:68
#: bookwyrm/templates/settings/federated_server.html:98
#: bookwyrm/templates/settings/site.html:108
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:42
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:42
#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:36
#: bookwyrm/templates/snippets/reading_modals/layout.html:16
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:42
#: bookwyrm/templates/user_admin/user_moderation_actions.html:45
msgid "Save"
msgstr "Enregistrer"
@ -304,10 +303,7 @@ msgstr "Enregistrer"
#: bookwyrm/templates/settings/federated_server.html:99
#: bookwyrm/templates/snippets/delete_readthrough_modal.html:17
#: bookwyrm/templates/snippets/goal_form.html:32
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:43
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:43
#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:37
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:28
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:43
msgid "Cancel"
msgstr "Annuler"
@ -2473,24 +2469,24 @@ msgid "Some thoughts on the book"
msgstr ""
#: bookwyrm/templates/snippets/create_status/comment.html:26
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:16
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:16
msgid "Progress:"
msgstr "Progression:"
#: bookwyrm/templates/snippets/create_status/comment.html:34
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:30
#: bookwyrm/templates/snippets/readthrough_form.html:22
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:30
msgid "pages"
msgstr "pages"
#: bookwyrm/templates/snippets/create_status/comment.html:35
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:31
#: bookwyrm/templates/snippets/readthrough_form.html:23
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:31
msgid "percent"
msgstr "pourcent"
#: bookwyrm/templates/snippets/create_status/comment.html:41
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:36
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:36
#, python-format
msgid "of %(pages)s pages"
msgstr "sur %(pages)s pages"
@ -2519,6 +2515,7 @@ msgid "Include spoiler alert"
msgstr "Afficher une alerte spoiler"
#: bookwyrm/templates/snippets/create_status/layout.html:38
#: bookwyrm/templates/snippets/reading_modals/form.html:7
msgid "Comment:"
msgstr "Commentaire:"
@ -2675,9 +2672,7 @@ msgid "Goal privacy:"
msgstr "Confidentialité du défi:"
#: bookwyrm/templates/snippets/goal_form.html:26
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:37
#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:31
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:20
#: bookwyrm/templates/snippets/reading_modals/layout.html:13
msgid "Post to feed"
msgstr "Publier sur le fil dactualité"
@ -2752,21 +2747,45 @@ msgstr "Laisser une note"
msgid "Rate"
msgstr "Noter"
#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:6
#, python-format
msgid "Finish \"<em>%(book_title)s</em>\""
msgstr "Terminer « <em>%(book_title)s</em> »"
#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:22
#: bookwyrm/templates/snippets/reading_modals/start_reading_modal.html:20
#: bookwyrm/templates/snippets/readthrough_form.html:7
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:19
#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:19
msgid "Started reading"
msgstr "Lecture commencée le"
#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:30
#: bookwyrm/templates/snippets/readthrough_form.html:30
msgid "Finished reading"
msgstr "Lecture terminée le"
#: bookwyrm/templates/snippets/reading_modals/form.html:8
msgid "(Optional)"
msgstr ""
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:5
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:45
msgid "Update progress"
msgstr "Progression de la mise à jour"
#: bookwyrm/templates/snippets/reading_modals/start_reading_modal.html:6
#, python-format
msgid "Start \"<em>%(book_title)s</em>\""
msgstr "Commencer « <em>%(book_title)s</em> »"
#: bookwyrm/templates/snippets/reading_modals/want_to_read_modal.html:6
#, python-format
msgid "Want to Read \"<em>%(book_title)s</em>\""
msgstr "Ajouter « <em>%(book_title)s</em> » aux envies de lecture"
#: bookwyrm/templates/snippets/readthrough_form.html:14
msgid "Progress"
msgstr "Progression"
#: bookwyrm/templates/snippets/readthrough_form.html:30
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:25
msgid "Finished reading"
msgstr "Lecture terminée le"
#: bookwyrm/templates/snippets/register_form.html:32
msgid "Sign Up"
msgstr "Senregistrer"
@ -2783,16 +2802,6 @@ msgstr "Importer le livre"
msgid "Move book"
msgstr "Déplacer le livre"
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:5
#, python-format
msgid "Finish \"<em>%(book_title)s</em>\""
msgstr "Terminer « <em>%(book_title)s</em> »"
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:5
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:45
msgid "Update progress"
msgstr "Progression de la mise à jour"
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown.html:5
msgid "More shelves"
msgstr "Plus détagères"
@ -2806,7 +2815,6 @@ msgid "Finish reading"
msgstr "Terminer la lecture"
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:25
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:26
msgid "Want to read"
msgstr "Je veux le lire"
@ -2815,16 +2823,6 @@ msgstr "Je veux le lire"
msgid "Remove from %(name)s"
msgstr "Retirer de %(name)s"
#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:5
#, python-format
msgid "Start \"<em>%(book_title)s</em>\""
msgstr "Commencer « <em>%(book_title)s</em> »"
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:5
#, python-format
msgid "Want to Read \"<em>%(book_title)s</em>\""
msgstr "Ajouter « <em>%(book_title)s</em> » aux envies de lecture"
#: bookwyrm/templates/snippets/status/content_status.html:72
#: bookwyrm/templates/snippets/trimmed_text.html:17
msgid "Show more"
@ -2862,13 +2860,13 @@ msgstr "Signalé par <a href=\"%(path)s\">%(username)s</a>"
msgid "rated <a href=\"%(book_path)s\">%(book)s</a>:"
msgstr "Créée par <a href=\"%(path)s\">%(username)s</a>"
#: bookwyrm/templates/snippets/status/headers/read.html:5
#: bookwyrm/templates/snippets/status/headers/read.html:7
#, fuzzy, python-format
#| msgid "Editions of <a href=\"%(work_path)s\">\"%(work_title)s\"</a>"
msgid "finished reading <a href=\"%(book_path)s\">%(book)s</a>"
msgstr "Éditions de <a href=\"%(work_path)s\">« %(work_title)s»</a>"
#: bookwyrm/templates/snippets/status/headers/reading.html:6
#: bookwyrm/templates/snippets/status/headers/reading.html:7
#, fuzzy, python-format
#| msgid "Created by <a href=\"%(path)s\">%(username)s</a>"
msgid "started reading <a href=\"%(book_path)s\">%(book)s</a>"
@ -2880,7 +2878,7 @@ msgstr "Créée par <a href=\"%(path)s\">%(username)s</a>"
msgid "reviewed <a href=\"%(book_path)s\">%(book)s</a>"
msgstr "Créée par <a href=\"%(path)s\">%(username)s</a>"
#: bookwyrm/templates/snippets/status/headers/to_read.html:6
#: bookwyrm/templates/snippets/status/headers/to_read.html:7
#, fuzzy, python-format
#| msgid "replied to <a href=\"%(user_path)s\">%(username)s's</a> <a href=\"%(status_path)s\">quote</a>"
msgid "<a href=\"%(user_path)s\">%(username)s</a> wants to read <a href=\"%(book_path)s\">%(book)s</a>"
@ -3195,6 +3193,11 @@ msgstr "Aucun compte avec cette adresse email na été trouvé."
msgid "A password reset link sent to %s"
msgstr "Un lien de réinitialisation a été envoyé à %s."
#: bookwyrm/views/rss_feed.py:34
#, python-brace-format
msgid "Status updates from {obj.display_name}"
msgstr ""
#~ msgid "Local Timeline"
#~ msgstr "Fil dactualité local"

Binary file not shown.

View file

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.1.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-08-13 02:21+0000\n"
"POT-Creation-Date: 2021-08-16 21:26+0000\n"
"PO-Revision-Date: 2021-03-20 00:56+0000\n"
"Last-Translator: Kana <gudzpoz@live.com>\n"
"Language-Team: Mouse Reeve <LL@li.org>\n"
@ -18,59 +18,59 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: bookwyrm/forms.py:232
#: bookwyrm/forms.py:233
msgid "A user with this email already exists."
msgstr "已经存在使用该邮箱的用户。"
#: bookwyrm/forms.py:246
#: bookwyrm/forms.py:247
msgid "One Day"
msgstr "一天"
#: bookwyrm/forms.py:247
#: bookwyrm/forms.py:248
msgid "One Week"
msgstr "一周"
#: bookwyrm/forms.py:248
#: bookwyrm/forms.py:249
msgid "One Month"
msgstr "一个月"
#: bookwyrm/forms.py:249
#: bookwyrm/forms.py:250
msgid "Does Not Expire"
msgstr "永不失效"
#: bookwyrm/forms.py:254
#: bookwyrm/forms.py:255
#, python-format
msgid "%(count)d uses"
msgstr "%(count)d 次使用"
#: bookwyrm/forms.py:257
#: bookwyrm/forms.py:258
msgid "Unlimited"
msgstr "不受限"
#: bookwyrm/forms.py:307
#: bookwyrm/forms.py:308
msgid "List Order"
msgstr "列表顺序"
#: bookwyrm/forms.py:308
#: bookwyrm/forms.py:309
msgid "Book Title"
msgstr "书名"
#: bookwyrm/forms.py:309
#: bookwyrm/forms.py:310
#: bookwyrm/templates/snippets/create_status/review.html:25
#: bookwyrm/templates/user/shelf/shelf.html:85
#: bookwyrm/templates/user/shelf/shelf.html:116
msgid "Rating"
msgstr "评价"
#: bookwyrm/forms.py:311 bookwyrm/templates/lists/list.html:107
#: bookwyrm/forms.py:312 bookwyrm/templates/lists/list.html:107
msgid "Sort By"
msgstr "排序方式"
#: bookwyrm/forms.py:315
#: bookwyrm/forms.py:316
msgid "Ascending"
msgstr "升序"
#: bookwyrm/forms.py:316
#: bookwyrm/forms.py:317
msgid "Descending"
msgstr "降序"
@ -284,9 +284,8 @@ msgstr "Goodreads key:"
#: bookwyrm/templates/settings/edit_server.html:68
#: bookwyrm/templates/settings/federated_server.html:98
#: bookwyrm/templates/settings/site.html:108
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:42
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:42
#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:36
#: bookwyrm/templates/snippets/reading_modals/layout.html:16
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:42
#: bookwyrm/templates/user_admin/user_moderation_actions.html:45
msgid "Save"
msgstr "保存"
@ -300,10 +299,7 @@ msgstr "保存"
#: bookwyrm/templates/settings/federated_server.html:99
#: bookwyrm/templates/snippets/delete_readthrough_modal.html:17
#: bookwyrm/templates/snippets/goal_form.html:32
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:43
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:43
#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:37
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:28
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:43
msgid "Cancel"
msgstr "取消"
@ -1791,8 +1787,9 @@ msgid "boosted your <a href=\"%(related_path)s\">status</a>"
msgstr "转发了你的 <a href=\"%(related_path)s\">状态</a>"
#: bookwyrm/templates/notifications.html:121
#, python-format
msgid " added <em><a href=\"%(book_path)s\">%(book_title)s</a></em> to your list “<a href=\"%(list_path)s\">%(list_name)s</a>”"
#, fuzzy, python-format
#| msgid " added <em><a href=\"%(book_path)s\">%(book_title)s</a></em> to your list “<a href=\"%(list_path)s\">%(list_name)s</a>”"
msgid " added <em><a href=\"%(book_path)s\">%(book_title)s</a></em> to your list \"<a href=\"%(list_path)s\">%(list_name)s</a>\""
msgstr " 添加了 <em><a href=\"%(book_path)s\">%(book_title)s</a></em> 到你的列表 “<a href=\"%(list_path)s\">%(list_name)s</a>”"
#: bookwyrm/templates/notifications.html:123
@ -2446,24 +2443,24 @@ msgid "Some thoughts on the book"
msgstr "对书的一些看法"
#: bookwyrm/templates/snippets/create_status/comment.html:26
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:16
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:16
msgid "Progress:"
msgstr "进度:"
#: bookwyrm/templates/snippets/create_status/comment.html:34
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:30
#: bookwyrm/templates/snippets/readthrough_form.html:22
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:30
msgid "pages"
msgstr "页数"
#: bookwyrm/templates/snippets/create_status/comment.html:35
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:31
#: bookwyrm/templates/snippets/readthrough_form.html:23
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:31
msgid "percent"
msgstr "百分比"
#: bookwyrm/templates/snippets/create_status/comment.html:41
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:36
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:36
#, python-format
msgid "of %(pages)s pages"
msgstr "全书 %(pages)s 页"
@ -2492,6 +2489,7 @@ msgid "Include spoiler alert"
msgstr "加入剧透警告"
#: bookwyrm/templates/snippets/create_status/layout.html:38
#: bookwyrm/templates/snippets/reading_modals/form.html:7
msgid "Comment:"
msgstr "评论:"
@ -2638,9 +2636,7 @@ msgid "Goal privacy:"
msgstr "目标隐私:"
#: bookwyrm/templates/snippets/goal_form.html:26
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:37
#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:31
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:20
#: bookwyrm/templates/snippets/reading_modals/layout.html:13
msgid "Post to feed"
msgstr "发布到消息流中"
@ -2715,21 +2711,45 @@ msgstr "留下评价"
msgid "Rate"
msgstr "评价"
#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:6
#, python-format
msgid "Finish \"<em>%(book_title)s</em>\""
msgstr "完成《<em>%(book_title)s</em>》"
#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:22
#: bookwyrm/templates/snippets/reading_modals/start_reading_modal.html:20
#: bookwyrm/templates/snippets/readthrough_form.html:7
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:19
#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:19
msgid "Started reading"
msgstr "已开始阅读"
#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:30
#: bookwyrm/templates/snippets/readthrough_form.html:30
msgid "Finished reading"
msgstr "已完成阅读"
#: bookwyrm/templates/snippets/reading_modals/form.html:8
msgid "(Optional)"
msgstr ""
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:5
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:45
msgid "Update progress"
msgstr "更新进度"
#: bookwyrm/templates/snippets/reading_modals/start_reading_modal.html:6
#, python-format
msgid "Start \"<em>%(book_title)s</em>\""
msgstr "开始《<em>%(book_title)s</em>》"
#: bookwyrm/templates/snippets/reading_modals/want_to_read_modal.html:6
#, python-format
msgid "Want to Read \"<em>%(book_title)s</em>\""
msgstr "想要阅读《<em>%(book_title)s</em>》"
#: bookwyrm/templates/snippets/readthrough_form.html:14
msgid "Progress"
msgstr "进度"
#: bookwyrm/templates/snippets/readthrough_form.html:30
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:25
msgid "Finished reading"
msgstr "已完成阅读"
#: bookwyrm/templates/snippets/register_form.html:32
msgid "Sign Up"
msgstr "注册"
@ -2746,16 +2766,6 @@ msgstr "导入书目"
msgid "Move book"
msgstr "移动书目"
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:5
#, python-format
msgid "Finish \"<em>%(book_title)s</em>\""
msgstr "完成《<em>%(book_title)s</em>》"
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:5
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:45
msgid "Update progress"
msgstr "更新进度"
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown.html:5
msgid "More shelves"
msgstr "更多书架"
@ -2769,7 +2779,6 @@ msgid "Finish reading"
msgstr "完成阅读"
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:25
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:26
msgid "Want to read"
msgstr "想要阅读"
@ -2778,16 +2787,6 @@ msgstr "想要阅读"
msgid "Remove from %(name)s"
msgstr "从 %(name)s 移除"
#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:5
#, python-format
msgid "Start \"<em>%(book_title)s</em>\""
msgstr "开始《<em>%(book_title)s</em>》"
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:5
#, python-format
msgid "Want to Read \"<em>%(book_title)s</em>\""
msgstr "想要阅读《<em>%(book_title)s</em>》"
#: bookwyrm/templates/snippets/status/content_status.html:72
#: bookwyrm/templates/snippets/trimmed_text.html:17
msgid "Show more"
@ -2814,7 +2813,6 @@ msgstr "回复了 <a href=\"%(user_path)s\">%(username)s</a> 的 <a href=\"%(sta
#: bookwyrm/templates/snippets/status/headers/quotation.html:2
#, python-format
#| msgid "Reported by <a href=\"%(path)s\">%(username)s</a>"
msgid "quoted <a href=\"%(book_path)s\">%(book)s</a>"
msgstr "引用了 <a href=\"%(book_path)s\">%(book)s</a>"
@ -2823,12 +2821,12 @@ msgstr "引用了 <a href=\"%(book_path)s\">%(book)s</a>"
msgid "rated <a href=\"%(book_path)s\">%(book)s</a>:"
msgstr "为 <a href=\"%(book_path)s\">%(book)s</a> 打了分:"
#: bookwyrm/templates/snippets/status/headers/read.html:5
#: bookwyrm/templates/snippets/status/headers/read.html:7
#, python-format
msgid "finished reading <a href=\"%(book_path)s\">%(book)s</a>"
msgstr "完成阅读 <a href=\"%(book_path)s\">%(book)s</a>"
#: bookwyrm/templates/snippets/status/headers/reading.html:6
#: bookwyrm/templates/snippets/status/headers/reading.html:7
#, python-format
msgid "started reading <a href=\"%(book_path)s\">%(book)s</a>"
msgstr "开始阅读 <a href=\"%(book_path)s\">%(book)s</a>"
@ -2838,7 +2836,7 @@ msgstr "开始阅读 <a href=\"%(book_path)s\">%(book)s</a>"
msgid "reviewed <a href=\"%(book_path)s\">%(book)s</a>"
msgstr "为 <a href=\"%(book_path)s\">%(book)s</a> 撰写了书评"
#: bookwyrm/templates/snippets/status/headers/to_read.html:6
#: bookwyrm/templates/snippets/status/headers/to_read.html:7
#, python-format
msgid "<a href=\"%(user_path)s\">%(username)s</a> wants to read <a href=\"%(book_path)s\">%(book)s</a>"
msgstr "<a href=\"%(user_path)s\">%(username)s</a> 想要阅读 <a href=\"%(book_path)s\">%(book)s</a>"
@ -3143,6 +3141,11 @@ msgstr "没有找到使用该邮箱的用户。"
msgid "A password reset link sent to %s"
msgstr "密码重置连接已发送给 %s"
#: bookwyrm/views/rss_feed.py:34
#, python-brace-format
msgid "Status updates from {obj.display_name}"
msgstr ""
#~ msgid "Local Timeline"
#~ msgstr "本地时间线"

View file

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: 0.0.1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-08-13 02:21+0000\n"
"POT-Creation-Date: 2021-08-16 21:26+0000\n"
"PO-Revision-Date: 2021-06-30 10:36+0000\n"
"Last-Translator: Grace Cheng <chengracecwy@gmail.com>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -18,59 +18,59 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: bookwyrm/forms.py:232
#: bookwyrm/forms.py:233
msgid "A user with this email already exists."
msgstr "已經存在使用該郵箱的使用者。"
#: bookwyrm/forms.py:246
#: bookwyrm/forms.py:247
msgid "One Day"
msgstr "一天"
#: bookwyrm/forms.py:247
#: bookwyrm/forms.py:248
msgid "One Week"
msgstr "一週"
#: bookwyrm/forms.py:248
#: bookwyrm/forms.py:249
msgid "One Month"
msgstr "一個月"
#: bookwyrm/forms.py:249
#: bookwyrm/forms.py:250
msgid "Does Not Expire"
msgstr "永不失效"
#: bookwyrm/forms.py:254
#: bookwyrm/forms.py:255
#, python-format
msgid "%(count)d uses"
msgstr "%(count)d 次使用"
#: bookwyrm/forms.py:257
#: bookwyrm/forms.py:258
msgid "Unlimited"
msgstr "不受限"
#: bookwyrm/forms.py:307
#: bookwyrm/forms.py:308
msgid "List Order"
msgstr "列表順序"
#: bookwyrm/forms.py:308
#: bookwyrm/forms.py:309
msgid "Book Title"
msgstr "書名"
#: bookwyrm/forms.py:309
#: bookwyrm/forms.py:310
#: bookwyrm/templates/snippets/create_status/review.html:25
#: bookwyrm/templates/user/shelf/shelf.html:85
#: bookwyrm/templates/user/shelf/shelf.html:116
msgid "Rating"
msgstr "評價"
#: bookwyrm/forms.py:311 bookwyrm/templates/lists/list.html:107
#: bookwyrm/forms.py:312 bookwyrm/templates/lists/list.html:107
msgid "Sort By"
msgstr "排序方式"
#: bookwyrm/forms.py:315
#: bookwyrm/forms.py:316
msgid "Ascending"
msgstr "升序"
#: bookwyrm/forms.py:316
#: bookwyrm/forms.py:317
msgid "Descending"
msgstr "降序"
@ -290,9 +290,8 @@ msgstr "Goodreads key:"
#: bookwyrm/templates/settings/edit_server.html:68
#: bookwyrm/templates/settings/federated_server.html:98
#: bookwyrm/templates/settings/site.html:108
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:42
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:42
#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:36
#: bookwyrm/templates/snippets/reading_modals/layout.html:16
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:42
#: bookwyrm/templates/user_admin/user_moderation_actions.html:45
msgid "Save"
msgstr "儲存"
@ -306,10 +305,7 @@ msgstr "儲存"
#: bookwyrm/templates/settings/federated_server.html:99
#: bookwyrm/templates/snippets/delete_readthrough_modal.html:17
#: bookwyrm/templates/snippets/goal_form.html:32
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:43
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:43
#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:37
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:28
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:43
msgid "Cancel"
msgstr "取消"
@ -2487,24 +2483,24 @@ msgid "Some thoughts on the book"
msgstr ""
#: bookwyrm/templates/snippets/create_status/comment.html:26
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:16
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:16
msgid "Progress:"
msgstr "進度:"
#: bookwyrm/templates/snippets/create_status/comment.html:34
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:30
#: bookwyrm/templates/snippets/readthrough_form.html:22
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:30
msgid "pages"
msgstr "頁數"
#: bookwyrm/templates/snippets/create_status/comment.html:35
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:31
#: bookwyrm/templates/snippets/readthrough_form.html:23
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:31
msgid "percent"
msgstr "百分比"
#: bookwyrm/templates/snippets/create_status/comment.html:41
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:36
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:36
#, python-format
msgid "of %(pages)s pages"
msgstr "全書 %(pages)s 頁"
@ -2533,6 +2529,7 @@ msgid "Include spoiler alert"
msgstr "加入劇透警告"
#: bookwyrm/templates/snippets/create_status/layout.html:38
#: bookwyrm/templates/snippets/reading_modals/form.html:7
msgid "Comment:"
msgstr "評論:"
@ -2685,9 +2682,7 @@ msgid "Goal privacy:"
msgstr "目標隱私:"
#: bookwyrm/templates/snippets/goal_form.html:26
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:37
#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:31
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:20
#: bookwyrm/templates/snippets/reading_modals/layout.html:13
msgid "Post to feed"
msgstr "發佈到即時動態"
@ -2762,21 +2757,45 @@ msgstr "留下評價"
msgid "Rate"
msgstr "評價"
#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:6
#, python-format
msgid "Finish \"<em>%(book_title)s</em>\""
msgstr "完成 \"<em>%(book_title)s</em>\""
#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:22
#: bookwyrm/templates/snippets/reading_modals/start_reading_modal.html:20
#: bookwyrm/templates/snippets/readthrough_form.html:7
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:19
#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:19
msgid "Started reading"
msgstr "已開始閱讀"
#: bookwyrm/templates/snippets/reading_modals/finish_reading_modal.html:30
#: bookwyrm/templates/snippets/readthrough_form.html:30
msgid "Finished reading"
msgstr "已完成閱讀"
#: bookwyrm/templates/snippets/reading_modals/form.html:8
msgid "(Optional)"
msgstr ""
#: bookwyrm/templates/snippets/reading_modals/progress_update_modal.html:5
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:45
msgid "Update progress"
msgstr "更新進度"
#: bookwyrm/templates/snippets/reading_modals/start_reading_modal.html:6
#, python-format
msgid "Start \"<em>%(book_title)s</em>\""
msgstr "開始 \"<em>%(book_title)s</em>\""
#: bookwyrm/templates/snippets/reading_modals/want_to_read_modal.html:6
#, python-format
msgid "Want to Read \"<em>%(book_title)s</em>\""
msgstr "想要閱讀 \"<em>%(book_title)s</em>\""
#: bookwyrm/templates/snippets/readthrough_form.html:14
msgid "Progress"
msgstr "進度"
#: bookwyrm/templates/snippets/readthrough_form.html:30
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:25
msgid "Finished reading"
msgstr "已完成閱讀"
#: bookwyrm/templates/snippets/register_form.html:32
msgid "Sign Up"
msgstr "註冊"
@ -2793,16 +2812,6 @@ msgstr "匯入書目"
msgid "Move book"
msgstr "移動書目"
#: bookwyrm/templates/snippets/shelve_button/finish_reading_modal.html:5
#, python-format
msgid "Finish \"<em>%(book_title)s</em>\""
msgstr "完成 \"<em>%(book_title)s</em>\""
#: bookwyrm/templates/snippets/shelve_button/progress_update_modal.html:5
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:45
msgid "Update progress"
msgstr "更新進度"
#: bookwyrm/templates/snippets/shelve_button/shelve_button_dropdown.html:5
msgid "More shelves"
msgstr "更多書架"
@ -2816,7 +2825,6 @@ msgid "Finish reading"
msgstr "完成閱讀"
#: bookwyrm/templates/snippets/shelve_button/shelve_button_options.html:25
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:26
msgid "Want to read"
msgstr "想要閱讀"
@ -2825,16 +2833,6 @@ msgstr "想要閱讀"
msgid "Remove from %(name)s"
msgstr "從 %(name)s 移除"
#: bookwyrm/templates/snippets/shelve_button/start_reading_modal.html:5
#, python-format
msgid "Start \"<em>%(book_title)s</em>\""
msgstr "開始 \"<em>%(book_title)s</em>\""
#: bookwyrm/templates/snippets/shelve_button/want_to_read_modal.html:5
#, python-format
msgid "Want to Read \"<em>%(book_title)s</em>\""
msgstr "想要閱讀 \"<em>%(book_title)s</em>\""
#: bookwyrm/templates/snippets/status/content_status.html:72
#: bookwyrm/templates/snippets/trimmed_text.html:17
msgid "Show more"
@ -2872,13 +2870,13 @@ msgstr "移除 <a href=\"%(path)s\">%(name)s</a>"
msgid "rated <a href=\"%(book_path)s\">%(book)s</a>:"
msgstr "由 <a href=\"%(path)s\">%(username)s</a> 建立"
#: bookwyrm/templates/snippets/status/headers/read.html:5
#: bookwyrm/templates/snippets/status/headers/read.html:7
#, fuzzy, python-format
#| msgid "Editions of <a href=\"%(work_path)s\">\"%(work_title)s\"</a>"
msgid "finished reading <a href=\"%(book_path)s\">%(book)s</a>"
msgstr "<a href=\"%(work_path)s\">\"%(work_title)s\"</a> 的各版本"
#: bookwyrm/templates/snippets/status/headers/reading.html:6
#: bookwyrm/templates/snippets/status/headers/reading.html:7
#, fuzzy, python-format
#| msgid "Created by <a href=\"%(path)s\">%(username)s</a>"
msgid "started reading <a href=\"%(book_path)s\">%(book)s</a>"
@ -2890,7 +2888,7 @@ msgstr "由 <a href=\"%(path)s\">%(username)s</a> 建立"
msgid "reviewed <a href=\"%(book_path)s\">%(book)s</a>"
msgstr "移除 <a href=\"%(path)s\">%(name)s</a>"
#: bookwyrm/templates/snippets/status/headers/to_read.html:6
#: bookwyrm/templates/snippets/status/headers/to_read.html:7
#, fuzzy, python-format
#| msgid "replied to <a href=\"%(user_path)s\">%(username)s's</a> <a href=\"%(status_path)s\">status</a>"
msgid "<a href=\"%(user_path)s\">%(username)s</a> wants to read <a href=\"%(book_path)s\">%(book)s</a>"
@ -3201,6 +3199,11 @@ msgstr "沒有找到使用該郵箱的使用者。"
msgid "A password reset link sent to %s"
msgstr "密碼重置連結已傳送給 %s"
#: bookwyrm/views/rss_feed.py:34
#, python-brace-format
msgid "Status updates from {obj.display_name}"
msgstr ""
#~ msgid "Local Timeline"
#~ msgstr "本地時間線"